Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e53c3d952 |
@@ -13,11 +13,11 @@ jobs:
|
||||
dist:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516 # v2.14.0
|
||||
- uses: hynek/build-and-inspect-python-package@v2
|
||||
|
||||
publish:
|
||||
needs: [dist]
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
attestations: write
|
||||
|
||||
steps:
|
||||
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: Packages
|
||||
path: dist
|
||||
@@ -41,6 +41,6 @@ jobs:
|
||||
with:
|
||||
subject-path: "dist/cibuildwheel-*"
|
||||
|
||||
- uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
||||
- uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
attestations: true
|
||||
|
||||
+30
-34
@@ -39,37 +39,35 @@ jobs:
|
||||
name: Linters (mypy, ruff, etc.)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
id: python
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- uses: j178/prek-action@79f765515bd648eb4d6bb1b17277b7cb22cb6468 # v2.0.0
|
||||
- uses: j178/prek-action@v1
|
||||
- name: PyLint checks
|
||||
run: pipx run --python "${STEPS_PYTHON_OUTPUTS_PYTHON_PATH}" nox -s pylint -- --output-format=github
|
||||
env:
|
||||
STEPS_PYTHON_OUTPUTS_PYTHON_PATH: ${{ steps.python.outputs.python-path }}
|
||||
run: pipx run --python "${{ steps.python.outputs.python-path }}" nox -s pylint -- --output-format=github
|
||||
|
||||
sample:
|
||||
name: Generate a sample project
|
||||
needs: lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
name: Install Python
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
||||
- uses: astral-sh/setup-uv@v7
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
- name: Generate a sample project
|
||||
run: uv run --no-sync -m test.test_projects test.test_0_basic.basic_project sample_proj
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
@@ -119,16 +117,16 @@ jobs:
|
||||
test_select: android
|
||||
timeout-minutes: 180
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
name: Install Python ${{ matrix.python_version }}
|
||||
with:
|
||||
python-version: ${{ matrix.python_version }}
|
||||
allow-prereleases: true
|
||||
|
||||
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
||||
- uses: astral-sh/setup-uv@v7
|
||||
|
||||
- name: Free up disk space
|
||||
if: runner.os == 'Linux' && matrix.test_select != 'android'
|
||||
@@ -141,7 +139,7 @@ jobs:
|
||||
# for oci_container unit tests
|
||||
- name: Set up QEMU
|
||||
if: runner.os == 'Linux'
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
|
||||
uses: docker/setup-qemu-action@v4
|
||||
|
||||
- name: Set up Xcode
|
||||
if: ${{ startsWith(matrix.os, 'macos-15') }}
|
||||
@@ -152,12 +150,12 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
|
||||
- uses: joerick/pr-labels-action@0543b277721e852d821c6738d449f2f4dea03d5f # v1.0.9
|
||||
- uses: joerick/pr-labels-action@v1.0.9
|
||||
|
||||
- name: Set CIBW_ENABLE
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "$GITHUB_REF_NAME" == "main" ]]; then
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
CIBW_ENABLE=all
|
||||
else
|
||||
# get the default CIBW_ENABLE value from the test module
|
||||
@@ -174,7 +172,7 @@ jobs:
|
||||
echo "CIBW_ENABLE=${CIBW_ENABLE}" >> $GITHUB_ENV
|
||||
|
||||
- name: Download a sample project
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
@@ -232,7 +230,7 @@ jobs:
|
||||
run: |
|
||||
test $(find wheelhouse_only -name '*.whl' | wc -l) -eq 1
|
||||
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
|
||||
path: wheelhouse/*.whl
|
||||
@@ -249,13 +247,13 @@ jobs:
|
||||
outputs:
|
||||
archs: ${{ steps.archs.outputs.archs }}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
||||
- uses: astral-sh/setup-uv@v7
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
- name: Get qemu emulated architectures
|
||||
@@ -274,23 +272,21 @@ jobs:
|
||||
matrix:
|
||||
arch: ${{ fromJSON(needs.emulated-archs.outputs.archs) }}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
||||
- uses: astral-sh/setup-uv@v7
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
|
||||
uses: docker/setup-qemu-action@v4
|
||||
|
||||
- name: Run the emulation tests
|
||||
env:
|
||||
MATRIX_ARCH: ${{ matrix.arch }}
|
||||
run: uv run --no-sync pytest --run-emulation "$MATRIX_ARCH" test/test_emulation.py
|
||||
run: uv run --no-sync pytest --run-emulation ${{ matrix.arch }} test/test_emulation.py
|
||||
|
||||
test-pyodide:
|
||||
name: Test pyodide
|
||||
@@ -298,20 +294,20 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 180
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
name: Install Python 3.12
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
||||
- uses: astral-sh/setup-uv@v7
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
|
||||
- name: Download a sample project
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
@@ -348,11 +344,11 @@ jobs:
|
||||
- os: macos-15
|
||||
test_select: android
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Download a sample project
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
|
||||
@@ -23,23 +23,22 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
environment: ${{ github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel' && 'update-dependencies-workflow' || '' }}
|
||||
steps:
|
||||
|
||||
# we use this step to grab a Github App auth token, so that PRs generated by this workflow
|
||||
# run the GHA tests.
|
||||
- uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
|
||||
- uses: actions/create-github-app-token@v2
|
||||
id: generate-token
|
||||
if: github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel'
|
||||
with:
|
||||
app-id: ${{ secrets.CIBUILDWHEEL_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.CIBUILDWHEEL_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- uses: wntrblm/nox@5a277b752f6094150e25237d47c34168e2b7526e # 2026.02.09
|
||||
- uses: wntrblm/nox@2026.02.09
|
||||
|
||||
- name: "Run update: dependencies"
|
||||
run: nox --force-color -s update_constraints
|
||||
@@ -50,7 +49,7 @@ jobs:
|
||||
|
||||
- name: Create Pull Request
|
||||
if: github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel'
|
||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
with:
|
||||
commit-message: Update dependencies
|
||||
title: '[Bot] Update dependencies'
|
||||
|
||||
@@ -21,12 +21,12 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Update the ${{ env.TAG_NAME }} tag
|
||||
id: update-major-minor-tag
|
||||
uses: joerick/update-vX.Y-tag-action@c4cefb60c33b82e4aa73a469e4acf30ee48d5812 # v1.0.2
|
||||
uses: joerick/update-vX.Y-tag-action@v1.0
|
||||
with:
|
||||
source-tag: ${{ env.TAG_NAME }}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
name: zizmor - GitHub Actions Security Analysis
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["main"]
|
||||
pull_request:
|
||||
branches: ["**"]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
zizmor:
|
||||
name: Run zizmor 🌈
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Run zizmor 🌈
|
||||
uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2
|
||||
@@ -112,10 +112,3 @@ site/
|
||||
|
||||
# PyCharm
|
||||
.idea/
|
||||
|
||||
# Lockfiles
|
||||
*.lock
|
||||
*.pylock
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
|
||||
@@ -3,7 +3,7 @@ ci:
|
||||
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
|
||||
rev: v6.0.0
|
||||
hooks:
|
||||
- id: check-case-conflict
|
||||
- id: check-merge-conflict
|
||||
@@ -16,14 +16,14 @@ repos:
|
||||
- id: trailing-whitespace
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: 4924b0e01e032fea073ad04a1c5cfa7e4add0afb # frozen: v0.15.6
|
||||
rev: v0.15.5
|
||||
hooks:
|
||||
- id: ruff-check
|
||||
args: ["--fix"]
|
||||
args: ["--fix", "--show-fixes"]
|
||||
- id: ruff-format
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: a66e98df7b4aeeb3724184b332785976d062b92e # frozen: v1.19.1
|
||||
rev: v1.19.1
|
||||
hooks:
|
||||
- id: mypy
|
||||
name: mypy 3.11 on cibuildwheel/
|
||||
@@ -56,7 +56,7 @@ repos:
|
||||
additional_dependencies: *mypy-dependencies
|
||||
|
||||
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||
rev: 745eface02aef23e168a8afb6b5737818efbea95 # frozen: v0.11.0.1
|
||||
rev: v0.11.0.1
|
||||
hooks:
|
||||
- id: shellcheck
|
||||
|
||||
@@ -77,7 +77,7 @@ repos:
|
||||
additional_dependencies: [cogapp>=3.5]
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: 2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a # frozen: v2.4.2
|
||||
rev: v2.4.2
|
||||
hooks:
|
||||
- id: codespell
|
||||
args: ["-w"]
|
||||
@@ -85,13 +85,14 @@ repos:
|
||||
|
||||
|
||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||
rev: 9f48a48aa91a6040d749ad68ec70907d907a5a7f # frozen: 0.37.0
|
||||
rev: 0.37.0
|
||||
hooks:
|
||||
- id: check-dependabot
|
||||
- id: check-github-actions
|
||||
- id: check-github-workflows
|
||||
- id: check-gitlab-ci
|
||||
- id: check-readthedocs
|
||||
# Disabled due to schema issue for now:
|
||||
# - id: check-readthedocs
|
||||
- id: check-travis
|
||||
- id: check-jsonschema
|
||||
name: Check projects
|
||||
|
||||
@@ -99,7 +99,7 @@ jobs:
|
||||
- uses: actions/setup-python@v6
|
||||
|
||||
- name: Install cibuildwheel
|
||||
run: python -m pip install cibuildwheel==3.4.1
|
||||
run: python -m pip install cibuildwheel==3.4.0
|
||||
|
||||
- name: Build wheels
|
||||
run: python -m cibuildwheel --output-dir wheelhouse
|
||||
@@ -235,16 +235,6 @@ Changelog
|
||||
|
||||
<!-- [[[cog from readme_changelog import mini_changelog; print(mini_changelog()) ]]] -->
|
||||
|
||||
### v3.4.1
|
||||
|
||||
_2 April 2026_
|
||||
|
||||
- ⚠️ Building for the experimental CPython 3.13 free-threading variant is now deprecated. That functionality will be removed in the next minor release. The [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) option `cpython-freethreading` is therefore also deprecated. Builds specifying `enable = "all"` no longer select `cpython-freethreading`. CPython 3.14 free-threading support remains available without the `enable` flag. (#2787)
|
||||
- 🐛 iOS builds will no longer skip `repair-wheel-command` if it's defined in config (#2761)
|
||||
- 🐛 Fix bug causing `uv` to fail when environments define PYTHON_VERSION or UV_PYTHON, conflicting with our venvs (#2795)
|
||||
- ✨ 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)
|
||||
|
||||
### v3.4.0
|
||||
|
||||
_5 March 2026_
|
||||
@@ -284,7 +274,18 @@ _12 October 2025_
|
||||
- 🐛 Fix the default MACOSX_DEPLOYMENT_TARGET on Python 3.14 (#2613)
|
||||
- 📚 Docs improvements (#2617)
|
||||
|
||||
<!-- [[[end]]] (sum: NOLMd9iLDC) -->
|
||||
### v3.2.0
|
||||
|
||||
_22 September 2025_
|
||||
|
||||
- ✨ Adds GraalPy v25 (Python 3.12) support (#2597)
|
||||
- 🛠 Update to CPython 3.14.0rc3 (#2602)
|
||||
- 🛠 Adds CPython 3.14.0 prerelease support for Android, and a number of improvements to Android builds (#2568, #2591)
|
||||
- 🛠 Improvements to testing on Android, passing environment markers when installing the venv, and providing more debug output when build-verbosity is set (#2575)
|
||||
- ⚠️ PyPy 3.10 was moved to `pypy-eol` in the `enable` option, as it is now end-of-life. (#2521)
|
||||
- 📚 Docs improvements (#2574, #2601, #2598)
|
||||
|
||||
<!-- [[[end]]] (sum: aO1wNWSgKa) -->
|
||||
|
||||
---
|
||||
|
||||
|
||||
+20
-46
@@ -36,10 +36,9 @@ runs:
|
||||
|
||||
- id: cibw
|
||||
run: |
|
||||
# Install cibuildwheel and build the command line
|
||||
"$PYTHON" -u << "EOF"
|
||||
# Install cibuildwheel
|
||||
"${{ steps.python.outputs.python-path }}" -u << "EOF"
|
||||
import os
|
||||
import shlex
|
||||
import shutil
|
||||
import sys
|
||||
import venv
|
||||
@@ -47,7 +46,7 @@ runs:
|
||||
from pathlib import Path
|
||||
from subprocess import run
|
||||
|
||||
EXTRAS = set(e.strip() for e in os.environ.get("INPUT_EXTRAS", "").split(",") if e.strip())
|
||||
EXTRAS = set(e.strip() for e in "${{ inputs.extras }}".split(",") if e.strip())
|
||||
|
||||
|
||||
class EnvBuilder(venv.EnvBuilder):
|
||||
@@ -60,14 +59,14 @@ runs:
|
||||
def post_setup(self, context):
|
||||
super().post_setup(context)
|
||||
self.bin_path = Path(context.env_exe).parent
|
||||
install_spec = os.environ["GITHUB_ACTION_PATH"]
|
||||
install_spec = r"${{ github.action_path }}"
|
||||
if EXTRAS:
|
||||
install_spec += f"[{','.join(sorted(EXTRAS))}]"
|
||||
run([sys.executable, "-m", "pip", "--python", context.env_exe, "install", install_spec], check=True)
|
||||
|
||||
|
||||
print("::group::Install cibuildwheel")
|
||||
venv_path = Path(os.environ["RUNNER_TEMP"]) / "cibw"
|
||||
venv_path = Path(r"${{ runner.temp }}") / "cibw"
|
||||
if venv_path.exists():
|
||||
shutil.rmtree(venv_path)
|
||||
|
||||
@@ -89,59 +88,34 @@ runs:
|
||||
|
||||
cibw_bin = [p for p in builder.bin_path.glob("cibuildwheel*") if p.stem == "cibuildwheel"][0]
|
||||
|
||||
# Build the command line
|
||||
cmd_args = [str(cibw_bin), os.environ["INPUT_PACKAGE_DIR"]]
|
||||
|
||||
if output_dir := os.environ.get("INPUT_OUTPUT_DIR"):
|
||||
cmd_args += ["--output-dir", output_dir]
|
||||
|
||||
if config_file := os.environ.get("INPUT_CONFIG_FILE"):
|
||||
cmd_args += ["--config-file", config_file]
|
||||
|
||||
if only := os.environ.get("INPUT_ONLY"):
|
||||
cmd_args += ["--only", only]
|
||||
|
||||
cmd_bash = shlex.join(cmd_args)
|
||||
|
||||
def pwsh_quote(text):
|
||||
# Wrap in single quotes and double-up any existing single quotes
|
||||
return "'" + str(text).replace("'", "''") + "'"
|
||||
|
||||
# Prepend '& ' so PowerShell executes the quoted binary path
|
||||
cmd_pwsh = "& " + " ".join(pwsh_quote(arg) for arg in cmd_args)
|
||||
|
||||
with open(os.environ["GITHUB_OUTPUT"], "at") as f:
|
||||
f.write(f"cibw-bin={cibw_bin}\n")
|
||||
f.write(f"prepend-path={clean_bin_path}\n")
|
||||
f.write(f"cmd-bash={cmd_bash}\n")
|
||||
f.write(f"cmd-pwsh={cmd_pwsh}\n")
|
||||
|
||||
print("::endgroup::")
|
||||
EOF
|
||||
shell: bash
|
||||
env:
|
||||
PYTHON: ${{ steps.python.outputs.python-path }}
|
||||
INPUT_PACKAGE_DIR: ${{ inputs.package-dir }}
|
||||
INPUT_OUTPUT_DIR: ${{ inputs.output-dir }}
|
||||
INPUT_CONFIG_FILE: ${{ inputs.config-file }}
|
||||
INPUT_ONLY: ${{ inputs.only }}
|
||||
INPUT_EXTRAS: ${{ inputs.extras }}
|
||||
|
||||
# Redirecting stderr to stdout to fix interleaving issue in Actions.
|
||||
- run: |
|
||||
export PATH="$CIBW_PREPEND_PATH:$PATH"
|
||||
eval "$CIBW_CMD_BASH" 2>&1
|
||||
export PATH="${{ steps.cibw.outputs.prepend-path }}:$PATH"
|
||||
|
||||
"${{ steps.cibw.outputs.cibw-bin }}" \
|
||||
"${{ inputs.package-dir }}" \
|
||||
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} \
|
||||
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} \
|
||||
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}} \
|
||||
2>&1
|
||||
shell: bash
|
||||
if: runner.os != 'Windows'
|
||||
env:
|
||||
CIBW_PREPEND_PATH: ${{ steps.cibw.outputs.prepend-path }}
|
||||
CIBW_CMD_BASH: ${{ steps.cibw.outputs.cmd-bash }}
|
||||
|
||||
# Windows needs powershell to interact nicely with Meson
|
||||
- run: |
|
||||
$env:PATH = "$env:CIBW_PREPEND_PATH;$env:PATH"
|
||||
Invoke-Expression $env:CIBW_CMD_PWSH
|
||||
$env:PATH = "${{ steps.cibw.outputs.prepend-path }};$env:PATH"
|
||||
& "${{ steps.cibw.outputs.cibw-bin }}" `
|
||||
"${{ inputs.package-dir }}" `
|
||||
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} `
|
||||
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} `
|
||||
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}}
|
||||
shell: pwsh
|
||||
if: runner.os == 'Windows'
|
||||
env:
|
||||
CIBW_PREPEND_PATH: ${{ steps.cibw.outputs.prepend-path }}
|
||||
CIBW_CMD_PWSH: ${{ steps.cibw.outputs.cmd-pwsh }}
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "3.4.1"
|
||||
__version__ = "3.4.0"
|
||||
|
||||
@@ -15,6 +15,7 @@ from tempfile import mkdtemp
|
||||
from typing import Any, Literal, TextIO
|
||||
|
||||
import cibuildwheel
|
||||
import cibuildwheel.util
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture, allowed_architectures_check
|
||||
from cibuildwheel.ci import CIProvider, detect_ci_provider, fix_ansi_codes_for_github_actions
|
||||
@@ -52,7 +53,7 @@ class Unbuffered:
|
||||
self.stream.writelines(data)
|
||||
self.stream.flush()
|
||||
|
||||
def __getattr__(self, attr: str) -> Any: # noqa: ANN401
|
||||
def __getattr__(self, attr: str) -> Any:
|
||||
return getattr(self.stream, attr)
|
||||
|
||||
|
||||
@@ -431,17 +432,17 @@ def print_preamble(platform: str, options: Options, identifiers: Sequence[str])
|
||||
msg = "\n".join(error_list)
|
||||
raise errors.ConfigurationError(msg)
|
||||
|
||||
n = len(identifiers)
|
||||
print(f"{n} build{'s' if n != 1 else ''} selected:")
|
||||
print(", ".join(identifiers))
|
||||
print()
|
||||
print("Here we go!\n")
|
||||
|
||||
|
||||
def detect_errors(*, options: Options, identifiers: Iterable[str]) -> Generator[str, None, None]:
|
||||
# Check for deprecated CIBW_FREE_THREADED_SUPPORT environment variable
|
||||
if "CIBW_FREE_THREADED_SUPPORT" in os.environ:
|
||||
yield "CIBW_FREE_THREADED_SUPPORT environment variable is no longer supported."
|
||||
yield (
|
||||
"CIBW_FREE_THREADED_SUPPORT environment variable is no longer supported. "
|
||||
'Use tool.cibuildwheel.enable = ["cpython-freethreading"] in pyproject.toml '
|
||||
"or set CIBW_ENABLE=cpython-freethreading instead."
|
||||
)
|
||||
|
||||
# Deprecated {python} and {pip}
|
||||
for option_name in ["test_command", "before_build"]:
|
||||
@@ -468,13 +469,6 @@ def detect_warnings(*, options: Options) -> Generator[str, None, None]:
|
||||
build_selector = options.globals.build_selector
|
||||
test_selector = options.globals.test_selector
|
||||
|
||||
if EnableGroup.CPythonFreeThreading in build_selector.enable:
|
||||
yield (
|
||||
"'cpython-freethreading' enable is deprecated and will be removed in a future version. "
|
||||
"It should be removed from tool.cibuildwheel.enable in pyproject.toml "
|
||||
"or CIBW_ENABLE environment variable."
|
||||
)
|
||||
|
||||
all_valid_identifiers = [
|
||||
config.identifier
|
||||
for module in ALL_PLATFORM_MODULES.values()
|
||||
|
||||
@@ -6,10 +6,11 @@ import sys
|
||||
import typing
|
||||
from collections.abc import Set
|
||||
from enum import StrEnum, auto
|
||||
from typing import Final, Literal, Self
|
||||
from typing import Final, Literal
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.typing import PlatformName
|
||||
|
||||
from .typing import PlatformName
|
||||
|
||||
PRETTY_NAMES: Final[dict[PlatformName, str]] = {
|
||||
"linux": "Linux",
|
||||
@@ -82,34 +83,34 @@ class Architecture(StrEnum):
|
||||
arm64_iphonesimulator = auto()
|
||||
x86_64_iphonesimulator = auto()
|
||||
|
||||
@classmethod
|
||||
def parse_config(cls, config: str, platform: PlatformName) -> set[Self]:
|
||||
@staticmethod
|
||||
def parse_config(config: str, platform: PlatformName) -> "set[Architecture]":
|
||||
result = set()
|
||||
for arch_str in re.split(r"[\s,]+", config):
|
||||
match arch_str:
|
||||
case "auto":
|
||||
result |= cls.auto_archs(platform=platform)
|
||||
result |= Architecture.auto_archs(platform=platform)
|
||||
case "native":
|
||||
if native_arch := cls.native_arch(platform=platform):
|
||||
if native_arch := Architecture.native_arch(platform=platform):
|
||||
result.add(native_arch)
|
||||
case "all":
|
||||
result |= cls.all_archs(platform=platform)
|
||||
result |= Architecture.all_archs(platform=platform)
|
||||
case "auto64":
|
||||
result |= cls.bitness_archs(platform=platform, bitness="64")
|
||||
result |= Architecture.bitness_archs(platform=platform, bitness="64")
|
||||
case "auto32":
|
||||
result |= cls.bitness_archs(platform=platform, bitness="32")
|
||||
result |= Architecture.bitness_archs(platform=platform, bitness="32")
|
||||
case _:
|
||||
try:
|
||||
result.add(cls(arch_str))
|
||||
result.add(Architecture(arch_str))
|
||||
except ValueError as e:
|
||||
msg = f"Invalid architecture '{arch_str}'"
|
||||
raise errors.ConfigurationError(msg) from e
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def native_arch(cls, platform: PlatformName) -> Self | None:
|
||||
@staticmethod
|
||||
def native_arch(platform: PlatformName) -> "Architecture | None":
|
||||
native_machine = platform_module.machine()
|
||||
native_architecture = cls(native_machine)
|
||||
native_architecture = Architecture(native_machine)
|
||||
|
||||
# Cross-platform support. Used for --print-build-identifiers or docker builds.
|
||||
host_platform: PlatformName = (
|
||||
@@ -119,15 +120,15 @@ class Architecture(StrEnum):
|
||||
)
|
||||
|
||||
if platform == "pyodide":
|
||||
return cls.wasm32
|
||||
return Architecture.wasm32
|
||||
elif platform == "ios":
|
||||
# Can only build for iOS on macOS. The "native" architecture is the
|
||||
# simulator for the macOS native platform.
|
||||
if host_platform == "macos":
|
||||
if native_architecture == cls.x86_64:
|
||||
return cls.x86_64_iphonesimulator
|
||||
if native_architecture == Architecture.x86_64:
|
||||
return Architecture.x86_64_iphonesimulator
|
||||
else:
|
||||
return cls.arm64_iphonesimulator
|
||||
return Architecture.arm64_iphonesimulator
|
||||
else:
|
||||
return None
|
||||
|
||||
@@ -139,64 +140,64 @@ class Architecture(StrEnum):
|
||||
# can't build anything on this platform
|
||||
return None
|
||||
|
||||
native_architecture = cls(synonym)
|
||||
native_architecture = Architecture(synonym)
|
||||
|
||||
return native_architecture
|
||||
|
||||
@classmethod
|
||||
def auto_archs(cls, platform: PlatformName) -> set[Self]:
|
||||
native_arch = cls.native_arch(platform)
|
||||
@staticmethod
|
||||
def auto_archs(platform: PlatformName) -> "set[Architecture]":
|
||||
native_arch = Architecture.native_arch(platform)
|
||||
if native_arch is None:
|
||||
return set() # can't build anything on this platform
|
||||
result = {native_arch}
|
||||
|
||||
match platform:
|
||||
case "windows" if cls.AMD64 in result:
|
||||
result.add(cls.x86)
|
||||
case "ios" if native_arch == cls.arm64_iphonesimulator:
|
||||
case "windows" if Architecture.AMD64 in result:
|
||||
result.add(Architecture.x86)
|
||||
case "ios" if native_arch == Architecture.arm64_iphonesimulator:
|
||||
# Also build the device wheel if we're on ARM64.
|
||||
result.add(cls.arm64_iphoneos)
|
||||
result.add(Architecture.arm64_iphoneos)
|
||||
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def all_archs(cls, platform: PlatformName) -> set[Self]:
|
||||
@staticmethod
|
||||
def all_archs(platform: PlatformName) -> "set[Architecture]":
|
||||
all_archs_map = {
|
||||
"linux": {
|
||||
cls.x86_64,
|
||||
cls.i686,
|
||||
cls.aarch64,
|
||||
cls.ppc64le,
|
||||
cls.s390x,
|
||||
cls.armv7l,
|
||||
cls.riscv64,
|
||||
Architecture.x86_64,
|
||||
Architecture.i686,
|
||||
Architecture.aarch64,
|
||||
Architecture.ppc64le,
|
||||
Architecture.s390x,
|
||||
Architecture.armv7l,
|
||||
Architecture.riscv64,
|
||||
},
|
||||
"macos": {cls.x86_64, cls.arm64, cls.universal2},
|
||||
"windows": {cls.x86, cls.AMD64, cls.ARM64},
|
||||
"pyodide": {cls.wasm32},
|
||||
"android": {cls.x86_64, cls.arm64_v8a},
|
||||
"macos": {Architecture.x86_64, Architecture.arm64, Architecture.universal2},
|
||||
"windows": {Architecture.x86, Architecture.AMD64, Architecture.ARM64},
|
||||
"pyodide": {Architecture.wasm32},
|
||||
"android": {Architecture.x86_64, Architecture.arm64_v8a},
|
||||
"ios": {
|
||||
cls.x86_64_iphonesimulator,
|
||||
cls.arm64_iphonesimulator,
|
||||
cls.arm64_iphoneos,
|
||||
Architecture.x86_64_iphonesimulator,
|
||||
Architecture.arm64_iphonesimulator,
|
||||
Architecture.arm64_iphoneos,
|
||||
},
|
||||
}
|
||||
return all_archs_map[platform]
|
||||
|
||||
@classmethod
|
||||
def bitness_archs(cls, platform: PlatformName, bitness: Literal["64", "32"]) -> set[Self]:
|
||||
@staticmethod
|
||||
def bitness_archs(platform: PlatformName, bitness: Literal["64", "32"]) -> "set[Architecture]":
|
||||
# This map maps 64-bit architectures to their 32-bit equivalents.
|
||||
archs_map = {
|
||||
cls.x86_64: cls.i686,
|
||||
cls.AMD64: cls.x86,
|
||||
cls.aarch64: cls.armv7l,
|
||||
Architecture.x86_64: Architecture.i686,
|
||||
Architecture.AMD64: Architecture.x86,
|
||||
Architecture.aarch64: Architecture.armv7l,
|
||||
}
|
||||
native_arch = cls.native_arch(platform)
|
||||
native_arch = Architecture.native_arch(platform)
|
||||
|
||||
if native_arch is None:
|
||||
return set() # can't build anything on this platform
|
||||
|
||||
if native_arch == cls.wasm32:
|
||||
if native_arch == Architecture.wasm32:
|
||||
return {native_arch} if bitness == "32" else set()
|
||||
|
||||
match bitness:
|
||||
@@ -206,7 +207,7 @@ class Architecture(StrEnum):
|
||||
if native_arch in archs_map.values():
|
||||
return {native_arch}
|
||||
elif native_arch in archs_map and platform in {"linux", "windows"}:
|
||||
if native_arch == cls.aarch64 and not _check_aarch32_el0():
|
||||
if native_arch == Architecture.aarch64 and not _check_aarch32_el0():
|
||||
# If we're on aarch64, skip if we cannot build armv7l wheels.
|
||||
return set()
|
||||
return {archs_map[native_arch]}
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ import os
|
||||
import re
|
||||
from enum import Enum
|
||||
|
||||
from cibuildwheel.util.helpers import strtobool
|
||||
from .util.helpers import strtobool
|
||||
|
||||
ANSI_CODE_REGEX = re.compile(r"(\033\[[0-9;]*m)")
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ from typing import Any, Protocol
|
||||
import bashlex
|
||||
import bashlex.errors
|
||||
|
||||
from cibuildwheel import bashlex_eval
|
||||
from . import bashlex_eval
|
||||
|
||||
|
||||
class EnvironmentParseError(Exception):
|
||||
@@ -131,7 +131,7 @@ class ParsedEnvironment:
|
||||
def __repr__(self) -> str:
|
||||
return f"{self.__class__.__name__}({[repr(a) for a in self.assignments]!r})"
|
||||
|
||||
def options_summary(self) -> list[EnvironmentAssignment]:
|
||||
def options_summary(self) -> Any:
|
||||
return self.assignments
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ def github_api_request(path: str, *, max_retries: int = 3) -> dict[str, Any]:
|
||||
# pylint: disable=E1101
|
||||
if (
|
||||
isinstance(e, urllib.error.HTTPError)
|
||||
and (e.code in {403, 429})
|
||||
and (e.code == 403 or e.code == 429)
|
||||
and e.headers.get("x-ratelimit-remaining") == "0"
|
||||
):
|
||||
reset_time = int(e.headers.get("x-ratelimit-reset", 0))
|
||||
|
||||
@@ -4,8 +4,8 @@ import typing
|
||||
from collections.abc import Sequence
|
||||
from typing import Literal, Self, get_args
|
||||
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.util.helpers import parse_key_value_string
|
||||
from .logger import log
|
||||
from .util.helpers import parse_key_value_string
|
||||
|
||||
BuildFrontendName = Literal["pip", "build", "build[uv]", "uv"]
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@ from typing import IO, TYPE_CHECKING, AnyStr, Final, Literal
|
||||
|
||||
import humanize
|
||||
|
||||
from cibuildwheel.ci import CIProvider, detect_ci_provider, filter_ansi_codes
|
||||
from .ci import CIProvider, detect_ci_provider, filter_ansi_codes
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from cibuildwheel.options import Options
|
||||
from .options import Options
|
||||
|
||||
FoldPattern = tuple[str, str]
|
||||
DEFAULT_FOLD_PATTERN: Final[FoldPattern] = ("{name}", "")
|
||||
|
||||
@@ -16,12 +16,12 @@ from pathlib import Path, PurePath, PurePosixPath
|
||||
from types import TracebackType
|
||||
from typing import IO, Literal, Self, assert_never
|
||||
|
||||
from cibuildwheel.ci import CIProvider, detect_ci_provider
|
||||
from cibuildwheel.errors import OCIEngineTooOldError
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.typing import PathOrStr
|
||||
from cibuildwheel.util.cmd import call
|
||||
from cibuildwheel.util.helpers import FlexibleVersion, parse_key_value_string, strtobool
|
||||
from .ci import CIProvider, detect_ci_provider
|
||||
from .errors import OCIEngineTooOldError
|
||||
from .logger import log
|
||||
from .typing import PathOrStr
|
||||
from .util.cmd import call
|
||||
from .util.helpers import FlexibleVersion, parse_key_value_string, strtobool
|
||||
|
||||
ContainerEngineName = Literal["docker", "podman"]
|
||||
|
||||
@@ -37,7 +37,7 @@ class OCIPlatform(Enum):
|
||||
S390X = "linux/s390x"
|
||||
|
||||
@classmethod
|
||||
def native(cls) -> Self:
|
||||
def native(cls) -> "OCIPlatform":
|
||||
"""Return the current OCI platform, or raise ValueError if unknown."""
|
||||
arch = platform.machine().lower()
|
||||
mapping = {
|
||||
|
||||
+15
-17
@@ -14,18 +14,18 @@ from typing import Any, Final, Literal, Self, assert_never
|
||||
|
||||
from packaging.specifiers import SpecifierSet
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.environment import EnvironmentParseError, ParsedEnvironment, parse_environment
|
||||
from cibuildwheel.frontend import BuildFrontendConfig
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.oci_container import OCIContainerEngineConfig
|
||||
from cibuildwheel.projectfiles import get_requires_python_str, resolve_dependency_groups
|
||||
from cibuildwheel.selector import BuildSelector, EnableGroup, TestSelector, selector_matches
|
||||
from cibuildwheel.typing import PLATFORMS, PlatformName
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.helpers import format_safe, parse_key_value_string, strtobool, unwrap
|
||||
from cibuildwheel.util.packaging import DependencyConstraints
|
||||
from . import errors
|
||||
from .architecture import Architecture
|
||||
from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment
|
||||
from .frontend import BuildFrontendConfig
|
||||
from .logger import log
|
||||
from .oci_container import OCIContainerEngineConfig
|
||||
from .projectfiles import get_requires_python_str, resolve_dependency_groups
|
||||
from .selector import BuildSelector, EnableGroup, TestSelector, selector_matches
|
||||
from .typing import PLATFORMS, PlatformName
|
||||
from .util import resources
|
||||
from .util.helpers import format_safe, parse_key_value_string, strtobool, unwrap
|
||||
from .util.packaging import DependencyConstraints
|
||||
|
||||
MANYLINUX_ARCHS: Final[tuple[str, ...]] = (
|
||||
"x86_64",
|
||||
@@ -686,8 +686,6 @@ class Options:
|
||||
skip_config = ""
|
||||
architectures = Architecture.all_archs(self.platform)
|
||||
enable |= EnableGroup.all_groups()
|
||||
if args.only.startswith("cp313t-"):
|
||||
enable.add(EnableGroup.CPythonFreeThreading)
|
||||
|
||||
build_selector = BuildSelector(
|
||||
build_config=build_config,
|
||||
@@ -989,8 +987,8 @@ class Options:
|
||||
def option_summary(
|
||||
self,
|
||||
option_name: str,
|
||||
option_value: Any, # noqa: ANN401
|
||||
default_value: Any, # noqa: ANN401
|
||||
option_value: Any,
|
||||
default_value: Any,
|
||||
overrides: Mapping[str, Any] | None = None,
|
||||
skip_unset: bool = False,
|
||||
) -> str | None:
|
||||
@@ -1042,7 +1040,7 @@ class Options:
|
||||
return value
|
||||
|
||||
@staticmethod
|
||||
def option_summary_value(option_value: Any) -> str: # noqa: ANN401
|
||||
def option_summary_value(option_value: Any) -> str:
|
||||
if hasattr(option_value, "options_summary"):
|
||||
option_value = option_value.options_summary()
|
||||
|
||||
|
||||
@@ -1,14 +1,19 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
from typing import Final, Protocol
|
||||
from typing import TYPE_CHECKING, Final, Protocol
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.platforms import android, ios, linux, macos, pyodide, windows
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.typing import GenericPythonConfiguration, PlatformName
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.typing import GenericPythonConfiguration, PlatformName
|
||||
|
||||
|
||||
class PlatformModule(Protocol):
|
||||
|
||||
@@ -22,19 +22,19 @@ from elftools.common.exceptions import ELFError
|
||||
from elftools.elf.elffile import ELFFile
|
||||
from filelock import FileLock
|
||||
|
||||
from cibuildwheel import errors, platforms # pylint: disable=cyclic-import
|
||||
from cibuildwheel.architecture import Architecture, arch_synonym
|
||||
from cibuildwheel.frontend import get_build_frontend_extra_flags, parse_config_settings
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.options import BuildOptions, Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call, shell
|
||||
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
|
||||
from cibuildwheel.util.helpers import prepare_command
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel
|
||||
from cibuildwheel.util.python_build_standalone import create_python_build_standalone_environment
|
||||
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
|
||||
from .. import errors, platforms # pylint: disable=cyclic-import
|
||||
from ..architecture import Architecture, arch_synonym
|
||||
from ..frontend import get_build_frontend_extra_flags, parse_config_settings
|
||||
from ..logger import log
|
||||
from ..options import BuildOptions, Options
|
||||
from ..selector import BuildSelector
|
||||
from ..util import resources
|
||||
from ..util.cmd import call, shell
|
||||
from ..util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
|
||||
from ..util.helpers import prepare_command
|
||||
from ..util.packaging import find_compatible_wheel
|
||||
from ..util.python_build_standalone import create_python_build_standalone_environment
|
||||
from ..venv import constraint_flags, find_uv, virtualenv
|
||||
|
||||
ANDROID_TRIPLET = {
|
||||
"arm64_v8a": "aarch64-linux-android",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import dataclasses
|
||||
import os
|
||||
import platform
|
||||
@@ -6,26 +8,39 @@ import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import textwrap
|
||||
from collections.abc import Sequence, Set
|
||||
from pathlib import Path
|
||||
from typing import assert_never
|
||||
from typing import TYPE_CHECKING, assert_never
|
||||
|
||||
from filelock import FileLock
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.environment import ParsedEnvironment
|
||||
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.platforms.macos import install_cpython as install_build_cpython
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call, shell, split_command
|
||||
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
|
||||
from cibuildwheel.util.helpers import prepare_command, unwrap_preserving_paragraphs
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel
|
||||
from cibuildwheel.venv import constraint_flags, virtualenv
|
||||
from .. import errors
|
||||
from ..frontend import (
|
||||
BuildFrontendName,
|
||||
get_build_frontend_extra_flags,
|
||||
)
|
||||
from ..logger import log
|
||||
from ..util import resources
|
||||
from ..util.cmd import call, shell, split_command
|
||||
from ..util.file import (
|
||||
CIBW_CACHE_PATH,
|
||||
copy_test_sources,
|
||||
download,
|
||||
move_file,
|
||||
)
|
||||
from ..util.helpers import prepare_command, unwrap_preserving_paragraphs
|
||||
from ..util.packaging import (
|
||||
find_compatible_wheel,
|
||||
)
|
||||
from ..venv import constraint_flags, virtualenv
|
||||
from .macos import install_cpython as install_build_cpython
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from collections.abc import Sequence, Set
|
||||
|
||||
from ..architecture import Architecture
|
||||
from ..environment import ParsedEnvironment
|
||||
from ..options import Options
|
||||
from ..selector import BuildSelector
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True, kw_only=True)
|
||||
@@ -269,8 +284,7 @@ def setup_python(
|
||||
build_frontend: BuildFrontendName,
|
||||
xbuild_tools: Sequence[str] | None,
|
||||
) -> tuple[Path, dict[str, str]]:
|
||||
# Not using set because mypy can't narrow it
|
||||
if build_frontend == "build[uv]" or build_frontend == "uv": # noqa: PLR1714
|
||||
if build_frontend == "build[uv]" or build_frontend == "uv":
|
||||
msg = "uv doesn't support iOS"
|
||||
raise errors.FatalError(msg)
|
||||
|
||||
@@ -427,8 +441,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
build_options = options.build_options(config.identifier)
|
||||
build_frontend = build_options.build_frontend
|
||||
# uv doesn't support iOS
|
||||
# Not using set because mypy can't narrow it
|
||||
if build_frontend.name == "build[uv]" or build_frontend.name == "uv": # noqa: PLR1714
|
||||
if build_frontend.name == "build[uv]" or build_frontend.name == "uv":
|
||||
msg = "uv doesn't support iOS"
|
||||
raise errors.FatalError(msg)
|
||||
|
||||
|
||||
@@ -8,20 +8,20 @@ from collections.abc import Iterable, Iterator, Sequence, Set
|
||||
from pathlib import Path, PurePath, PurePosixPath
|
||||
from typing import TYPE_CHECKING, assert_never
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.frontend import get_build_frontend_extra_flags
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.oci_container import OCIContainer, OCIContainerEngineConfig, OCIPlatform
|
||||
from cibuildwheel.options import BuildOptions, Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.file import copy_test_sources
|
||||
from cibuildwheel.util.helpers import prepare_command, unwrap
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel
|
||||
from .. import errors
|
||||
from ..architecture import Architecture
|
||||
from ..frontend import get_build_frontend_extra_flags
|
||||
from ..logger import log
|
||||
from ..oci_container import OCIContainer, OCIContainerEngineConfig, OCIPlatform
|
||||
from ..options import BuildOptions, Options
|
||||
from ..selector import BuildSelector
|
||||
from ..util import resources
|
||||
from ..util.file import copy_test_sources
|
||||
from ..util.helpers import prepare_command, unwrap
|
||||
from ..util.packaging import find_compatible_wheel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from cibuildwheel.typing import PathOrStr
|
||||
from ..typing import PathOrStr
|
||||
|
||||
ARCHITECTURE_OCI_PLATFORM_MAP = {
|
||||
Architecture.x86_64: OCIPlatform.AMD64,
|
||||
|
||||
@@ -15,20 +15,25 @@ from typing import Literal, assert_never
|
||||
from filelock import FileLock
|
||||
from packaging.version import Version
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.ci import detect_ci_provider
|
||||
from cibuildwheel.environment import ParsedEnvironment
|
||||
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call, shell
|
||||
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
|
||||
from cibuildwheel.util.helpers import prepare_command, unwrap
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
|
||||
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
|
||||
from .. import errors
|
||||
from ..architecture import Architecture
|
||||
from ..ci import detect_ci_provider
|
||||
from ..environment import ParsedEnvironment
|
||||
from ..frontend import BuildFrontendName, get_build_frontend_extra_flags
|
||||
from ..logger import log
|
||||
from ..options import Options
|
||||
from ..selector import BuildSelector
|
||||
from ..util import resources
|
||||
from ..util.cmd import call, shell
|
||||
from ..util.file import (
|
||||
CIBW_CACHE_PATH,
|
||||
copy_test_sources,
|
||||
download,
|
||||
move_file,
|
||||
)
|
||||
from ..util.helpers import prepare_command, unwrap
|
||||
from ..util.packaging import find_compatible_wheel, get_pip_version
|
||||
from ..venv import constraint_flags, find_uv, virtualenv
|
||||
|
||||
|
||||
@functools.cache
|
||||
@@ -253,10 +258,6 @@ def setup_python(
|
||||
# https://github.com/pypa/virtualenv/issues/620
|
||||
# Also see https://github.com/python/cpython/pull/9516
|
||||
env.pop("__PYVENV_LAUNCHER__", None)
|
||||
# uv uses this over the current environment's python, so remove it to avoid confusion
|
||||
env.pop("PYTHON_VERSION", None)
|
||||
env.pop("PYTHON_ARCH", None)
|
||||
env.pop("UV_PYTHON", None)
|
||||
|
||||
# we version pip ourselves, so we don't care about pip version checking
|
||||
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
|
||||
@@ -374,8 +375,6 @@ def setup_python(
|
||||
uv_path,
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
which_python,
|
||||
"--upgrade",
|
||||
"delocate",
|
||||
"build[virtualenv, uv]",
|
||||
@@ -388,8 +387,6 @@ def setup_python(
|
||||
uv_path,
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
which_python,
|
||||
"--upgrade",
|
||||
"delocate",
|
||||
*constraint_flags(dependency_constraint),
|
||||
|
||||
@@ -14,16 +14,16 @@ from typing import Final, TypedDict
|
||||
|
||||
from filelock import FileLock
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.environment import ParsedEnvironment
|
||||
from cibuildwheel.frontend import get_build_frontend_extra_flags
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call, shell
|
||||
from cibuildwheel.util.file import (
|
||||
from .. import errors
|
||||
from ..architecture import Architecture
|
||||
from ..environment import ParsedEnvironment
|
||||
from ..frontend import get_build_frontend_extra_flags
|
||||
from ..logger import log
|
||||
from ..options import Options
|
||||
from ..selector import BuildSelector
|
||||
from ..util import resources
|
||||
from ..util.cmd import call, shell
|
||||
from ..util.file import (
|
||||
CIBW_CACHE_PATH,
|
||||
copy_test_sources,
|
||||
download,
|
||||
@@ -31,13 +31,13 @@ from cibuildwheel.util.file import (
|
||||
extract_zip,
|
||||
move_file,
|
||||
)
|
||||
from cibuildwheel.util.helpers import prepare_command, unwrap, unwrap_preserving_paragraphs
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
|
||||
from cibuildwheel.util.python_build_standalone import (
|
||||
from ..util.helpers import prepare_command, unwrap, unwrap_preserving_paragraphs
|
||||
from ..util.packaging import find_compatible_wheel, get_pip_version
|
||||
from ..util.python_build_standalone import (
|
||||
PythonBuildStandaloneError,
|
||||
create_python_build_standalone_environment,
|
||||
)
|
||||
from cibuildwheel.venv import constraint_flags, virtualenv
|
||||
from ..venv import constraint_flags, virtualenv
|
||||
|
||||
IS_WIN: Final[bool] = sys.platform.startswith("win")
|
||||
|
||||
@@ -285,6 +285,7 @@ def setup_python(
|
||||
"install",
|
||||
"--upgrade",
|
||||
"pyodide-build",
|
||||
"build[virtualenv]",
|
||||
*constraint_flags(constraints_path),
|
||||
env=env,
|
||||
)
|
||||
|
||||
@@ -12,25 +12,19 @@ from typing import assert_never
|
||||
|
||||
from filelock import FileLock
|
||||
|
||||
from cibuildwheel import errors
|
||||
from cibuildwheel.architecture import Architecture
|
||||
from cibuildwheel.environment import ParsedEnvironment
|
||||
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
|
||||
from cibuildwheel.logger import log
|
||||
from cibuildwheel.options import Options
|
||||
from cibuildwheel.selector import BuildSelector
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call, shell
|
||||
from cibuildwheel.util.file import (
|
||||
CIBW_CACHE_PATH,
|
||||
copy_test_sources,
|
||||
download,
|
||||
extract_zip,
|
||||
move_file,
|
||||
)
|
||||
from cibuildwheel.util.helpers import prepare_command, unwrap
|
||||
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
|
||||
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
|
||||
from .. import errors
|
||||
from ..architecture import Architecture
|
||||
from ..environment import ParsedEnvironment
|
||||
from ..frontend import BuildFrontendName, get_build_frontend_extra_flags
|
||||
from ..logger import log
|
||||
from ..options import Options
|
||||
from ..selector import BuildSelector
|
||||
from ..util import resources
|
||||
from ..util.cmd import call, shell
|
||||
from ..util.file import CIBW_CACHE_PATH, copy_test_sources, download, extract_zip, move_file
|
||||
from ..util.helpers import prepare_command, unwrap
|
||||
from ..util.packaging import find_compatible_wheel, get_pip_version
|
||||
from ..venv import constraint_flags, find_uv, virtualenv
|
||||
|
||||
|
||||
def get_nuget_args(
|
||||
@@ -293,9 +287,7 @@ def setup_python(
|
||||
# set up environment variables for run_with_env
|
||||
env["PYTHON_VERSION"] = python_configuration.version
|
||||
env["PYTHON_ARCH"] = python_configuration.arch
|
||||
env.pop("UV_PYTHON", None)
|
||||
if not use_uv:
|
||||
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
|
||||
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
|
||||
|
||||
# update env with results from CIBW_ENVIRONMENT
|
||||
env = environment.as_dictionary(prev_environment=env)
|
||||
@@ -336,8 +328,6 @@ def setup_python(
|
||||
uv_path,
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
where_python,
|
||||
"--upgrade",
|
||||
"build[virtualenv]",
|
||||
*constraint_flags(dependency_constraint),
|
||||
|
||||
@@ -10,7 +10,7 @@ build==1.2.2.post1
|
||||
# pyodide-build
|
||||
certifi==2026.2.25
|
||||
# via requests
|
||||
charset-normalizer==3.4.6
|
||||
charset-normalizer==3.4.5
|
||||
# via requests
|
||||
click==8.1.8
|
||||
# via
|
||||
@@ -62,7 +62,7 @@ pyodide-lock==0.1.2
|
||||
# via pyodide-build
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
requests==2.32.5
|
||||
# via pyodide-build
|
||||
|
||||
@@ -10,7 +10,7 @@ build==1.2.2.post1
|
||||
# pyodide-build
|
||||
certifi==2026.2.25
|
||||
# via requests
|
||||
charset-normalizer==3.4.6
|
||||
charset-normalizer==3.4.5
|
||||
# via requests
|
||||
click==8.1.8
|
||||
# via
|
||||
@@ -62,7 +62,7 @@ pyodide-lock==0.1.2
|
||||
# via pyodide-build
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
requests==2.32.5
|
||||
# via pyodide-build
|
||||
|
||||
@@ -12,7 +12,7 @@ filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
importlib-metadata==9.0.0
|
||||
importlib-metadata==8.7.1
|
||||
# via build
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
@@ -28,7 +28,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
tomli==2.4.0
|
||||
# via build
|
||||
|
||||
@@ -26,7 +26,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
|
||||
@@ -26,7 +26,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
|
||||
@@ -26,7 +26,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
|
||||
@@ -26,7 +26,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
|
||||
@@ -28,7 +28,7 @@ platformdirs==4.3.6
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
tomli==2.4.0
|
||||
# via build
|
||||
|
||||
@@ -28,7 +28,7 @@ platformdirs==4.4.0
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
tomli==2.4.0
|
||||
# via build
|
||||
|
||||
@@ -26,7 +26,7 @@ platformdirs==4.9.4
|
||||
# virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
python-discovery==1.1.3
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
[x86_64]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2026.03.14-2
|
||||
|
||||
[i686]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2026.03.14-2
|
||||
|
||||
[aarch64]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2026.03.14-2
|
||||
|
||||
[ppc64le]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2026.03.14-2
|
||||
|
||||
[s390x]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2026.03.14-2
|
||||
|
||||
[pypy_x86_64]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.14-2
|
||||
|
||||
[pypy_i686]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.14-2
|
||||
|
||||
[pypy_aarch64]
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.20-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.20-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.20-1
|
||||
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.14-2
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.14-2
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.14-2
|
||||
|
||||
[armv7l]
|
||||
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2026.03.20-1
|
||||
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2026.03.20-1
|
||||
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2026.03.14-2
|
||||
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2026.03.14-2
|
||||
|
||||
[riscv64]
|
||||
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2026.03.20-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2026.03.20-1
|
||||
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2026.03.14-2
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2026.03.14-2
|
||||
|
||||
|
||||
@@ -1,723 +1,483 @@
|
||||
{
|
||||
"releases": [
|
||||
{
|
||||
"tag": "20260320",
|
||||
"tag": "20260310",
|
||||
"assets": [
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.10.20+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.10.20%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.10.20+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.11.15+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.11.15%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.11.15+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.12.13+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.12.13%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.12.13+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.13.12+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.13.12+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.13.12%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.14.3+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.14.3+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.14.3%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-aarch64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-armv7-unknown-linux-gnueabi-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-i686-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-ppc64le-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-riscv64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-s390x-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-apple-darwin-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-pc-windows-msvc-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
|
||||
},
|
||||
{
|
||||
"name": "cpython-3.15.0a7+20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260320/cpython-3.15.0a7%2B20260320-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
"name": "cpython-3.15.0a7+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
from cibuildwheel.util import resources
|
||||
from .util import resources
|
||||
|
||||
|
||||
def get_schema(tool_name: str = "cibuildwheel") -> dict[str, Any]:
|
||||
|
||||
@@ -2,7 +2,7 @@ import dataclasses
|
||||
import itertools
|
||||
from enum import StrEnum
|
||||
from fnmatch import fnmatch
|
||||
from typing import Self
|
||||
from typing import Any
|
||||
|
||||
import bracex
|
||||
from packaging.specifiers import SpecifierSet
|
||||
@@ -37,12 +37,11 @@ class EnableGroup(StrEnum):
|
||||
PyodidePrerelease = "pyodide-prerelease"
|
||||
|
||||
@classmethod
|
||||
def all_groups(cls) -> frozenset[Self]:
|
||||
# see https://github.com/python/mypy/issues/20434 for the reason to type: ignore[arg-type]
|
||||
return frozenset(set(cls) - {cls.CPythonFreeThreading}) # type: ignore[arg-type]
|
||||
def all_groups(cls) -> frozenset["EnableGroup"]:
|
||||
return frozenset(cls)
|
||||
|
||||
@classmethod
|
||||
def parse_option_value(cls, value: str) -> frozenset[Self]:
|
||||
def parse_option_value(cls, value: str) -> frozenset["EnableGroup"]:
|
||||
"""
|
||||
Parses a string of space-separated values into a set of EnableGroup
|
||||
members. The string may contain group names or "all".
|
||||
@@ -114,7 +113,7 @@ class BuildSelector:
|
||||
|
||||
return should_build and not should_skip
|
||||
|
||||
def options_summary(self) -> dict[str, str | list[str]]:
|
||||
def options_summary(self) -> Any:
|
||||
return {
|
||||
"build_config": self.build_config,
|
||||
"skip_config": self.skip_config,
|
||||
@@ -135,5 +134,5 @@ class TestSelector:
|
||||
should_skip = selector_matches(self.skip_config, build_id)
|
||||
return not should_skip
|
||||
|
||||
def options_summary(self) -> dict[str, str]:
|
||||
def options_summary(self) -> Any:
|
||||
return {"skip_config": self.skip_config}
|
||||
|
||||
@@ -7,8 +7,8 @@ import typing
|
||||
from collections.abc import Iterator, Mapping
|
||||
from typing import Final, Literal
|
||||
|
||||
from cibuildwheel.errors import FatalError
|
||||
from cibuildwheel.typing import PathOrStr
|
||||
from ..errors import FatalError
|
||||
from ..typing import PathOrStr
|
||||
|
||||
_IS_WIN: Final[bool] = sys.platform.startswith("win")
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ from zipfile import ZipFile
|
||||
import certifi
|
||||
from platformdirs import user_cache_path
|
||||
|
||||
from cibuildwheel.errors import FatalError
|
||||
from ..errors import FatalError
|
||||
|
||||
DEFAULT_CIBW_CACHE_PATH: Final[Path] = user_cache_path(appname="cibuildwheel", appauthor="pypa")
|
||||
CIBW_CACHE_PATH: Final[Path] = Path(
|
||||
|
||||
@@ -7,7 +7,7 @@ import textwrap
|
||||
from collections import defaultdict
|
||||
from collections.abc import Sequence
|
||||
|
||||
from cibuildwheel.typing import PathOrStr
|
||||
from ..typing import PathOrStr
|
||||
|
||||
|
||||
def format_safe(template: str, **kwargs: str | os.PathLike[str]) -> str:
|
||||
|
||||
@@ -2,13 +2,13 @@ import shlex
|
||||
from collections.abc import Mapping, Sequence
|
||||
from dataclasses import dataclass, field
|
||||
from pathlib import Path, PurePath
|
||||
from typing import Literal, Self, TypeVar
|
||||
from typing import Any, Literal, Self, TypeVar
|
||||
|
||||
from packaging.utils import parse_wheel_filename
|
||||
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call
|
||||
from cibuildwheel.util.helpers import parse_key_value_string, unwrap
|
||||
from . import resources
|
||||
from .cmd import call
|
||||
from .helpers import parse_key_value_string, unwrap
|
||||
|
||||
|
||||
@dataclass(kw_only=True)
|
||||
@@ -102,7 +102,7 @@ class DependencyConstraints:
|
||||
|
||||
return None
|
||||
|
||||
def options_summary(self) -> str | dict[str, str]:
|
||||
def options_summary(self) -> Any:
|
||||
if self == DependencyConstraints.pinned():
|
||||
return "pinned"
|
||||
elif self.packages:
|
||||
@@ -169,9 +169,10 @@ def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> T | None:
|
||||
elif platform.startswith("pyodide"):
|
||||
# each Pyodide version has its own platform tag
|
||||
continue
|
||||
# Windows should exactly match
|
||||
elif tag.platform != platform:
|
||||
continue
|
||||
else:
|
||||
# Windows should exactly match
|
||||
if tag.platform != platform:
|
||||
continue
|
||||
|
||||
# If all the filters above pass, then the wheel is a previously built compatible wheel.
|
||||
return wheel
|
||||
|
||||
@@ -3,7 +3,7 @@ import tomllib
|
||||
from pathlib import Path
|
||||
from typing import Final
|
||||
|
||||
from cibuildwheel.typing import PlatformName
|
||||
from ..typing import PlatformName
|
||||
|
||||
PATH: Final[Path] = Path(__file__).parent.parent / "resources"
|
||||
INSTALL_CERTIFI_SCRIPT: Final[Path] = PATH / "install_certifi.py"
|
||||
|
||||
@@ -12,9 +12,9 @@ from filelock import FileLock
|
||||
from packaging.requirements import InvalidRequirement, Requirement
|
||||
from packaging.version import Version
|
||||
|
||||
from cibuildwheel.util import resources
|
||||
from cibuildwheel.util.cmd import call
|
||||
from cibuildwheel.util.file import CIBW_CACHE_PATH, download
|
||||
from .util import resources
|
||||
from .util.cmd import call
|
||||
from .util.file import CIBW_CACHE_PATH, download
|
||||
|
||||
_IS_WIN: Final[bool] = sys.platform.startswith("win")
|
||||
|
||||
|
||||
@@ -4,16 +4,6 @@ title: Changelog
|
||||
|
||||
# Changelog
|
||||
|
||||
### v3.4.1
|
||||
|
||||
_2 April 2026_
|
||||
|
||||
- ⚠️ Building for the experimental CPython 3.13 free-threading variant is now deprecated. That functionality will be removed in the next minor release. The [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) option `cpython-freethreading` is therefore also deprecated. Builds specifying `enable = "all"` no longer select `cpython-freethreading`. CPython 3.14 free-threading support remains available without the `enable` flag. (#2787)
|
||||
- 🐛 iOS builds will no longer skip `repair-wheel-command` if it's defined in config (#2761)
|
||||
- 🐛 Fix bug causing `uv` to fail when environments define PYTHON_VERSION or UV_PYTHON, conflicting with our venvs (#2795)
|
||||
- ✨ 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)
|
||||
|
||||
### v3.4.0
|
||||
|
||||
_5 March 2026_
|
||||
@@ -177,12 +167,6 @@ See @henryiii's [release post](https://iscinumpy.dev/post/cibuildwheel-3-0-0/) f
|
||||
- 📚 Docs now primarily use the pyproject.toml name of options, rather than the environment variable name. (#2389)
|
||||
- 📚 README table now matches docs and auto-updates. (#2427, #2428)
|
||||
|
||||
### v2.23.4
|
||||
|
||||
_16 March 2026_
|
||||
|
||||
- 🐛 Fix HTTP 429 errors while downloading virtualenv from GitHub blob URLs – uses a https://bootstrap.pypa.io/ URL instead. (#2775)
|
||||
|
||||
### v2.23.3
|
||||
|
||||
_26 April 2025_
|
||||
|
||||
+3
-6
@@ -125,14 +125,11 @@ 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:
|
||||
|
||||
```yaml
|
||||
uses: pypa/cibuildwheel@v3.4.1
|
||||
uses: pypa/cibuildwheel@v3.4.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.
|
||||
|
||||
!!! note "Minor version tags"
|
||||
Unlike some GitHub Actions, cibuildwheel does **not** provide a floating `@v3` major-version tag, since our minor version change can add/remove wheels. You can, however, pin to a minor version such as `@v3.4` to automatically receive patch releases within that minor version. Dependabot (shown below) is the recommended way to stay up to date.
|
||||
|
||||
Then, your `.github/dependabot.yml` file could look like this:
|
||||
|
||||
```yaml
|
||||
@@ -150,7 +147,7 @@ The second option, and the only one that supports other CI systems, is using a `
|
||||
|
||||
```bash
|
||||
# requirements-cibw.txt
|
||||
cibuildwheel==3.4.1
|
||||
cibuildwheel==3.4.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:
|
||||
@@ -315,7 +312,7 @@ Solutions to this vary, but the simplest is to use pipx:
|
||||
# most runners have pipx preinstalled, but in case you don't
|
||||
python3 -m pip install pipx
|
||||
|
||||
pipx run cibuildwheel==3.4.1 --output-dir wheelhouse
|
||||
pipx run cibuildwheel==3.4.0 --output-dir wheelhouse
|
||||
pipx run twine upload wheelhouse/*.whl
|
||||
```
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import rich.console
|
||||
import rich.text
|
||||
|
||||
|
||||
def define_env(env: Any) -> None: # noqa: ANN401
|
||||
def define_env(env: Any) -> None:
|
||||
"Hook function for mkdocs-macros"
|
||||
|
||||
@env.macro # type: ignore[untyped-decorator]
|
||||
|
||||
@@ -92,11 +92,11 @@ title: Working examples
|
||||
| [keyvi][] | ![github icon][] | ![linux icon][] ![apple icon][] | FST based key value index highly optimized for size and lookup performance, utilizes ccache action for improved runtime |
|
||||
| [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python |
|
||||
| [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 |
|
||||
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
|
||||
| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
|
||||
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
|
||||
| [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][] | Fast Base64 encoding/decoding in Python |
|
||||
| [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. |
|
||||
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
|
||||
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
|
||||
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
|
||||
| [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 |
|
||||
@@ -203,11 +203,11 @@ title: Working examples
|
||||
[keyvi]: https://github.com/KeyviDev/keyvi
|
||||
[PyGLM]: https://github.com/Zuzu-Typ/PyGLM
|
||||
[iDynTree]: https://github.com/robotology/idyntree
|
||||
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
|
||||
[TgCrypto]: https://github.com/pyrogram/tgcrypto
|
||||
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
|
||||
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
|
||||
[pybase64]: https://github.com/mayeut/pybase64
|
||||
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
|
||||
[pybase64]: https://github.com/mayeut/pybase64
|
||||
[bx-python]: https://github.com/bxlab/bx-python
|
||||
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
|
||||
[Python-WebRTC]: https://github.com/MarshalX/python-webrtc
|
||||
|
||||
@@ -6,7 +6,7 @@ jobs:
|
||||
- bash: |
|
||||
set -o errexit
|
||||
python3 -m pip install --upgrade pip
|
||||
pip3 install cibuildwheel==3.4.1
|
||||
pip3 install cibuildwheel==3.4.0
|
||||
displayName: Install dependencies
|
||||
- bash: cibuildwheel --output-dir wheelhouse .
|
||||
displayName: Build wheels
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
- bash: |
|
||||
set -o errexit
|
||||
python3 -m pip install --upgrade pip
|
||||
python3 -m pip install cibuildwheel==3.4.1
|
||||
python3 -m pip install cibuildwheel==3.4.0
|
||||
displayName: Install dependencies
|
||||
- bash: cibuildwheel --output-dir wheelhouse .
|
||||
displayName: Build wheels
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
- bash: |
|
||||
set -o errexit
|
||||
python -m pip install --upgrade pip
|
||||
pip install cibuildwheel==3.4.1
|
||||
pip install cibuildwheel==3.4.0
|
||||
displayName: Install dependencies
|
||||
- bash: cibuildwheel --output-dir wheelhouse .
|
||||
displayName: Build wheels
|
||||
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
- run:
|
||||
name: Build the Linux wheels.
|
||||
command: |
|
||||
python3 -m pip install --user cibuildwheel==3.4.1
|
||||
python3 -m pip install --user cibuildwheel==3.4.0
|
||||
cibuildwheel --output-dir wheelhouse
|
||||
- store_artifacts:
|
||||
path: wheelhouse/
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
- run:
|
||||
name: Build the Linux aarch64 wheels.
|
||||
command: |
|
||||
python3 -m pip install --user cibuildwheel==3.4.1
|
||||
python3 -m pip install --user cibuildwheel==3.4.0
|
||||
python3 -m cibuildwheel --output-dir wheelhouse
|
||||
- store_artifacts:
|
||||
path: wheelhouse/
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
name: Build the OS X wheels.
|
||||
command: |
|
||||
sudo softwareupdate --install-rosetta --agree-to-license # for python<=3.8 or x86_64/universal2 tests
|
||||
pip3 install cibuildwheel==3.4.1
|
||||
pip3 install cibuildwheel==3.4.0
|
||||
cibuildwheel --output-dir wheelhouse
|
||||
- store_artifacts:
|
||||
path: wheelhouse/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==3.4.1
|
||||
- python -m pip install cibuildwheel==3.4.0
|
||||
run_cibuildwheel_script:
|
||||
- cibuildwheel
|
||||
wheels_artifacts:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==3.4.1
|
||||
- python -m pip install cibuildwheel==3.4.0
|
||||
run_cibuildwheel_script:
|
||||
- cibuildwheel
|
||||
wheels_artifacts:
|
||||
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Build wheels
|
||||
uses: pypa/cibuildwheel@v3.4.1
|
||||
uses: pypa/cibuildwheel@v3.4.0
|
||||
env:
|
||||
CIBW_PLATFORM: ${{ matrix.platform || 'auto' }}
|
||||
CIBW_ARCHS: ${{ matrix.archs || 'auto' }}
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Build wheels
|
||||
uses: pypa/cibuildwheel@v3.4.1
|
||||
uses: pypa/cibuildwheel@v3.4.0
|
||||
# env:
|
||||
# CIBW_SOME_OPTION: value
|
||||
# ...
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Build wheels
|
||||
run: pipx run cibuildwheel==3.4.1
|
||||
run: pipx run cibuildwheel==3.4.0
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
platforms: all
|
||||
|
||||
- name: Build wheels
|
||||
uses: pypa/cibuildwheel@v3.4.1
|
||||
uses: pypa/cibuildwheel@v3.4.0
|
||||
env:
|
||||
# configure cibuildwheel on Linux to build native archs ('auto'),
|
||||
# and to split the remaining architectures between the x86_64 and
|
||||
|
||||
@@ -12,7 +12,7 @@ linux:
|
||||
DOCKER_TLS_CERTDIR: ""
|
||||
script:
|
||||
- curl -sSL https://get.docker.com/ | sh
|
||||
- python -m pip install cibuildwheel==3.4.1
|
||||
- python -m pip install cibuildwheel==3.4.0
|
||||
- cibuildwheel --output-dir wheelhouse
|
||||
artifacts:
|
||||
paths:
|
||||
@@ -23,7 +23,7 @@ windows:
|
||||
before_script:
|
||||
- choco install python -y --allow-downgrade --version 3.12.4
|
||||
- choco install git.install -y
|
||||
- py -m pip install cibuildwheel==3.4.1
|
||||
- py -m pip install cibuildwheel==3.4.0
|
||||
script:
|
||||
- py -m cibuildwheel --output-dir wheelhouse --platform windows
|
||||
artifacts:
|
||||
@@ -35,7 +35,7 @@ windows:
|
||||
macos:
|
||||
image: macos-14-xcode-15
|
||||
before_script:
|
||||
- python3 -m pip install cibuildwheel==3.4.1
|
||||
- python3 -m pip install cibuildwheel==3.4.0
|
||||
script:
|
||||
- python3 -m cibuildwheel --output-dir wheelhouse
|
||||
artifacts:
|
||||
|
||||
@@ -14,7 +14,7 @@ linux:
|
||||
- curl -sSL https://get.docker.com/ | sh
|
||||
# Warning: This is extremely slow, be careful with how many wheels you build
|
||||
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
- python -m pip install cibuildwheel==3.4.1
|
||||
- python -m pip install cibuildwheel==3.4.0
|
||||
# Assuming your CI runner's default architecture is x86_64...
|
||||
- cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64
|
||||
artifacts:
|
||||
|
||||
+12
-11
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "cibuildwheel"
|
||||
version = "3.4.1"
|
||||
version = "3.4.0"
|
||||
description = "Build Python wheels on CI with minimal configuration."
|
||||
readme = "README.md"
|
||||
license = "BSD-2-Clause"
|
||||
@@ -128,10 +128,17 @@ files = [
|
||||
"noxfile.py",
|
||||
]
|
||||
warn_unused_configs = true
|
||||
|
||||
strict = true
|
||||
disallow_untyped_defs = false
|
||||
|
||||
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
|
||||
warn_unreachable = false
|
||||
|
||||
[[tool.mypy.overrides]]
|
||||
module = "cibuildwheel.*"
|
||||
disallow_untyped_defs = true
|
||||
|
||||
[[tool.mypy.overrides]]
|
||||
module = [
|
||||
"setuptools._distutils", # needed even if only directly import setuptools._distutils.util
|
||||
@@ -183,7 +190,6 @@ messages_control.disable = [
|
||||
]
|
||||
|
||||
[tool.ruff]
|
||||
show-fixes = true
|
||||
line-length = 100
|
||||
|
||||
[tool.ruff.lint]
|
||||
@@ -191,7 +197,6 @@ extend-select = [
|
||||
"B", # flake8-bugbear
|
||||
"I", # isort
|
||||
"ARG", # flake8-unused-arguments
|
||||
"ANN", # flake8-annotations
|
||||
"C4", # flake8-comprehensions
|
||||
"EM", # flake8-errmsg
|
||||
"ICN", # flake8-import-conventions
|
||||
@@ -206,7 +211,6 @@ extend-select = [
|
||||
"RUF", # Ruff-specific
|
||||
"SIM", # flake8-simplify
|
||||
"TID251", # flake8-tidy-imports.banned-api
|
||||
"TID252", # flake8-tidy-imports.relative-imports
|
||||
"UP", # pyupgrade
|
||||
"YTT", # flake8-2020
|
||||
"EXE", # flake8-executable
|
||||
@@ -223,17 +227,15 @@ extend-select = [
|
||||
"TC", # flake8-type-checking
|
||||
]
|
||||
ignore = [
|
||||
"PLR09", # Design related pylint codes
|
||||
"PLR2004", # Magic value in comparison
|
||||
"PLR", # Design related pylint codes
|
||||
"RET504", "RET505", "RET508", # else after control flow
|
||||
"PT007", # Lists of tuples in Pytest
|
||||
"PYI025", # Set as AbstractSet
|
||||
"ISC001", # Conflicts with formatter
|
||||
"EXE003", # Ruff doesn't like uv?
|
||||
"PTH123", # open -> Path.open
|
||||
]
|
||||
flake8-unused-arguments.ignore-variadic-names = true
|
||||
flake8-tidy-imports.ban-relative-imports = "all"
|
||||
flake8-annotations.allow-star-arg-any = true
|
||||
flake8-annotations.mypy-init-return = true
|
||||
|
||||
[tool.ruff.lint.flake8-tidy-imports.banned-api]
|
||||
"typing.Mapping".msg = "Use collections.abc.Mapping instead."
|
||||
@@ -243,8 +245,7 @@ flake8-annotations.mypy-init-return = true
|
||||
"typing.Set".msg = "Use collections.abc.Set instead."
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"unit_test/*" = ["PLC1901", "TID252"]
|
||||
"test/*" = ["TID252"]
|
||||
"unit_test/*" = ["PLC1901"]
|
||||
"bin/*" = ["TID251"]
|
||||
"cibuildwheel/resources/install_certifi.py" = ["PTH"]
|
||||
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ def pytest_addoption(parser: pytest.Parser) -> None:
|
||||
)
|
||||
|
||||
|
||||
def pytest_configure(config: pytest.Config) -> None:
|
||||
def pytest_configure(config):
|
||||
flag_enable = config.getoption("--enable")
|
||||
flag_platform = config.getoption("--platform")
|
||||
|
||||
|
||||
+5
-12
@@ -1,5 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import packaging.utils
|
||||
import pytest
|
||||
@@ -22,7 +21,7 @@ basic_project = test_projects.new_c_project(
|
||||
|
||||
|
||||
@pytest.mark.serial
|
||||
def test_dummy_serial() -> None:
|
||||
def test_dummy_serial():
|
||||
"""A no-op test to ensure that at least one serial test is always found.
|
||||
|
||||
Without this no-op test, CI fails on CircleCI because no serial tests are
|
||||
@@ -30,9 +29,7 @@ def test_dummy_serial() -> None:
|
||||
"""
|
||||
|
||||
|
||||
def test(
|
||||
tmp_path: Path, build_frontend_env: dict[str, str], capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test(tmp_path, build_frontend_env, capfd):
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
@@ -55,7 +52,7 @@ def test(
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="to keep test output clean")
|
||||
def test_sample_build(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_sample_build(tmp_path, capfd):
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
@@ -73,9 +70,7 @@ def test_sample_build(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None
|
||||
@pytest.mark.parametrize(
|
||||
"enable_setting", ["", "cpython-prerelease", "pypy", "cpython-freethreading"]
|
||||
)
|
||||
def test_build_identifiers(
|
||||
tmp_path: Path, enable_setting: str, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
def test_build_identifiers(tmp_path, enable_setting, monkeypatch):
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
@@ -98,9 +93,7 @@ def test_build_identifiers(
|
||||
(None, {"CIBW_ALLOW_EMPTY": "1"}),
|
||||
],
|
||||
)
|
||||
def test_allow_empty(
|
||||
tmp_path: Path, add_args: list[str] | None, env_allow_empty: dict[str, str]
|
||||
) -> None:
|
||||
def test_allow_empty(tmp_path, add_args, env_allow_empty):
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from . import test_projects, utils
|
||||
|
||||
@@ -34,7 +31,7 @@ limited_api_project = test_projects.new_c_project(
|
||||
limited_api_project.files["pyproject.toml"] = pyproject_toml
|
||||
|
||||
|
||||
def test_abi3(tmp_path: Path) -> None:
|
||||
def test_abi3(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
limited_api_project.generate(project_dir)
|
||||
|
||||
@@ -44,7 +41,7 @@ def test_abi3(tmp_path: Path) -> None:
|
||||
add_env={
|
||||
# free_threaded, GraalPy, and PyPy do not have a Py_LIMITED_API equivalent, just build one of those
|
||||
# also limit the number of builds for test performance reasons
|
||||
"CIBW_BUILD": "cp39-* cp310-* pp310-* gp312_250-* cp312-* cp314t-*",
|
||||
"CIBW_BUILD": "cp39-* cp310-* pp310-* gp312_250-* cp312-* cp313t-*",
|
||||
"CIBW_ENABLE": "all",
|
||||
},
|
||||
)
|
||||
@@ -65,7 +62,7 @@ def test_abi3(tmp_path: Path) -> None:
|
||||
python_abi_tags=[
|
||||
"cp39-cp39",
|
||||
"cp310-abi3", # <-- ABI3, works with 3.10 and 3.12
|
||||
"cp314-cp314t",
|
||||
"cp313-cp313t",
|
||||
"pp310-pypy310_pp73",
|
||||
"graalpy312-graalpy250_312_native",
|
||||
],
|
||||
@@ -181,7 +178,7 @@ ctypes_project.files["test/add_test.py"] = textwrap.dedent(
|
||||
ctypes_project.files["pyproject.toml"] = pyproject_toml
|
||||
|
||||
|
||||
def test_abi_none(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_abi_none(tmp_path, capfd):
|
||||
project_dir = tmp_path / "project"
|
||||
ctypes_project.generate(project_dir)
|
||||
|
||||
@@ -192,7 +189,7 @@ def test_abi_none(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
"CIBW_TEST_REQUIRES": "pytest",
|
||||
"CIBW_TEST_COMMAND": f"{utils.invoke_pytest()} {{project}}/test",
|
||||
# limit the number of builds for test performance reasons
|
||||
"CIBW_BUILD": "cp38-* cp{}{}-* cp314t-* pp310-*".format(*utils.SINGLE_PYTHON_VERSION),
|
||||
"CIBW_BUILD": "cp38-* cp{}{}-* cp313t-* pp310-*".format(*utils.SINGLE_PYTHON_VERSION),
|
||||
"CIBW_ENABLE": "all",
|
||||
},
|
||||
)
|
||||
|
||||
+23
-43
@@ -2,8 +2,6 @@ import os
|
||||
import platform
|
||||
import re
|
||||
import sys
|
||||
import typing
|
||||
from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from shutil import rmtree, which
|
||||
@@ -54,10 +52,8 @@ if "ANDROID_HOME" not in os.environ:
|
||||
# Many CI services don't support running the Android emulator: see platforms.md.
|
||||
supports_emulator = (not ci) or ("GITHUB_ACTIONS" in os.environ and platform.system() == "Linux")
|
||||
|
||||
T = typing.TypeVar("T", bound=Callable[..., typing.Any])
|
||||
|
||||
|
||||
def needs_emulator(test: T) -> T:
|
||||
def needs_emulator(test):
|
||||
# All copies of the testbed app run on the same emulator with the same
|
||||
# application ID, so these tests must be run serially.
|
||||
test = pytest.mark.serial(test)
|
||||
@@ -89,7 +85,7 @@ cp313_env = {
|
||||
}
|
||||
|
||||
|
||||
def test_android_home(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_android_home(tmp_path, capfd):
|
||||
new_c_project().generate(tmp_path)
|
||||
env = os.environ.copy()
|
||||
del env["ANDROID_HOME"]
|
||||
@@ -104,7 +100,7 @@ def test_android_home(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None
|
||||
# a build, which is marked as serial so it will run before the parallel tests, but isn't
|
||||
# marked as needs_emulator so it will run on all CI platforms.
|
||||
@pytest.mark.serial
|
||||
def test_expected_wheels(tmp_path: Path, spam_env: dict[str, str]) -> None:
|
||||
def test_expected_wheels(tmp_path, spam_env):
|
||||
# Since this test covers all Python versions, check the cross venv.
|
||||
test_module = "_cross_venv_test_android"
|
||||
project = new_c_project(setup_py_add=f"import {test_module}")
|
||||
@@ -123,7 +119,7 @@ def test_expected_wheels(tmp_path: Path, spam_env: dict[str, str]) -> None:
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_frontend_good(tmp_path: Path, build_frontend_env: dict[str, str]) -> None:
|
||||
def test_frontend_good(tmp_path, build_frontend_env):
|
||||
new_c_project().generate(tmp_path)
|
||||
wheels = cibuildwheel_run(
|
||||
tmp_path,
|
||||
@@ -133,7 +129,7 @@ def test_frontend_good(tmp_path: Path, build_frontend_env: dict[str, str]) -> No
|
||||
|
||||
|
||||
@pytest.mark.parametrize("frontend", ["pip"])
|
||||
def test_frontend_bad(frontend: str, tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_frontend_bad(frontend, tmp_path, capfd):
|
||||
new_c_project().generate(tmp_path)
|
||||
with pytest.raises(CalledProcessError):
|
||||
cibuildwheel_run(
|
||||
@@ -144,7 +140,7 @@ def test_frontend_bad(frontend: str, tmp_path: Path, capfd: pytest.CaptureFixtur
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_archs(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_archs(tmp_path, capfd):
|
||||
new_c_project().generate(tmp_path)
|
||||
|
||||
# Build all architectures while checking the handling of the `before` commands.
|
||||
@@ -193,7 +189,7 @@ def test_archs(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
pytest.fail(f"Unexpected line: {line!r}")
|
||||
|
||||
|
||||
def test_build_requires(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_build_requires(tmp_path, capfd):
|
||||
# Build-time requirements should be installed for the build platform, not for Android. Prove
|
||||
# this by installing some non-pure-Python requirements and using them in setup.py.
|
||||
#
|
||||
@@ -230,13 +226,13 @@ def test_build_requires(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> No
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def spam_env(tmp_path: Path) -> dict[str, str]:
|
||||
def spam_env(tmp_path):
|
||||
project = new_c_project()
|
||||
project.files["test_spam.py"] = dedent(
|
||||
"""\
|
||||
import spam
|
||||
|
||||
def test_spam() -> None:
|
||||
def test_spam():
|
||||
assert spam.filter("ham")
|
||||
assert not spam.filter("spam")
|
||||
print("Spam test passed")
|
||||
@@ -244,7 +240,7 @@ def spam_env(tmp_path: Path) -> dict[str, str]:
|
||||
)
|
||||
project.files["test_empty.py"] = dedent(
|
||||
"""\
|
||||
def test_empty() -> None:
|
||||
def test_empty():
|
||||
pass
|
||||
"""
|
||||
)
|
||||
@@ -269,13 +265,7 @@ def spam_env(tmp_path: Path) -> dict[str, str]:
|
||||
("pytest test_spam.py", "=== 1 passed in "),
|
||||
],
|
||||
)
|
||||
def test_test_command_good(
|
||||
command: str,
|
||||
expected_output: str,
|
||||
tmp_path: Path,
|
||||
spam_env: dict[str, str],
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
) -> None:
|
||||
def test_test_command_good(command, expected_output, tmp_path, spam_env, capfd):
|
||||
cibuildwheel_run(tmp_path, add_env={**spam_env, "CIBW_TEST_COMMAND": command})
|
||||
stdout, stderr = capfd.readouterr()
|
||||
assert expected_output in stdout
|
||||
@@ -310,13 +300,7 @@ BAD_PLACEHOLDER_ERROR = (
|
||||
("pytest test_ham.py", "not found: test_ham.py"),
|
||||
],
|
||||
)
|
||||
def test_test_command_bad(
|
||||
command: str,
|
||||
expected_output: str,
|
||||
tmp_path: Path,
|
||||
spam_env: dict[str, str],
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
) -> None:
|
||||
def test_test_command_bad(command, expected_output, tmp_path, spam_env, capfd):
|
||||
with pytest.raises(CalledProcessError):
|
||||
cibuildwheel_run(tmp_path, add_env={**spam_env, "CIBW_TEST_COMMAND": command})
|
||||
assert expected_output in capfd.readouterr().err
|
||||
@@ -330,9 +314,7 @@ def test_test_command_bad(
|
||||
("-E", 1),
|
||||
],
|
||||
)
|
||||
def test_test_command_python_options(
|
||||
options: str, expected: int, tmp_path: Path, capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_test_command_python_options(options, expected, tmp_path, capfd):
|
||||
project = new_c_project()
|
||||
project.generate(tmp_path)
|
||||
|
||||
@@ -348,9 +330,7 @@ def test_test_command_python_options(
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_package_subdir(
|
||||
tmp_path: Path, spam_env: dict[str, str], capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_package_subdir(tmp_path, spam_env, capfd):
|
||||
spam_paths = list(tmp_path.iterdir())
|
||||
package_dir = tmp_path / "package"
|
||||
package_dir.mkdir()
|
||||
@@ -365,7 +345,7 @@ def test_package_subdir(
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_no_test_sources(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_no_test_sources(tmp_path, capfd):
|
||||
new_c_project().generate(tmp_path)
|
||||
with pytest.raises(CalledProcessError):
|
||||
cibuildwheel_run(
|
||||
@@ -379,17 +359,17 @@ def test_no_test_sources(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> N
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_environment_markers(tmp_path: Path) -> None:
|
||||
def test_environment_markers(tmp_path):
|
||||
project = new_c_project()
|
||||
test_filename = "test_environment_markers.py"
|
||||
project.files[test_filename] = dedent(
|
||||
"""\
|
||||
import pytest
|
||||
|
||||
def test_android() -> None:
|
||||
def test_android():
|
||||
import certifi
|
||||
|
||||
def test_not_android() -> None:
|
||||
def test_not_android():
|
||||
try:
|
||||
import platformdirs
|
||||
except ImportError:
|
||||
@@ -412,7 +392,7 @@ def test_environment_markers(tmp_path: Path) -> None:
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_verbosity(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_verbosity(tmp_path, capfd):
|
||||
new_c_project().generate(tmp_path)
|
||||
test_env = {
|
||||
**cp313_env,
|
||||
@@ -438,7 +418,7 @@ def test_verbosity(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_api_level(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_api_level(tmp_path, capfd):
|
||||
project = new_c_project()
|
||||
project.files["pyproject.toml"] = dedent(
|
||||
"""\
|
||||
@@ -470,7 +450,7 @@ def test_api_level(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_libcxx(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_libcxx(tmp_path, capfd):
|
||||
project_dir = tmp_path / "project"
|
||||
output_dir = tmp_path / "output"
|
||||
|
||||
@@ -519,7 +499,7 @@ def test_libcxx(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_setuptools_rust(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_setuptools_rust(tmp_path, capfd):
|
||||
"""
|
||||
Test Android cross-compilation using the setuptools-rust toolchain.
|
||||
"""
|
||||
@@ -604,7 +584,7 @@ def test_setuptools_rust(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> N
|
||||
|
||||
|
||||
@needs_emulator
|
||||
def test_maturin(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_maturin(tmp_path, capfd):
|
||||
"""
|
||||
Test Android cross-compilation using the maturin backend.
|
||||
"""
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import subprocess
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -30,7 +29,7 @@ project_with_before_build_asserts = test_projects.new_c_project(
|
||||
)
|
||||
|
||||
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_before_build_asserts.generate(project_dir)
|
||||
|
||||
@@ -62,7 +61,7 @@ def test(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_failing_command(tmp_path: Path) -> None:
|
||||
def test_failing_command(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
test_projects.new_c_project().generate(project_dir)
|
||||
|
||||
@@ -76,7 +75,7 @@ def test_failing_command(tmp_path: Path) -> None:
|
||||
)
|
||||
|
||||
|
||||
def test_cwd(tmp_path: Path) -> None:
|
||||
def test_cwd(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
test_projects.new_c_project().generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import subprocess
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -37,7 +36,7 @@ project_with_before_build_asserts = test_projects.new_c_project(
|
||||
)
|
||||
|
||||
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_before_build_asserts.generate(project_dir)
|
||||
|
||||
@@ -66,7 +65,7 @@ def test(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_failing_command(tmp_path: Path) -> None:
|
||||
def test_failing_command(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
test_projects.new_c_project().generate(project_dir)
|
||||
|
||||
@@ -80,7 +79,7 @@ def test_failing_command(tmp_path: Path) -> None:
|
||||
)
|
||||
|
||||
|
||||
def test_cwd(tmp_path: Path) -> None:
|
||||
def test_cwd(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
test_projects.new_c_project().generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from pathlib import Path
|
||||
|
||||
from . import test_projects, utils
|
||||
|
||||
before_test_project = test_projects.new_c_project()
|
||||
@@ -13,7 +11,7 @@ PROJECT_DIR = Path(__file__).parent.parent.resolve()
|
||||
|
||||
|
||||
class TestBeforeTest(TestCase):
|
||||
def test_version(self) -> None:
|
||||
def test_version(self):
|
||||
# assert that the Python version as written to pythonversion_bt.txt in the CIBW_BEFORE_TEST step
|
||||
# is the same one as is currently running.
|
||||
# because of use symlinks in MacOS run this test is also need
|
||||
@@ -22,7 +20,7 @@ class TestBeforeTest(TestCase):
|
||||
print('sys.version', sys.version)
|
||||
assert stored_version == sys.version
|
||||
|
||||
def test_prefix(self) -> None:
|
||||
def test_prefix(self):
|
||||
# check that the prefix also was written
|
||||
stored_prefix = PROJECT_DIR.joinpath('pythonprefix_bt.txt').read_text()
|
||||
print('stored_prefix', stored_prefix)
|
||||
@@ -34,7 +32,7 @@ class TestBeforeTest(TestCase):
|
||||
"""
|
||||
|
||||
|
||||
def test(tmp_path: Path, build_frontend_env: dict[str, str]) -> None:
|
||||
def test(tmp_path, build_frontend_env):
|
||||
project_dir = tmp_path / "project"
|
||||
before_test_project.generate(project_dir)
|
||||
test_project_dir = project_dir / "dependency"
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -13,9 +12,7 @@ from . import test_projects, utils
|
||||
"build",
|
||||
],
|
||||
)
|
||||
def test_build_frontend_args(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str], frontend_name: str
|
||||
) -> None:
|
||||
def test_build_frontend_args(tmp_path, capfd, frontend_name):
|
||||
project = test_projects.new_c_project()
|
||||
project_dir = tmp_path / "project"
|
||||
project.generate(project_dir)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
from . import test_projects, utils
|
||||
|
||||
@@ -16,7 +15,7 @@ project_with_skip_asserts = test_projects.new_c_project(
|
||||
)
|
||||
|
||||
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_skip_asserts.generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from . import test_projects, utils
|
||||
@@ -7,9 +5,7 @@ from . import test_projects, utils
|
||||
basic_project = test_projects.new_c_project()
|
||||
|
||||
|
||||
def test_podman(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str], request: pytest.FixtureRequest
|
||||
) -> None:
|
||||
def test_podman(tmp_path, capfd, request):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the test is only relevant to the linux build")
|
||||
|
||||
@@ -39,7 +35,7 @@ def test_podman(
|
||||
assert "test log statement from before-all" in captured.out
|
||||
|
||||
|
||||
def test_create_args(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_create_args(tmp_path, capfd):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the test is only relevant to the linux build")
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import platform
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -23,7 +22,7 @@ dockcross_only_project = test_projects.new_c_project(
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("docker_cleanup")
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the test is only relevant to the linux build")
|
||||
if platform.machine() not in ["x86_64", "i686"]:
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from pathlib import Path
|
||||
|
||||
import jinja2
|
||||
|
||||
from . import utils
|
||||
@@ -54,7 +52,7 @@ cpp_test_project.files["setup.py"] = jinja2.Template(setup_py_template)
|
||||
cpp_test_project.files["spam.cpp"] = jinja2.Template(spam_cpp_template)
|
||||
|
||||
|
||||
def test_cpp11(tmp_path: Path) -> None:
|
||||
def test_cpp11(tmp_path):
|
||||
# This test checks that the C++11 standard is supported
|
||||
project_dir = tmp_path / "project"
|
||||
cpp11_project = cpp_test_project.copy()
|
||||
@@ -70,7 +68,7 @@ def test_cpp11(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_cpp14(tmp_path: Path) -> None:
|
||||
def test_cpp14(tmp_path):
|
||||
# This test checks that the C++14 standard is supported
|
||||
project_dir = tmp_path / "project"
|
||||
cpp14_project = cpp_test_project.copy()
|
||||
@@ -86,7 +84,7 @@ def test_cpp14(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_cpp17(tmp_path: Path) -> None:
|
||||
def test_cpp17(tmp_path):
|
||||
# This test checks that the C++17 standard is supported
|
||||
project_dir = tmp_path / "project"
|
||||
cpp17_project = cpp_test_project.copy()
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import subprocess
|
||||
import textwrap
|
||||
from contextlib import nullcontext as does_not_raise
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -31,7 +30,7 @@ shutil.copy(wheel, dest)
|
||||
"""
|
||||
|
||||
|
||||
def test(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test(tmp_path, capfd):
|
||||
# this test checks that a generated wheel name shall be unique in a given cibuildwheel run
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
@@ -69,7 +68,7 @@ def test(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
],
|
||||
ids=["no-placeholder", "package-placeholder", "project-placeholder"],
|
||||
)
|
||||
def test_repair_wheel_command_structure(tmp_path: Path, repair_command: str) -> None:
|
||||
def test_repair_wheel_command_structure(tmp_path, repair_command):
|
||||
project_dir = tmp_path / "project"
|
||||
project = test_projects.new_c_project()
|
||||
project.files["repair.py"] = textwrap.dedent("""
|
||||
|
||||
@@ -36,9 +36,7 @@ for name, expected_version in expected_versions.items():
|
||||
"""
|
||||
|
||||
|
||||
def test_check_versions_script(
|
||||
tmp_path: Path, build_frontend_env_nouv: dict[str, str], capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_check_versions_script(tmp_path, build_frontend_env_nouv, capfd):
|
||||
if utils.get_platform() == "linux":
|
||||
pytest.skip("we don't test dependency versions on linux, refer to other tests")
|
||||
|
||||
@@ -78,9 +76,7 @@ def get_versions_from_constraint_file(constraint_file: Path) -> dict[str, str]:
|
||||
|
||||
|
||||
@pytest.mark.parametrize("python_version", ["3.8", "3.12"])
|
||||
def test_pinned_versions(
|
||||
tmp_path: Path, python_version: str, build_frontend_env_nouv: dict[str, str]
|
||||
) -> None:
|
||||
def test_pinned_versions(tmp_path, python_version, build_frontend_env_nouv):
|
||||
if utils.get_platform() == "linux":
|
||||
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
||||
if python_version != "3.12" and utils.get_platform() == "pyodide":
|
||||
@@ -131,9 +127,7 @@ def test_pinned_versions(
|
||||
|
||||
|
||||
@pytest.mark.parametrize("method", ["inline", "file"])
|
||||
def test_dependency_constraints(
|
||||
method: str, tmp_path: Path, build_frontend_env_nouv: dict[str, str]
|
||||
) -> None:
|
||||
def test_dependency_constraints(method, tmp_path, build_frontend_env_nouv):
|
||||
if utils.get_platform() == "linux":
|
||||
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import itertools
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -11,13 +10,13 @@ project_with_a_test = test_projects.new_c_project()
|
||||
project_with_a_test.files["test/spam_test.py"] = r"""
|
||||
import spam
|
||||
|
||||
def test_spam() -> None:
|
||||
def test_spam():
|
||||
assert spam.filter("spam") == 0
|
||||
assert spam.filter("ham") != 0
|
||||
"""
|
||||
|
||||
|
||||
def test(tmp_path: Path, request: pytest.FixtureRequest) -> None:
|
||||
def test(tmp_path, request):
|
||||
archs = request.config.getoption("--run-emulation")
|
||||
if archs is None:
|
||||
pytest.skip("needs --run-emulation option to run")
|
||||
@@ -46,7 +45,7 @@ def test(tmp_path: Path, request: pytest.FixtureRequest) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_setting_arch_on_other_platforms(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_setting_arch_on_other_platforms(tmp_path, capfd):
|
||||
if utils.get_platform() == "linux":
|
||||
pytest.skip("this test checks the behaviour on platforms other than linux")
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ import os
|
||||
import subprocess
|
||||
import sys
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -34,7 +33,7 @@ project_with_environment_asserts = test_projects.new_c_project(
|
||||
)
|
||||
|
||||
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
python_echo = f"'{sys.executable}' -c \"import sys; print(*sys.argv[1:])\""
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_environment_asserts.generate(project_dir)
|
||||
@@ -56,7 +55,7 @@ def test(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_overridden_path(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_overridden_path(tmp_path, capfd):
|
||||
project_dir = tmp_path / "project"
|
||||
output_dir = tmp_path / "output"
|
||||
|
||||
@@ -109,7 +108,7 @@ def test_overridden_path(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> N
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_overridden_pip_constraint(tmp_path: Path, build_frontend: str) -> None:
|
||||
def test_overridden_pip_constraint(tmp_path, build_frontend):
|
||||
"""
|
||||
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
|
||||
|
||||
@@ -6,8 +6,6 @@ from collections.abc import Mapping
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
import pytest
|
||||
|
||||
from test.test_projects.base import TestProject
|
||||
|
||||
from . import test_projects, utils
|
||||
@@ -61,7 +59,7 @@ def cibuildwheel_from_sdist_run(
|
||||
# tests
|
||||
|
||||
|
||||
def test_simple(tmp_path: Path) -> None:
|
||||
def test_simple(tmp_path):
|
||||
basic_project = test_projects.new_c_project()
|
||||
|
||||
# make an sdist of the project
|
||||
@@ -89,7 +87,7 @@ def test_simple(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_external_config_file_argument(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_external_config_file_argument(tmp_path, capfd):
|
||||
basic_project = test_projects.new_c_project()
|
||||
|
||||
# make an sdist of the project
|
||||
@@ -120,7 +118,7 @@ def test_external_config_file_argument(tmp_path: Path, capfd: pytest.CaptureFixt
|
||||
assert "test log statement from before-all" in captured.out
|
||||
|
||||
|
||||
def test_config_in_pyproject_toml(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_config_in_pyproject_toml(tmp_path, capfd):
|
||||
# make a project with a pyproject.toml
|
||||
project = test_projects.new_c_project()
|
||||
project.files["pyproject.toml"] = textwrap.dedent(
|
||||
@@ -147,7 +145,7 @@ def test_config_in_pyproject_toml(tmp_path: Path, capfd: pytest.CaptureFixture[s
|
||||
assert "test log statement from before-build 8419" in captured.out
|
||||
|
||||
|
||||
def test_internal_config_file_argument(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_internal_config_file_argument(tmp_path, capfd):
|
||||
# make a project with a config file inside
|
||||
project = test_projects.new_c_project(
|
||||
setup_cfg_add="include_package_data = True",
|
||||
|
||||
+15
-23
@@ -1,9 +1,10 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import platform
|
||||
import shutil
|
||||
import subprocess
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -23,7 +24,7 @@ import platform
|
||||
from unittest import TestCase
|
||||
|
||||
class TestPlatform(TestCase):
|
||||
def test_platform(self) -> None:
|
||||
def test_platform(self):
|
||||
self.assertEqual(platform.machine(), "{platform.machine()}")
|
||||
|
||||
"""
|
||||
@@ -60,12 +61,7 @@ def skip_if_ios_testing_not_supported() -> None:
|
||||
{"CIBW_PLATFORM": "ios", "CIBW_BUILD_FRONTEND": "build"},
|
||||
],
|
||||
)
|
||||
def test_ios_platforms(
|
||||
tmp_path: Path,
|
||||
build_config: dict[str, str],
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
) -> None:
|
||||
def test_ios_platforms(tmp_path, build_config, monkeypatch, capfd):
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
# Create a temporary "bin" directory, symlink a tool that we know eixsts
|
||||
@@ -73,9 +69,7 @@ def test_ios_platforms(
|
||||
# and add the temp bin directory to the PATH.
|
||||
tools_dir = tmp_path / "bin"
|
||||
tools_dir.mkdir()
|
||||
true_app = shutil.which("true")
|
||||
assert true_app is not None
|
||||
tools_dir.joinpath("does-exist").symlink_to(true_app)
|
||||
tools_dir.joinpath("does-exist").symlink_to(shutil.which("true"))
|
||||
|
||||
monkeypatch.setenv("PATH", str(tools_dir), prepend=os.pathsep)
|
||||
|
||||
@@ -118,7 +112,7 @@ def test_ios_platforms(
|
||||
|
||||
|
||||
@pytest.mark.serial
|
||||
def test_no_test_sources(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_no_test_sources(tmp_path, capfd):
|
||||
"""Build will provide a helpful error if pytest is run and test-sources is not defined."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -146,7 +140,7 @@ def test_no_test_sources(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> N
|
||||
)
|
||||
|
||||
|
||||
def test_ios_testing_with_placeholder(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_ios_testing_with_placeholder(tmp_path, capfd):
|
||||
"""
|
||||
Tests with the {project} placeholder are not supported on iOS, because the test command
|
||||
is run in the simulator.
|
||||
@@ -176,7 +170,7 @@ def test_ios_testing_with_placeholder(tmp_path: Path, capfd: pytest.CaptureFixtu
|
||||
|
||||
@pytest.mark.serial
|
||||
@pytest.mark.flaky(reruns=2)
|
||||
def test_ios_test_command_short_circuit(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_ios_test_command_short_circuit(tmp_path, capfd):
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
project_dir = tmp_path / "project"
|
||||
@@ -204,7 +198,7 @@ def test_ios_test_command_short_circuit(tmp_path: Path, capfd: pytest.CaptureFix
|
||||
assert "Zen of Python" not in captured.out + captured.err
|
||||
|
||||
|
||||
def test_missing_xbuild_tool(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_missing_xbuild_tool(tmp_path, capfd):
|
||||
"""Build will fail if xbuild-tools references a non-existent tool."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -228,7 +222,7 @@ def test_missing_xbuild_tool(tmp_path: Path, capfd: pytest.CaptureFixture[str])
|
||||
assert "Could not find a 'does-not-exist' executable on the path." in captured.err
|
||||
|
||||
|
||||
def test_no_xbuild_tool_definition(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_no_xbuild_tool_definition(tmp_path, capfd):
|
||||
"""Build will succeed with a warning if there is no xbuild-tools definition."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -262,7 +256,7 @@ def test_no_xbuild_tool_definition(tmp_path: Path, capfd: pytest.CaptureFixture[
|
||||
assert "Your project configuration does not define any cross-build tools." in captured.err
|
||||
|
||||
|
||||
def test_empty_xbuild_tool_definition(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_empty_xbuild_tool_definition(tmp_path, capfd):
|
||||
"""Build will succeed with no warning if there is an empty xbuild-tools definition."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -294,9 +288,7 @@ def test_empty_xbuild_tool_definition(tmp_path: Path, capfd: pytest.CaptureFixtu
|
||||
|
||||
|
||||
@pytest.mark.serial
|
||||
def test_ios_test_command_without_python_dash_m(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_ios_test_command_without_python_dash_m(tmp_path, capfd):
|
||||
"""pytest should be able to run without python -m, but it should warn."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -306,7 +298,7 @@ def test_ios_test_command_without_python_dash_m(
|
||||
project.files["tests/__init__.py"] = ""
|
||||
project.files["tests/test_spam.py"] = textwrap.dedent("""
|
||||
import spam
|
||||
def test_spam() -> None:
|
||||
def test_spam():
|
||||
assert spam.filter("spam") == 0
|
||||
assert spam.filter("ham") != 0
|
||||
""")
|
||||
@@ -334,7 +326,7 @@ def test_ios_test_command_without_python_dash_m(
|
||||
assert "iOS tests configured with a test command which doesn't start with 'python -m'" in err
|
||||
|
||||
|
||||
def test_ios_test_command_invalid(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_ios_test_command_invalid(tmp_path, capfd):
|
||||
"""Test command should raise an error if it's clearly invalid."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
@@ -357,7 +349,7 @@ def test_ios_test_command_invalid(tmp_path: Path, capfd: pytest.CaptureFixture[s
|
||||
assert "iOS tests configured with a test command which doesn't start with 'python -m'" in err
|
||||
|
||||
|
||||
def test_repair_step(tmp_path: Path) -> None:
|
||||
def test_repair_step(tmp_path):
|
||||
"""Build will succeed & the custom repair step is called."""
|
||||
skip_if_ios_testing_not_supported()
|
||||
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import platform
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from . import test_projects, utils
|
||||
|
||||
|
||||
def test_python_exist(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_python_exist(tmp_path, capfd):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the test is only relevant to the linux build")
|
||||
machine = platform.machine()
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import platform
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -20,7 +19,7 @@ ALL_MACOS_WHEELS = {
|
||||
DEPLOYMENT_TARGET_TOO_LOW_WARNING = "Bumping MACOSX_DEPLOYMENT_TARGET"
|
||||
|
||||
|
||||
def test_cross_compiled_build(tmp_path: Path) -> None:
|
||||
def test_cross_compiled_build(tmp_path):
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
if utils.get_xcode_version() < (12, 2):
|
||||
@@ -52,12 +51,7 @@ def test_cross_compiled_build(tmp_path: Path) -> None:
|
||||
},
|
||||
],
|
||||
)
|
||||
def test_cross_compiled_test(
|
||||
tmp_path: Path,
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
build_universal2: bool,
|
||||
test_config: dict[str, str],
|
||||
) -> None:
|
||||
def test_cross_compiled_test(tmp_path, capfd, build_universal2, test_config):
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
if utils.get_xcode_version() < (12, 2):
|
||||
@@ -116,9 +110,7 @@ def test_cross_compiled_test(
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_deployment_target_warning_is_firing(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_deployment_target_warning_is_firing(tmp_path, capfd):
|
||||
# force the warning to check that we can detect it if it happens
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
@@ -141,9 +133,7 @@ def test_deployment_target_warning_is_firing(
|
||||
|
||||
|
||||
@pytest.mark.parametrize("skip_arm64_test", [False, True])
|
||||
def test_universal2_testing_on_x86_64(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str], skip_arm64_test: bool
|
||||
) -> None:
|
||||
def test_universal2_testing_on_x86_64(tmp_path, capfd, skip_arm64_test):
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
if utils.get_xcode_version() < (12, 2):
|
||||
@@ -182,9 +172,7 @@ def test_universal2_testing_on_x86_64(
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_universal2_testing_on_arm64(
|
||||
build_frontend_env: dict[str, str], tmp_path: Path, capfd: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
def test_universal2_testing_on_arm64(build_frontend_env, tmp_path, capfd):
|
||||
# cibuildwheel should test the universal2 wheel on both x86_64 and arm64, when run on arm64
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
@@ -215,9 +203,7 @@ def test_universal2_testing_on_arm64(
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_cp38_arm64_testing(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str], request: pytest.FixtureRequest
|
||||
) -> None:
|
||||
def test_cp38_arm64_testing(tmp_path, capfd, request):
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("this test is only relevant to macos")
|
||||
if utils.get_xcode_version() < (12, 2):
|
||||
@@ -252,9 +238,7 @@ def test_cp38_arm64_testing(
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_cp38_arm64_testing_universal2_installer(
|
||||
tmp_path: Path, capfd: pytest.CaptureFixture[str], request: pytest.FixtureRequest
|
||||
) -> None:
|
||||
def test_cp38_arm64_testing_universal2_installer(tmp_path, capfd, request):
|
||||
if not request.config.getoption("--run-cp38-universal2"):
|
||||
pytest.skip("needs --run-cp38-universal2 option to run")
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import platform
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -62,7 +61,7 @@ project_with_manylinux_symbols = test_projects.new_c_project(
|
||||
],
|
||||
)
|
||||
@pytest.mark.usefixtures("docker_cleanup")
|
||||
def test(manylinux_image: str, tmp_path: Path) -> None:
|
||||
def test(manylinux_image, tmp_path):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the container image test is only relevant to the linux build")
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from pathlib import Path
|
||||
|
||||
import packaging.utils
|
||||
|
||||
from . import test_projects, utils
|
||||
@@ -7,7 +5,7 @@ from . import test_projects, utils
|
||||
meson_project = test_projects.new_meson_project()
|
||||
|
||||
|
||||
def test_meson_python_basic(tmp_path: Path, build_frontend_env: dict[str, str]) -> None:
|
||||
def test_meson_python_basic(tmp_path, build_frontend_env):
|
||||
"""Test that cibuildwheel can build a project with meson-python backend."""
|
||||
project_dir = tmp_path / "project"
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -28,7 +27,7 @@ project_with_manylinux_symbols = test_projects.new_c_project(
|
||||
["musllinux_1_2"],
|
||||
)
|
||||
@pytest.mark.usefixtures("docker_cleanup")
|
||||
def test(musllinux_image: str, tmp_path: Path) -> None:
|
||||
def test(musllinux_image, tmp_path):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("the container image test is only relevant to the linux build")
|
||||
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
from . import test_projects, utils
|
||||
|
||||
@@ -30,7 +29,7 @@ build-backend = "setuptools.build_meta"
|
||||
"""
|
||||
|
||||
|
||||
def test_pep518(tmp_path: Path, build_frontend_env: dict[str, str]) -> None:
|
||||
def test_pep518(tmp_path, build_frontend_env):
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -24,7 +23,7 @@ def a_function():
|
||||
"""
|
||||
|
||||
|
||||
def test(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test(tmp_path, capfd):
|
||||
# this test checks that if a pure wheel is generated, the build should
|
||||
# fail.
|
||||
project_dir = tmp_path / "project"
|
||||
|
||||
@@ -3,7 +3,6 @@ import os
|
||||
import subprocess
|
||||
import sys
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -49,7 +48,7 @@ if __name__ == "__main__":
|
||||
|
||||
|
||||
@pytest.mark.parametrize("use_pyproject_toml", [True, False])
|
||||
def test_pyodide_build(tmp_path: Path, use_pyproject_toml: bool) -> None:
|
||||
def test_pyodide_build(tmp_path, use_pyproject_toml):
|
||||
if sys.platform == "win32":
|
||||
pytest.skip("pyodide-build doesn't work correctly on Windows")
|
||||
|
||||
@@ -89,7 +88,7 @@ def test_pyodide_build(tmp_path: Path, use_pyproject_toml: bool) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_pyodide_version_incompatible(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
|
||||
def test_pyodide_version_incompatible(tmp_path, capfd):
|
||||
if sys.platform == "win32":
|
||||
pytest.skip("pyodide-build doesn't work correctly on Windows")
|
||||
|
||||
@@ -111,19 +110,19 @@ def test_pyodide_version_incompatible(tmp_path: Path, capfd: pytest.CaptureFixtu
|
||||
|
||||
|
||||
@pytest.mark.parametrize("expect_failure", [True, False])
|
||||
def test_pyodide_build_and_test(tmp_path: Path, expect_failure: bool) -> None:
|
||||
def test_pyodide_build_and_test(tmp_path, expect_failure):
|
||||
if sys.platform == "win32":
|
||||
pytest.skip("pyodide-build doesn't work correctly on Windows")
|
||||
|
||||
if expect_failure:
|
||||
basic_project.files["test/spam_test.py"] = textwrap.dedent(r"""
|
||||
def test_filter() -> None:
|
||||
def test_filter():
|
||||
assert 0 == 1
|
||||
""")
|
||||
else:
|
||||
basic_project.files["test/spam_test.py"] = textwrap.dedent(r"""
|
||||
import spam
|
||||
def test_filter() -> None:
|
||||
def test_filter():
|
||||
assert spam.filter("spam") == 0
|
||||
""")
|
||||
basic_project.generate(tmp_path)
|
||||
@@ -150,7 +149,7 @@ def test_pyodide_build_and_test(tmp_path: Path, expect_failure: bool) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_pyodide_repair_wheel(tmp_path: Path) -> None:
|
||||
def test_pyodide_repair_wheel(tmp_path):
|
||||
if sys.platform == "win32":
|
||||
pytest.skip("pyodide-build doesn't work correctly on Windows")
|
||||
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -33,7 +32,7 @@ project_with_ssl_tests = test_projects.new_c_project(
|
||||
|
||||
|
||||
@pytest.mark.flaky(reruns=2)
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
# this test checks that SSL is working in the build environment using
|
||||
# some checks in setup.py.
|
||||
project_dir = tmp_path / "project"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from pathlib import Path
|
||||
|
||||
import jinja2
|
||||
import pytest
|
||||
|
||||
from . import utils
|
||||
from .test_projects import TestProject
|
||||
@@ -32,7 +31,7 @@ print('before_build.py executed!')
|
||||
"""
|
||||
|
||||
|
||||
def test(capfd: pytest.CaptureFixture[str], tmp_path: Path) -> None:
|
||||
def test(capfd, tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
subdir_package_project.generate(project_dir)
|
||||
|
||||
|
||||
+10
-10
@@ -43,11 +43,11 @@ def path_contains(parent, child):
|
||||
|
||||
|
||||
class TestSpam(TestCase):
|
||||
def test_filter(self) -> None:
|
||||
def test_filter(self):
|
||||
self.assertEqual(0, spam.filter("spam"))
|
||||
self.assertNotEqual(0, spam.filter("ham"))
|
||||
|
||||
def test_virtualenv(self) -> None:
|
||||
def test_virtualenv(self):
|
||||
# sys.prefix is different from sys.base_prefix when running a virtualenv
|
||||
# See https://docs.python.org/3/library/venv.html, which virtualenv seems
|
||||
# to honor in recent releases
|
||||
@@ -58,7 +58,7 @@ class TestSpam(TestCase):
|
||||
self.assertTrue(path_contains(sys.prefix, spam.__file__))
|
||||
self.assertIn("VIRTUAL_ENV", os.environ)
|
||||
|
||||
def test_uname(self) -> None:
|
||||
def test_uname(self):
|
||||
if platform.system() == "Windows":
|
||||
return
|
||||
# if we're running in 32-bit Python, check that the machine is i686.
|
||||
@@ -69,7 +69,7 @@ class TestSpam(TestCase):
|
||||
'''
|
||||
|
||||
|
||||
def test(tmp_path: Path) -> None:
|
||||
def test(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_a_test.generate(project_dir)
|
||||
|
||||
@@ -90,7 +90,7 @@ def test(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_extras_require(tmp_path: Path) -> None:
|
||||
def test_extras_require(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_a_test.generate(project_dir)
|
||||
|
||||
@@ -112,7 +112,7 @@ def test_extras_require(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_dependency_groups(tmp_path: Path) -> None:
|
||||
def test_dependency_groups(tmp_path):
|
||||
group_project = project_with_a_test.copy()
|
||||
group_project.files["pyproject.toml"] = inspect.cleandoc("""
|
||||
[build-system]
|
||||
@@ -149,12 +149,12 @@ project_with_a_failing_test.files["test/spam_test.py"] = r"""
|
||||
from unittest import TestCase
|
||||
|
||||
class TestSpam(TestCase):
|
||||
def test_something(self) -> None:
|
||||
def test_something(self):
|
||||
self.fail('this test is supposed to fail')
|
||||
"""
|
||||
|
||||
|
||||
def test_failing_test(tmp_path: Path) -> None:
|
||||
def test_failing_test(tmp_path):
|
||||
"""Ensure a failing test causes cibuildwheel to error out and exit"""
|
||||
project_dir = tmp_path / "project"
|
||||
output_dir = tmp_path / "output"
|
||||
@@ -215,7 +215,7 @@ def test_bare_pytest_invocation(
|
||||
)
|
||||
|
||||
|
||||
def test_test_sources(tmp_path: Path) -> None:
|
||||
def test_test_sources(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_a_test.generate(project_dir)
|
||||
|
||||
@@ -235,7 +235,7 @@ def test_test_sources(tmp_path: Path) -> None:
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
|
||||
def test_test_environment(tmp_path: Path) -> None:
|
||||
def test_test_environment(tmp_path):
|
||||
project_dir = tmp_path / "project"
|
||||
test_projects.new_c_project().generate(project_dir)
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -10,12 +9,7 @@ SO_FILE_WARNING = "NOTE: Shared object (.so) files found in this project."
|
||||
|
||||
|
||||
@pytest.mark.parametrize("project_contains_so_files", [False, True])
|
||||
def test_failed_build_with_so_files(
|
||||
tmp_path: Path,
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
build_frontend_env: dict[str, str],
|
||||
project_contains_so_files: bool,
|
||||
) -> None:
|
||||
def test_failed_build_with_so_files(tmp_path, capfd, build_frontend_env, project_contains_so_files):
|
||||
project = TestProject()
|
||||
project.files["setup.py"] = "raise Exception('this build will fail')\n"
|
||||
if project_contains_so_files:
|
||||
@@ -41,11 +35,7 @@ def test_failed_build_with_so_files(
|
||||
|
||||
|
||||
@pytest.mark.parametrize("project_contains_so_files", [False, True])
|
||||
def test_failed_repair_with_so_files(
|
||||
tmp_path: Path,
|
||||
capfd: pytest.CaptureFixture[str],
|
||||
project_contains_so_files: bool,
|
||||
) -> None:
|
||||
def test_failed_repair_with_so_files(tmp_path, capfd, project_contains_so_files):
|
||||
if utils.get_platform() != "linux":
|
||||
pytest.skip("this test is only relevant to the linux build")
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from . import test_projects, utils
|
||||
@@ -7,7 +5,7 @@ from . import test_projects, utils
|
||||
basic_project = test_projects.new_c_project()
|
||||
|
||||
|
||||
def test_wheel_tag_is_correct_when_using_macosx_deployment_target(tmp_path: Path) -> None:
|
||||
def test_wheel_tag_is_correct_when_using_macosx_deployment_target(tmp_path):
|
||||
if utils.get_platform() != "macos":
|
||||
pytest.skip("This test is only relevant to MACOSX_DEPLOYMENT_TARGET")
|
||||
|
||||
|
||||
@@ -38,9 +38,7 @@ def skip_if_no_msvc(arm64: bool = False) -> None:
|
||||
|
||||
|
||||
@pytest.mark.parametrize("use_pyproject_toml", [True, False])
|
||||
def test_wheel_tag_is_correct_when_using_windows_cross_compile(
|
||||
tmp_path: Path, use_pyproject_toml: bool
|
||||
) -> None:
|
||||
def test_wheel_tag_is_correct_when_using_windows_cross_compile(tmp_path, use_pyproject_toml):
|
||||
if utils.get_platform() != "windows":
|
||||
pytest.skip("This test is only relevant to Windows")
|
||||
|
||||
|
||||
+2
-2
@@ -11,7 +11,7 @@ import sys
|
||||
from collections.abc import Generator, Mapping, Sequence
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
from typing import Final
|
||||
from typing import Any, Final
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -458,7 +458,7 @@ def get_xcode_version() -> tuple[int, int]:
|
||||
return (int(version_parts[0]), int(version_parts[1]))
|
||||
|
||||
|
||||
def skip_if_pyodide(reason: str) -> pytest.MarkDecorator:
|
||||
def skip_if_pyodide(reason: str) -> Any:
|
||||
return pytest.mark.skipif(get_platform() == "pyodide", reason=reason)
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import pytest
|
||||
|
||||
import cibuildwheel.architecture
|
||||
from cibuildwheel.architecture import Architecture, arch_synonym
|
||||
from cibuildwheel.typing import PlatformName
|
||||
|
||||
|
||||
@pytest.fixture(
|
||||
@@ -21,9 +20,7 @@ from cibuildwheel.typing import PlatformName
|
||||
pytest.param(("windows", "win32", "ARM64", "arm"), id="windows-arm"),
|
||||
]
|
||||
)
|
||||
def platform_machine(
|
||||
request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch
|
||||
) -> tuple[str, str]:
|
||||
def platform_machine(request, monkeypatch):
|
||||
platform_name, platform_value, machine_value, machine_name = request.param
|
||||
monkeypatch.setattr(sys, "platform", platform_value)
|
||||
monkeypatch.setattr(platform_module, "machine", lambda: machine_value)
|
||||
@@ -31,7 +28,7 @@ def platform_machine(
|
||||
return platform_name, machine_name
|
||||
|
||||
|
||||
def test_arch_auto(platform_machine: tuple[str, str]) -> None:
|
||||
def test_arch_auto(platform_machine):
|
||||
_, machine_name = platform_machine
|
||||
|
||||
arch_set = Architecture.auto_archs("linux")
|
||||
@@ -55,7 +52,7 @@ def test_arch_auto(platform_machine: tuple[str, str]) -> None:
|
||||
assert arch_set == expected[machine_name]
|
||||
|
||||
|
||||
def test_arch_auto64(platform_machine: tuple[str, str]) -> None:
|
||||
def test_arch_auto64(platform_machine):
|
||||
_, machine_name = platform_machine
|
||||
|
||||
arch_set = Architecture.parse_config("auto64", "linux")
|
||||
@@ -71,7 +68,7 @@ def test_arch_auto64(platform_machine: tuple[str, str]) -> None:
|
||||
assert arch_set == expected[machine_name]
|
||||
|
||||
|
||||
def test_arch_auto32(platform_machine: tuple[str, str]) -> None:
|
||||
def test_arch_auto32(platform_machine):
|
||||
_, machine_name = platform_machine
|
||||
|
||||
arch_set = Architecture.parse_config("auto32", "linux")
|
||||
@@ -86,7 +83,7 @@ def test_arch_auto32(platform_machine: tuple[str, str]) -> None:
|
||||
assert arch_set == expected[machine_name]
|
||||
|
||||
|
||||
def test_arch_auto_no_aarch32(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
def test_arch_auto_no_aarch32(monkeypatch):
|
||||
monkeypatch.setattr(sys, "platform", "linux")
|
||||
monkeypatch.setattr(platform_module, "machine", lambda: "aarch64")
|
||||
monkeypatch.setattr(shutil, "which", lambda *args, **kwargs: None)
|
||||
@@ -106,14 +103,14 @@ def test_arch_auto_no_aarch32(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
assert arch_set == set()
|
||||
|
||||
|
||||
def test_arch_native_on_ios(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
def test_arch_native_on_ios(monkeypatch):
|
||||
monkeypatch.setattr(sys, "platform", "darwin")
|
||||
monkeypatch.setattr(platform_module, "machine", lambda: "arm64")
|
||||
arch_set = Architecture.parse_config("native", platform="ios")
|
||||
assert arch_set == {Architecture.arm64_iphonesimulator}
|
||||
|
||||
|
||||
def test_arch_auto_on_ios(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
def test_arch_auto_on_ios(monkeypatch):
|
||||
monkeypatch.setattr(sys, "platform", "darwin")
|
||||
monkeypatch.setattr(platform_module, "machine", lambda: "arm64")
|
||||
arch_set = Architecture.parse_config("auto", platform="ios")
|
||||
@@ -133,7 +130,5 @@ def test_arch_auto_on_ios(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
("x86", "windows", "macos", None),
|
||||
],
|
||||
)
|
||||
def test_arch_synonym(
|
||||
arch: str, from_platform: PlatformName, to_platform: PlatformName, expected: str | None
|
||||
) -> None:
|
||||
def test_arch_synonym(arch, from_platform, to_platform, expected):
|
||||
assert arch_synonym(arch, from_platform, to_platform) == expected
|
||||
|
||||
@@ -6,7 +6,7 @@ from cibuildwheel.extra import Printable, dump_python_configurations
|
||||
from cibuildwheel.util import resources
|
||||
|
||||
|
||||
def test_compare_configs() -> None:
|
||||
def test_compare_configs():
|
||||
txt = resources.BUILD_PLATFORMS.read_text()
|
||||
|
||||
with resources.BUILD_PLATFORMS.open("rb") as f2:
|
||||
@@ -18,7 +18,7 @@ def test_compare_configs() -> None:
|
||||
assert new_txt == txt
|
||||
|
||||
|
||||
def test_dump_with_Version() -> None:
|
||||
def test_dump_with_Version():
|
||||
# MyPy doesn't understand deeply nested dicts correctly
|
||||
example: dict[str, dict[str, list[dict[str, Printable]]]] = {
|
||||
"windows": {
|
||||
|
||||
@@ -4,7 +4,7 @@ import cibuildwheel.selector
|
||||
from cibuildwheel.selector import BuildSelector, EnableGroup
|
||||
|
||||
|
||||
def test_build() -> None:
|
||||
def test_build():
|
||||
build_selector = BuildSelector(
|
||||
build_config="cp3*-* *-manylinux*", skip_config="", enable=frozenset([EnableGroup.PyPy])
|
||||
)
|
||||
@@ -41,7 +41,7 @@ def test_build() -> None:
|
||||
assert not build_selector("pp311-win_amd64")
|
||||
|
||||
|
||||
def test_build_filter_pre() -> None:
|
||||
def test_build_filter_pre():
|
||||
build_selector = BuildSelector(
|
||||
build_config="cp3*-* *-manylinux*",
|
||||
skip_config="",
|
||||
@@ -55,7 +55,7 @@ def test_build_filter_pre() -> None:
|
||||
assert not build_selector("cp313t-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_filter_pypy() -> None:
|
||||
def test_build_filter_pypy():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -67,7 +67,7 @@ def test_build_filter_pypy() -> None:
|
||||
assert not build_selector("pp39-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_filter_pypy_eol() -> None:
|
||||
def test_build_filter_pypy_eol():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -79,7 +79,7 @@ def test_build_filter_pypy_eol() -> None:
|
||||
assert build_selector("pp39-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_filter_pypy_all() -> None:
|
||||
def test_build_filter_pypy_all():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -91,7 +91,7 @@ def test_build_filter_pypy_all() -> None:
|
||||
assert build_selector("pp39-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_filter_pyodide_prerelease() -> None:
|
||||
def test_build_filter_pyodide_prerelease():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -101,7 +101,7 @@ def test_build_filter_pyodide_prerelease() -> None:
|
||||
assert build_selector("cp313-pyodide_wasm32")
|
||||
|
||||
|
||||
def test_build_filter_pyodide() -> None:
|
||||
def test_build_filter_pyodide():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -111,7 +111,7 @@ def test_build_filter_pyodide() -> None:
|
||||
assert build_selector("cp313-pyodide_wasm32")
|
||||
|
||||
|
||||
def test_skip() -> None:
|
||||
def test_skip():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="pp310-* cp3?-manylinux_i686 cp36-win* *-win32",
|
||||
@@ -136,7 +136,7 @@ def test_skip() -> None:
|
||||
assert build_selector("cp37-win_amd64")
|
||||
|
||||
|
||||
def test_build_and_skip() -> None:
|
||||
def test_build_and_skip():
|
||||
build_selector = BuildSelector(
|
||||
build_config="cp36-* cp37-macosx* *-manylinux*",
|
||||
skip_config="pp37-* cp37-manylinux_i686",
|
||||
@@ -160,7 +160,7 @@ def test_build_and_skip() -> None:
|
||||
assert not build_selector("cp37-win_amd64")
|
||||
|
||||
|
||||
def test_build_braces() -> None:
|
||||
def test_build_braces():
|
||||
build_selector = BuildSelector(build_config="cp{36,37}*", skip_config="")
|
||||
|
||||
assert build_selector("cp36-manylinux_x86_64")
|
||||
@@ -169,7 +169,7 @@ def test_build_braces() -> None:
|
||||
assert not build_selector("cp39-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_limited_python() -> None:
|
||||
def test_build_limited_python():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*",
|
||||
skip_config="",
|
||||
@@ -190,7 +190,7 @@ def test_build_limited_python() -> None:
|
||||
assert build_selector("gp311_242-win_amd64")
|
||||
|
||||
|
||||
def test_build_limited_python_partial() -> None:
|
||||
def test_build_limited_python_partial():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*", skip_config="", requires_python=SpecifierSet(">=3.6, !=3.7.*")
|
||||
)
|
||||
@@ -201,7 +201,7 @@ def test_build_limited_python_partial() -> None:
|
||||
assert build_selector("cp39-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_limited_python_patch() -> None:
|
||||
def test_build_limited_python_patch():
|
||||
build_selector = BuildSelector(
|
||||
build_config="*", skip_config="", requires_python=SpecifierSet(">=3.6.8")
|
||||
)
|
||||
@@ -210,13 +210,13 @@ def test_build_limited_python_patch() -> None:
|
||||
assert build_selector("cp37-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_build_free_threaded_python() -> None:
|
||||
def test_build_free_threaded_python():
|
||||
build_selector = BuildSelector(build_config="*", skip_config="", enable=frozenset(EnableGroup))
|
||||
|
||||
assert build_selector("cp313t-manylinux_x86_64")
|
||||
|
||||
|
||||
def test_testing_selector() -> None:
|
||||
def test_testing_selector():
|
||||
# This is not a global import to keep pytest from collecting it as a test
|
||||
test_selector = cibuildwheel.selector.TestSelector(skip_config="cp36-*")
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import pytest
|
||||
MOCK_PACKAGE_DIR = Path("some_package_dir")
|
||||
|
||||
|
||||
def pytest_addoption(parser: pytest.Parser) -> None:
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption("--run-docker", action="store_true", default=False, help="run docker tests")
|
||||
parser.addoption("--run-podman", action="store_true", default=False, help="run podman tests")
|
||||
parser.addoption(
|
||||
@@ -18,13 +18,13 @@ def pytest_addoption(parser: pytest.Parser) -> None:
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_package_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> list[str]:
|
||||
def fake_package_dir(tmp_path, monkeypatch):
|
||||
"""
|
||||
Monkey-patch enough for the main() function to run
|
||||
"""
|
||||
real_path_exists = Path.exists
|
||||
|
||||
def mock_path_exists(path: Path) -> bool:
|
||||
def mock_path_exists(path):
|
||||
if str(path).endswith(str(MOCK_PACKAGE_DIR / "setup.py")):
|
||||
return True
|
||||
else:
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import ssl
|
||||
from pathlib import Path
|
||||
|
||||
import certifi
|
||||
import pytest
|
||||
@@ -9,21 +8,21 @@ from cibuildwheel.util.file import download
|
||||
DOWNLOAD_URL = "https://cdn.jsdelivr.net/gh/pypa/cibuildwheel@v1.6.3/requirements-dev.txt"
|
||||
|
||||
|
||||
def test_download(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
||||
def test_download(monkeypatch, tmp_path):
|
||||
monkeypatch.delenv("SSL_CERT_FILE", raising=False)
|
||||
dest = tmp_path / "file.txt"
|
||||
download(DOWNLOAD_URL, dest)
|
||||
assert len(dest.read_bytes()) == 134
|
||||
|
||||
|
||||
def test_download_good_ssl_cert_file(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
||||
def test_download_good_ssl_cert_file(monkeypatch, tmp_path):
|
||||
monkeypatch.setenv("SSL_CERT_FILE", certifi.where())
|
||||
dest = tmp_path / "file.txt"
|
||||
download(DOWNLOAD_URL, dest)
|
||||
assert len(dest.read_bytes()) == 134
|
||||
|
||||
|
||||
def test_download_bad_ssl_cert_file(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
||||
def test_download_bad_ssl_cert_file(monkeypatch, tmp_path):
|
||||
bad_cafile = tmp_path / "ca.pem"
|
||||
bad_cafile.write_text("bad certificates")
|
||||
monkeypatch.setenv("SSL_CERT_FILE", str(bad_cafile))
|
||||
|
||||
@@ -7,7 +7,7 @@ from cibuildwheel.environment import parse_environment
|
||||
PYTHON_ECHO = f"'{sys.executable}' -c \"import sys; print(*sys.argv[1:])\""
|
||||
|
||||
|
||||
def test_basic_parsing() -> None:
|
||||
def test_basic_parsing():
|
||||
environment_recipe = parse_environment("VAR=1 VBR=2")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={})
|
||||
@@ -15,7 +15,7 @@ def test_basic_parsing() -> None:
|
||||
assert environment_dict == {"VAR": "1", "VBR": "2"}
|
||||
|
||||
|
||||
def test_quotes() -> None:
|
||||
def test_quotes():
|
||||
environment_recipe = parse_environment("A=1 VAR=\"1 NOT_A_VAR=2\" VBR='vbr'")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={})
|
||||
@@ -23,7 +23,7 @@ def test_quotes() -> None:
|
||||
assert environment_dict == {"A": "1", "VAR": "1 NOT_A_VAR=2", "VBR": "vbr"}
|
||||
|
||||
|
||||
def test_inheritance() -> None:
|
||||
def test_inheritance():
|
||||
environment_recipe = parse_environment("PATH=$PATH:/usr/local/bin")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={"PATH": "/usr/bin"})
|
||||
@@ -31,7 +31,7 @@ def test_inheritance() -> None:
|
||||
assert environment_dict == {"PATH": "/usr/bin:/usr/local/bin"}
|
||||
|
||||
|
||||
def test_shell_eval() -> None:
|
||||
def test_shell_eval():
|
||||
environment_recipe = parse_environment(f'VAR="$({PYTHON_ECHO} "a test" string)"')
|
||||
|
||||
env_copy = os.environ.copy()
|
||||
@@ -42,7 +42,7 @@ def test_shell_eval() -> None:
|
||||
assert environment_dict["VAR"] == "a test string"
|
||||
|
||||
|
||||
def test_shell_eval_and_env() -> None:
|
||||
def test_shell_eval_and_env():
|
||||
environment_recipe = parse_environment(f'VAR="$({PYTHON_ECHO} "$PREV_VAR" string)"')
|
||||
|
||||
prev_environment = {**os.environ, "PREV_VAR": "1 2 3"}
|
||||
@@ -51,7 +51,7 @@ def test_shell_eval_and_env() -> None:
|
||||
assert environment_dict == {**prev_environment, "VAR": "1 2 3 string"}
|
||||
|
||||
|
||||
def test_empty_var() -> None:
|
||||
def test_empty_var():
|
||||
environment_recipe = parse_environment("CFLAGS=")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={"CFLAGS": "-Wall"})
|
||||
@@ -59,7 +59,7 @@ def test_empty_var() -> None:
|
||||
assert environment_dict == {"CFLAGS": ""}
|
||||
|
||||
|
||||
def test_no_vars() -> None:
|
||||
def test_no_vars():
|
||||
environment_recipe = parse_environment("")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={})
|
||||
@@ -67,7 +67,7 @@ def test_no_vars() -> None:
|
||||
assert environment_dict == {}
|
||||
|
||||
|
||||
def test_no_vars_pass_through() -> None:
|
||||
def test_no_vars_pass_through():
|
||||
environment_recipe = parse_environment("")
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(
|
||||
@@ -77,7 +77,7 @@ def test_no_vars_pass_through() -> None:
|
||||
assert environment_dict == {"CIBUILDWHEEL": "awesome"}
|
||||
|
||||
|
||||
def test_operators_inside_eval() -> None:
|
||||
def test_operators_inside_eval():
|
||||
environment_recipe = parse_environment(
|
||||
f'SOMETHING="$({PYTHON_ECHO} a; {PYTHON_ECHO} b; {PYTHON_ECHO} c)"'
|
||||
)
|
||||
@@ -88,7 +88,7 @@ def test_operators_inside_eval() -> None:
|
||||
assert environment_dict.get("SOMETHING") == "a\nb\nc"
|
||||
|
||||
|
||||
def test_substitution_with_backslash() -> None:
|
||||
def test_substitution_with_backslash():
|
||||
environment_recipe = parse_environment('PATH2="somewhere_else;$PATH1"')
|
||||
|
||||
environment_dict = environment_recipe.as_dictionary(prev_environment={"PATH1": "c:\\folder\\"})
|
||||
@@ -96,7 +96,7 @@ def test_substitution_with_backslash() -> None:
|
||||
assert environment_dict.get("PATH2") == "somewhere_else;c:\\folder\\"
|
||||
|
||||
|
||||
def test_awkwardly_quoted_variable() -> None:
|
||||
def test_awkwardly_quoted_variable():
|
||||
environment_recipe = parse_environment(
|
||||
f'VAR2=something"like this""$VAR1"$VAR1$({PYTHON_ECHO} "there is more")"$({PYTHON_ECHO} "and more!")"'
|
||||
)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user