Skip to content

Commit 7bd4d26

Browse files
Technologicatclaude
andcommitted
Support Python 3.15
SciPy 1.18.1 (21 August 2026) is the first release to publish `cp315` wheels, which was the whole block: `utils/lapackdrivers.pyx` does `from scipy.linalg.cython_lapack cimport ...`, so SciPy is a build dependency and the extensions did not compile on 3.15 at all. Adds 3.15 to the CI test matrix, to `[tool.cibuildwheel] build`, and to the classifiers, with `allow-prereleases` on the test job's `setup-python` since 3.15 is at rc2. Verified locally against 3.15.0rc1: the wheel builds under meson-python and all 57 tests pass, no source changes needed. The matrix comment gains "stable". macOS and Windows stay on 3.14 — as they also do in pylu — so "newest Python" stopped describing the matrix once Linux went to 3.15. Removes the deferred item that recorded the block; the one-command check it carried now passes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J1djVVwJCFVPARVfV6qK67
1 parent 9e267ce commit 7bd4d26

4 files changed

Lines changed: 16 additions & 35 deletions

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
strategy:
4848
fail-fast: false
4949
matrix:
50-
# Full Python matrix on Linux; newest Python only on macOS and Windows.
50+
# Full Python matrix on Linux; newest stable Python only on macOS and Windows.
5151
# Rationale: this `test` job exists for fast feedback ahead of the
5252
# `build-wheels` job, which runs `cibuildwheel` on every (Python × OS)
5353
# combination anyway. Duplicating the full 12-job matrix here would
@@ -58,7 +58,7 @@ jobs:
5858
# cibuildwheel as the comprehensive backstop for ABI/build regressions
5959
# on older Pythons across all three OSes.
6060
os: [ubuntu-latest]
61-
python-version: ["3.11", "3.12", "3.13", "3.14"]
61+
python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"]
6262
include:
6363
- os: macos-latest
6464
python-version: "3.14"
@@ -71,6 +71,11 @@ jobs:
7171
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
7272
with:
7373
python-version: ${{ matrix.python-version }}
74+
# 3.15 is at rc2, which the setup-python manifest marks unstable, so a bare
75+
# "3.15" resolves to nothing without this. Versions with a stable release
76+
# are unaffected — the prerelease is only a fallback when no stable one
77+
# satisfies the request. Becomes a no-op once 3.15 final ships.
78+
allow-prereleases: true
7479

7580
# Apple Clang does not ship an OpenMP runtime; install libomp so that
7681
# meson's `dependency('openmp', required: false)` can find it. If meson

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22

33
## v1.0.1 (in progress)
44

5-
*No user-visible changes yet.*
5+
### New
6+
7+
- **Python 3.15 supported.**
8+
- Pre-built wheels on PyPI for Linux, macOS, and Windows, as for 3.11 – 3.14.
9+
- SciPy 1.18.1 is the first release to publish `cp315` wheels, so that is what
10+
a 3.15 install resolves to. SciPy is a build dependency here, not only a
11+
runtime one, so an older pinned SciPy will not work on 3.15.
612

713

814
## v1.0.0 (15 April 2026)

TODO_DEFERRED.md

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,3 @@ applied to neighbor points (e.g. distance-based decay). wlsqm currently has
5959
only `WEIGHT_UNIFORM` and `WEIGHT_CENTER`. Adding a user-supplied radial
6060
weight function would be a natural extension and improves robustness against
6161
outliers.
62-
63-
## Python 3.15 support, once SciPy ships `cp315` wheels
64-
65-
wlsqm is the one project in the fleet that cannot take 3.15 yet, and the block
66-
is entirely external. `utils/lapackdrivers.pyx` does
67-
`from scipy.linalg.cython_lapack cimport ...`, which makes SciPy a *build*
68-
dependency, not merely a runtime one — so no SciPy on 3.15 means the extensions
69-
do not compile at all, and neither the `test` job nor `cibuildwheel` can run.
70-
71-
Checked 2026-08-18 against PyPI: `pip install --only-binary=:all: scipy` under
72-
3.15.0rc1 reports "no matching distribution", and no SciPy release publishes a
73-
`cp315` wheel. Building SciPy from source inside a manylinux container to get
74-
around this is not worth it — it needs a Fortran toolchain and BLAS, and the
75-
whole point of the wheel job is that it is reproducible.
76-
77-
Expect this to clear itself some weeks after 3.15 final, when SciPy cuts a
78-
release with `cp315` wheels. The check is one command; when it passes, the edit
79-
is the same one the other two Cython projects already took:
80-
81-
```bash
82-
pip install --only-binary=:all: --dry-run scipy # under a 3.15 interpreter
83-
```
84-
85-
- `pyproject.toml`: add `"Programming Language :: Python :: 3.15"` and
86-
`cp315-*` to `[tool.cibuildwheel] build`.
87-
- `.github/workflows/ci.yml`: add `"3.15"` to the `test` matrix and
88-
`allow-prereleases: true` to its `setup-python` step (drop the flag once 3.15
89-
is final).
90-
91-
Deferred during the fleet-wide Python 3.15 pass (2026-08-18), where pylu, pydgq,
92-
chandra and arxiv-api-search all went green.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ classifiers = [
3434
"Programming Language :: Python :: 3.12",
3535
"Programming Language :: Python :: 3.13",
3636
"Programming Language :: Python :: 3.14",
37+
"Programming Language :: Python :: 3.15",
3738
"Topic :: Scientific/Engineering",
3839
"Topic :: Scientific/Engineering :: Mathematics",
3940
]
@@ -115,7 +116,7 @@ ignore = [
115116
]
116117

117118
[tool.cibuildwheel]
118-
build = "cp311-* cp312-* cp313-* cp314-*"
119+
build = "cp311-* cp312-* cp313-* cp314-* cp315-*"
119120
skip = "*-win32 *-manylinux_i686 *-musllinux*"
120121
test-requires = ["pytest", "numpy", "scipy"]
121122
test-command = "pytest {project}/tests -v"

0 commit comments

Comments
 (0)