Compare commits

...
13 Commits
Author SHA1 Message Date
Henry Schreiner 1828c10ab3 Bump version: v4.2.0 2026-08-04 22:23:12 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 1ed6c225c9 [Bot] Update dependencies (#2960)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2026-08-04 22:19:16 -04:00
Matthieu Darbois 92e2145d80 feat: Python 3.15 build by default (#2944) 2026-08-04 20:26:00 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 3568a1cb9e [Bot] Update dependencies (#2952)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2026-08-04 19:46:48 -04:00
Hood Chathamandpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> 03cefa35ab feat: add pyodide_315 support (#2958)
* Add pyodide_315 support

Guarded by cpython_prerelease for the moment.

* Update

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update constraints to pyodide-build 0.39.0

* Update to 315.0.0a2

* Remove example versions

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-04 17:41:22 -04:00
Matthieu Darbois 73417aefe5 fix(tests): delete test_overridden_pip_constraint (#2957)
* fix: test_overridden_pip_constraint with pip>=26.2

* fix(tests): delete test_overridden_pip_constraint

This test is not needed since #2583 and will fail with pip>=26.2
2026-08-03 10:20:35 -04:00
Matthieu Darbois 3c603e4a4a fix: pin pip on GraalPy (#2955) 2026-08-03 06:58:53 +02:00
Matthieu Darbois f0b2156470 chore: use pp311 for test_abi3 (#2956)
this should be faster on Linux when PyPy is not enabled as a whole in CI
2026-08-03 06:58:36 +02:00
Henry Schreiner ffd2e18240 fix(schema): default is fine for pyodide too (#2951) 2026-08-02 07:49:12 -04:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dca67ee350 chore(deps): bump the actions group with 5 updates (#2954)
Bumps the actions group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [actions/setup-python](https://github.com/actions/setup-python) | `6.3.0` | `7.0.0` |
| [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `8.3.2` | `9.0.0` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.14.0` | `1.14.1` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.5` | `2.0.6` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.6.0` | `0.6.1` |


Updates `actions/setup-python` from 6.3.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/ece7cb06caefa5fff74198d8649806c4678c61a1...5fda3b95a4ea91299a34e894583c3862153e4b97)

Updates `astral-sh/setup-uv` from 8.3.2 to 9.0.0
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/11f9893b081a58869d3b5fccaea48c9e9e46f990...c771a70e6277c0a99b617c7a806ffedaca235ff9)

Updates `pypa/gh-action-pypi-publish` from 1.14.0 to 1.14.1
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/cef221092ed1bacb1cc03d23a2d87d1d172e277b...ba38be9e461d3875417946c167d0b5f3d385a247)

Updates `j178/prek-action` from 2.0.5 to 2.0.6
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](https://github.com/j178/prek-action/compare/e98a699c41eb69ab013a45817a0406469a748f8d...5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16)

Updates `zizmorcore/zizmor-action` from 0.6.0 to 0.6.1
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](https://github.com/zizmorcore/zizmor-action/compare/6599ee8b7a49aef6a770f63d261d214911a7ce02...6fc4b006235f201fdab3722e17240ab420d580e5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: astral-sh/setup-uv
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-02 07:04:49 +02:00
Henry Schreiner b2533d3833 fix: survive short network outages when downloading (#2953)
* fix: use exponential backoff when a download fails

The retry used a flat 3 second wait over 3 attempts, which covers only
about 6 seconds of downtime. A CI runner lost DNS for approximately a
minute and the PyPy download failed. Wait 3, 6, 12, 24, then 48 seconds
over 6 attempts.

Assisted-by: ClaudeCode:claude-opus-5

* ci: raise the uv HTTP retry count

uv stops after 3 retries, which was too few when a runner lost DNS for
approximately a minute during a test run.

Assisted-by: ClaudeCode:claude-opus-5

* fix: do not retry a download after a client error

A bad URL will not fix itself, and the longer backoff made the wait
before the report about 93 seconds. Report 4xx responses at once, and
keep retrying 5xx.

Assisted-by: ClaudeCode:claude-opus-5
2026-08-02 07:01:14 +02:00
Agriya Khetarpal f05f72d4c1 Update to Pyodide 314.0.3 (#2949) 2026-07-25 22:56:28 -04:00
dependabot[bot] 1e4eb55ef2 chore(deps): bump the actions group with 2 updates (#2948)
Signed-off-by: dependabot[bot] <support@github.com>
2026-07-26 02:49:36 +05:30
55 changed files with 1325 additions and 1029 deletions
+3 -3
View File
@@ -19,16 +19,16 @@ jobs:
contents: read contents: read
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with: with:
python-version: "3.x" python-version: "3.x"
allow-prereleases: true allow-prereleases: true
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Install tooling - name: Install tooling
run: | run: |
+2 -2
View File
@@ -13,7 +13,7 @@ jobs:
dist: dist:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
@@ -41,6 +41,6 @@ jobs:
with: with:
subject-path: "dist/cibuildwheel-*" subject-path: "dist/cibuildwheel-*"
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0 - uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
with: with:
attestations: true attestations: true
+26 -22
View File
@@ -34,19 +34,23 @@ concurrency:
group: test-${{ github.ref }} group: test-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
env:
# runners see short DNS/network outages; uv's default of 3 retries is too few
UV_HTTP_RETRIES: "6"
jobs: jobs:
lint: lint:
name: Linters (mypy, ruff, etc.) name: Linters (mypy, ruff, etc.)
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with: with:
python-version: "3.x" python-version: "3.x"
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: j178/prek-action@e98a699c41eb69ab013a45817a0406469a748f8d # v2.0.5 - uses: j178/prek-action@5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16 # v2.0.6
- name: PyLint checks - name: PyLint checks
run: uvx nox -s pylint -- --output-format=github run: uvx nox -s pylint -- --output-format=github
@@ -55,14 +59,14 @@ jobs:
needs: lint needs: lint
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
name: Install Python name: Install Python
with: with:
python-version: "3.x" python-version: "3.x"
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Install dependencies - name: Install dependencies
run: uv sync --no-dev --group test run: uv sync --no-dev --group test
- name: Generate a sample project - name: Generate a sample project
@@ -117,16 +121,16 @@ jobs:
test_select: android test_select: android
timeout-minutes: 180 timeout-minutes: 180
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
name: Install Python ${{ matrix.python_version }} name: Install Python ${{ matrix.python_version }}
with: with:
python-version: ${{ matrix.python_version }} python-version: ${{ matrix.python_version }}
allow-prereleases: true allow-prereleases: true
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Free up disk space - name: Free up disk space
if: runner.os == 'Linux' && matrix.test_select != 'android' if: runner.os == 'Linux' && matrix.test_select != 'android'
@@ -250,13 +254,13 @@ jobs:
outputs: outputs:
archs: ${{ steps.archs.outputs.archs }} archs: ${{ steps.archs.outputs.archs }}
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with: with:
python-version: "3.x" python-version: "3.x"
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Install dependencies - name: Install dependencies
run: uv sync --no-dev --group test run: uv sync --no-dev --group test
- name: Get qemu emulated architectures - name: Get qemu emulated architectures
@@ -275,13 +279,13 @@ jobs:
matrix: matrix:
arch: ${{ fromJSON(needs.emulated-archs.outputs.archs) }} arch: ${{ fromJSON(needs.emulated-archs.outputs.archs) }}
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with: with:
python-version: "3.x" python-version: "3.x"
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Install dependencies - name: Install dependencies
run: uv sync --no-dev --group test run: uv sync --no-dev --group test
@@ -299,14 +303,14 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
timeout-minutes: 180 timeout-minutes: 180
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
name: Install Python 3.12 name: Install Python 3.12
with: with:
python-version: '3.12' python-version: '3.12'
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- name: Install dependencies - name: Install dependencies
run: uv sync --no-dev --group test run: uv sync --no-dev --group test
@@ -324,13 +328,13 @@ jobs:
output-dir: wheelhouse output-dir: wheelhouse
env: env:
CIBW_PLATFORM: pyodide CIBW_PLATFORM: pyodide
CIBW_ENABLE: pyodide-prerelease CIBW_ENABLE: cpython-prerelease
- name: Run tests with 'CIBW_PLATFORM' set to 'pyodide' - name: Run tests with 'CIBW_PLATFORM' set to 'pyodide'
run: uv run --no-sync ./bin/run_tests.py run: uv run --no-sync ./bin/run_tests.py
env: env:
CIBW_PLATFORM: pyodide CIBW_PLATFORM: pyodide
CIBW_ENABLE: pyodide-prerelease CIBW_ENABLE: cpython-prerelease
test-uv-extras: test-uv-extras:
name: Test uv extra on ${{ matrix.os }} ${{ matrix.test_select }} name: Test uv extra on ${{ matrix.os }} ${{ matrix.test_select }}
@@ -351,7 +355,7 @@ jobs:
- os: macos-15 - os: macos-15
test_select: android test_select: android
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- name: Download a sample project - name: Download a sample project
+2 -2
View File
@@ -37,11 +37,11 @@ jobs:
permission-contents: write permission-contents: write
permission-pull-requests: write permission-pull-requests: write
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
with: with:
python-version: "3.14" python-version: "3.14"
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
permissions: permissions:
contents: write contents: write
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
+2 -2
View File
@@ -16,9 +16,9 @@ jobs:
security-events: write security-events: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- name: Run zizmor 🌈 - name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7 uses: zizmorcore/zizmor-action@6fc4b006235f201fdab3722e17240ab420d580e5 # v0.6.1
+1
View File
@@ -122,3 +122,4 @@ site/
# This file should be a symlink or contain "See @AGENTS.md" # This file should be a symlink or contain "See @AGENTS.md"
CLAUDE.md CLAUDE.md
.claude/
+29 -28
View File
@@ -22,25 +22,24 @@ What does it do?
While cibuildwheel itself requires a recent Python version to run (we support the last three releases), it can target the following versions to build wheels: While cibuildwheel itself requires a recent Python version to run (we support the last three releases), it can target the following versions to build wheels:
| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x | manylinux<br/>musllinux armv7l | Android | iOS | Pyodide | | | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x | manylinux<br/>musllinux armv7l | Android | iOS | Pyodide |
| ------------------------ | ----------- | ------------------- | ------------- | ------------- | -------------- | ------------------------------ | ---------------------------- | ------------------------------- | ------------------------------- | ----------------------------- | ------------------------------ | ------- | --- | -------------- | |--------------------| ----------- | ------------------- | ------------- | ------------- | -------------- | ------------------------------ | ---------------------------- | ------------------------------- | ------------------------------- | ----------------------------- | ------------------------------ | ------- | --- | -------------- |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A | | CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A | | CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A | | CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | N/A |
| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | ✅<sup>3</sup> | | CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | N/A | N/A | ✅<sup>3</sup> |
| CPython 3.13 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | ✅ | | CPython 3.13 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | ✅ |
| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | ✅ | | CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | ✅ |
| CPython 3.15<sup>5</sup> | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | N/A | | CPython 3.15 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>4</sup> | ✅ | ✅ | |
| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A | | PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A | | PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A | | PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A | | GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
<sup>**1** PyPy & GraalPy are only supported for manylinux wheels.</sup><br> <sup>**1** PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
<sup>**2** Windows arm64 support is experimental.</sup><br> <sup>**2** Windows arm64 support is experimental.</sup><br>
<sup>**3** Not supported on PyPI, uses old `pyodide` tag instead of `pyemscripten`. Requires `pyodide-eol` [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br> <sup>**3** Not supported on PyPI, uses old `pyodide` tag instead of `pyemscripten`. Requires `pyodide-eol` [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
<sup>**4** manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.</sup><br> <sup>**4** manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.</sup><br>
<sup>**5** Python 3.15 requires opt-in using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
- Builds manylinux, musllinux, macOS, Windows, pyemscripten, iOS, and Android wheels - Builds manylinux, musllinux, macOS, Windows, pyemscripten, iOS, and Android wheels
- Supports CPython, PyPy, and GraalPy - Supports CPython, PyPy, and GraalPy
@@ -98,7 +97,7 @@ jobs:
- uses: actions/setup-python@v6 - uses: actions/setup-python@v6
- name: Install cibuildwheel - name: Install cibuildwheel
run: python -m pip install cibuildwheel==4.1.1 run: python -m pip install cibuildwheel==4.2.0
- name: Build wheels - name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse run: python -m cibuildwheel --output-dir wheelhouse
@@ -239,6 +238,20 @@ Changelog
<!-- [[[cog from readme_changelog import mini_changelog; print(mini_changelog()) ]]] --> <!-- [[[cog from readme_changelog import mini_changelog; print(mini_changelog()) ]]] -->
### v4.2.0
_4 August 2026_
- 🌟 CPython 3.15 wheels are now built by default - without the `"cpython-prerelease"` [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) set. It's time to build and upload these wheels to PyPI! This release includes CPython 3.15.0rc1, which is guaranteed to be ABI compatible with the final release. (#2944)
- ✨ Adds Pyodide 3.15 support with the `cp315-pyodide_wasm32` build identifier, using Pyodide 315.0.0a2. These are also stable wrt. the final release. (#2958)
- 🐛 Retries a failed download six times with exponential backoff, so short network outages no longer stop a build. A `4xx` response is still reported at once. (#2953)
- 🐛 Accepts `default` as a [`build-frontend`](https://cibuildwheel.pypa.io/en/stable/options/#build-frontend) value on Pyodide, and accepts `pyodide-build` in the top-level table and in overrides (#2951)
- 🛠 Holds pip back on GraalPy, where newer pip breaks the build (#2955)
- 🛠 Updates Pyodide to 314.0.4 (#2949, #2952)
- 🛠 Updates dependencies and container pins (#2952, #2960)
- 💼 Updates CI action pins (#2948, #2954)
- 🧪 Uses pp311 for the abi3 test, and deletes `test_overridden_pip_constraint`, which is not necessary since #2583 (#2956, #2957)
### v4.1.1 ### v4.1.1
_24 July 2026_ _24 July 2026_
@@ -338,19 +351,7 @@ _2 April 2026_
- ✨ cibuildwheel prints the selected build identifiers at the start of the build. (#2785) - ✨ cibuildwheel prints the selected build identifiers at the start of the build. (#2785)
- 🔐 The GitHub Action now references other actions with a full SHA (#2744) - 🔐 The GitHub Action now references other actions with a full SHA (#2744)
### v3.4.0 <!-- [[[end]]] (sum: fEuiF50wvg) -->
_5 March 2026_
- 🌟 You can now build wheels using `uv` as a build frontend. This should improve performance, especially if your project has lots of build dependencies. To use, set [`build-frontend`](https://cibuildwheel.pypa.io/en/stable/options/#build-frontend) to `uv`. (#2322)
- ⚠️ We no longer support running on Travis CI. It may continue working but we don't run tests there anymore so we can't be sure. (#2682)
- ✨ Improvements to building rust wheels on Android (#2650)
- 🛠 Update Pyodide to 0.29.3 (#2719, #2733)
- 🐛 Fix bug with the GitHub Action on Windows, where PATH was getting unnecessarily changed, causing issues with meson builds. (#2723)
- ✨ Add support for quiet setting on `build` and `uv` from the cibuildwheel `build-verbosity` setting. (#2737)
- 📚 Docs updates, including guidance on using Meson on Windows (#2718)
<!-- [[[end]]] (sum: kQUcUVgqfM) -->
--- ---
+1 -1
View File
@@ -28,7 +28,7 @@ branding:
runs: runs:
using: composite using: composite
steps: steps:
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
id: python id: python
with: with:
python-version: "3.11 - 3.14" python-version: "3.11 - 3.14"
+53 -42
View File
@@ -35,7 +35,7 @@ $defs:
- pyodide-prerelease - pyodide-prerelease
- pypy - pypy
- pypy-eol - pypy-eol
description: A Python version or flavor to enable. description: A Python version or flavor to enable.
additionalProperties: false additionalProperties: false
description: cibuildwheel's settings. description: cibuildwheel's settings.
type: object type: object
@@ -62,29 +62,7 @@ properties:
default: ['*'] default: ['*']
description: Choose the Python versions to build. description: Choose the Python versions to build.
type: string_array type: string_array
build-frontend: build-frontend: {} # filled in by build_frontend_schema below
default: default
description: Set the tool to use to build, either "build" (default), "build[uv]", "uv", or "pip"
oneOf:
- enum: [pip, build, "build[uv]", uv, default]
- type: string
pattern: '^pip; ?args:'
- type: string
pattern: '^build; ?args:'
- type: string
pattern: '^build\\[uv\\]; ?args:'
- type: string
pattern: '^uv; ?args:'
- type: object
additionalProperties: false
required: [name]
properties:
name:
enum: [pip, build, "build[uv]", uv]
args:
type: array
items:
type: string
build-verbosity: build-verbosity:
type: integer type: integer
minimum: -3 minimum: -3
@@ -292,6 +270,43 @@ string_table = yaml.safe_load(
""" """
) )
FRONTENDS = ["pip", "build", "build[uv]", "uv"]
def build_frontend_schema(
names: list[str], description: str, default: str = "default"
) -> dict[str, Any]:
"""
A frontend is a name, a "name; args: ..." string, or a table with a name and args.
"""
# Only the brackets in "build[uv]" need escaping
patterns = [name.replace("[", r"\[").replace("]", r"\]") for name in names]
return {
"default": default,
"description": description,
"oneOf": [
{"enum": [*names, "default"]},
*({"type": "string", "pattern": f"^{pattern}; ?args:"} for pattern in patterns),
{
"type": "object",
"additionalProperties": False,
"required": ["name"],
"properties": {
"name": {"enum": names},
"args": {"type": "array", "items": {"type": "string"}},
},
},
],
"title": "CIBW_BUILD_FRONTEND",
}
schema["properties"]["build-frontend"] = build_frontend_schema(
[*FRONTENDS, "pyodide-build"],
'Set the tool to use to build, either "build" (default), "build[uv]", "uv", or "pip"'
' ("pyodide-build" for pyodide)',
)
for value in schema["properties"].values(): for value in schema["properties"].values():
match value: match value:
case {"type": "string_array"}: case {"type": "string_array"}:
@@ -393,24 +408,20 @@ for os_name, command in [
del oses["linux"]["properties"]["dependency-versions"] del oses["linux"]["properties"]["dependency-versions"]
oses["pyodide"]["properties"]["build-frontend"] = {
**schema["properties"]["build-frontend"], schema["$defs"]["build-frontend-no-pyodide"] = build_frontend_schema(
"default": "pyodide-build", FRONTENDS,
"description": 'On the pyodide platform, the build frontend must be "pyodide-build"', 'Set the tool to use to build, either "build" (default), "build[uv]", "uv", or "pip"',
"oneOf": [ )
{"enum": ["pyodide-build"]},
{"type": "string", "pattern": "^pyodide-build; ?args:"}, for os_val in oses.values():
{ os_val["properties"]["build-frontend"] = {"$ref": "#/$defs/build-frontend-no-pyodide"}
"type": "object",
"additionalProperties": False, oses["pyodide"]["properties"]["build-frontend"] = build_frontend_schema(
"required": ["name"], ["pyodide-build"],
"properties": { 'On the pyodide platform, the build frontend must be "pyodide-build"',
"name": {"enum": ["pyodide-build"]}, default="pyodide-build",
"args": {"type": "array", "items": {"type": "string"}}, )
},
},
],
}
schema["properties"]["overrides"] = overrides schema["properties"]["overrides"] = overrides
schema["properties"] |= oses schema["properties"] |= oses
+1 -1
View File
@@ -1 +1 @@
__version__ = "4.1.1" __version__ = "4.2.0"
+19 -18
View File
@@ -162,12 +162,12 @@ python_configurations = [
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" }, { identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" }, { identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" }, { identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp315-macosx_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315-macosx_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315-macosx_arm64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315-macosx_arm64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315-macosx_universal2", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315-macosx_universal2", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315t-macosx_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315t-macosx_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315t-macosx_arm64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315t-macosx_arm64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315t-macosx_universal2", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-macos11.pkg", sha256 = "6f1ed07cc92ed6e694b38b29d929a4e55190532fddb3828afe68d07cd4bf4aff" }, { identifier = "cp315t-macosx_universal2", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_x86_64.tar.gz", sha256 = "7ea762a1b0af7545a74cd4260bb3fd2812813deffef2ef8d2fddd5e03fa63ef1" }, { identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_x86_64.tar.gz", sha256 = "7ea762a1b0af7545a74cd4260bb3fd2812813deffef2ef8d2fddd5e03fa63ef1" },
{ identifier = "pp39-macosx_arm64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_arm64.tar.gz", sha256 = "b09ce3a865c1c0f4e58c0ee4f70511f1b27dfc1f7148f4b6060cfdfd581c9e82" }, { identifier = "pp39-macosx_arm64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_arm64.tar.gz", sha256 = "b09ce3a865c1c0f4e58c0ee4f70511f1b27dfc1f7148f4b6060cfdfd581c9e82" },
{ identifier = "pp310-macosx_x86_64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_x86_64.tar.gz", sha256 = "63f9d30cdd9e47cfe279be941975ac3d24e46c79756cd1d1bd2c551c27d8b32c" }, { identifier = "pp310-macosx_x86_64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_x86_64.tar.gz", sha256 = "63f9d30cdd9e47cfe279be941975ac3d24e46c79756cd1d1bd2c551c27d8b32c" },
@@ -194,10 +194,10 @@ python_configurations = [
{ identifier = "cp314t-win32", version = "3.14.6" }, { identifier = "cp314t-win32", version = "3.14.6" },
{ identifier = "cp314-win_amd64", version = "3.14.6" }, { identifier = "cp314-win_amd64", version = "3.14.6" },
{ identifier = "cp314t-win_amd64", version = "3.14.6" }, { identifier = "cp314t-win_amd64", version = "3.14.6" },
{ identifier = "cp315-win32", version = "3.15.0-b4" }, { identifier = "cp315-win32", version = "3.15.0-rc1" },
{ identifier = "cp315t-win32", version = "3.15.0-b4" }, { identifier = "cp315t-win32", version = "3.15.0-rc1" },
{ identifier = "cp315-win_amd64", version = "3.15.0-b4" }, { identifier = "cp315-win_amd64", version = "3.15.0-rc1" },
{ identifier = "cp315t-win_amd64", version = "3.15.0-b4" }, { identifier = "cp315t-win_amd64", version = "3.15.0-rc1" },
{ identifier = "cp39-win_arm64", version = "3.9.10" }, { identifier = "cp39-win_arm64", version = "3.9.10" },
{ identifier = "cp310-win_arm64", version = "3.10.11" }, { identifier = "cp310-win_arm64", version = "3.10.11" },
{ identifier = "cp311-win_arm64", version = "3.11.9" }, { identifier = "cp311-win_arm64", version = "3.11.9" },
@@ -205,8 +205,8 @@ python_configurations = [
{ identifier = "cp313-win_arm64", version = "3.13.14" }, { identifier = "cp313-win_arm64", version = "3.13.14" },
{ identifier = "cp314-win_arm64", version = "3.14.6" }, { identifier = "cp314-win_arm64", version = "3.14.6" },
{ identifier = "cp314t-win_arm64", version = "3.14.6" }, { identifier = "cp314t-win_arm64", version = "3.14.6" },
{ identifier = "cp315-win_arm64", version = "3.15.0-b4" }, { identifier = "cp315-win_arm64", version = "3.15.0-rc1" },
{ identifier = "cp315t-win_arm64", version = "3.15.0-b4" }, { identifier = "cp315t-win_arm64", version = "3.15.0-rc1" },
{ identifier = "pp39-win_amd64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip", sha256 = "06ec12a5e964dc0ad33e6f380185a4d295178dce6d6df512f508e7aee00a1323" }, { identifier = "pp39-win_amd64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip", sha256 = "06ec12a5e964dc0ad33e6f380185a4d295178dce6d6df512f508e7aee00a1323" },
{ identifier = "pp310-win_amd64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip", sha256 = "c0d07bba6c8fb4e5804f4a8b3f8ef07cc3d89f6ad1db42a45ffb9be60bbb7cc2" }, { identifier = "pp310-win_amd64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip", sha256 = "c0d07bba6c8fb4e5804f4a8b3f8ef07cc3d89f6ad1db42a45ffb9be60bbb7cc2" },
{ identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.23-win64.zip", sha256 = "948b8ea58dea5b9917210fe4afd242c788fbfaba1c3f1a25e696a404f703389a" }, { identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.23-win64.zip", sha256 = "948b8ea58dea5b9917210fe4afd242c788fbfaba1c3f1a25e696a404f703389a" },
@@ -217,7 +217,8 @@ python_configurations = [
python_configurations = [ python_configurations = [
{ identifier = "cp312-pyodide_wasm32", version = "3.12", default_pyodide_version = "0.27.7", node_version = "v22", sha256 = "0c2e7db42efa5d1dac38b50f8b3d659a1e3885d0a233494831b8206281307d52" }, { identifier = "cp312-pyodide_wasm32", version = "3.12", default_pyodide_version = "0.27.7", node_version = "v22", sha256 = "0c2e7db42efa5d1dac38b50f8b3d659a1e3885d0a233494831b8206281307d52" },
{ identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.4", node_version = "v22", sha256 = "a29fc4a076408a18fc29eb4b280f80c6dddc95c19514c874c29e590d0931c02a" }, { identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.4", node_version = "v22", sha256 = "a29fc4a076408a18fc29eb4b280f80c6dddc95c19514c874c29e590d0931c02a" },
{ identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.2", node_version = "v24", sha256 = "01ab1b229bf2031603bf20ad4ceb9c1059ba680b26df7bda2db4748906dfd78a" }, { identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.4", node_version = "v24", sha256 = "257ceae085eaa1423c2ab49794d7a72bf36ddad475d126fa929791b9a8ab7289" },
{ identifier = "cp315-pyodide_wasm32", version = "3.15", default_pyodide_version = "315.0.0a2", node_version = "v24", sha256 = "d7c0d6ddf0fce807668d7413d0e0f20fbc7922128ba8361ed71d9cff048cb96a" },
] ]
[android] [android]
@@ -226,8 +227,8 @@ python_configurations = [
{ identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.14/python-3.13.14-x86_64-linux-android.tar.gz", sha256 = "9d96f7e077677b6651b2e756034ed41ab4479f5f8bf3168a814f458bc2ac137e" }, { identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.14/python-3.13.14-x86_64-linux-android.tar.gz", sha256 = "9d96f7e077677b6651b2e756034ed41ab4479f5f8bf3168a814f458bc2ac137e" },
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-aarch64-linux-android.tar.gz", sha256 = "38bbe77d3167b5cd554e03b1021324926f09f3825202b065951dd7638e9c37e5" }, { identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-aarch64-linux-android.tar.gz", sha256 = "38bbe77d3167b5cd554e03b1021324926f09f3825202b065951dd7638e9c37e5" },
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-x86_64-linux-android.tar.gz", sha256 = "e04eb26607627e68d148f89de793372f54a345c91b13628567f24abcdd3bfa3e" }, { identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-x86_64-linux-android.tar.gz", sha256 = "e04eb26607627e68d148f89de793372f54a345c91b13628567f24abcdd3bfa3e" },
{ identifier = "cp315-android_arm64_v8a", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b2-aarch64-linux-android.tar.gz", sha256 = "de5e36ffc3c33b63a1ed53fe83db4dee16b003a3180ac35e5c4c203d3750e076" }, { identifier = "cp315-android_arm64_v8a", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-aarch64-linux-android.tar.gz", sha256 = "7d6fb28a69368841656f919a08141b0e3720837ac67987388037ee9d2a5c5492" },
{ identifier = "cp315-android_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b2-x86_64-linux-android.tar.gz", sha256 = "e05ef9c142ea83b41b194b16014ffe2249d27783313c3b00b97f6c93d9a56b92" }, { identifier = "cp315-android_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-x86_64-linux-android.tar.gz", sha256 = "f048f5c60b538efc64e4c26399a0a21202ce430949d5b2c10369d624548a5dc3" },
] ]
[ios] [ios]
@@ -238,7 +239,7 @@ python_configurations = [
{ identifier = "cp314-ios_arm64_iphoneos", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" }, { identifier = "cp314-ios_arm64_iphoneos", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" },
{ identifier = "cp314-ios_x86_64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" }, { identifier = "cp314-ios_x86_64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" },
{ identifier = "cp314-ios_arm64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" }, { identifier = "cp314-ios_arm64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b10/Python-3.14-iOS-support.b10.tar.gz", sha256 = "200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583" },
{ identifier = "cp315-ios_arm64_iphoneos", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-iOS-XCframework.tar.gz", sha256 = "dbf1095502e0b4a0dc2a4d96ae1b1d92ee8c0b7bea773862f7124ede0017e3dc" }, { identifier = "cp315-ios_arm64_iphoneos", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-iOS-XCframework.tar.gz", sha256 = "178bf7bef9cd0f18b27cacb98b14332a5ba44c9427543ffb71f8809bc1f11c3c" },
{ identifier = "cp315-ios_x86_64_iphonesimulator", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-iOS-XCframework.tar.gz", sha256 = "dbf1095502e0b4a0dc2a4d96ae1b1d92ee8c0b7bea773862f7124ede0017e3dc" }, { identifier = "cp315-ios_x86_64_iphonesimulator", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-iOS-XCframework.tar.gz", sha256 = "178bf7bef9cd0f18b27cacb98b14332a5ba44c9427543ffb71f8809bc1f11c3c" },
{ identifier = "cp315-ios_arm64_iphonesimulator", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0b4-iOS-XCframework.tar.gz", sha256 = "dbf1095502e0b4a0dc2a4d96ae1b1d92ee8c0b7bea773862f7124ede0017e3dc" }, { identifier = "cp315-ios_arm64_iphonesimulator", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-iOS-XCframework.tar.gz", sha256 = "178bf7bef9cd0f18b27cacb98b14332a5ba44c9427543ffb71f8809bc1f11c3c" },
] ]
+72 -10
View File
@@ -18,9 +18,64 @@
"pyodide-prerelease", "pyodide-prerelease",
"pypy", "pypy",
"pypy-eol" "pypy-eol"
] ],
"description": "A Python version or flavor to enable."
}, },
"description": "A Python version or flavor to enable." "build-frontend-no-pyodide": {
"default": "default",
"description": "Set the tool to use to build, either \"build\" (default), \"build[uv]\", \"uv\", or \"pip\"",
"oneOf": [
{
"enum": [
"pip",
"build",
"build[uv]",
"uv",
"default"
]
},
{
"type": "string",
"pattern": "^pip; ?args:"
},
{
"type": "string",
"pattern": "^build; ?args:"
},
{
"type": "string",
"pattern": "^build\\[uv\\]; ?args:"
},
{
"type": "string",
"pattern": "^uv; ?args:"
},
{
"type": "object",
"additionalProperties": false,
"required": [
"name"
],
"properties": {
"name": {
"enum": [
"pip",
"build",
"build[uv]",
"uv"
]
},
"args": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
],
"title": "CIBW_BUILD_FRONTEND"
}
}, },
"additionalProperties": false, "additionalProperties": false,
"description": "cibuildwheel's settings.", "description": "cibuildwheel's settings.",
@@ -136,7 +191,7 @@
}, },
"build-frontend": { "build-frontend": {
"default": "default", "default": "default",
"description": "Set the tool to use to build, either \"build\" (default), \"build[uv]\", \"uv\", or \"pip\"", "description": "Set the tool to use to build, either \"build\" (default), \"build[uv]\", \"uv\", or \"pip\" (\"pyodide-build\" for pyodide)",
"oneOf": [ "oneOf": [
{ {
"enum": [ "enum": [
@@ -144,6 +199,7 @@
"build", "build",
"build[uv]", "build[uv]",
"uv", "uv",
"pyodide-build",
"default" "default"
] ]
}, },
@@ -163,6 +219,10 @@
"type": "string", "type": "string",
"pattern": "^uv; ?args:" "pattern": "^uv; ?args:"
}, },
{
"type": "string",
"pattern": "^pyodide-build; ?args:"
},
{ {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -175,7 +235,8 @@
"pip", "pip",
"build", "build",
"build[uv]", "build[uv]",
"uv" "uv",
"pyodide-build"
] ]
}, },
"args": { "args": {
@@ -894,7 +955,7 @@
"$ref": "#/properties/before-test" "$ref": "#/properties/before-test"
}, },
"build-frontend": { "build-frontend": {
"$ref": "#/properties/build-frontend" "$ref": "#/$defs/build-frontend-no-pyodide"
}, },
"build-verbosity": { "build-verbosity": {
"$ref": "#/properties/build-verbosity" "$ref": "#/properties/build-verbosity"
@@ -1033,7 +1094,7 @@
"$ref": "#/properties/before-test" "$ref": "#/properties/before-test"
}, },
"build-frontend": { "build-frontend": {
"$ref": "#/properties/build-frontend" "$ref": "#/$defs/build-frontend-no-pyodide"
}, },
"build-verbosity": { "build-verbosity": {
"$ref": "#/properties/build-verbosity" "$ref": "#/properties/build-verbosity"
@@ -1118,7 +1179,7 @@
"$ref": "#/properties/before-test" "$ref": "#/properties/before-test"
}, },
"build-frontend": { "build-frontend": {
"$ref": "#/properties/build-frontend" "$ref": "#/$defs/build-frontend-no-pyodide"
}, },
"build-verbosity": { "build-verbosity": {
"$ref": "#/properties/build-verbosity" "$ref": "#/properties/build-verbosity"
@@ -1208,7 +1269,8 @@
"oneOf": [ "oneOf": [
{ {
"enum": [ "enum": [
"pyodide-build" "pyodide-build",
"default"
] ]
}, },
{ {
@@ -1308,7 +1370,7 @@
"$ref": "#/properties/before-test" "$ref": "#/properties/before-test"
}, },
"build-frontend": { "build-frontend": {
"$ref": "#/properties/build-frontend" "$ref": "#/$defs/build-frontend-no-pyodide"
}, },
"build-verbosity": { "build-verbosity": {
"$ref": "#/properties/build-verbosity" "$ref": "#/properties/build-verbosity"
@@ -1393,7 +1455,7 @@
"$ref": "#/properties/before-test" "$ref": "#/properties/before-test"
}, },
"build-frontend": { "build-frontend": {
"$ref": "#/properties/build-frontend" "$ref": "#/$defs/build-frontend-no-pyodide"
}, },
"build-verbosity": { "build-verbosity": {
"$ref": "#/properties/build-verbosity" "$ref": "#/properties/build-verbosity"
@@ -1,14 +1,21 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# nox -s update_constraints # nox -s update_constraints
annotated-types==0.7.0 attrs==26.1.0
# via pydantic # via
# cattrs
# pyodide-build
# pyodide-lock
auditwheel-emscripten==0.2.5 auditwheel-emscripten==0.2.5
# via pyodide-build # via pyodide-build
build==1.5.0 build==1.5.0
# via # via
# -r .nox/update_constraints/tmp/constraints-pyodide.in # -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build # pyodide-build
certifi==2026.6.17 cattrs==26.1.0
# via
# pyodide-build
# pyodide-lock
certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -19,7 +26,7 @@ click==8.1.8
# pyodide-cli # pyodide-cli
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -31,38 +38,31 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# build # build
# pyodide-build # pyodide-build
# wheel # wheel
pip==26.1.2 pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# pyodide-build # pyodide-build
# python-discovery
# virtualenv # virtualenv
pydantic==2.13.4
# via
# pyodide-build
# pyodide-lock
pydantic-core==2.46.4
# via pydantic
pygments==2.20.0 pygments==2.20.0
# via rich # via rich
pyodide-build==0.36.0 pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0 pyodide-cli==0.5.0
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# pyodide-build # pyodide-build
pyodide-lock==0.1.3 pyodide-lock==0.2.0
# via pyodide-build # via pyodide-build
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via pyodide-build # via pyodide-build
@@ -73,15 +73,10 @@ rich==15.0.0
ruamel-yaml==0.19.1 ruamel-yaml==0.19.1
# via pyodide-build # via pyodide-build
typing-extensions==4.16.0 typing-extensions==4.16.0
# via # via cattrs
# pydantic
# pydantic-core
# typing-inspection
typing-inspection==0.4.2
# via pydantic
urllib3==2.7.0 urllib3==2.7.0
# via requests # via requests
virtualenv==21.6.1 virtualenv==21.7.1
# via # via
# build # build
# pyodide-build # pyodide-build
@@ -1,14 +1,21 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# nox -s update_constraints # nox -s update_constraints
annotated-types==0.7.0 attrs==26.1.0
# via pydantic # via
# cattrs
# pyodide-build
# pyodide-lock
auditwheel-emscripten==0.2.5 auditwheel-emscripten==0.2.5
# via pyodide-build # via pyodide-build
build==1.5.0 build==1.5.0
# via # via
# -r .nox/update_constraints/tmp/constraints-pyodide.in # -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build # pyodide-build
certifi==2026.6.17 cattrs==26.1.0
# via
# pyodide-build
# pyodide-lock
certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -19,7 +26,7 @@ click==8.1.8
# pyodide-cli # pyodide-cli
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -31,38 +38,31 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# build # build
# pyodide-build # pyodide-build
# wheel # wheel
pip==26.1.2 pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# pyodide-build # pyodide-build
# python-discovery
# virtualenv # virtualenv
pydantic==2.13.4
# via
# pyodide-build
# pyodide-lock
pydantic-core==2.46.4
# via pydantic
pygments==2.20.0 pygments==2.20.0
# via rich # via rich
pyodide-build==0.36.0 pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0 pyodide-cli==0.5.0
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# pyodide-build # pyodide-build
pyodide-lock==0.1.3 pyodide-lock==0.2.0
# via pyodide-build # via pyodide-build
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via pyodide-build # via pyodide-build
@@ -73,15 +73,10 @@ rich==15.0.0
ruamel-yaml==0.19.1 ruamel-yaml==0.19.1
# via pyodide-build # via pyodide-build
typing-extensions==4.16.0 typing-extensions==4.16.0
# via # via cattrs
# pydantic
# pydantic-core
# typing-inspection
typing-inspection==0.4.2
# via pydantic
urllib3==2.7.0 urllib3==2.7.0
# via requests # via requests
virtualenv==21.6.1 virtualenv==21.7.1
# via # via
# build # build
# pyodide-build # pyodide-build
@@ -1,14 +1,21 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# nox -s update_constraints # nox -s update_constraints
annotated-types==0.7.0 attrs==26.1.0
# via pydantic # via
# cattrs
# pyodide-build
# pyodide-lock
auditwheel-emscripten==0.2.5 auditwheel-emscripten==0.2.5
# via pyodide-build # via pyodide-build
build==1.5.0 build==1.5.0
# via # via
# -r .nox/update_constraints/tmp/constraints-pyodide.in # -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build # pyodide-build
certifi==2026.6.17 cattrs==26.1.0
# via
# pyodide-build
# pyodide-lock
certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -19,7 +26,7 @@ click==8.1.8
# pyodide-cli # pyodide-cli
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -31,38 +38,31 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# build # build
# pyodide-build # pyodide-build
# wheel # wheel
pip==26.1.2 pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# pyodide-build # pyodide-build
# python-discovery
# virtualenv # virtualenv
pydantic==2.13.4
# via
# pyodide-build
# pyodide-lock
pydantic-core==2.46.4
# via pydantic
pygments==2.20.0 pygments==2.20.0
# via rich # via rich
pyodide-build==0.36.0 pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0 pyodide-cli==0.5.0
# via # via
# auditwheel-emscripten # auditwheel-emscripten
# pyodide-build # pyodide-build
pyodide-lock==0.1.3 pyodide-lock==0.2.0
# via pyodide-build # via pyodide-build
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via pyodide-build # via pyodide-build
@@ -73,15 +73,10 @@ rich==15.0.0
ruamel-yaml==0.19.1 ruamel-yaml==0.19.1
# via pyodide-build # via pyodide-build
typing-extensions==4.16.0 typing-extensions==4.16.0
# via # via cattrs
# pydantic
# pydantic-core
# typing-inspection
typing-inspection==0.4.2
# via pydantic
urllib3==2.7.0 urllib3==2.7.0
# via requests # via requests
virtualenv==21.6.1 virtualenv==21.7.1
# via # via
# build # build
# pyodide-build # pyodide-build
@@ -0,0 +1,86 @@
# This file was autogenerated by uv via the following command:
# nox -s update_constraints
attrs==26.1.0
# via
# cattrs
# pyodide-build
# pyodide-lock
auditwheel-emscripten==0.2.5
# via pyodide-build
build==1.5.0
# via
# -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build
cattrs==26.1.0
# via
# pyodide-build
# pyodide-lock
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
# via requests
click==8.1.8
# via
# -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build
# pyodide-cli
distlib==0.4.3
# via virtualenv
filelock==3.32.2
# via
# python-discovery
# virtualenv
idna==3.18
# via requests
leb128==1.0.9
# via auditwheel-emscripten
markdown-it-py==4.2.0
# via rich
mdurl==0.1.2
# via markdown-it-py
packaging==26.3
# via
# auditwheel-emscripten
# build
# pyodide-build
# wheel
pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.11.0
# via
# pyodide-build
# virtualenv
pygments==2.20.0
# via rich
pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0
# via
# auditwheel-emscripten
# pyodide-build
pyodide-lock==0.2.0
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
# via virtualenv
requests==2.34.2
# via pyodide-build
rich==15.0.0
# via
# pyodide-build
# pyodide-cli
ruamel-yaml==0.19.1
# via pyodide-build
typing-extensions==4.16.0
# via cattrs
urllib3==2.7.0
# via requests
virtualenv==21.7.1
# via
# build
# pyodide-build
wheel==0.47.0
# via
# auditwheel-emscripten
# pyodide-build
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -28,7 +28,7 @@ distlib==0.4.3
# via virtualenv # via virtualenv
exceptiongroup==1.3.1 exceptiongroup==1.3.1
# via cattrs # via cattrs
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -46,7 +46,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -58,13 +58,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -75,7 +74,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -99,7 +98,7 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
zipp==4.1.0 zipp==4.1.0
# via importlib-metadata # via importlib-metadata
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -42,7 +42,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -54,13 +54,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -71,7 +70,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -91,5 +90,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1; implementation_name != "graalpy" filelock==3.32.2; implementation_name != "graalpy"
filelock==3.29.7; implementation_name == "graalpy" filelock==3.29.7; implementation_name == "graalpy"
# via # via
# python-discovery # python-discovery
@@ -43,7 +43,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -55,14 +55,14 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2; implementation_name != "graalpy" or platform_system != "Windows" pip==26.2.1; implementation_name != "graalpy"
pip==26.1.2; implementation_name == "graalpy" and platform_system != "Windows"
pip==26.0.1; implementation_name == "graalpy" and platform_system == "Windows" pip==26.0.1; implementation_name == "graalpy" and platform_system == "Windows"
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -73,7 +73,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -93,5 +93,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -42,7 +42,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -54,13 +54,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -71,7 +70,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -91,5 +90,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -42,7 +42,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -54,13 +54,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -71,7 +70,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -91,5 +90,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -42,7 +42,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -54,13 +54,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -71,7 +70,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -91,5 +90,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -16,7 +16,7 @@ build==1.4.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==25.3.0 cattrs==25.3.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -66,7 +66,6 @@ pkgconf==2.4.3.post2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.4.0 platformdirs==4.4.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.32 pyelftools==0.32
@@ -77,7 +76,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.32.5 requests==2.32.5
# via # via
@@ -101,7 +100,7 @@ urllib3==2.6.3
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
zipp==3.23.1 zipp==3.23.1
# via importlib-metadata # via importlib-metadata
+7 -8
View File
@@ -16,7 +16,7 @@ build==1.5.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
cattrs==26.1.0 cattrs==26.1.0
# via requests-cache # via requests-cache
certifi==2026.6.17 certifi==2026.7.22
# via requests # via requests
charset-normalizer==3.4.9 charset-normalizer==3.4.9
# via requests # via requests
@@ -26,7 +26,7 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.4.3 distlib==0.4.3
# via virtualenv # via virtualenv
filelock==3.31.1 filelock==3.32.2
# via # via
# python-discovery # python-discovery
# virtualenv # virtualenv
@@ -42,7 +42,7 @@ markdown-it-py==4.2.0
# via rich # via rich
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
packaging==26.2 packaging==26.3
# via # via
# abi3audit # abi3audit
# auditwheel # auditwheel
@@ -54,13 +54,12 @@ pefile==2024.8.26
# via # via
# abi3audit # abi3audit
# delvewheel # delvewheel
pip==26.1.2 pip==26.2.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0 pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.10.1 platformdirs==4.11.0
# via # via
# python-discovery
# requests-cache # requests-cache
# virtualenv # virtualenv
pyelftools==0.33 pyelftools==0.33
@@ -71,7 +70,7 @@ pygments==2.20.0
# via rich # via rich
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
python-discovery==1.4.4 python-discovery==1.5.1
# via virtualenv # via virtualenv
requests==2.34.2 requests==2.34.2
# via # via
@@ -91,5 +90,5 @@ urllib3==2.7.0
# via # via
# requests # requests
# requests-cache # requests-cache
virtualenv==21.6.1 virtualenv==21.7.1
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
+2 -2
View File
@@ -1,4 +1,4 @@
url = "https://nodejs.org/dist/" url = "https://nodejs.org/dist/"
v24 = "v24.18.0" v24 = "v24.19.0"
v22 = "v22.23.1" v22 = "v22.23.2"
v20 = "v20.20.2" v20 = "v20.20.2"
+34 -34
View File
@@ -1,54 +1,54 @@
[x86_64] [x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:0d25b049964b2549b83384036abdff06789a8c0b1e9ff003ec80f0d531f79e50 # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:c163a278006f45883c117b4166b93cdc7b574b62e58292ed9e52879579841d77 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:a61875a2f84cab7df8de222ff12cabc08ff86eb4ad402ac90ba7bdaed9600cca # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:012f4a50472412f18bb2b450c1cce7158434cfae4ae878591c2748a13a30c2be # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:b6e1f264da7bf4e8db3e6a625ea1ecaf1e52290253df8588f71e4a9e50a85a17 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:db817cd4c670f1191d74db6a94a0b115954af78861db7da660de4e93ebf2984c # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64@sha256:fd0694e23637ae8d13433c58f647aba1aae5de4fd50350201307be453a8b2ff4 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64@sha256:f130bd3e3aebb39abcdec28a89f987f0d31b52d74bac5852318303698e9a5033 # 2026.08.04-1
[i686] [i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:9833ed0665e4bd2aceeda6f7ea81b69c75a941464b659edf62c98aa63526d1ba # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:abfc526a4f9d9692ed6d53b60ffd6be764aa7a4dc1d61522a1ce5ea64138aa53 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:3a4de216ae551c1cbb8f93d4bbf9faebe7fb16a67afa3380b9a3ed2cc7b80fcf # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:605a71b7fa720562ad76147860e33d97b2a884ca9d5a454b2f7f353caec40ded # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:1fc55618156152a6570991a6ee81038fd507b48c41cbdede495931146b074869 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:82e74fcb11aa1d425260804292b8a25533f37eda280570b2441a465dc159351a # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686@sha256:a85be8fc5aa7fa291b8bee5647469d3d48dd26600cc7295553ff47ca60906ff2 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686@sha256:2ccf31ab3685cf8952f2d9251f79a29c7ffcb663bbc58c10b2317a15a86ac96d # 2026.08.04-1
[aarch64] [aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:ae34a6ceeefe0b535c525b2e96f297311c8f1e01cfd8b9be5f647eece5b5c60b # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:5d366450eeff9abe09cc93db50fd2c9832bafaf473daa7a911d8b184424bbefd # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:162c81dfd3efc710732a571717d3c916a6945ebf279e879ddee3243af96fe46f # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:52e4da6e9348db7cd0b529a827623b62b7c1fe867ba515ae752fa13d41f7f46e # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:ae032906c631ad572a91bcc9545023d327822912957ae85a57c85181836662b6 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:86585a1adfa6cdb4e3aea2f5bf11d6fffa37acf17aa902605d7237c55d3c88ce # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64@sha256:e6ac3eca5f7d2cd5b8267b94b65d9a693e7ba06f5ba4c6643b1b0e6f9ae2cde3 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64@sha256:1fa8dcacab5e13769abb36028f98bd2c0a1af4dbde492505f774d7f0ce01e87f # 2026.08.04-1
[ppc64le] [ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le@sha256:7e311ceece0fd3faa54a8539fb0b7906ee2ac068ecc39095e48ed1097312eaa0 # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_ppc64le@sha256:405ac40dffd7a76b4864a185d0440c6449c855eaffd1a20b56af9e4cc15318a6 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le@sha256:32ec597dd87e27980750115a6c020cae54fd17386e18d86d695e35e6b3a3e0da # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le@sha256:ad99a0b35b8820b0ccd1d117e23097da224df11c98f19e2783735d5b7e717526 # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le@sha256:7f649dea6f31fbc4ca6d665e78e87a192b55e739c44ed9965129956be77c4e3d # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le@sha256:bc61f200bea02d2a507bb292d6210297bd12abc71fa1e8e1f05b1755495b8518 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le@sha256:d59ad21615cf5b83cc9046cf7c44d07e8ef1247333e8a72147d7c781008605c1 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le@sha256:0acbe90fc63807d3ce52249d1d21e5625fe105aee7f3de60583b8485d82401c8 # 2026.08.04-1
[s390x] [s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x@sha256:e392818123219665c259c9a5e389cecd978918dc279fe8e3542864f1067b9cdb # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_s390x@sha256:3797dba7137e416c67ca1f45222dd382a2bfdaee8c751e95a79503adf38071e7 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x@sha256:9c4f347bc43b1b799a296f6801a8845af132fa6f919cc6237b889c8d2e16ae01 # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x@sha256:43b1c58ab1a37f3bf45d65026c968be18f2a4dddd4f923291d1122b3e42380da # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x@sha256:37fe79ec71fed0eaa4d6edfb22244699877e3cd92a2ca4679bf9e4fd5f45c61d # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x@sha256:b9bba263ab1309ddd2b41560f8ea15138fdb31fa31daf5858878d00b19d57d77 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x@sha256:e29d28c68a0bd4594fd41cb2435ca64388038b05c24e77b34f186ff90a2968c4 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x@sha256:aec126e37ce315e724217342bb62533cbfeae88b4ed5aa2a8bfd5ee4a4a1ca77 # 2026.08.04-1
[pypy_x86_64] [pypy_x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:0d25b049964b2549b83384036abdff06789a8c0b1e9ff003ec80f0d531f79e50 # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:c163a278006f45883c117b4166b93cdc7b574b62e58292ed9e52879579841d77 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:a61875a2f84cab7df8de222ff12cabc08ff86eb4ad402ac90ba7bdaed9600cca # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:012f4a50472412f18bb2b450c1cce7158434cfae4ae878591c2748a13a30c2be # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:b6e1f264da7bf4e8db3e6a625ea1ecaf1e52290253df8588f71e4a9e50a85a17 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:db817cd4c670f1191d74db6a94a0b115954af78861db7da660de4e93ebf2984c # 2026.08.04-1
[pypy_i686] [pypy_i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:9833ed0665e4bd2aceeda6f7ea81b69c75a941464b659edf62c98aa63526d1ba # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:abfc526a4f9d9692ed6d53b60ffd6be764aa7a4dc1d61522a1ce5ea64138aa53 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:3a4de216ae551c1cbb8f93d4bbf9faebe7fb16a67afa3380b9a3ed2cc7b80fcf # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:605a71b7fa720562ad76147860e33d97b2a884ca9d5a454b2f7f353caec40ded # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:1fc55618156152a6570991a6ee81038fd507b48c41cbdede495931146b074869 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:82e74fcb11aa1d425260804292b8a25533f37eda280570b2441a465dc159351a # 2026.08.04-1
[pypy_aarch64] [pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:ae34a6ceeefe0b535c525b2e96f297311c8f1e01cfd8b9be5f647eece5b5c60b # 2026.07.19-1 manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:5d366450eeff9abe09cc93db50fd2c9832bafaf473daa7a911d8b184424bbefd # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:162c81dfd3efc710732a571717d3c916a6945ebf279e879ddee3243af96fe46f # 2026.07.19-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:52e4da6e9348db7cd0b529a827623b62b7c1fe867ba515ae752fa13d41f7f46e # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:ae032906c631ad572a91bcc9545023d327822912957ae85a57c85181836662b6 # 2026.07.19-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:86585a1adfa6cdb4e3aea2f5bf11d6fffa37acf17aa902605d7237c55d3c88ce # 2026.08.04-1
[armv7l] [armv7l]
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l@sha256:a58ece566251a37b3b4cd17d7ef85d88df05f80670c7dfe80c1b1ffe4cd00bf8 # 2026.07.19-1 manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l@sha256:bbd7f67c0fc2a9541ed462a41bd9abbfa696801483533ba44ec5fe3120e8cda6 # 2026.08.04-1
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l@sha256:c8dba9616907a810e2668afb88153bf47a84422933733dbf4ea7b561af5e8d1e # 2026.07.19-1 manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l@sha256:1335af18598960ecc4b57ccf239cacbca847af9f197e65e495ba376d0178385a # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l@sha256:d87cbc211df71486a6a90fb2bece474166f3e2dcf81bbfc4be07607fd64185b0 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l@sha256:fd4998e62ec4476d76d7b180b523e21ac7557d7f41f1b1e7d02ced21a3eee8b5 # 2026.08.04-1
[riscv64] [riscv64]
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64@sha256:04b3acc69a6cebb10ac1252587d202acce6445d91c783d3f92229bb2b2483069 # 2026.07.19-1 manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64@sha256:41197d59628c256b0fde14a5dd5bb306e17665c515a8385e43cc72c1da1d7866 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64@sha256:2d36623ffc59785e124ecf2992456847baaf2f2e0a87e64d23f2f6a69e5a0357 # 2026.07.19-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64@sha256:aaf12357d794dc375e797dce7fd71e92013bc46f269bc4cffe4da1f188080afb # 2026.08.04-1
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1 +1 @@
default = { version = "21.6.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.6.1/virtualenv.pyz", sha256 = "32490c6eea415c3a8f44ee112bbef07bc7b70a0aba706672240c6c66d4f7d9cc" } default = { version = "21.7.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.7.1/virtualenv.pyz", sha256 = "d63ac10e610738c3dcfa51ee0799e6b69ce2964d76cab734542684baf0ed3a5f" }
+1 -14
View File
@@ -92,7 +92,7 @@ class BuildSelector:
return False return False
# filter out groups that are not enabled # filter out groups that are not enabled
if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp315*"): if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp316*"):
return False return False
is_pypy_eol = fnmatch(build_id, "pp3?-*") or fnmatch(build_id, "pp310-*") is_pypy_eol = fnmatch(build_id, "pp3?-*") or fnmatch(build_id, "pp310-*")
is_pypy = fnmatch(build_id, "pp*") and not is_pypy_eol is_pypy = fnmatch(build_id, "pp*") and not is_pypy_eol
@@ -104,19 +104,6 @@ class BuildSelector:
return False return False
if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodide_*"): if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodide_*"):
return False return False
# NOTE: Re-enable this when we have a new Pyodide prerelease (e.g., 315.0.0a1+)
# When doing this, also:
# 1. update Pyodide tests in unit_test/build_selector_test.py and unit_test/options_test.py accordingly.
# 2. update Python versions for Pyodide identifiers in cibuildwheel/selector.py.
# 3. update constraints as necessary via bin/generate_pyodide_constraints.py and add/delete
# Pyodide constraints files in cibuildwheel/resources/constraints/ as necessary.
# When re-enabling, update the pattern to match the experimental Python version when
# it is bumped to Python 3.15 (likely cp315-pyodide_*).
# This depends on the CPython version being used in the Pyodide runtime at the time.
# if EnableGroup.PyodidePrerelease not in self.enable and fnmatch(
# build_id, "cp315-pyodide_*"
# ):
# return False
should_build = selector_matches(self.build_config, build_id) should_build = selector_matches(self.build_config, build_id)
should_skip = selector_matches(self.skip_config, build_id) should_skip = selector_matches(self.skip_config, build_id)
+11 -2
View File
@@ -9,6 +9,7 @@ __lazy_modules__ = {
"tarfile", "tarfile",
"typing", "typing",
"urllib", "urllib",
"urllib.error",
"urllib.request", "urllib.request",
"zipfile", "zipfile",
} }
@@ -20,6 +21,7 @@ import shutil
import ssl import ssl
import tarfile import tarfile
import time import time
import urllib.error
import urllib.request import urllib.request
from contextlib import contextmanager from contextlib import contextmanager
from pathlib import Path, PurePath from pathlib import Path, PurePath
@@ -86,17 +88,24 @@ def download(url: str, dest: Path, *, sha256: str | None = None) -> None:
# so we use certifi (this sounds odd but requests also does this by default) # so we use certifi (this sounds odd but requests also does this by default)
cafile = os.environ.get("SSL_CERT_FILE", certifi.where()) cafile = os.environ.get("SSL_CERT_FILE", certifi.where())
context = ssl.create_default_context(cafile=cafile) context = ssl.create_default_context(cafile=cafile)
repeat_num = 3 # exponential backoff, so that a network outage of about a minute is survivable
repeat_num = 6
for i in range(repeat_num): for i in range(repeat_num):
try: try:
with urllib.request.urlopen(url, context=context) as response: with urllib.request.urlopen(url, context=context) as response:
dest.write_bytes(response.read()) dest.write_bytes(response.read())
break break
except urllib.error.HTTPError as error:
# a client error, such as a bad URL, will not fix itself
if i == repeat_num - 1 or 400 <= error.code < 500:
raise
time.sleep(3 * 2**i)
except OSError: except OSError:
if i == repeat_num - 1: if i == repeat_num - 1:
raise raise
time.sleep(3) time.sleep(3 * 2**i)
if sha256: if sha256:
with dest.open("rb") as f: with dest.open("rb") as f:
+47 -51
View File
@@ -1,6 +1,6 @@
# Maintaining Pyodide support # Maintaining Pyodide support
Last updated: May 2026 Last updated: August 2026
This page describes how to update cibuildwheel's Pyodide platform code when either: This page describes how to update cibuildwheel's Pyodide platform code when either:
@@ -11,17 +11,26 @@ This page describes how to update cibuildwheel's Pyodide platform code when eith
Pyodide has three types of releases that matter to cibuildwheel: Pyodide has three types of releases that matter to cibuildwheel:
- **Stable** the most recent full Pyodide release (e.g., `0.29.x` / cp313). This is enabled by default with no special `CIBW_ENABLE` flag needed. - **Stable** the most recent full Pyodide release.
- **Prerelease** an alpha/beta/rc Pyodide release that uses the _next_ CPython version (e.g., `314.0.0a1` / cp314). Users must opt in with `CIBW_ENABLE: pyodide-prerelease` to build against this version. This may or may not be available at any given time, depending on the Pyodide release cycle. This is enabled by default with no special `CIBW_ENABLE` flag needed.
- **End-of-life (EoL)** older Pyodide stable releases that are no longer the current stable. These are kept available behind `CIBW_ENABLE: pyodide-eol` so that users who still need to build for older Pyodide versions can do so. - **Prerelease** an alpha/beta/rc Pyodide release that uses the _next_ CPython
version. Users must opt in with `CIBW_ENABLE:
cpython-prerelease` to build against this version. This may or may not be
available at any given time, depending on the Pyodide release cycle.
- **End-of-life (EoL)** older Pyodide stable releases that are no longer the
current stable. These are kept available behind `CIBW_ENABLE: pyodide-eol` so
that users who still need to build for older Pyodide versions can do so.
The guards in `cibuildwheel/selector.py` enforce this distinction. The constraints files under `cibuildwheel/resources/` pin the exact tool versions that go with each build. The guards in `cibuildwheel/selector.py` enforce this distinction. The
constraints files under `cibuildwheel/resources/` pin the exact tool versions
that go with each build.
--- ---
## When a new Pyodide prerelease becomes available ## When a new Pyodide prerelease becomes available
For example, consider a scenario when Pyodide ships a new `315.0.0a1` with cp315 support. For example, consider a scenario when Pyodide ships a new `315.0.0a1` with cp315
support.
### 1. Add the new Python configuration ### 1. Add the new Python configuration
@@ -31,61 +40,39 @@ In `cibuildwheel/resources/build-platforms.toml`, add an entry under `[pyodide]`
{ identifier = "cp315-pyodide_wasm32", version = "3.15", default_pyodide_version = "315.0.0a1", node_version = "v24", sha256 = "SHA256" }, { identifier = "cp315-pyodide_wasm32", version = "3.15", default_pyodide_version = "315.0.0a1", node_version = "v24", sha256 = "SHA256" },
``` ```
`version` is the CPython version string, `default_pyodide_version` is the Pyodide release to use when the user does not pin one explicitly (use the latest available alpha/beta for a prerelease entry), and `node_version` is the minimum Node.js major required by that Pyodide release — check the [pyodide-build FAQ](https://pyodide-build.readthedocs.io/en/latest/faq.html#what-node-js-version-do-i-need) for a rudimentary idea of what the correct value is. `sha256` is the checksum of the Pyodide xbuildenv tarball. `version` is the CPython version string, `default_pyodide_version` is the
Pyodide release to use when the user does not pin one explicitly (use the latest
available alpha/beta for a prerelease entry), and `node_version` is the minimum
Node.js major required by that Pyodide release — check the
[pyodide-build FAQ](https://pyodide-build.readthedocs.io/en/latest/faq.html#what-node-js-version-do-i-need)
for a rudimentary idea of what the correct value is. `sha256` is the checksum of
the Pyodide xbuildenv tarball.
### 2. Update the prerelease guards in the selector ### 2. Generate and pin a constraints file
In `cibuildwheel/selector.py`, update the patterns in the `PyodidePrerelease` guards to match the new identifier: Run the `update_constraints` `nox` session, which reads `build-platforms.toml`
and regenerates all Pyodide constraints files automatically:
```python
if EnableGroup.PyodidePrerelease not in self.enable and fnmatch(
build_id, "cp315-pyodide_*"
):
return False
```
### 3. Generate and pin a constraints file
Run the `update_constraints` `nox` session, which reads `build-platforms.toml` and regenerates all Pyodide constraints files automatically:
```bash ```bash
nox -s update_constraints nox -s update_constraints
``` ```
### 4. Update tests ### 3. Update tests
Update the unit tests so the new identifier is accepted by the selector with `PyodidePrerelease` enabled and rejected without it. Pyodide-specific integration tests may also need their hardcoded expected-wheel lists extended. Update the unit tests so the new identifier is accepted by the selector with
`CPythonPrerelease` enabled and rejected without it. Pyodide-specific
## When a Pyodide prerelease becomes stable integration tests may also need their hardcoded expected-wheel lists extended.
Pyodide uses a versioning scheme where the stable release for a given CPython version is named `[PythonMajorMinor].0.0`, so the first stable release shipping cp314 will be **`314.0.0`**. See [pyodide/pyodide#6084](https://github.com/pyodide/pyodide/issues/6084) for a rationale of this versioning scheme.
### 1. Update the stable entries, and remove (or replace) the prerelease entry
In `build-platforms.toml`, update the former prerelease entry's `default_pyodide_version` to the new stable release (e.g. `314.0.0`) and remove the prerelease marker from the identifier if present. Remove previous prerelease entries if they are now obsolete, or update them to the next prerelease if one is available. Move the previous stable version behind `pyodide-eol` rather than dropping it outright (see below).
### 2. Disable or update the prerelease guards
In `selector.py`:
- **If a new prerelease is available**: update the `fnmatch` pattern to the next identifier (e.g. `cp315-pyodide_*`) as described above.
- **If there is no new prerelease**: comment out the `PyodidePrerelease` logic.
### 3. Update the constraints file
Run `nox -s update_constraints` to regenerate the constraints file for the newly stable version. If the entry was already in `build-platforms.toml` as a prerelease, its constraints file already exists, and this step just refreshes it against the stable Pyodide release and updates the dependencies' versions.
### 4. Update tests
Update the unit tests so the newly stable identifier is accepted by the selector without needing `PyodidePrerelease` in the enable set. Pyodide-specific integration tests may also need their hardcoded expected-wheel lists extended.
## When an old Pyodide version is to be moved to end-of-life ## When an old Pyodide version is to be moved to end-of-life
When a Pyodide version is superseded by a new stable release, move it behind the `pyodide-eol` enable flag. We want to allow users who still build for older Pyodide ABIs time to upgrade. When a Pyodide version is superseded by a new stable release, move it behind the
`pyodide-eol` enable flag. We want to allow users who still build for older
Pyodide ABIs time to upgrade.
### 1. Add the `pyodide-eol` guard in the selector ### 1. Add the `pyodide-eol` guard in the selector
In `cibuildwheel/selector.py`, add (or update) the `PyodideEoL` guard to include the old identifier: In `cibuildwheel/selector.py`, add (or update) the `PyodideEoL` guard to include
the old identifier:
```python ```python
if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodide_*"): if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodide_*"):
@@ -94,15 +81,23 @@ if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodid
### 2. Update tests ### 2. Update tests
Update the unit tests so the EoL identifier requires `PyodideEoL` to be included in the enable set. The default (no `CIBW_ENABLE`) should exclude it. Update the unit tests so the EoL identifier requires `PyodideEoL` to be included
in the enable set. The default (no `CIBW_ENABLE`) should exclude it.
## When an old Pyodide version is to be fully retired ## When an old Pyodide version is to be fully retired
Retirement is not expected to happen on a routine basis. It is only warranted when the Pyodide ecosystem itself has evolved to the point where an older ABI version is considered obsolete for example, if the surrounding toolchain, packaging standards, or runtime infrastructure have moved on so substantially that building for the older version no longer makes practical sense. Any retirement is to be discussed and agreed upon by Pyodide maintainers before proceeding. Retirement is not expected to happen on a routine basis. It is only warranted
when the Pyodide ecosystem itself has evolved to the point where an older ABI
version is considered obsolete for example, if the surrounding toolchain,
packaging standards, or runtime infrastructure have moved on so substantially
that building for the older version no longer makes practical sense. Any
retirement is to be discussed and agreed upon by Pyodide maintainers before
proceeding.
### 1. Remove the Python configuration ### 1. Remove the Python configuration
Delete the entry from `build-platforms.toml` and remove the `PyodideEoL` guard for that identifier in `selector.py`. Delete the entry from `build-platforms.toml` and remove the `PyodideEoL` guard
for that identifier in `selector.py`.
### 2. Delete the constraints file ### 2. Delete the constraints file
@@ -110,4 +105,5 @@ Remove `cibuildwheel/resources/constraints-pyodideXYZ.txt`.
### 3. Update tests ### 3. Update tests
Remove references to the old identifier from the unit tests, integration tests, and drop any expected-wheel entries for it from the test helper. Remove references to the old identifier from the unit tests, integration tests,
and drop any expected-wheel entries for it from the test helper.
+14
View File
@@ -5,6 +5,20 @@ ref: changelog
# Changelog # Changelog
### v4.2.0
_4 August 2026_
- 🌟 CPython 3.15 wheels are now built by default - without the `"cpython-prerelease"` [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) set. It's time to build and upload these wheels to PyPI! This release includes CPython 3.15.0rc1, which is guaranteed to be ABI compatible with the final release. (#2944)
- ✨ Adds Pyodide 3.15 support with the `cp315-pyodide_wasm32` build identifier, using Pyodide 315.0.0a2. These are also stable wrt. the final release. (#2958)
- 🐛 Retries a failed download six times with exponential backoff, so short network outages no longer stop a build. A `4xx` response is still reported at once. (#2953)
- 🐛 Accepts `default` as a [`build-frontend`](https://cibuildwheel.pypa.io/en/stable/options/#build-frontend) value on Pyodide, and accepts `pyodide-build` in the top-level table and in overrides (#2951)
- 🛠 Holds pip back on GraalPy, where newer pip breaks the build (#2955)
- 🛠 Updates Pyodide to 314.0.4 (#2949, #2952)
- 🛠 Updates dependencies and container pins (#2952, #2960)
- 💼 Updates CI action pins (#2948, #2954)
- 🧪 Uses pp311 for the abi3 test, and deletes `test_overridden_pip_constraint`, which is not necessary since #2583 (#2956, #2957)
### v4.1.1 ### v4.1.1
_24 July 2026_ _24 July 2026_
+3 -3
View File
@@ -158,7 +158,7 @@ There are two suggested methods for keeping cibuildwheel up to date that instead
If you use GitHub Actions for builds, you can use cibuildwheel as an action: If you use GitHub Actions for builds, you can use cibuildwheel as an action:
```yaml ```yaml
uses: pypa/cibuildwheel@v4.1.1 uses: pypa/cibuildwheel@v4.2.0
``` ```
This is a composite step that just runs cibuildwheel using pipx. You can set command-line options as `with:` parameters, and use `env:` as normal. This is a composite step that just runs cibuildwheel using pipx. You can set command-line options as `with:` parameters, and use `env:` as normal.
@@ -183,7 +183,7 @@ The second option, and the only one that supports other CI systems, is using a `
```bash ```bash
# requirements-cibw.txt # requirements-cibw.txt
cibuildwheel==4.1.1 cibuildwheel==4.2.0
``` ```
Then your install step would have `python -m pip install -r requirements-cibw.txt` in it. Your `.github/dependabot.yml` file could look like this: Then your install step would have `python -m pip install -r requirements-cibw.txt` in it. Your `.github/dependabot.yml` file could look like this:
@@ -402,7 +402,7 @@ Solutions to this vary, but the simplest is to use pipx:
# most runners have pipx preinstalled, but in case you don't # most runners have pipx preinstalled, but in case you don't
python3 -m pip install pipx python3 -m pip install pipx
pipx run cibuildwheel==4.1.1 --output-dir wheelhouse pipx run cibuildwheel==4.2.0 --output-dir wheelhouse
pipx run twine upload wheelhouse/*.whl pipx run twine upload wheelhouse/*.whl
``` ```
+3 -5
View File
@@ -65,7 +65,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
| Python 3.12 | cp312-macosx_x86_64<br/>cp312-macosx_universal2<br/>cp312-macosx_arm64 | cp312-win_amd64<br/>cp312-win32<br/>cp312-win_arm64 | cp312-manylinux_x86_64<br/>cp312-manylinux_i686<br/>cp312-musllinux_x86_64<br/>cp312-musllinux_i686 | cp312-manylinux_aarch64<br/>cp312-manylinux_ppc64le<br/>cp312-manylinux_s390x<br/>cp312-manylinux_armv7l<br/>cp312-manylinux_riscv64<br/>cp312-musllinux_aarch64<br/>cp312-musllinux_ppc64le<br/>cp312-musllinux_s390x<br/>cp312-musllinux_armv7l<br/>cp312-musllinux_riscv64 | | | cp312-pyodide_wasm32 | | Python 3.12 | cp312-macosx_x86_64<br/>cp312-macosx_universal2<br/>cp312-macosx_arm64 | cp312-win_amd64<br/>cp312-win32<br/>cp312-win_arm64 | cp312-manylinux_x86_64<br/>cp312-manylinux_i686<br/>cp312-musllinux_x86_64<br/>cp312-musllinux_i686 | cp312-manylinux_aarch64<br/>cp312-manylinux_ppc64le<br/>cp312-manylinux_s390x<br/>cp312-manylinux_armv7l<br/>cp312-manylinux_riscv64<br/>cp312-musllinux_aarch64<br/>cp312-musllinux_ppc64le<br/>cp312-musllinux_s390x<br/>cp312-musllinux_armv7l<br/>cp312-musllinux_riscv64 | | | cp312-pyodide_wasm32 |
| Python 3.13 | cp313-macosx_x86_64<br/>cp313-macosx_universal2<br/>cp313-macosx_arm64 | cp313-win_amd64<br/>cp313-win32<br/>cp313-win_arm64 | cp313-manylinux_x86_64<br/>cp313-manylinux_i686<br/>cp313-musllinux_x86_64<br/>cp313-musllinux_i686 | cp313-manylinux_aarch64<br/>cp313-manylinux_ppc64le<br/>cp313-manylinux_s390x<br/>cp313-manylinux_armv7l<br/>cp313-manylinux_riscv64<br/>cp313-musllinux_aarch64<br/>cp313-musllinux_ppc64le<br/>cp313-musllinux_s390x<br/>cp313-musllinux_armv7l<br/>cp313-musllinux_riscv64 | cp313-android_arm64_v8a<br/>cp313-android_x86_64 | cp313-ios_arm64_iphoneos<br/>cp313-ios_arm64_iphonesimulator<br/>cp313-ios_x86_64_iphonesimulator | cp313-pyodide_wasm32 | | Python 3.13 | cp313-macosx_x86_64<br/>cp313-macosx_universal2<br/>cp313-macosx_arm64 | cp313-win_amd64<br/>cp313-win32<br/>cp313-win_arm64 | cp313-manylinux_x86_64<br/>cp313-manylinux_i686<br/>cp313-musllinux_x86_64<br/>cp313-musllinux_i686 | cp313-manylinux_aarch64<br/>cp313-manylinux_ppc64le<br/>cp313-manylinux_s390x<br/>cp313-manylinux_armv7l<br/>cp313-manylinux_riscv64<br/>cp313-musllinux_aarch64<br/>cp313-musllinux_ppc64le<br/>cp313-musllinux_s390x<br/>cp313-musllinux_armv7l<br/>cp313-musllinux_riscv64 | cp313-android_arm64_v8a<br/>cp313-android_x86_64 | cp313-ios_arm64_iphoneos<br/>cp313-ios_arm64_iphonesimulator<br/>cp313-ios_x86_64_iphonesimulator | cp313-pyodide_wasm32 |
| Python 3.14 | cp314-macosx_x86_64<br/>cp314-macosx_universal2<br/>cp314-macosx_arm64<br><br>cp314t-macosx_x86_64<br/>cp314t-macosx_universal2<br/>cp314t-macosx_arm64 | cp314-win_amd64<br/>cp314-win32<br/>cp314-win_arm64<br><br>cp314t-win_amd64<br/>cp314t-win32<br/>cp314t-win_arm64 | cp314-manylinux_x86_64<br/>cp314-manylinux_i686<br/>cp314-musllinux_x86_64<br/>cp314-musllinux_i686<br><br>cp314t-manylinux_x86_64<br/>cp314t-manylinux_i686<br/>cp314t-musllinux_x86_64<br/>cp314t-musllinux_i686 | cp314-manylinux_aarch64<br/>cp314-manylinux_ppc64le<br/>cp314-manylinux_s390x<br/>cp314-manylinux_armv7l<br/>cp314-manylinux_riscv64<br/>cp314-musllinux_aarch64<br/>cp314-musllinux_ppc64le<br/>cp314-musllinux_s390x<br/>cp314-musllinux_armv7l<br/>cp314-musllinux_riscv64<br><br>cp314t-manylinux_aarch64<br/>cp314t-manylinux_ppc64le<br/>cp314t-manylinux_s390x<br/>cp314t-manylinux_armv7l<br/>cp314t-manylinux_riscv64<br/>cp314t-musllinux_aarch64<br/>cp314t-musllinux_ppc64le<br/>cp314t-musllinux_s390x<br/>cp314t-musllinux_armv7l<br/>cp314t-musllinux_riscv64 | cp314-android_arm64_v8a<br/>cp314-android_x86_64 | cp314-ios_arm64_iphoneos<br/>cp314-ios_arm64_iphonesimulator<br/>cp314-ios_x86_64_iphonesimulator | cp314-pyodide_wasm32 | | Python 3.14 | cp314-macosx_x86_64<br/>cp314-macosx_universal2<br/>cp314-macosx_arm64<br><br>cp314t-macosx_x86_64<br/>cp314t-macosx_universal2<br/>cp314t-macosx_arm64 | cp314-win_amd64<br/>cp314-win32<br/>cp314-win_arm64<br><br>cp314t-win_amd64<br/>cp314t-win32<br/>cp314t-win_arm64 | cp314-manylinux_x86_64<br/>cp314-manylinux_i686<br/>cp314-musllinux_x86_64<br/>cp314-musllinux_i686<br><br>cp314t-manylinux_x86_64<br/>cp314t-manylinux_i686<br/>cp314t-musllinux_x86_64<br/>cp314t-musllinux_i686 | cp314-manylinux_aarch64<br/>cp314-manylinux_ppc64le<br/>cp314-manylinux_s390x<br/>cp314-manylinux_armv7l<br/>cp314-manylinux_riscv64<br/>cp314-musllinux_aarch64<br/>cp314-musllinux_ppc64le<br/>cp314-musllinux_s390x<br/>cp314-musllinux_armv7l<br/>cp314-musllinux_riscv64<br><br>cp314t-manylinux_aarch64<br/>cp314t-manylinux_ppc64le<br/>cp314t-manylinux_s390x<br/>cp314t-manylinux_armv7l<br/>cp314t-manylinux_riscv64<br/>cp314t-musllinux_aarch64<br/>cp314t-musllinux_ppc64le<br/>cp314t-musllinux_s390x<br/>cp314t-musllinux_armv7l<br/>cp314t-musllinux_riscv64 | cp314-android_arm64_v8a<br/>cp314-android_x86_64 | cp314-ios_arm64_iphoneos<br/>cp314-ios_arm64_iphonesimulator<br/>cp314-ios_x86_64_iphonesimulator | cp314-pyodide_wasm32 |
| Python 3.15 | cp315-macosx_x86_64<br/>cp315-macosx_universal2<br/>cp315-macosx_arm64<br><br>cp315t-macosx_x86_64<br/>cp315t-macosx_universal2<br/>cp315t-macosx_arm64 | cp315-win_amd64<br/>cp315-win32<br/>cp315-win_arm64<br><br>cp315t-win_amd64<br/>cp315t-win32<br/>cp315t-win_arm64 | cp315-manylinux_x86_64<br/>cp315-manylinux_i686<br/>cp315-musllinux_x86_64<br/>cp315-musllinux_i686<br><br>cp315t-manylinux_x86_64<br/>cp315t-manylinux_i686<br/>cp315t-musllinux_x86_64<br/>cp315t-musllinux_i686 | cp315-manylinux_aarch64<br/>cp315-manylinux_ppc64le<br/>cp315-manylinux_s390x<br/>cp315-manylinux_armv7l<br/>cp315-manylinux_riscv64<br/>cp315-musllinux_aarch64<br/>cp315-musllinux_ppc64le<br/>cp315-musllinux_s390x<br/>cp315-musllinux_armv7l<br/>cp315-musllinux_riscv64<br><br>cp315t-manylinux_aarch64<br/>cp315t-manylinux_ppc64le<br/>cp315t-manylinux_s390x<br/>cp315t-manylinux_armv7l<br/>cp315t-manylinux_riscv64<br/>cp315t-musllinux_aarch64<br/>cp315t-musllinux_ppc64le<br/>cp315t-musllinux_s390x<br/>cp315t-musllinux_armv7l<br/>cp315t-musllinux_riscv64 | cp315-android_arm64_v8a<br/>cp315-android_x86_64 | cp315-ios_arm64_iphoneos<br/>cp315-ios_arm64_iphonesimulator<br/>cp315-ios_x86_64_iphonesimulator | | | Python 3.15 | cp315-macosx_x86_64<br/>cp315-macosx_universal2<br/>cp315-macosx_arm64<br><br>cp315t-macosx_x86_64<br/>cp315t-macosx_universal2<br/>cp315t-macosx_arm64 | cp315-win_amd64<br/>cp315-win32<br/>cp315-win_arm64<br><br>cp315t-win_amd64<br/>cp315t-win32<br/>cp315t-win_arm64 | cp315-manylinux_x86_64<br/>cp315-manylinux_i686<br/>cp315-musllinux_x86_64<br/>cp315-musllinux_i686<br><br>cp315t-manylinux_x86_64<br/>cp315t-manylinux_i686<br/>cp315t-musllinux_x86_64<br/>cp315t-musllinux_i686 | cp315-manylinux_aarch64<br/>cp315-manylinux_ppc64le<br/>cp315-manylinux_s390x<br/>cp315-manylinux_armv7l<br/>cp315-manylinux_riscv64<br/>cp315-musllinux_aarch64<br/>cp315-musllinux_ppc64le<br/>cp315-musllinux_s390x<br/>cp315-musllinux_armv7l<br/>cp315-musllinux_riscv64<br><br>cp315t-manylinux_aarch64<br/>cp315t-manylinux_ppc64le<br/>cp315t-manylinux_s390x<br/>cp315t-manylinux_armv7l<br/>cp315t-manylinux_riscv64<br/>cp315t-musllinux_aarch64<br/>cp315t-musllinux_ppc64le<br/>cp315t-musllinux_s390x<br/>cp315t-musllinux_armv7l<br/>cp315t-musllinux_riscv64 | cp315-android_arm64_v8a<br/>cp315-android_x86_64 | cp315-ios_arm64_iphoneos<br/>cp315-ios_arm64_iphonesimulator<br/>cp315-ios_x86_64_iphonesimulator | cp315-pyodide_wasm32 |
| PyPy3.9 v7.3 | pp39-macosx_x86_64<br/>pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64<br/>pp39-manylinux_i686 | pp39-manylinux_aarch64 | | | | | PyPy3.9 v7.3 | pp39-macosx_x86_64<br/>pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64<br/>pp39-manylinux_i686 | pp39-manylinux_aarch64 | | | |
| PyPy3.10 v7.3 | pp310-macosx_x86_64<br/>pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64<br/>pp310-manylinux_i686 | pp310-manylinux_aarch64 | | | | | PyPy3.10 v7.3 | pp310-macosx_x86_64<br/>pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64<br/>pp310-manylinux_i686 | pp310-manylinux_aarch64 | | | |
| PyPy3.11 v7.3 | pp311-macosx_x86_64<br/>pp311-macosx_arm64 | pp311-win_amd64 | pp311-manylinux_x86_64<br/>pp311-manylinux_i686 | pp311-manylinux_aarch64 | | | | | PyPy3.11 v7.3 | pp311-macosx_x86_64<br/>pp311-macosx_arm64 | pp311-win_amd64 | pp311-manylinux_x86_64<br/>pp311-manylinux_i686 | pp311-manylinux_aarch64 | | | |
@@ -357,13 +357,11 @@ values are:
- `cpython-prerelease`: Enables beta versions of Pythons if any are available - `cpython-prerelease`: Enables beta versions of Pythons if any are available
(May-July, approximately). (May-July, approximately). This also covers Pyodide versions built against a
beta CPython, which is the case for the current Pyodide prerelease.
- `pypy`: Enable PyPy. - `pypy`: Enable PyPy.
- `pypy-eol`: Enable PyPy versions that have passed end of life (if still available). - `pypy-eol`: Enable PyPy versions that have passed end of life (if still available).
- `graalpy`: Enable GraalPy. - `graalpy`: Enable GraalPy.
- `pyodide-prerelease`: Pyodide versions that haven't released yet, if one is
available. Safe if you are shipping a site with an early build, not for
general distribution.
- `pyodide-eol`: Enable Pyodide versions that are no longer the current stable - `pyodide-eol`: Enable Pyodide versions that are no longer the current stable
release (if still available). release (if still available).
- `all`: Enable all of the above. - `all`: Enable all of the above.
+4 -4
View File
@@ -67,8 +67,8 @@ ref: working-examples
| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data | | [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data |
| [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. | | [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. |
| [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system | | [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system |
| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. | | [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. |
| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) | | [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A machine learning model serving framework powered by Rust | | [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A machine learning model serving framework powered by Rust |
| [Picologging][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A high-performance logging library for Python. | | [Picologging][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A high-performance logging library for Python. |
@@ -95,8 +95,8 @@ ref: working-examples
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis | | [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 | | [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 |
| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. | | [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [Imagecodecs (fork)][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] | Over 20 external dependencies in compiled libraries, custom docker image, `libomp`, `openblas` and `install_name_tool` for macOS. | | [Imagecodecs (fork)][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] | Over 20 external dependencies in compiled libraries, custom docker image, `libomp`, `openblas` and `install_name_tool` for macOS. |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![android icon][] ![ios icon][] ![pyodide icon][] | setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step. | | [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![android icon][] ![ios icon][] ![pyodide icon][] | setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step. |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Supports full range of wheels, including PyPy and alternate archs. | | [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. | | [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
@@ -178,8 +178,8 @@ ref: working-examples
[google neuroglancer]: https://github.com/google/neuroglancer [google neuroglancer]: https://github.com/google/neuroglancer
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth [Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[H3-py]: https://github.com/uber/h3-py [H3-py]: https://github.com/uber/h3-py
[AutoPy]: https://github.com/autopilot-rs/autopy
[time-machine]: https://github.com/adamchainz/time-machine [time-machine]: https://github.com/adamchainz/time-machine
[AutoPy]: https://github.com/autopilot-rs/autopy
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest [DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[mosec]: https://github.com/mosecorg/mosec [mosec]: https://github.com/mosecorg/mosec
[Picologging]: https://github.com/microsoft/picologging [Picologging]: https://github.com/microsoft/picologging
@@ -206,8 +206,8 @@ ref: working-examples
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model [power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[iDynTree]: https://github.com/robotology/idyntree [iDynTree]: https://github.com/robotology/idyntree
[TgCrypto]: https://github.com/pyrogram/tgcrypto [TgCrypto]: https://github.com/pyrogram/tgcrypto
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build [Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[pybase64]: https://github.com/mayeut/pybase64 [pybase64]: https://github.com/mayeut/pybase64
[boost-histogram]: https://github.com/scikit-hep/boost-histogram [boost-histogram]: https://github.com/scikit-hep/boost-histogram
[bx-python]: https://github.com/bxlab/bx-python [bx-python]: https://github.com/bxlab/bx-python
+3 -3
View File
@@ -6,7 +6,7 @@ jobs:
- bash: | - bash: |
set -o errexit set -o errexit
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
pip3 install cibuildwheel==4.1.1 pip3 install cibuildwheel==4.2.0
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -20,7 +20,7 @@ jobs:
- bash: | - bash: |
set -o errexit set -o errexit
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
python3 -m pip install cibuildwheel==4.1.1 python3 -m pip install cibuildwheel==4.2.0
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -34,7 +34,7 @@ jobs:
- bash: | - bash: |
set -o errexit set -o errexit
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install cibuildwheel==4.1.1 pip install cibuildwheel==4.2.0
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
+3 -3
View File
@@ -11,7 +11,7 @@ jobs:
- run: - run:
name: Build the Linux wheels. name: Build the Linux wheels.
command: | command: |
python3 -m pip install --user cibuildwheel==4.1.1 python3 -m pip install --user cibuildwheel==4.2.0
cibuildwheel --output-dir wheelhouse cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
@@ -28,7 +28,7 @@ jobs:
- run: - run:
name: Build the Linux aarch64 wheels. name: Build the Linux aarch64 wheels.
command: | command: |
python3 -m pip install --user cibuildwheel==4.1.1 python3 -m pip install --user cibuildwheel==4.2.0
python3 -m cibuildwheel --output-dir wheelhouse python3 -m cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
@@ -44,7 +44,7 @@ jobs:
name: Build the OS X wheels. name: Build the OS X wheels.
command: | command: |
sudo softwareupdate --install-rosetta --agree-to-license # for x86_64/universal2 tests sudo softwareupdate --install-rosetta --agree-to-license # for x86_64/universal2 tests
pip3 install cibuildwheel==4.1.1 pip3 install cibuildwheel==4.2.0
cibuildwheel --output-dir wheelhouse cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
+1 -1
View File
@@ -53,7 +53,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v4.1.1 uses: pypa/cibuildwheel@v4.2.0
env: env:
CIBW_PLATFORM: ${{ matrix.platform || 'auto' }} CIBW_PLATFORM: ${{ matrix.platform || 'auto' }}
CIBW_ARCHS: ${{ matrix.archs || 'auto' }} CIBW_ARCHS: ${{ matrix.archs || 'auto' }}
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v4.1.1 uses: pypa/cibuildwheel@v4.2.0
# env: # env:
# CIBW_SOME_OPTION: value # CIBW_SOME_OPTION: value
# ... # ...
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Build wheels - name: Build wheels
run: pipx run cibuildwheel==4.1.1 run: pipx run cibuildwheel==4.2.0
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
platforms: all platforms: all
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v4.1.1 uses: pypa/cibuildwheel@v4.2.0
env: env:
# configure cibuildwheel on Linux to build native archs ('auto'), # configure cibuildwheel on Linux to build native archs ('auto'),
# and to split the remaining architectures between the x86_64 and # and to split the remaining architectures between the x86_64 and
+3 -3
View File
@@ -12,7 +12,7 @@ linux:
DOCKER_TLS_CERTDIR: "" DOCKER_TLS_CERTDIR: ""
script: script:
- curl -sSL https://get.docker.com/ | sh - curl -sSL https://get.docker.com/ | sh
- python -m pip install cibuildwheel==4.1.1 - python -m pip install cibuildwheel==4.2.0
- cibuildwheel --output-dir wheelhouse - cibuildwheel --output-dir wheelhouse
artifacts: artifacts:
paths: paths:
@@ -23,7 +23,7 @@ windows:
before_script: before_script:
- choco install python -y --allow-downgrade --version 3.12.4 - choco install python -y --allow-downgrade --version 3.12.4
- choco install git.install -y - choco install git.install -y
- py -m pip install cibuildwheel==4.1.1 - py -m pip install cibuildwheel==4.2.0
script: script:
- py -m cibuildwheel --output-dir wheelhouse --platform windows - py -m cibuildwheel --output-dir wheelhouse --platform windows
artifacts: artifacts:
@@ -35,7 +35,7 @@ windows:
macos: macos:
image: macos-14-xcode-15 image: macos-14-xcode-15
before_script: before_script:
- python3 -m pip install cibuildwheel==4.1.1 - python3 -m pip install cibuildwheel==4.2.0
script: script:
- python3 -m cibuildwheel --output-dir wheelhouse - python3 -m cibuildwheel --output-dir wheelhouse
artifacts: artifacts:
+1 -1
View File
@@ -14,7 +14,7 @@ linux:
- curl -sSL https://get.docker.com/ | sh - curl -sSL https://get.docker.com/ | sh
# Warning: This is extremely slow, be careful with how many wheels you build # Warning: This is extremely slow, be careful with how many wheels you build
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- python -m pip install cibuildwheel==4.1.1 - python -m pip install cibuildwheel==4.2.0
# Assuming your CI runner's default architecture is x86_64... # Assuming your CI runner's default architecture is x86_64...
- cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64 - cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64
artifacts: artifacts:
+15 -8
View File
@@ -70,18 +70,21 @@ def tests(session: nox.Session) -> None:
# GraalPy (matching `graalpy_marker`) gets `held`, everything else # GraalPy (matching `graalpy_marker`) gets `held`, everything else
# (`other_marker`) tracks the freshly compiled version. # (`other_marker`) tracks the freshly compiled version.
GRAALPY_HELD_BACK = ( GRAALPY_HELD_BACK = (
# Newer pip breaks GraalPy on Windows. # Newer pip breaks GraalPy on macOS and Windows.
{ {
"package": "pip", "package": "pip",
"held": "26.0.1", "held": ("26.1.2", "26.0.1"),
"graalpy_marker": 'implementation_name == "graalpy" and platform_system == "Windows"', "graalpy_marker": (
"other_marker": 'implementation_name != "graalpy" or platform_system != "Windows"', 'implementation_name == "graalpy" and platform_system != "Windows"',
'implementation_name == "graalpy" and platform_system == "Windows"',
),
"other_marker": 'implementation_name != "graalpy"',
}, },
# filelock >=3.30 imports errno.ENOTSUP, which GraalPy lacks (fix due ~2026-08). # filelock >=3.30 imports errno.ENOTSUP, which GraalPy lacks (fix due ~2026-08).
{ {
"package": "filelock", "package": "filelock",
"held": "3.29.7", "held": ("3.29.7",),
"graalpy_marker": 'implementation_name == "graalpy"', "graalpy_marker": ('implementation_name == "graalpy"',),
"other_marker": 'implementation_name != "graalpy"', "other_marker": 'implementation_name != "graalpy"',
}, },
) )
@@ -90,11 +93,15 @@ GRAALPY_HELD_BACK = (
def _pin_graalpy_workarounds(output_file: Path) -> None: def _pin_graalpy_workarounds(output_file: Path) -> None:
text = output_file.read_text() text = output_file.read_text()
for pin in GRAALPY_HELD_BACK: for pin in GRAALPY_HELD_BACK:
assert isinstance(pin["package"], str)
package = re.escape(pin["package"]) package = re.escape(pin["package"])
graalpy_pins = "\n".join(
f"{pin['package']}=={pin['held'][i]}; {pin['graalpy_marker'][i]}"
for i in range(len(pin["held"]))
)
text = re.sub( text = re.sub(
rf"^{package}==(?P<version>[^\s;]+)$", rf"^{package}==(?P<version>[^\s;]+)$",
f"{pin['package']}==\\g<version>; {pin['other_marker']}\n" f"{pin['package']}==\\g<version>; {pin['other_marker']}\n{graalpy_pins}",
f"{pin['package']}=={pin['held']}; {pin['graalpy_marker']}",
text, text,
flags=re.MULTILINE, flags=re.MULTILINE,
) )
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project] [project]
name = "cibuildwheel" name = "cibuildwheel"
version = "4.1.1" version = "4.2.0"
description = "Build Python wheels on CI with minimal configuration." description = "Build Python wheels on CI with minimal configuration."
readme = "README.md" readme = "README.md"
license = "BSD-2-Clause" license = "BSD-2-Clause"
+3 -3
View File
@@ -54,7 +54,7 @@ def test_abi3(tmp_path: Path) -> None:
"CIBW_BUILD": ( "CIBW_BUILD": (
"cp314-*" "cp314-*"
if utils.get_platform() == "pyodide" if utils.get_platform() == "pyodide"
else "cp39-* cp310-* pp310-* gp312_250-* cp312-* cp314t-*" else "cp39-* cp310-* pp311-* gp312_250-* cp312-* cp314t-*"
), ),
"CIBW_ENABLE": "all", "CIBW_ENABLE": "all",
}, },
@@ -77,7 +77,7 @@ def test_abi3(tmp_path: Path) -> None:
"cp39-cp39", "cp39-cp39",
"cp310-abi3", # <-- ABI3, works with 3.10 and 3.12 "cp310-abi3", # <-- ABI3, works with 3.10 and 3.12
"cp314-cp314t", "cp314-cp314t",
"pp310-pypy310_pp73", "pp311-pypy311_pp73",
"graalpy312-graalpy250_312_native", "graalpy312-graalpy250_312_native",
], ],
) )
@@ -203,7 +203,7 @@ def test_abi_none(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
"CIBW_TEST_REQUIRES": "pytest", "CIBW_TEST_REQUIRES": "pytest",
"CIBW_TEST_COMMAND": f"{utils.invoke_pytest()} {{project}}/test", "CIBW_TEST_COMMAND": f"{utils.invoke_pytest()} {{project}}/test",
# limit the number of builds for test performance reasons # limit the number of builds for test performance reasons
"CIBW_BUILD": "cp39-* cp{}{}-* cp314t-* pp310-*".format(*utils.SINGLE_PYTHON_VERSION), "CIBW_BUILD": "cp39-* cp{}{}-* cp314t-* pp311-*".format(*utils.SINGLE_PYTHON_VERSION),
"CIBW_ENABLE": "all", "CIBW_ENABLE": "all",
}, },
) )
-60
View File
@@ -100,63 +100,3 @@ def test_overridden_path(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> N
assert "python available on PATH doesn't match our installed instance" in captured.err.replace( assert "python available on PATH doesn't match our installed instance" in captured.err.replace(
"venv", "installed" "venv", "installed"
) )
@pytest.mark.parametrize(
"build_frontend",
[
pytest.param("pip", marks=utils.skip_if_pyodide("No pip for pyodide")),
pytest.param(
"build",
marks=utils.skip_if_pyodide(
"pyodide doesn't support multiple values for PIP_CONSTRAINT"
),
),
],
)
def test_overridden_pip_constraint(tmp_path: Path, build_frontend: str) -> None:
"""
Verify that users can use PIP_CONSTRAINT to specify a specific version of
a build-system.requires dependency, by asserting the version of pytz in the
setup.py.
"""
project_dir = tmp_path / "project"
project = test_projects.new_c_project(
setup_py_add=textwrap.dedent(
"""
import pytz
assert pytz.__version__ == "2022.4", f"{pytz.__version__!r} != '2022.4'"
"""
)
)
project.files["pyproject.toml"] = textwrap.dedent(
"""
[build-system]
requires = ["setuptools", "pytz"]
build-backend = "setuptools.build_meta"
"""
)
project.generate(project_dir)
if utils.get_platform() == "linux":
# put the constraints file in the project directory, so it's available
# in the docker container
constraints_file = project_dir / "constraints.txt"
else:
constraints_file = tmp_path / "constraints.txt"
constraints_file.write_text("pytz==2022.4")
actual_wheels = utils.cibuildwheel_run(
project_dir,
add_env={
"CIBW_BUILD_FRONTEND": build_frontend,
"PIP_CONSTRAINT": str(constraints_file),
"CIBW_ENVIRONMENT_LINUX": "PIP_CONSTRAINT=./constraints.txt",
},
single_python=True,
)
expected_wheels = utils.expected_wheels("spam", "0.1.0", single_python=True)
assert set(actual_wheels) == set(expected_wheels)
+6 -2
View File
@@ -71,7 +71,9 @@ def test_pyodide_build(tmp_path: Path, use_pyproject_toml: bool) -> None:
basic_project.generate(project_dir) basic_project.generate(project_dir)
# check for node in 1 case only to reduce CI load # check for node in 1 case only to reduce CI load
add_env = {"CIBW_ENABLE": "pyodide-prerelease"} # cp315 is a Pyodide prerelease embedding a prerelease CPython, so it is
# gated by `cpython-prerelease`.
add_env = {"CIBW_ENABLE": "cpython-prerelease"}
if use_pyproject_toml: if use_pyproject_toml:
add_env["CIBW_TEST_COMMAND"] = f"python {{project}}/check_node.py {CIBW_CACHE_PATH}" add_env["CIBW_TEST_COMMAND"] = f"python {{project}}/check_node.py {CIBW_CACHE_PATH}"
@@ -86,6 +88,7 @@ def test_pyodide_build(tmp_path: Path, use_pyproject_toml: bool) -> None:
expected_wheels = [ expected_wheels = [
"spam-0.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", "spam-0.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl",
"spam-0.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", "spam-0.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl",
"spam-0.1.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl",
] ]
print("actual_wheels", actual_wheels) print("actual_wheels", actual_wheels)
@@ -144,13 +147,14 @@ def test_pyodide_build_and_test(tmp_path: Path, expect_failure: bool) -> None:
add_env={ add_env={
"CIBW_TEST_REQUIRES": "pytest", "CIBW_TEST_REQUIRES": "pytest",
"CIBW_TEST_COMMAND": "python -m pytest {project}", "CIBW_TEST_COMMAND": "python -m pytest {project}",
"CIBW_ENABLE": "pyodide-prerelease", "CIBW_ENABLE": "cpython-prerelease",
}, },
) )
# check that the expected wheels are produced # check that the expected wheels are produced
expected_wheels = [ expected_wheels = [
"spam-0.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", "spam-0.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl",
"spam-0.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", "spam-0.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl",
"spam-0.1.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl",
] ]
assert set(actual_wheels) == set(expected_wheels) assert set(actual_wheels) == set(expected_wheels)
+13 -9
View File
@@ -278,18 +278,18 @@ def _expected_wheels(
# To be kept in sync with Python versions for Pyodide identifiers in cibuildwheel/selector.py. # To be kept in sync with Python versions for Pyodide identifiers in cibuildwheel/selector.py.
if platform == "pyodide" and python_abi_tags is None: if platform == "pyodide" and python_abi_tags is None:
python_abi_tags = ["cp313-cp313", "cp314-cp314"] python_abi_tags = ["cp313-cp313", "cp314-cp314", "cp315-cp315"]
if EnableGroup.PyodideEoL in enable_groups: if EnableGroup.PyodideEoL in enable_groups:
python_abi_tags.insert(0, "cp312-cp312") python_abi_tags.insert(0, "cp312-cp312")
elif (platform == "android" and python_abi_tags is None) or ( elif platform in {"android", "ios"} and python_abi_tags is None:
platform == "ios" and python_abi_tags is None
):
python_abi_tags = [ python_abi_tags = [
"cp313-cp313", "cp313-cp313",
"cp314-cp314", "cp314-cp314",
"cp315-cp315",
] ]
if EnableGroup.CPythonPrerelease in enable_groups: if EnableGroup.CPythonPrerelease in enable_groups:
python_abi_tags += ["cp315-cp315"] # python_abi_tags += ["cp316-cp316"]
... # Add cp316 here when available
elif python_abi_tags is None: elif python_abi_tags is None:
python_abi_tags = [ python_abi_tags = [
"cp39-cp39", "cp39-cp39",
@@ -299,13 +299,16 @@ def _expected_wheels(
"cp313-cp313", "cp313-cp313",
"cp314-cp314", "cp314-cp314",
"cp314-cp314t", "cp314-cp314t",
"cp315-cp315",
"cp315-cp315t",
] ]
if EnableGroup.CPythonPrerelease in enable_groups: if EnableGroup.CPythonPrerelease in enable_groups:
python_abi_tags += [ # python_abi_tags += [
"cp315-cp315", # "cp316-cp316",
"cp315-cp315t", # "cp316-cp316t",
] # ]
... # Add cp316 here when available
if EnableGroup.PyPyEoL in enable_groups: if EnableGroup.PyPyEoL in enable_groups:
python_abi_tags += [ python_abi_tags += [
@@ -410,6 +413,7 @@ def _expected_wheels(
"cp312-cp312": ["pyodide_2024_0_wasm32"], "cp312-cp312": ["pyodide_2024_0_wasm32"],
"cp313-cp313": ["pyemscripten_2025_0_wasm32"], "cp313-cp313": ["pyemscripten_2025_0_wasm32"],
"cp314-cp314": ["pyemscripten_2026_0_wasm32"], "cp314-cp314": ["pyemscripten_2026_0_wasm32"],
"cp315-cp315": ["pyemscripten_2026_5_wasm32"],
}.get(python_abi_tag, []) }.get(python_abi_tag, [])
if not platform_tags: if not platform_tags:
+4 -11
View File
@@ -16,6 +16,7 @@ def test_build() -> None:
assert build_selector("cp312-manylinux_x86_64") assert build_selector("cp312-manylinux_x86_64")
assert build_selector("cp313-manylinux_x86_64") assert build_selector("cp313-manylinux_x86_64")
assert build_selector("cp314-manylinux_x86_64") assert build_selector("cp314-manylinux_x86_64")
assert build_selector("cp315-manylinux_x86_64")
assert build_selector("pp311-manylinux_x86_64") assert build_selector("pp311-manylinux_x86_64")
assert build_selector("cp36-manylinux_i686") assert build_selector("cp36-manylinux_i686")
assert build_selector("cp37-manylinux_i686") assert build_selector("cp37-manylinux_i686")
@@ -37,6 +38,7 @@ def test_build() -> None:
assert build_selector("cp312-win_amd64") assert build_selector("cp312-win_amd64")
assert build_selector("cp313-win_amd64") assert build_selector("cp313-win_amd64")
assert build_selector("cp314-win_amd64") assert build_selector("cp314-win_amd64")
assert build_selector("cp315-win_amd64")
assert not build_selector("pp310-win_amd64") assert not build_selector("pp310-win_amd64")
assert not build_selector("pp311-win_amd64") assert not build_selector("pp311-win_amd64")
@@ -91,17 +93,6 @@ def test_build_filter_pypy_all() -> None:
assert build_selector("pp39-manylinux_x86_64") assert build_selector("pp39-manylinux_x86_64")
# Re-enable when we have Pyodide 3.15 prerelease builds to test against
# def test_build_filter_pyodide_prerelease() -> None:
# build_selector = BuildSelector(
# build_config="*",
# skip_config="",
# enable=frozenset([EnableGroup.PyodidePrerelease]),
# )
# assert build_selector("cp314-pyodide_wasm32")
# assert build_selector("cp315-pyodide_wasm32")
def test_build_filter_pyodide() -> None: def test_build_filter_pyodide() -> None:
build_selector = BuildSelector( build_selector = BuildSelector(
build_config="*", build_config="*",
@@ -111,6 +102,7 @@ def test_build_filter_pyodide() -> None:
assert build_selector("cp313-pyodide_wasm32") assert build_selector("cp313-pyodide_wasm32")
assert build_selector("cp314-pyodide_wasm32") assert build_selector("cp314-pyodide_wasm32")
assert not build_selector("cp312-pyodide_wasm32") assert not build_selector("cp312-pyodide_wasm32")
assert build_selector("cp315-pyodide_wasm32")
def test_build_filter_pyodide_eol() -> None: def test_build_filter_pyodide_eol() -> None:
@@ -122,6 +114,7 @@ def test_build_filter_pyodide_eol() -> None:
assert build_selector("cp312-pyodide_wasm32") assert build_selector("cp312-pyodide_wasm32")
assert build_selector("cp313-pyodide_wasm32") assert build_selector("cp313-pyodide_wasm32")
assert build_selector("cp314-pyodide_wasm32") assert build_selector("cp314-pyodide_wasm32")
assert build_selector("cp315-pyodide_wasm32")
def test_skip() -> None: def test_skip() -> None:
+135
View File
@@ -1,6 +1,10 @@
from __future__ import annotations from __future__ import annotations
import io
import ssl import ssl
import time
import urllib.error
import urllib.request
import certifi import certifi
import pytest import pytest
@@ -9,9 +13,12 @@ from cibuildwheel.util.file import download
TYPE_CHECKING = False TYPE_CHECKING = False
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable, Iterator
from pathlib import Path from pathlib import Path
from typing import Self
DOWNLOAD_URL = "https://cdn.jsdelivr.net/gh/pypa/cibuildwheel@v1.6.3/requirements-dev.txt" DOWNLOAD_URL = "https://cdn.jsdelivr.net/gh/pypa/cibuildwheel@v1.6.3/requirements-dev.txt"
PAYLOAD = b"payload"
def test_download(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: def test_download(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
@@ -35,3 +42,131 @@ def test_download_bad_ssl_cert_file(monkeypatch: pytest.MonkeyPatch, tmp_path: P
dest = tmp_path / "file.txt" dest = tmp_path / "file.txt"
with pytest.raises(ssl.SSLError): with pytest.raises(ssl.SSLError):
download(DOWNLOAD_URL, dest) download(DOWNLOAD_URL, dest)
def _no_sleep(seconds: float) -> None:
pass
@pytest.fixture
def http_error() -> Iterator[Callable[[str, int], urllib.error.HTTPError]]:
"""Build HTTPErrors, and close them, as each one holds a temporary file."""
errors = []
def make(url: str, code: int) -> urllib.error.HTTPError:
error = urllib.error.HTTPError(url, code, "error", {}, io.BytesIO(b"")) # type: ignore[arg-type]
errors.append(error)
return error
yield make
for error in errors:
error.close()
class FakeResponse:
def __enter__(self) -> Self:
return self
def __exit__(self, *args: object) -> None:
return None
def read(self) -> bytes:
return PAYLOAD
@pytest.fixture
def fake_network(
monkeypatch: pytest.MonkeyPatch,
) -> Callable[[int], tuple[list[str], list[float]]]:
"""Fail the first ``failures`` downloads, recording attempts and sleeps."""
def setup(failures: int) -> tuple[list[str], list[float]]:
attempts: list[str] = []
sleeps: list[float] = []
def fake_urlopen(url: str, context: object = None) -> FakeResponse: # noqa: ARG001
attempts.append(url)
if len(attempts) <= failures:
msg = "temporary DNS failure"
raise OSError(msg)
return FakeResponse()
monkeypatch.setattr(urllib.request, "urlopen", fake_urlopen)
monkeypatch.setattr(time, "sleep", sleeps.append)
return attempts, sleeps
return setup
def test_download_retries_transient_failures(
fake_network: Callable[[int], tuple[list[str], list[float]]], tmp_path: Path
) -> None:
attempts, sleeps = fake_network(3)
dest = tmp_path / "file.txt"
download(DOWNLOAD_URL, dest)
assert dest.read_bytes() == PAYLOAD
assert len(attempts) == 4
# the wait must grow, so that a long outage is survivable
assert sleeps == sorted(sleeps)
assert sleeps[-1] > sleeps[0]
def test_download_backoff_covers_a_minute_outage(
fake_network: Callable[[int], tuple[list[str], list[float]]], tmp_path: Path
) -> None:
_, sleeps = fake_network(99)
dest = tmp_path / "file.txt"
with pytest.raises(OSError, match="temporary DNS failure"):
download(DOWNLOAD_URL, dest)
assert sum(sleeps) >= 60
@pytest.mark.parametrize("code", [400, 404, 410])
def test_download_does_not_retry_client_errors(
monkeypatch: pytest.MonkeyPatch,
tmp_path: Path,
code: int,
http_error: Callable[[str, int], urllib.error.HTTPError],
) -> None:
"""A bad URL is not going to fix itself, so report it at once."""
attempts: list[str] = []
def fake_urlopen(url: str, context: object = None) -> FakeResponse: # noqa: ARG001
attempts.append(url)
raise http_error(url, code)
monkeypatch.setattr(urllib.request, "urlopen", fake_urlopen)
monkeypatch.setattr(time, "sleep", _no_sleep)
with pytest.raises(urllib.error.HTTPError):
download(DOWNLOAD_URL, tmp_path / "file.txt")
assert len(attempts) == 1
@pytest.mark.parametrize("code", [500, 503])
def test_download_retries_server_errors(
monkeypatch: pytest.MonkeyPatch,
tmp_path: Path,
code: int,
http_error: Callable[[str, int], urllib.error.HTTPError],
) -> None:
attempts: list[str] = []
def fake_urlopen(url: str, context: object = None) -> FakeResponse: # noqa: ARG001
attempts.append(url)
if len(attempts) == 1:
raise http_error(url, code)
return FakeResponse()
monkeypatch.setattr(urllib.request, "urlopen", fake_urlopen)
monkeypatch.setattr(time, "sleep", _no_sleep)
download(DOWNLOAD_URL, tmp_path / "file.txt")
assert len(attempts) == 2
+4 -2
View File
@@ -97,9 +97,11 @@ def test_linux_container_split(tmp_path: Path, monkeypatch: pytest.MonkeyPatch)
"cp313-manylinux_x86_64", "cp313-manylinux_x86_64",
"cp314-manylinux_x86_64", "cp314-manylinux_x86_64",
"cp314t-manylinux_x86_64", "cp314t-manylinux_x86_64",
"cp315-manylinux_x86_64",
"cp315t-manylinux_x86_64",
] ]
assert before_alls(build_steps[3]) == [""] * 4 assert before_alls(build_steps[3]) == [""] * 6
assert container_engines(build_steps[3]) == [default_container_engine] * 4 assert container_engines(build_steps[3]) == [default_container_engine] * 6
def test_package_dir_outside_working_directory_raises_configuration_error( def test_package_dir_outside_working_directory_raises_configuration_error(
+5 -1
View File
@@ -13,7 +13,7 @@ from cibuildwheel.__main__ import main
from cibuildwheel.oci_container import OCIPlatform from cibuildwheel.oci_container import OCIPlatform
from cibuildwheel.util import file from cibuildwheel.util import file
DEFAULT_IDS = {"cp39", "cp310", "cp311", "cp312", "cp313", "cp314", "cp314t"} DEFAULT_IDS = {"cp39", "cp310", "cp311", "cp312", "cp313", "cp314", "cp314t", "cp315", "cp315t"}
ALL_IDS = DEFAULT_IDS | {"pp39", "pp310", "pp311", "gp312_250"} ALL_IDS = DEFAULT_IDS | {"pp39", "pp310", "pp311", "gp312_250"}
@@ -155,6 +155,8 @@ before-all = "true"
"cp313", "cp313",
"cp314", "cp314",
"cp314t", "cp314t",
"cp315",
"cp315t",
"pp39", "pp39",
"pp310", "pp310",
"pp311", "pp311",
@@ -176,6 +178,8 @@ before-all = "true"
"cp313", "cp313",
"cp314", "cp314",
"cp314t", "cp314t",
"cp315",
"cp315t",
"pp39", "pp39",
"pp310", "pp310",
"pp311", "pp311",
+59
View File
@@ -143,6 +143,65 @@ def test_overrides_invalid_inherit_value(validator: validate_pyproject.api.Valid
validator(example) validator(example)
def test_pyodide_build_frontend(validator: validate_pyproject.api.Validator) -> None:
"""
pyodide-build is accepted anywhere the frontend can be set, as an override
or a global value can apply to pyodide builds only.
"""
example = tomllib.loads(
"""
[tool.cibuildwheel]
build-frontend = "pyodide-build"
[tool.cibuildwheel.pyodide]
build-frontend = { name = "pyodide-build", args = ["--some-arg"] }
[[tool.cibuildwheel.overrides]]
select = "*pyodide*"
build-frontend = "pyodide-build; args: --some-arg"
"""
)
assert validator(example) is not None
@pytest.mark.parametrize("frontend", ['"uv"', '"build; args: --some-arg"', '{ name = "pip" }'])
def test_pyodide_bad_build_frontend(
validator: validate_pyproject.api.Validator, frontend: str
) -> None:
"""
The pyodide table only accepts the pyodide-build frontend.
"""
example = tomllib.loads(
f"""
[tool.cibuildwheel.pyodide]
build-frontend = {frontend}
"""
)
with pytest.raises(validate_pyproject.error_reporting.ValidationError):
validator(example)
@pytest.mark.parametrize("platform", ["linux", "macos", "windows", "ios", "android"])
@pytest.mark.parametrize("frontend", ["pyodide-build", "pyodide-build; args: --some-arg"])
def test_bad_pyodide_build_frontend(
validator: validate_pyproject.api.Validator, platform: str, frontend: str
) -> None:
"""
Only the pyodide table accepts the pyodide-build frontend.
"""
example = tomllib.loads(
f"""
[tool.cibuildwheel.{platform}]
build-frontend = "{frontend}"
"""
)
with pytest.raises(validate_pyproject.error_reporting.ValidationError):
validator(example)
def test_docs_examples(validator: validate_pyproject.api.Validator) -> None: def test_docs_examples(validator: validate_pyproject.api.Validator) -> None:
""" """
Parse out all the configuration examples, build valid TOML out of them, and Parse out all the configuration examples, build valid TOML out of them, and