From 6bce9a250eda5006ed09f5775e1e22c7c696bdd8 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 13 Oct 2026 11:01:08 -0500 Subject: [PATCH 1/2] Build wheels against Python 3.15.0 final; routine CI maintenance - cibuildwheel v4.2.1 -> v4.3.1, which builds 3.15 wheels with 3.15.0 final instead of rc3 - Skip PyPy 3.12 wheels: no NumPy release builds on PyPy 3.12 yet. pp311 wheels are now for PyPy 8.0 (pypy311_pp80), and CI builds NumPy from source for them - Build macOS arm64 wheels on macos-15 (macos-14 is retired 2026-11-02). Homebrew's libomp there needs macOS 15, so arm64 wheels now require macOS 15 - test.yml: drop the conda-forge python_rc channel now that Python 3.15.0 is on conda-forge - upload-artifact v7.0.2, download-artifact v8.0.2 - pre-commit: pyupgrade v3.22.0, black 26.10.1 --- .github/workflows/test.yml | 17 ++--------------- .github/workflows/wheels.yml | 19 ++++++++++++------- .pre-commit-config.yaml | 4 ++-- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0d79922..8f16332 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,20 +54,7 @@ jobs: else variant=python-gil fi - channels=conda-forge,nodefaults - if [[ $pyver == 3.15 ]]; then - # TODO: drop this branch once Python 3.15.0 final is on conda-forge. - # Until then the 3.15 release candidates need `_python_rc`, which only - # the `python_rc` label provides. The label must rank *below* - # conda-forge: it also holds older `python` rc builds (but no 3.15), and - # strict channel priority would then hide conda-forge's 3.15 rc. - channels=conda-forge,conda-forge/label/python_rc,nodefaults - awk '{ print } /^ - conda-forge$/ { print " - conda-forge/label/python_rc" }' \ - continuous_integration/environment.yml > environment-ci.yml - else - cp continuous_integration/environment.yml environment-ci.yml - fi - echo "CONDA_CHANNELS=$channels" >> "$GITHUB_ENV" + cp continuous_integration/environment.yml environment-ci.yml echo " - python=$pyver" >> environment-ci.yml echo " - $variant" >> environment-ci.yml cat environment-ci.yml @@ -76,7 +63,7 @@ jobs: with: auto-update-conda: true environment-file: environment-ci.yml - channels: ${{ env.CONDA_CHANNELS }} + channels: conda-forge,nodefaults channel-priority: strict activate-environment: suitesparse-graphblas auto-activate-base: false diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index ead4e0b..8157e01 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -46,7 +46,7 @@ jobs: - name: Check metadata run: pipx run twine check dist/* - - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: sdist path: dist/*.tar.gz @@ -91,7 +91,8 @@ jobs: # macOS Apple Silicon # Keep runner version as old as possible: libomp determines minimum macOS version. - - os: macos-14 + # macos-14 is retired on 2026-11-02 (and fails jobs during brownouts before then). + - os: macos-15 cibw_archs: "arm64" # WebAssembly for Pyodide (PEP 783 `pyemscripten_*` wheels). GraphBLAS is built in @@ -143,7 +144,7 @@ jobs: brew fetch --retry libomp && brew reinstall libomp echo "MACOSX_DEPLOYMENT_TARGET=$(otool -l "$(brew --prefix libomp)/lib/libomp.dylib" | grep minos | awk '{print $2}')" >> "$GITHUB_ENV" - - uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1 + - uses: pypa/cibuildwheel@b3395e271a35f73dad77f21802abe9b986dfe299 # v4.3.1 with: output-dir: wheelhouse env: @@ -151,6 +152,8 @@ jobs: CIBW_BUILD_VERBOSITY: 3 # PyPy is not built by default (since cibuildwheel v3); enable explicitly. + # cibuildwheel v4.3 builds PyPy 8.0, whose ABI tag (`pypy311_pp80`) PyPy 7.3 can't + # install, and NumPy has no wheels for it, so building and testing compile NumPy. # Free-threaded wheels (cp314t, cp315t) are built and tested by default. # cibuildwheel v4 dropped cp313t (and its "cpython-freethreading" # enable option) entirely. @@ -190,7 +193,9 @@ jobs: # Architectures to build specified in matrix CIBW_ARCHS: ${{ matrix.cibw_archs }} - CIBW_SKIP: "${{ matrix.cibw_skip }}" + # Skip PyPy 3.12 everywhere: no NumPy release builds on it yet (NumPy's bundled + # pythoncapi_compat.h redefines functions that PyPy 3.12 v8.0's headers declare). + CIBW_SKIP: "pp312-* ${{ matrix.cibw_skip }}" # Use delvewheel on Windows. # This copies graphblas.dll into the wheel. "repair" in cibuildwheel parlance includes copying any shared @@ -208,7 +213,7 @@ jobs: # `python -m pytest`, because the `pytest` script doesn't work in a Pyodide venv. CIBW_TEST_COMMAND: "python -m pytest --pyargs suitesparse_graphblas -s -k test_print_jit_config && python -m pytest -v -W error --pyargs suitesparse_graphblas" - - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: wheels-${{ matrix.os }}-${{ matrix.cibw_archs }}${{ matrix.arch_note}} path: wheelhouse/*.whl @@ -229,7 +234,7 @@ jobs: permissions: id-token: write # for Trusted Publishing (and its attestations) steps: - - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: path: dist merge-multiple: true @@ -250,7 +255,7 @@ jobs: permissions: id-token: write # for Trusted Publishing (and its attestations) steps: - - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: path: dist merge-multiple: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2b3decc..c51ee4a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,12 +45,12 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.21.2 + rev: v3.22.0 hooks: - id: pyupgrade args: [--py311-plus] - repo: https://github.com/psf/black-pre-commit-mirror - rev: 26.5.1 + rev: 26.10.1 hooks: - id: black - repo: https://github.com/PyCQA/flake8 From 9d43002af92af7a95e2dcfd7c231d3989d186c6b Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 13 Oct 2026 13:44:40 -0500 Subject: [PATCH 2/2] Skip PyPy wheels on Windows NumPy has no wheels for PyPy 8.0, so the pp311 test step built NumPy from source. On Windows that build uses MinGW, which warns on import that it is experimental, and -W error makes that warning fail the tests. --- .github/workflows/wheels.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 8157e01..c96d494 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -61,6 +61,10 @@ jobs: include: - os: windows-latest cibw_archs: "auto64" + # No PyPy: NumPy has no wheels for PyPy 8.0, and a NumPy built from source here + # uses MinGW, which warns on import that it is experimental ("CRASHES ARE TO BE + # EXPECTED"), failing the tests. + cibw_skip: "pp*" # Linux x86_64 manylinux - os: ubuntu-latest