Skip to content

Commit 07c3f98

Browse files
committed
Merge master into feature/pytest-plugin-issue-70
Brings in the non-ASCII path fix (#1087), the get_ipython() Optional guard (#1088), and the free-threaded CI setup fix (#1089).
2 parents aa8bc20 + 9069a32 commit 07c3f98

66 files changed

Lines changed: 8459 additions & 103 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/tests.yml

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,15 @@ jobs:
8787

8888
- name: install test dependencies
8989
run: |
90-
python3 -m pip install pytest pytest-asyncio hypothesis
90+
python3 -m pip install pytest pytest-asyncio
91+
# hypothesis ships no wheel for free-threaded CPython 3.13, and
92+
# building it from source fails there: its dependency chain pulls
93+
# pyo3-ffi, and "PyO3 does not support the free-threaded build of
94+
# CPython versions below 3.14". That aborted this step under
95+
# ``bash -e``, so the 3.13t jobs never reached ``run tests`` at all.
96+
# Install it best-effort; the two modules that need it call
97+
# pytest.importorskip("hypothesis") and skip when it's absent.
98+
python3 -m pip install hypothesis || echo "hypothesis unavailable; property-based tests will skip"
9199
# torch/JAX/TensorFlow may not be available on free-threaded Python builds
92100
python3 -m pip install torch --index-url https://download.pytorch.org/whl/cpu || true
93101
python3 -m pip install -e ".[test]" || python3 -m pip install -e .
@@ -97,7 +105,14 @@ jobs:
97105
run: |
98106
ulimit -c unlimited
99107
echo '/tmp/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
100-
sudo apt-get install -y gdb
108+
# ``apt-get update`` first: the runner image ships a package index
109+
# that can be older than the mirror's contents, and installing gdb
110+
# then 404s on a superseded libc6-dbg. That failed the whole step
111+
# (exit 100), skipping ``run tests`` on 3.14t. gdb is only used by
112+
# the optional "Collect crash backtraces" step, so never let its
113+
# absence stop the job.
114+
sudo apt-get update || true
115+
sudo apt-get install -y gdb || echo "gdb unavailable; crash backtraces will be skipped"
101116
102117
- name: Quick memory profiling smoke test
103118
if: runner.os == 'Linux' && endsWith(matrix.python, 't')
@@ -113,6 +128,12 @@ jobs:
113128
- name: run tests
114129
# Free-threaded Python support is experimental; don't block CI on failures
115130
continue-on-error: ${{ endsWith(matrix.python, 't') }}
131+
# SCALENE_TEST_DIAG=1 makes tests/conftest.py print each skip's reason
132+
# live and flushed. On free-threaded builds the 45-min job timeout can
133+
# cancel pytest before its -rs summary, so this keeps skip reasons in
134+
# the log for future debugging.
135+
env:
136+
SCALENE_TEST_DIAG: ${{ endsWith(matrix.python, 't') && '1' || '' }}
116137
run: |
117138
python3 -m pytest
118139
@@ -145,8 +166,15 @@ jobs:
145166
- name: Free-threaded parity test
146167
# Runs on ALL matrix entries to verify CPU+memory profiling with
147168
# native code and threads produces comparable results everywhere.
169+
#
170+
# continue-on-error on ALL jobs (not just t-builds): the contention-ratio
171+
# check (8T/1T slowdown <= 3x) is a wall-clock timing assertion, so on a
172+
# noisy shared CI runner it spikes past the threshold (observed 3.1x-5.2x)
173+
# for reasons unrelated to Scalene. Combined with fail-fast, one such
174+
# spike cancelled the whole matrix. The step still runs and prints its
175+
# results for inspection; it just no longer fails the job.
148176
if: runner.os != 'Windows'
149-
continue-on-error: ${{ endsWith(matrix.python, 't') }}
177+
continue-on-error: true
150178
run: |
151179
python3 test/test_freethreaded_parity.py
152180
@@ -158,3 +186,46 @@ jobs:
158186
echo "=== Backtrace from $core ==="
159187
gdb -batch -ex "thread apply all bt full" python3 "$core" 2>/dev/null || true
160188
done
189+
190+
# Windows is profiled via threads, not signals, so the signal-based
191+
# interruption that breaks blocking syscalls on Linux (issue #1060) cannot
192+
# happen here. This job runs the Windows side of tests/test_eintr_retry.py --
193+
# a positive check that profiling a blocking TCP round-trip under
194+
# ``scalene run`` completes cleanly -- guarding against any regression that
195+
# would reintroduce signal-style interruption on Windows. It is a separate,
196+
# scoped job rather than a matrix entry because the full pytest suite is not
197+
# yet Windows-clean (Windows support is partial).
198+
run-tests-windows:
199+
runs-on: windows-latest
200+
timeout-minutes: 30
201+
strategy:
202+
fail-fast: false
203+
matrix:
204+
python: [ '3.11', '3.13' ]
205+
206+
steps:
207+
- uses: actions/checkout@v4
208+
209+
- name: Set up Python
210+
uses: actions/setup-python@v5
211+
with:
212+
python-version: ${{ matrix.python }}
213+
cache: pip
214+
cache-dependency-path: |
215+
requirements.txt
216+
pyproject.toml
217+
218+
- name: Install dependencies
219+
run: |
220+
python -m pip install --upgrade pip
221+
python -m pip install -r requirements.txt
222+
python -m pip install numpy
223+
224+
- name: Build scalene
225+
run: pip -v install -e .
226+
227+
- name: Install test dependencies
228+
run: python -m pip install pytest pytest-asyncio hypothesis
229+
230+
- name: Run Windows profiling test
231+
run: python -m pytest tests/test_eintr_retry.py -v

0 commit comments

Comments
 (0)