Skip to content

Commit e23e85d

Browse files
authored
Build wheels against Python 3.15.0 final; routine CI maintenance (#159)
* 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 * 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.
1 parent 90dfbd3 commit e23e85d

3 files changed

Lines changed: 20 additions & 24 deletions

File tree

‎.github/workflows/test.yml‎

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,7 @@ jobs:
5454
else
5555
variant=python-gil
5656
fi
57-
channels=conda-forge,nodefaults
58-
if [[ $pyver == 3.15 ]]; then
59-
# TODO: drop this branch once Python 3.15.0 final is on conda-forge.
60-
# Until then the 3.15 release candidates need `_python_rc`, which only
61-
# the `python_rc` label provides. The label must rank *below*
62-
# conda-forge: it also holds older `python` rc builds (but no 3.15), and
63-
# strict channel priority would then hide conda-forge's 3.15 rc.
64-
channels=conda-forge,conda-forge/label/python_rc,nodefaults
65-
awk '{ print } /^ - conda-forge$/ { print " - conda-forge/label/python_rc" }' \
66-
continuous_integration/environment.yml > environment-ci.yml
67-
else
68-
cp continuous_integration/environment.yml environment-ci.yml
69-
fi
70-
echo "CONDA_CHANNELS=$channels" >> "$GITHUB_ENV"
57+
cp continuous_integration/environment.yml environment-ci.yml
7158
echo " - python=$pyver" >> environment-ci.yml
7259
echo " - $variant" >> environment-ci.yml
7360
cat environment-ci.yml
@@ -76,7 +63,7 @@ jobs:
7663
with:
7764
auto-update-conda: true
7865
environment-file: environment-ci.yml
79-
channels: ${{ env.CONDA_CHANNELS }}
66+
channels: conda-forge,nodefaults
8067
channel-priority: strict
8168
activate-environment: suitesparse-graphblas
8269
auto-activate-base: false

‎.github/workflows/wheels.yml‎

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
- name: Check metadata
4747
run: pipx run twine check dist/*
4848

49-
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
49+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
5050
with:
5151
name: sdist
5252
path: dist/*.tar.gz
@@ -61,6 +61,10 @@ jobs:
6161
include:
6262
- os: windows-latest
6363
cibw_archs: "auto64"
64+
# No PyPy: NumPy has no wheels for PyPy 8.0, and a NumPy built from source here
65+
# uses MinGW, which warns on import that it is experimental ("CRASHES ARE TO BE
66+
# EXPECTED"), failing the tests.
67+
cibw_skip: "pp*"
6468

6569
# Linux x86_64 manylinux
6670
- os: ubuntu-latest
@@ -91,7 +95,8 @@ jobs:
9195

9296
# macOS Apple Silicon
9397
# Keep runner version as old as possible: libomp determines minimum macOS version.
94-
- os: macos-14
98+
# macos-14 is retired on 2026-11-02 (and fails jobs during brownouts before then).
99+
- os: macos-15
95100
cibw_archs: "arm64"
96101

97102
# WebAssembly for Pyodide (PEP 783 `pyemscripten_*` wheels). GraphBLAS is built in
@@ -143,14 +148,16 @@ jobs:
143148
brew fetch --retry libomp && brew reinstall libomp
144149
echo "MACOSX_DEPLOYMENT_TARGET=$(otool -l "$(brew --prefix libomp)/lib/libomp.dylib" | grep minos | awk '{print $2}')" >> "$GITHUB_ENV"
145150
146-
- uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
151+
- uses: pypa/cibuildwheel@b3395e271a35f73dad77f21802abe9b986dfe299 # v4.3.1
147152
with:
148153
output-dir: wheelhouse
149154
env:
150155
# very verbose
151156
CIBW_BUILD_VERBOSITY: 3
152157

153158
# PyPy is not built by default (since cibuildwheel v3); enable explicitly.
159+
# cibuildwheel v4.3 builds PyPy 8.0, whose ABI tag (`pypy311_pp80`) PyPy 7.3 can't
160+
# install, and NumPy has no wheels for it, so building and testing compile NumPy.
154161
# Free-threaded wheels (cp314t, cp315t) are built and tested by default.
155162
# cibuildwheel v4 dropped cp313t (and its "cpython-freethreading"
156163
# enable option) entirely.
@@ -190,7 +197,9 @@ jobs:
190197
# Architectures to build specified in matrix
191198
CIBW_ARCHS: ${{ matrix.cibw_archs }}
192199

193-
CIBW_SKIP: "${{ matrix.cibw_skip }}"
200+
# Skip PyPy 3.12 everywhere: no NumPy release builds on it yet (NumPy's bundled
201+
# pythoncapi_compat.h redefines functions that PyPy 3.12 v8.0's headers declare).
202+
CIBW_SKIP: "pp312-* ${{ matrix.cibw_skip }}"
194203

195204
# Use delvewheel on Windows.
196205
# This copies graphblas.dll into the wheel. "repair" in cibuildwheel parlance includes copying any shared
@@ -208,7 +217,7 @@ jobs:
208217
# `python -m pytest`, because the `pytest` script doesn't work in a Pyodide venv.
209218
CIBW_TEST_COMMAND: "python -m pytest --pyargs suitesparse_graphblas -s -k test_print_jit_config && python -m pytest -v -W error --pyargs suitesparse_graphblas"
210219

211-
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
220+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
212221
with:
213222
name: wheels-${{ matrix.os }}-${{ matrix.cibw_archs }}${{ matrix.arch_note}}
214223
path: wheelhouse/*.whl
@@ -229,7 +238,7 @@ jobs:
229238
permissions:
230239
id-token: write # for Trusted Publishing (and its attestations)
231240
steps:
232-
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
241+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
233242
with:
234243
path: dist
235244
merge-multiple: true
@@ -250,7 +259,7 @@ jobs:
250259
permissions:
251260
id-token: write # for Trusted Publishing (and its attestations)
252261
steps:
253-
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
262+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
254263
with:
255264
path: dist
256265
merge-multiple: true

‎.pre-commit-config.yaml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ repos:
4545
hooks:
4646
- id: isort
4747
- repo: https://github.com/asottile/pyupgrade
48-
rev: v3.21.2
48+
rev: v3.22.0
4949
hooks:
5050
- id: pyupgrade
5151
args: [--py311-plus]
5252
- repo: https://github.com/psf/black-pre-commit-mirror
53-
rev: 26.5.1
53+
rev: 26.10.1
5454
hooks:
5555
- id: black
5656
- repo: https://github.com/PyCQA/flake8

0 commit comments

Comments
 (0)