Repository navigation
feat(python)!: abi3t wheels for CPython 3.15, require CPython 3.12 - #162
Merged
Merged
Conversation
uv 0.12.23 knows CPython 3.15 only up to 3.15.0rc3; 0.13.0 adds 3.15.0 final (and makes it the default stable version).
Three wheels per platform, each built with its family's oldest CPython: cp312-abi3 (GIL-enabled 3.12 to 3.14), cp315-abi3.abi3t (PEP 803: both builds of 3.15 and newer, which uv and pip prefer there), and cp314-cp314t (free-threaded 3.14 has no stable ABI). PyO3's abi3-py312 and abi3t-py315 features let the build interpreter pick the extension. - rust-numpy comes from a pinned git revision: its abi3t support (PyO3/rust-numpy#556) is not in a release yet. The abi3t extension reads arrays through NumPy 2.5's C API, so CPython 3.15 and newer require numpy>=2.5. - requires-python >=3.12: numpy 2.5 and SciPy 1.18 already dropped 3.11, and 3.12 is the most-used CPython. ruff and ty target 3.12, and the type aliases become PEP 695 `type` statements. - CI builds the abi3 and abi3t wheels on every platform (cp314t on x86_64 Linux) and tests them on 3.12 and 3.14, 3.15 and 3.15t (3.14t); publish.yml builds and tests all three, and the CUDA runtime's, on every platform. The tests name each version, since uv's "3" also matches an installed free-threaded interpreter. BREAKING CHANGE: CPython 3.11 is no longer supported; installers there keep resolving hessboost 0.3.1.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
For CPython 3.14 and newer uv takes an installed free-threaded interpreter for a plain version request, and keeps a free-threaded project environment for one. publish.yml therefore tested the abi3 wheels against 3.14t, which refuses them. ci.yml tested its "3.15" runs on the 3.15t build interpreter. test-wheel.sh now installs the requested version (uv downloads the GIL-enabled build for a plain version) and asks for it as "+gil".
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.
Summary
hessboost now ships a PEP 803
abi3twheel for CPython 3.15 and newer. It is a single extension that both the GIL-enabled and the free-threaded builds load, and uv and pip pick it over theabi3wheel there. The minimum CPython goes from 3.11 to 3.12, and CI now tests every wheel family on every platform.cp312-abi3cp315-abi3.abi3tcp314-cp314tpublish.ymlnow expects 18hessboostwheels (was 12) and 6hessboost-runtime-cudawheels (was 4).User Impact
requires-python. This is breaking for Python users, so the next release should be a minor bump.ModelFormat,PathLike,Column,Method, ...) are now PEP 695typestatements. At runtime they areTypeAliasTypeobjects instead of the unions they name. Nothing in the package introspects them.Decisions
Minimum CPython 3.12. PyPI downloads over the last 30 days (pypistats):
3.12 is the most-used version, so it stays. numpy 2.5 and SciPy 1.18 already require 3.12, and SPEC 0 dropped 3.11 in Q4 2025.
rust-numpy from a pinned git revision (
aca95e9, current main). Its abi3t support (add support for abi3t PyO3/rust-numpy#556) is not released yet: 0.29.0 is from June. Switch back to crates.io once a release carries it; update pyo3 to 0.30 PyO3/rust-numpy#572 (PyO3 0.30) is the likely one. PyO3 stays at 0.29.3. The sdist build fetches the revision through Cargo, and the sdist round trip exercises that.PyO3 features
abi3-py312andabi3t-py315. The build interpreter selects the extension: 3.12–3.14 build abi3, 3.15+ (either build) build abi3t, and 3.14t builds version-specific. Every build therefore passes-iexplicitly.Explicit, GIL-pinned Python versions in CI. For 3.14 and newer, uv takes an installed free-threaded interpreter for a plain version request, and keeps an existing free-threaded environment for one. With only 3.15t installed,
uv python find 3.15returns 3.15t, anduv sync --python 3.14keeps a 3.14t.venv. The first CI run hit this twice:publish.ymltested the abi3 wheels on 3.14t, which refuses them, andci.yml's "3.15" runs ran on the 3.15t build interpreter.test-wheel.shnow runsuv python install <version>(a plain version downloads the GIL-enabled build) and then requests<version>+gilunless the version ends int. The old "run3first" ordering is gone:3would take any installed CPython.uv 0.13.1 in mise: the first uv with CPython 3.15.0 final (0.12.23 stopped at rc3). The Alpine test image moves to
uv:0.13-alpine.Validation
All local runs were on aarch64 Linux.
cp312-abi3,cp315-abi3.abi3t, andcp314-cp314t.test-wheel.shper interpreter):python/.venvgives each run the requested build._native.abi3.soon 3.12 and 3.14,cpython-314ton 3.14t, and_native.abi3t.soon 3.15 and 3.15t.maturin sdist, then an abi3t wheel built from the sdist on 3.15t.cargo clippy --all-targets -D warningspasses under all three ABI configurations, with and without--features cuda.cargo fmt --checkpasses.ruff check,ruff format --check, andty checkare clean on the 3.12 target.pyright --verifytypesreports 100% completeness and 0 missing docstrings.shellcheckandactionlint(with its shellcheck integration) are clean.python3t.dllon GIL-enabled Windows 3.15), musllinux in Alpine, the manylinux images'/opt/python/cp315-cp315t, and the CUDA runtime wheels.