Skip to content

👷 ci: test on Python 3.10, 3.14, and 3.15 - #83

Merged
nstarman merged 2 commits into
GalacticDynamics:mainfrom
nstarman:ci/python-3.14-3.15
Oct 10, 2026
Merged

nstarman merged 2 commits into
GalacticDynamics:mainfrom
nstarman:ci/python-3.14-3.15

Conversation

@nstarman

@nstarman nstarman commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

The test matrix is now 3.10, 3.14, 3.15 (replacing 3.13), on Linux, macOS and Windows. This is the first time CI tests the code path that uses the PEP 814 built-in frozendict with JAX's native pytree support. #82's parity tests also run against the real built-in on 3.15.

Changes

  • ci.yml
    • The matrix is now ["3.10", "3.14", "3.15"].
    • The GitHub code-coverage artifact comes from the ubuntu 3.14 job (it was 3.13).
    • The tests-latest canary, which installs the newest dependencies, now runs on 3.15. It exists to catch upstream breakage early, which matters most on the newest Python.
  • uv.lock
    • jax/jaxlib → 0.11.2 for Python ≥ 3.14. The previous lock had jax 0.7.1, which has no Python 3.15 wheels, so uv sync --locked would have failed.
    • Every other package whose locked version had no cp314/cp315 wheels is upgraded too: numpy, scipy, ml-dtypes, opt-einsum, markupsafe, pyyaml, watchdog, librt, and pywin32 (311 → 312). Without this, CI would compile them from source; scipy would likely fail on Windows, and pywin32 can't be built from source at all. pywin32 arrives via ipykernel → jupyter-core in the dev group, which the nox test session installs, and it is what failed the first 3.15 Windows run. Every numeric package now has cp315 wheels for Linux x86_64, macOS arm64 and Windows amd64.
    • Two packages still build from source, because upstream hasn't published wheels: pyyaml 6.0.3 on 3.15, and watchdog 6.0.0 on macOS 3.14. Both come from zensical in the docs group, which is part of dev. Both compiled cleanly in local runs. pyyaml also falls back to pure Python if its C extension fails to build.
    • Python 3.10 resolutions are unchanged (jax 0.6.2, numpy 2.2.6).
  • pyproject.toml: adds the 3.14 and 3.15 classifiers and removes a duplicated 3.10 line.
  • _core.py: the comment on the sys.version_info >= (3, 15) branch said CI didn't exercise it, which is no longer true. The pragma: no cover stays because each job's coverage report only sees one side of the branch.

Verification (local, macOS arm64)

For each Python version I ran the CI steps in a fresh environment: uv sync --locked --no-default-groups --group nox --group test followed by nox -s test.

Python jax / numpy Result
3.10.15 0.6.2 / 2.2.6 135 passed
3.14.3 0.11.2 / 2.5.4 135 passed
3.15.0 0.11.2 / 2.5.4 135 passed, using the built-in frozendict

uv sync --locked --all-groups --no-build --dry-run --python-platform … succeeds for every OS × Python combination in the matrix, except for the pyyaml and watchdog source builds noted above. The docs workflow's locked install and zensical build also still work, and prek run --all-files passes.

🤖 Generated with Claude Code

Replace 3.13 with 3.14 and 3.15 in the test matrix, so the PEP 814
built-in frozendict path (and JAX's native support for it) is tested.
The newest-dependencies canary moves to 3.15 and the coverage artifact
to 3.14.

The lock is bumped for jax/jaxlib (0.11.2 on 3.14+) and for every
package whose locked version had no cp314/cp315 wheels (numpy, scipy,
ml-dtypes, opt-einsum, markupsafe, pyyaml, watchdog, librt), so no CI
job builds from source. 3.10 resolutions are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (main@8a48b5e). Learn more about missing BASE report.

Additional details and impacted files
@@           Coverage Diff            @@
##             main       #83   +/-   ##
========================================
  Coverage        ?   100.00%           
========================================
  Files           ?         3           
  Lines           ?        98           
  Branches        ?         0           
========================================
  Hits            ?        98           
  Misses          ?         0           
  Partials        ?         0           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@nstarman nstarman modified the milestones: v0.2.x, v0.3.0 Oct 10, 2026
pywin32 311 (via ipykernel -> jupyter-core in the dev group, which the
nox test session installs) has no cp315 wheels and cannot be built from
source, failing the 3.15 Windows job.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nstarman
nstarman merged commit 356d326 into GalacticDynamics:main Oct 10, 2026
21 checks passed
@nstarman
nstarman deleted the ci/python-3.14-3.15 branch October 10, 2026 23:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant