Skip to content

Test and build wheels on Python 3.15 - #73

Merged
wbarnha merged 1 commit into
masterfrom
claude/python-3.15-cicd-testing-6jtvbj
Aug 10, 2026
Merged

Test and build wheels on Python 3.15#73
wbarnha merged 1 commit into
masterfrom
claude/python-3.15-cicd-testing-6jtvbj

Conversation

@wbarnha

@wbarnha wbarnha commented Aug 10, 2026

Copy link
Copy Markdown
Member

Adds Python 3.15 to CI, covering the same ground the 3.14 rows get.

Changes

  • test.yml — new 3.15 and 3.15t rows (default and free-threaded builds).
  • test-system-uchardet.yml — new 3.15t row. 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 — cibuildwheel 4.1.04.2.0, the first release that knows about CPython 3.15. It 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. Confirmed with --print-build-identifiers — under the old 4.1.0 pin 3.15 could not be built at any setting; cp313t remains unbuildable at 4.2.0, so the note about 3.13t being covered in test.yml still holds.
  • tox.ini — the envlist was still py36py311, predating both the 3.10 floor in requires-python and the versions CI actually runs. Now mirrors the workflow matrix.
  • pyproject.toml — added the Programming Language :: Python :: 3.15 classifier (verified it's a valid trove classifier, so PyPI won't reject an upload).

allow-prereleases: true on setup-python resolves 3.15 to 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 widens 3.X to ~3.X.0-0, and a pre-release only wins when no stable release satisfies the spec. Verified against the real actions/python-versions manifest: 3.10 → 3.10.20, 3.12 → 3.12.13, 3.14 → 3.14.7, identical with and without the flag; without it 3.15 resolves 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:

result
3.15.0rc1 extension compiles, 150 passed, 3 skipped
3.15.0rc1 free-threaded (3.15t) 151 passed, 2 skipped — GIL confirmed disabled

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

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
@wbarnha
wbarnha merged commit 8440765 into master Aug 10, 2026
24 checks passed
@wbarnha
wbarnha deleted the claude/python-3.15-cicd-testing-6jtvbj branch August 10, 2026 16:26
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.

2 participants