From 3ca47096c2e6e69aa202405e1025bfdb42b9a046 Mon Sep 17 00:00:00 2001 From: William Barnhart Date: Sat, 18 Jul 2026 20:33:42 +0000 Subject: [PATCH 1/3] Modernize release wheel-build runners The build_wheels matrix pinned ubuntu-20.04, whose runner image GitHub retired in April 2025 -- that job can no longer schedule. macos-13 is also on the deprecation path, and pypa/cibuildwheel@v2.10.1 (Sept 2022) predates Python 3.12/3.13 wheel support and newer runner images. This only runs on release, so the breakage is latent. - os matrix: ubuntu-20.04 -> ubuntu-latest; macos-13 -> macos-15-intel (still x86_64), keeping macos-14 for arm64. - pypa/cibuildwheel: v2.10.1 -> v2.21.3, so release wheels cover the same Python range (3.10-3.13) the test matrix already exercises. cibuildwheel honors python_requires (>=3.10), so older interpreters stay skipped. The other workflows (codeql-analysis, gh-pages) already use ubuntu-latest and current action versions; no changes needed. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01HHPL4VFWQRQPpjR1gXSKyL --- .github/workflows/python-package.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 7a3728f18..e7450796c 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -114,13 +114,15 @@ jobs: if: github.event_name == 'release' && github.event.action == 'created' strategy: matrix: - os: [ubuntu-20.04, macos-13, macos-14] + # Modern, supported runner images (ubuntu-20.04 was retired in 2025). + # macos-15-intel -> x86_64 wheels, macos-14 -> arm64 wheels. + os: [ubuntu-latest, macos-15-intel, macos-14] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build wheels - uses: pypa/cibuildwheel@v2.10.1 + uses: pypa/cibuildwheel@v2.21.3 - uses: actions/upload-artifact@v4 with: name: cibw-wheels-${{ matrix.os }} From 5662dff0c008fd63d84ad0c300a7bd759f0961c7 Mon Sep 17 00:00:00 2001 From: William Barnhart Date: Sat, 18 Jul 2026 20:40:07 +0000 Subject: [PATCH 2/3] Build Windows wheels on release Add windows-2022 to the release wheel matrix. pyproject.toml already declares Windows support and carries a [tool.cibuildwheel] config (build = cp3*, archs = auto64, before-build installs Cython), and setup.py already handles the win32 case (links ws2_32, skips the gcc-only warning flags), so the existing build config applies unchanged -- windows-2022 produces AMD64 CPython wheels for 3.10-3.13. The per-runner artifact name (cibw-wheels-${{ matrix.os }}) stays unique, so the publish job's `cibw-*` download+merge picks up the Windows wheels alongside the Linux/macOS ones. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01HHPL4VFWQRQPpjR1gXSKyL --- .github/workflows/python-package.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index e7450796c..2ac5c624f 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -115,8 +115,10 @@ jobs: strategy: matrix: # Modern, supported runner images (ubuntu-20.04 was retired in 2025). - # macos-15-intel -> x86_64 wheels, macos-14 -> arm64 wheels. - os: [ubuntu-latest, macos-15-intel, macos-14] + # macos-15-intel -> x86_64 wheels, macos-14 -> arm64 wheels, + # windows-2022 -> AMD64 wheels. Build config lives in + # pyproject.toml's [tool.cibuildwheel] (cp3*, auto64, Cython). + os: [ubuntu-latest, macos-15-intel, macos-14, windows-2022] steps: - uses: actions/checkout@v4 with: From 9ac7ab4698996eb4f092f00e428f50e27a8fa74e Mon Sep 17 00:00:00 2001 From: William Barnhart Date: Sat, 18 Jul 2026 20:44:16 +0000 Subject: [PATCH 3/3] Drop Python 3.9 from CI, add required 3.14 test coverage - test-pytest matrix: add 3.14 (with and without Cython). 3.13 was already present; both now run under the required `check` gate. Python 3.14 is GA (Oct 2025), so it needs no prerelease handling. - test-pypy: bump pypy3.9 -> pypy3.11 so the project no longer targets 3.9 while keeping a PyPy smoke lane (still non-required / continue-on-error). - requirements/test.txt: drop the 3.9 formatter fallbacks; the pins now install unconditionally since the minimum supported Python is 3.10. - pyproject.toml: add the 3.13 and 3.14 classifiers. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01HHPL4VFWQRQPpjR1gXSKyL --- .github/workflows/python-package.yml | 6 +++--- pyproject.toml | 2 ++ requirements/test.txt | 8 ++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 2ac5c624f..adf9c838c 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -42,7 +42,7 @@ jobs: # for example if a test fails only when Cython is enabled fail-fast: false matrix: - python-version: ['3.10', '3.11', '3.12', '3.13'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] use-cython: ['true', 'false'] experimental: [false] env: @@ -68,7 +68,7 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} test-pypy: - name: 'Python pypy3.9/Cython: false' + name: 'Python pypy3.11/Cython: false' runs-on: ubuntu-latest timeout-minutes: 10 continue-on-error: true @@ -80,7 +80,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-python@v5 with: - python-version: pypy3.9 + python-version: pypy3.11 cache: pip cache-dependency-path: requirements/test.txt - name: Install dependencies diff --git a/pyproject.toml b/pyproject.toml index b4b7f923c..23afb32fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,8 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", diff --git a/requirements/test.txt b/requirements/test.txt index 832762190..759f5bd62 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,13 +1,9 @@ # Formatters are pinned so `scripts/check` is reproducible: new releases # change formatting output and would fail lint on an otherwise-unchanged # tree. They are lint-only tools, run only by the lint job (PYTHON_LATEST). -# The current pins require Python >= 3.10, so guard them with a marker and -# fall back to an unpinned install on 3.9 (installed there but never run). # Bump the pins deliberately, together with a tree-wide reformat. -black==26.5.1; python_version >= "3.10" -black; python_version < "3.10" -isort==8.0.1; python_version >= "3.10" -isort; python_version < "3.10" +black==26.5.1 +isort==8.0.1 autoflake flake8==5.0.4 # 5.0.4 can be upgraded to 6.0.0+ when we EOL Python 3.7 flake8-bugbear