Repository navigation
Conversation
CPython 3.15.0 is final, but requires-python capped the package at <3.15: pip on 3.15 falls back to diff-diff 2.3.1, and uv builds the sdist. Raise the cap, add the classifier, build cp315 wheels on every platform and add 3.15 to the Rust-backend CI matrix; the pure-Python fallback and the doc snippets move to 3.15 as they moved to 3.14 in igerber#284. PyO3 0.29 already supports 3.15.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds Python 3.15 to the supported range, following the pattern of #284 (Python 3.14).
CPython 3.15.0 is final, but diff-diff 3.12.0 declares
requires-python = ">=3.9,<3.15". On 3.15 (checked with pip 26.2.1 and uv 0.13.0):pip install diff-diffskips every release from 2.3.2 on, since each one carries an upper cap, and silently installs 2.3.1, the last release without one.pip install diff-diff==3.12.0fails: "Ignored the following versions that require a different python version: ... 3.12.0 Requires-Python >=3.9,<3.15".uv pip install diff-diffignores the upper bound and selects 3.12.0, but there is no cp315 wheel, so it builds the sdist, which needs a Rust toolchain.Changes
pyproject.toml:requires-python<3.15-><3.16, add theProgramming Language :: Python :: 3.15classifier.build-wheels.yml(used bypublish.ymlandrelease-build-check.yml): build cp315 wheels on Linux x86_64 / aarch64 (/opt/python/cp315-cp315ships in the currentmanylinux_2_28images), macOS arm64 and Windows.rust-test.yml: add3.15to thepython-testsmatrix (all four OSes); move the Pure Python Fallback job from 3.14 to 3.15, as Add Python 3.14 support #284 moved it from 3.13 to 3.14.docs-tests.yml: the doc-snippets job follows the fallback job to 3.15 (its comment says it mirrors that job); the two comments naming 3.14 are updated.release-build-check.yml,README.md, therust/Cargo.tomlcomment: the supported range now reads 3.9-3.15.changelog.d/20261011-python-3-15.md(### Added).No Rust dependency change: PyO3 0.29 supports 3.15 (0.29.0: "Support Python 3.15.0b1", PyO3/pyo3#6014), and with no committed
Cargo.lock,pyo3 = "0.29"resolves to 0.29.3. The extension is not built for abi3, so per-version wheels stay the model andPYO3_USE_ABI3_FORWARD_COMPATIBILITYis not needed for 3.15. numpy 2.5.4, scipy 1.18.1, pandas 3.0.6 and scikit-learn 1.9.1 publish cp315 wheels, so the CI install steps need no source builds.Not changed: the Lint workflow stays on 3.14 (tool pins, not the support surface); no free-threaded (3.15t) wheels or CI legs, since the project builds none for 3.14t either.
Methodology references (required if estimator / math changes)
Validation
rust-test.ymlLinux steps reproduced in a fresh venv per interpreter:maturin build --release --features extension-module,openblas, install the wheel, run from a copy oftests/outside the source tree. Dependencies resolved to numpy 2.5.4, pandas 3.0.6, scipy 1.18.1, scikit-learn 1.9.1, pytest 9.1.1, pytest-xdist 3.8.0, maturin 1.15.0, Rust 1.99.0, PyO3 0.29.3.pytest tests/test_rust_backend.py -m ''DIFF_DIFF_BACKEND=rust pytest tests/ --ignore=tests/test_doc_snippets.py -n 4 --dist worksteal -m ''PYTHONPATH=. DIFF_DIFF_BACKEND=python pytest tests/ --ignore=tests/test_rust_backend.py --ignore=tests/test_doc_snippets.py -n 4 --dist workstealPYTHONPATH=. DIFF_DIFF_BACKEND=python pytest tests/test_doc_snippets.pyNo failures. Per-test outcomes are identical on 3.15 and 3.14 (compared test by test from the JUnit XML), and so are the warning categories. The skips are the isolated-install and missing-fixture skips (
openai_review.pynot in the checkout, R / Stata golden files, matplotlib not installed), the same on both. The 3.14 runs use this branch, whose Python and Rust sources are identical tomain.Release path: the
build-linuxloop ofbuild-wheels.yml, run inquay.io/pypa/manylinux_2_28_x86_64for cp314 and cp315, builds bothmanylinux_2_28_x86_64wheels; the cp315 wheel installs into a 3.15.0 venv withHAS_RUST_BACKEND == True, andtests/test_rust_backend.pygives 200 passed.Backtest / simulation / notebook evidence (if applicable): N/A
Not run: macOS, Windows and aarch64 (CI covers them); the Rust unit tests (
cargo test, a job with no Python matrix, unchanged here); the Lint workflow (no Python source changed); the notebooks and mmm-interop workflows.CI has not run yet: the fork's workflow runs are waiting for a maintainer's approval, and the test jobs also need the
ready-for-cilabel.Security / privacy
Changelog
changelog.d/20261011-python-3-15.md