Test and build wheels on Python 3.15 - #73
Merged
Merged
Conversation
Adds Python 3.15 to CI, covering the same ground the 3.14 rows get: - test.yml gains 3.15 and 3.15t (default and free-threaded builds). - test-system-uchardet.yml gains 3.15t. A system build compiles against upstream uchardet's headers instead of the vendored sources, so it is where a new interpreter is most likely to break first. - build-and-upload-to-pypi.yml moves from cibuildwheel 4.1.0 to 4.2.0, the first release that knows about CPython 3.15. 4.2.0 builds and tests cp315/cp315t by default -- cibuildwheel gates a Python behind the `cpython-prerelease` enable group only until its first release candidate, since the ABI is frozen at rc1, so no opt-in is needed and the wheels are forward-compatible with 3.15.0 final. Under the old pin 3.15 could not be built at any setting. `allow-prereleases` on setup-python resolves `3.15` to the newest pre-release the runner image publishes (3.15.0rc1 today) and will pick up 3.15.0 final with no further change. It leaves the stable rows alone: it widens `3.X` to `~3.X.0-0`, and a pre-release only wins when no stable release satisfies the spec, so 3.10-3.14 still resolve to their newest stable patch. The new rows are advisory (`continue-on-error`) while 3.15 is a pre-release, so a CPython-side regression in rc2 or final cannot block merges; the comments record how to promote them. tox.ini's envlist was still py36-py311, predating both the 3.10 floor in requires-python and the versions CI actually runs; it now matches the workflow matrix. No source change was needed: against the 3.15.0rc1 build the runners use, the extension compiles and the suite passes on both 3.15 (150 passed) and free-threaded 3.15t (151 passed, GIL confirmed disabled). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jr6Lsfd3fULmP1Gi4b6nDK
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 CI, covering the same ground the 3.14 rows get.
Changes
test.yml— new3.15and3.15trows (default and free-threaded builds).test-system-uchardet.yml— new3.15trow. A system build compiles against upstream uchardet's headers instead of the vendored sources, so it's where a new interpreter is most likely to break first.build-and-upload-to-pypi.yml— cibuildwheel4.1.0→4.2.0, the first release that knows about CPython 3.15. It builds and testscp315/cp315tby default: cibuildwheel gates a Python behind thecpython-prereleaseenable group only until its first release candidate, since the ABI is frozen at rc1, so no opt-in is needed and the wheels are forward-compatible with 3.15.0 final. Confirmed with--print-build-identifiers— under the old 4.1.0 pin 3.15 could not be built at any setting;cp313tremains unbuildable at 4.2.0, so the note about 3.13t being covered intest.ymlstill holds.tox.ini— the envlist was stillpy36–py311, predating both the 3.10 floor inrequires-pythonand the versions CI actually runs. Now mirrors the workflow matrix.pyproject.toml— added theProgramming Language :: Python :: 3.15classifier (verified it's a valid trove classifier, so PyPI won't reject an upload).allow-prereleases: trueonsetup-pythonresolves3.15to whatever pre-release the runner image publishes — 3.15.0rc1 today — and will pick up 3.15.0 final with no further change. It leaves the stable rows alone: it widens3.Xto~3.X.0-0, and a pre-release only wins when no stable release satisfies the spec. Verified against the realactions/python-versionsmanifest:3.10→ 3.10.20,3.12→ 3.12.13,3.14→ 3.14.7, identical with and without the flag; without it3.15resolves to nothing, which is the "Version 3.15 was not found in the local cache" failure.The new rows are advisory (
continue-on-error) while 3.15 is a pre-release, so a CPython-side regression in rc2 or final can't block merges. The workflow comments record how to promote them.Verification
No source change was needed. Ran against the actual 3.15.0rc1 build the runners use:
3.15t)Of the three repos in this set, this is the only one that needed no code change to pass on 3.15.
Generated by Claude Code