Compare commits

...
10 Commits
Author SHA1 Message Date
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> a007eeda0d [Bot] Update dependencies (#2976)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2026-08-28 12:15:55 -04:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> fdda545750 chore(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 in the actions group (#2974)
chore(deps): bump astral-sh/setup-uv in the actions group

Bumps the actions group with 1 update: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv).


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

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-24 00:30:47 -04:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Henry Schreiner
8832cf6b75 chore(deps): bump actions/attest-build-provenance from 4.1.1 to 4.2.2 in the actions group (#2969)
* chore(deps): bump actions/attest-build-provenance in the actions group

Bumps the actions group with 1 update: [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance).


Updates `actions/attest-build-provenance` from 4.1.1 to 4.2.2
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](https://github.com/actions/attest-build-provenance/compare/0f67c3f4856b2e3261c31976d6725780e5e4c373...4d101475d8b20a2381f78447822ac1eab6504dd8)

---
updated-dependencies:
- dependency-name: actions/attest-build-provenance
  dependency-version: 4.2.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>

* Apply suggestion from @henryiii

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
2026-08-18 08:41:07 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> a35209b5ca [Bot] Update dependencies (#2970)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2026-08-18 08:40:46 -04:00
Henry Schreiner 148ea702ac chore: faster and stricter mypy (#2968)
* chore: faster mypy

This makes mypy around 26% faster from a cold cache.

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>

* chore: enable more mypy error codes

Turn on possibly-undefined, exhaustive-match, and other strict flags, and
fix what they report. Two real bugs: pyodide never set `repaired_wheel`
when it reused a compatible wheel, so the test step failed with a
NameError; the OCI shell read loop spun forever if the shell exited.

Assisted-by: ClaudeCode:claude-opus-5

* test: carry default OCI runtime into podman vfs test config

Podman ignores its usual config files when CONTAINERS_CONF is set, so it
falls back to the first runtime found on PATH. On current GitHub Ubuntu
runner images that is crun 1.14.1, which cannot parse the OCI spec v1.2.x
config that podman 5.8.4 generates ("crun: unknown version specified").
Query the default runtime path and set it in the generated config.

Assisted-by: ClaudeCode:claude-fable-5

* fix: annotate vfs config dict so mypy passes on Linux

mypy on macOS marks the rest of the function unreachable after the
darwin pytest.skip, so the strict index error only appears on Linux.

Assisted-by: ClaudeCode:claude-fable-5

* chore: minor cleanup of variable name

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>

* test: cover container shell exiting during call

Assisted-by: ClaudeCode:claude-opus-5

---------

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>
2026-08-17 19:02:37 -04:00
Malcolm Smith 96ba88f3aa Android Meson test improvements (#2964) 2026-08-15 10:05:08 +02:00
pre-commit-ci[bot]pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>Henry Schreiner
10c055d89c [pre-commit.ci] pre-commit autoupdate (#2959)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: c59bba8fb259db0fec2bbb77ad8ba51ea7341b56 → 39d9ac5938dadb73df0564a45f163e25ff9fa6e2](https://github.com/astral-sh/ruff-pre-commit/compare/c59bba8fb259db0fec2bbb77ad8ba51ea7341b56...39d9ac5938dadb73df0564a45f163e25ff9fa6e2)
- [github.com/pre-commit/mirrors-mypy: d2823d321df3af8f878f7ee3414dc94d037145b9 → 41e691678310dfd3833f7ab4e180ddb014310356](https://github.com/pre-commit/mirrors-mypy/compare/d2823d321df3af8f878f7ee3414dc94d037145b9...41e691678310dfd3833f7ab4e180ddb014310356)
- [github.com/codespell-project/codespell: 2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a → 57b21406f092110c18776e39b0bda50d37c945c8](https://github.com/codespell-project/codespell/compare/2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a...57b21406f092110c18776e39b0bda50d37c945c8)

* chore: fix lint errors from new ruff rules

Ruff 0.16 enables BLE, TRY, and N999 by default. Use local noqa
excludes for the blind-except catches, ignore TRY002 and N999 in tests,
and drop the pylint equivalents.

Assisted-by: ClaudeCode:claude-opus-5

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Henry Schreiner <henryfs@princeton.edu>
2026-08-11 17:42:16 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 1928c1bfa5 [Bot] Update dependencies (#2965)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2026-08-10 21:44:01 -04:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> a1005548ee chore(deps): bump the actions group with 4 updates (#2963)
Bumps the actions group with 4 updates: [hynek/build-and-inspect-python-package](https://github.com/hynek/build-and-inspect-python-package), [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish), [j178/prek-action](https://github.com/j178/prek-action) and [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action).


Updates `hynek/build-and-inspect-python-package` from 2.18.0 to 3.0.1
- [Release notes](https://github.com/hynek/build-and-inspect-python-package/releases)
- [Changelog](https://github.com/hynek/build-and-inspect-python-package/blob/main/CHANGELOG.md)
- [Commits](https://github.com/hynek/build-and-inspect-python-package/compare/d44ca7d91762de7a7d5436ddae667c6da6d1c3df...2abe76da66d0a6a4a227101f9348ee855797cfa5)

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

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

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

---
updated-dependencies:
- dependency-name: hynek/build-and-inspect-python-package
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 10:09:27 +02:00
Malcolm Smith a07eff98b0 Update Android Python versions (#2962) 2026-08-08 12:58:08 +02:00
37 changed files with 841 additions and 752 deletions
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
python-version: "3.x"
allow-prereleases: true
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Install tooling
run: |
+3 -3
View File
@@ -17,7 +17,7 @@ jobs:
with:
persist-credentials: false
- uses: hynek/build-and-inspect-python-package@d44ca7d91762de7a7d5436ddae667c6da6d1c3df # v2.18.0
- uses: hynek/build-and-inspect-python-package@2abe76da66d0a6a4a227101f9348ee855797cfa5 # v3.0.1
publish:
needs: [dist]
@@ -37,10 +37,10 @@ jobs:
path: dist
- name: Generate artifact attestation for sdist and wheel
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
with:
subject-path: "dist/cibuildwheel-*"
- uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
attestations: true
+7 -7
View File
@@ -49,8 +49,8 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: j178/prek-action@5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16 # v2.0.6
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- uses: j178/prek-action@4e14d07f9231acabce116ccfca13b13dd9755ece # v3.0.0
- name: PyLint checks
run: uvx nox -s pylint -- --output-format=github
@@ -66,7 +66,7 @@ jobs:
name: Install Python
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Generate a sample project
@@ -130,7 +130,7 @@ jobs:
python-version: ${{ matrix.python_version }}
allow-prereleases: true
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Free up disk space
if: runner.os == 'Linux' && matrix.test_select != 'android'
@@ -260,7 +260,7 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Get qemu emulated architectures
@@ -285,7 +285,7 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Install dependencies
run: uv sync --no-dev --group test
@@ -310,7 +310,7 @@ jobs:
name: Install Python 3.12
with:
python-version: '3.12'
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- name: Install dependencies
run: uv sync --no-dev --group test
+1 -1
View File
@@ -41,7 +41,7 @@ jobs:
with:
persist-credentials: false
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
python-version: "3.14"
+1 -1
View File
@@ -21,4 +21,4 @@ jobs:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@6fc4b006235f201fdab3722e17240ab420d580e5 # v0.6.1
uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2
+3 -3
View File
@@ -18,14 +18,14 @@ repos:
exclude: ^cibuildwheel/resources/android/android.patch$
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: c59bba8fb259db0fec2bbb77ad8ba51ea7341b56 # frozen: v0.15.20
rev: 39d9ac5938dadb73df0564a45f163e25ff9fa6e2 # frozen: v0.16.1
hooks:
- id: ruff-check
args: ["--fix"]
- id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy
rev: d2823d321df3af8f878f7ee3414dc94d037145b9 # frozen: v2.1.0
rev: 41e691678310dfd3833f7ab4e180ddb014310356 # frozen: v2.3.0
hooks:
- id: mypy
name: mypy 3.11 on cibuildwheel/
@@ -85,7 +85,7 @@ repos:
exclude: "^cibuildwheel/resources/"
- repo: https://github.com/codespell-project/codespell
rev: 2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a # frozen: v2.4.2
rev: 57b21406f092110c18776e39b0bda50d37c945c8 # frozen: v2.4.3
hooks:
- id: codespell
args: ["-w"]
+2
View File
@@ -318,6 +318,8 @@ for value in schema["properties"].values():
case {"type": "string_table_array"}:
del value["type"]
value["oneOf"] = string_table_array
case _:
pass
overrides = yaml.safe_load(
"""
+1 -1
View File
@@ -49,7 +49,7 @@ def parse(contents: str) -> str | None:
analyzer = Analyzer()
analyzer.visit(tree)
return analyzer.requires_python or ""
except Exception:
except Exception: # noqa: BLE001
return None
+3 -3
View File
@@ -76,9 +76,9 @@ class WindowsVersions:
response.raise_for_status()
api_info = response.json()
for resource in api_info["resources"]:
if resource["@type"] == "PackageBaseAddress/3.0.0":
endpoint = resource["@id"]
endpoint = next(
r["@id"] for r in api_info["resources"] if r["@type"] == "PackageBaseAddress/3.0.0"
)
ARCH_DICT = {"32": "win32", "64": "win_amd64", "ARM64": "win_arm64"}
PACKAGE_DICT = {"32": "pythonx86", "64": "python", "ARM64": "pythonarm64"}
+1 -1
View File
@@ -83,7 +83,7 @@ def github_api_request(path: str, *, max_retries: int = 3) -> dict[str, Any]:
if retry_count == max_retries - 1:
print(f"GitHub API request failed (Network error: {e}). Check network connection.")
raise e
raise
# Should never be reached but to keep the type checker happy
msg = "Unexpected execution path in github_api_request"
+6 -2
View File
@@ -546,9 +546,14 @@ class OCIContainer:
else:
output_io = sys.stdout.buffer
while True:
return_code = None
while return_code is None:
line = self.bash_stdout.readline()
if not line:
msg = "Failed to read the return code, the container shell has exited"
raise RuntimeError(msg)
if line.endswith(bytes(end_of_message, encoding="utf8") + b"\n"):
# fmt: off
footer_offset = (
@@ -563,7 +568,6 @@ class OCIContainer:
# add the last line to output, without the footer
output_io.write(line[0:footer_offset])
output_io.flush()
break
else:
output_io.write(line)
output_io.flush()
-6
View File
@@ -222,12 +222,6 @@ def setup_target_python(config: PythonConfiguration, build_path: Path) -> Path:
python_dir = build_path / "python"
python_dir.mkdir()
shutil.unpack_archive(python_tgz, python_dir)
# Work around https://github.com/python/cpython/issues/138800. This can be removed
# once we've updated to Python versions that include the fix.
pc_path = python_dir / f"prefix/lib/pkgconfig/python-{config.version}.pc"
pc_path.write_text(pc_path.read_text().replace("$(BLDLIBRARY)", f"-lpython{config.version}"))
return python_dir
+2 -4
View File
@@ -540,7 +540,7 @@ def build(options: Options, tmp_path: Path) -> None:
f"that is compatible with {config.identifier}. "
"Skipping build step..."
)
test_wheel = compatible_wheel
repaired_wheel = compatible_wheel
else:
if build_options.before_build:
log.step("Running before_build...")
@@ -632,8 +632,6 @@ def build(options: Options, tmp_path: Path) -> None:
run_audit(tmp_dir=tmp_path, build_options=build_options, wheel=repaired_wheel)
test_wheel = repaired_wheel
if build_options.test_command and build_options.test_selector(config.identifier):
if not config.is_simulator:
log.step("Skipping tests on non-simulator SDK")
@@ -693,7 +691,7 @@ def build(options: Options, tmp_path: Path) -> None:
platform_tag,
"--target",
testbed_path / "iOSTestbed" / "app_packages",
f"{test_wheel}{build_options.test_extras}",
f"{repaired_wheel}{build_options.test_extras}",
*build_options.test_requires,
env=test_env,
)
+1 -1
View File
@@ -473,7 +473,7 @@ def build(options: Options, tmp_path: Path) -> None:
print(
f"\nFound previously built wheel {compatible_wheel.name}, that's compatible with {config.identifier}. Skipping build step..."
)
built_wheel = compatible_wheel
repaired_wheel = compatible_wheel
else:
if build_options.before_build:
log.step("Running before_build...")
+3 -1
View File
@@ -60,6 +60,8 @@ class Analyzer(ast.NodeVisitor):
case ast.keyword(arg="python_requires", value=ast.Constant(value=str() as version)):
if unnested or name_main_unnested:
self.requires_python = version
case _:
pass
def setup_py_python_requires(content: str) -> str | None:
@@ -68,7 +70,7 @@ def setup_py_python_requires(content: str) -> str | None:
analyzer = Analyzer()
analyzer.visit(tree)
return analyzer.requires_python or None
except Exception: # pylint: disable=broad-except
except Exception: # noqa: BLE001
return None
+23 -23
View File
@@ -153,15 +153,15 @@ python_configurations = [
{ identifier = "cp312-macosx_x86_64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg", sha256 = "8373e58da4ea146b3eb1c1f9834f19a319440b6b679b06050b1f9ee3237aa8e4" },
{ identifier = "cp312-macosx_arm64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg", sha256 = "8373e58da4ea146b3eb1c1f9834f19a319440b6b679b06050b1f9ee3237aa8e4" },
{ identifier = "cp312-macosx_universal2", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg", sha256 = "8373e58da4ea146b3eb1c1f9834f19a319440b6b679b06050b1f9ee3237aa8e4" },
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.14/python-3.13.14-macos11.pkg", sha256 = "8e58affb218c155a1dfdc27b291f817129669f8760e7a297adb2e4439ba5d2e8" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.14/python-3.13.14-macos11.pkg", sha256 = "8e58affb218c155a1dfdc27b291f817129669f8760e7a297adb2e4439ba5d2e8" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.14/python-3.13.14-macos11.pkg", sha256 = "8e58affb218c155a1dfdc27b291f817129669f8760e7a297adb2e4439ba5d2e8" },
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg", sha256 = "d3c9fff52214847e4fab03e9eaf53dd2a8e51e3534aa0b61f201b749f86bef28" },
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.15/python-3.13.15-macos11.pkg", sha256 = "3b7eaf7f29825f796e8267024435540ddf1f17fc9a97ad58095daa7a75bfdcd3" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.15/python-3.13.15-macos11.pkg", sha256 = "3b7eaf7f29825f796e8267024435540ddf1f17fc9a97ad58095daa7a75bfdcd3" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.15/python-3.13.15-macos11.pkg", sha256 = "3b7eaf7f29825f796e8267024435540ddf1f17fc9a97ad58095daa7a75bfdcd3" },
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-macos11.pkg", sha256 = "70c5239ad2d62925d2947e46921d0ddd3d35be3d2f0a2d50db33da507dbcb419" },
{ identifier = "cp315-macosx_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315-macosx_arm64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
{ identifier = "cp315-macosx_universal2", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg", sha256 = "57e0b1095f5dda52a8ff8b3b73140a52dfb3b76bdcf9e0284f2dbe10f7ee92ea" },
@@ -188,12 +188,12 @@ python_configurations = [
{ identifier = "cp311-win_amd64", version = "3.11.9" },
{ identifier = "cp312-win32", version = "3.12.10" },
{ identifier = "cp312-win_amd64", version = "3.12.10" },
{ identifier = "cp313-win32", version = "3.13.14" },
{ identifier = "cp313-win_amd64", version = "3.13.14" },
{ identifier = "cp314-win32", version = "3.14.6" },
{ identifier = "cp314t-win32", version = "3.14.6" },
{ identifier = "cp314-win_amd64", version = "3.14.6" },
{ identifier = "cp314t-win_amd64", version = "3.14.6" },
{ identifier = "cp313-win32", version = "3.13.15" },
{ identifier = "cp313-win_amd64", version = "3.13.15" },
{ identifier = "cp314-win32", version = "3.14.7" },
{ identifier = "cp314t-win32", version = "3.14.7" },
{ identifier = "cp314-win_amd64", version = "3.14.7" },
{ identifier = "cp314t-win_amd64", version = "3.14.7" },
{ identifier = "cp315-win32", version = "3.15.0-rc1" },
{ identifier = "cp315t-win32", version = "3.15.0-rc1" },
{ identifier = "cp315-win_amd64", version = "3.15.0-rc1" },
@@ -202,9 +202,9 @@ python_configurations = [
{ identifier = "cp310-win_arm64", version = "3.10.11" },
{ identifier = "cp311-win_arm64", version = "3.11.9" },
{ identifier = "cp312-win_arm64", version = "3.12.10" },
{ identifier = "cp313-win_arm64", version = "3.13.14" },
{ identifier = "cp314-win_arm64", version = "3.14.6" },
{ identifier = "cp314t-win_arm64", version = "3.14.6" },
{ identifier = "cp313-win_arm64", version = "3.13.15" },
{ identifier = "cp314-win_arm64", version = "3.14.7" },
{ identifier = "cp314t-win_arm64", version = "3.14.7" },
{ identifier = "cp315-win_arm64", version = "3.15.0-rc1" },
{ identifier = "cp315t-win_arm64", version = "3.15.0-rc1" },
{ identifier = "pp39-win_amd64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip", sha256 = "06ec12a5e964dc0ad33e6f380185a4d295178dce6d6df512f508e7aee00a1323" },
@@ -217,16 +217,16 @@ python_configurations = [
python_configurations = [
{ identifier = "cp312-pyodide_wasm32", version = "3.12", default_pyodide_version = "0.27.7", node_version = "v22", sha256 = "0c2e7db42efa5d1dac38b50f8b3d659a1e3885d0a233494831b8206281307d52" },
{ identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.4", node_version = "v22", sha256 = "a29fc4a076408a18fc29eb4b280f80c6dddc95c19514c874c29e590d0931c02a" },
{ identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.4", node_version = "v24", sha256 = "257ceae085eaa1423c2ab49794d7a72bf36ddad475d126fa929791b9a8ab7289" },
{ identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.5", node_version = "v24", sha256 = "77bde42a27695e28525fe19933c2ff13ba63598c536060fa60143726a284acdd" },
{ identifier = "cp315-pyodide_wasm32", version = "3.15", default_pyodide_version = "315.0.0a2", node_version = "v24", sha256 = "d7c0d6ddf0fce807668d7413d0e0f20fbc7922128ba8361ed71d9cff048cb96a" },
]
[android]
python_configurations = [
{ identifier = "cp313-android_arm64_v8a", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.14/python-3.13.14-aarch64-linux-android.tar.gz", sha256 = "2541c4fa77b6543504c97fa90a71c745225b5800fe25bc8c73a6516b594d0cbc" },
{ identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.14/python-3.13.14-x86_64-linux-android.tar.gz", sha256 = "9d96f7e077677b6651b2e756034ed41ab4479f5f8bf3168a814f458bc2ac137e" },
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-aarch64-linux-android.tar.gz", sha256 = "38bbe77d3167b5cd554e03b1021324926f09f3825202b065951dd7638e9c37e5" },
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.6/python-3.14.6-x86_64-linux-android.tar.gz", sha256 = "e04eb26607627e68d148f89de793372f54a345c91b13628567f24abcdd3bfa3e" },
{ identifier = "cp313-android_arm64_v8a", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.15/python-3.13.15-aarch64-linux-android.tar.gz", sha256 = "a51d1e153f68f1c40f612a5431e9f79870d993da795173b3d27564e42b056271" },
{ identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.15/python-3.13.15-x86_64-linux-android.tar.gz", sha256 = "2096ecd6e180274ad1637cf140f7d6c2a160fe5ef9bfb47fd318e3d963f2d929" },
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-aarch64-linux-android.tar.gz", sha256 = "6d50cc3aa66e414a439594089bcdfb5f1264358155c70c1f00471c24cfb477fb" },
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.7/python-3.14.7-x86_64-linux-android.tar.gz", sha256 = "2c16ce2359565cd8c24f86cfb75630768ba6607e732946b294b969797f583b60" },
{ identifier = "cp315-android_arm64_v8a", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-aarch64-linux-android.tar.gz", sha256 = "7d6fb28a69368841656f919a08141b0e3720837ac67987388037ee9d2a5c5492" },
{ identifier = "cp315-android_x86_64", version = "3.15", url = "https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-x86_64-linux-android.tar.gz", sha256 = "f048f5c60b538efc64e4c26399a0a21202ce430949d5b2c10369d624548a5dc3" },
]
@@ -17,7 +17,7 @@ cattrs==26.1.0
# pyodide-lock
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
click==8.1.8
# via
@@ -26,11 +26,11 @@ click==8.1.8
# pyodide-cli
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via requests
leb128==1.0.9
# via auditwheel-emscripten
@@ -46,11 +46,11 @@ packaging==26.3
# wheel
pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# pyodide-build
# virtualenv
pygments==2.20.0
pygments==2.21.0
# via rich
pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
@@ -62,7 +62,7 @@ pyodide-lock==0.2.0
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via pyodide-build
@@ -76,11 +76,11 @@ typing-extensions==4.16.0
# via cattrs
urllib3==2.7.0
# via requests
virtualenv==21.7.1
virtualenv==21.7.4
# via
# build
# pyodide-build
wheel==0.47.0
wheel==0.48.0
# via
# auditwheel-emscripten
# pyodide-build
@@ -17,7 +17,7 @@ cattrs==26.1.0
# pyodide-lock
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
click==8.1.8
# via
@@ -26,11 +26,11 @@ click==8.1.8
# pyodide-cli
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via requests
leb128==1.0.9
# via auditwheel-emscripten
@@ -46,11 +46,11 @@ packaging==26.3
# wheel
pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# pyodide-build
# virtualenv
pygments==2.20.0
pygments==2.21.0
# via rich
pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
@@ -62,7 +62,7 @@ pyodide-lock==0.2.0
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via pyodide-build
@@ -76,11 +76,11 @@ typing-extensions==4.16.0
# via cattrs
urllib3==2.7.0
# via requests
virtualenv==21.7.1
virtualenv==21.7.4
# via
# build
# pyodide-build
wheel==0.47.0
wheel==0.48.0
# via
# auditwheel-emscripten
# pyodide-build
@@ -17,7 +17,7 @@ cattrs==26.1.0
# pyodide-lock
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
click==8.1.8
# via
@@ -26,11 +26,11 @@ click==8.1.8
# pyodide-cli
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via requests
leb128==1.0.9
# via auditwheel-emscripten
@@ -46,11 +46,11 @@ packaging==26.3
# wheel
pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# pyodide-build
# virtualenv
pygments==2.20.0
pygments==2.21.0
# via rich
pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
@@ -62,7 +62,7 @@ pyodide-lock==0.2.0
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via pyodide-build
@@ -76,11 +76,11 @@ typing-extensions==4.16.0
# via cattrs
urllib3==2.7.0
# via requests
virtualenv==21.7.1
virtualenv==21.7.4
# via
# build
# pyodide-build
wheel==0.47.0
wheel==0.48.0
# via
# auditwheel-emscripten
# pyodide-build
@@ -17,7 +17,7 @@ cattrs==26.1.0
# pyodide-lock
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
click==8.1.8
# via
@@ -26,11 +26,11 @@ click==8.1.8
# pyodide-cli
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via requests
leb128==1.0.9
# via auditwheel-emscripten
@@ -46,11 +46,11 @@ packaging==26.3
# wheel
pip==26.2.1
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# pyodide-build
# virtualenv
pygments==2.20.0
pygments==2.21.0
# via rich
pyodide-build==0.39.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
@@ -62,7 +62,7 @@ pyodide-lock==0.2.0
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via pyodide-build
@@ -76,11 +76,11 @@ typing-extensions==4.16.0
# via cattrs
urllib3==2.7.0
# via requests
virtualenv==21.7.1
virtualenv==21.7.4
# via
# build
# pyodide-build
wheel==0.47.0
wheel==0.48.0
# via
# auditwheel-emscripten
# pyodide-build
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -28,11 +28,11 @@ distlib==0.4.3
# via virtualenv
exceptiongroup==1.3.1
# via cattrs
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -52,7 +52,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -62,7 +62,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -70,11 +70,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -98,7 +98,7 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
zipp==4.1.0
# via importlib-metadata
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,11 +26,11 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -48,7 +48,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -58,7 +58,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -66,11 +66,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -90,5 +90,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,12 +26,12 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2; implementation_name != "graalpy"
filelock==3.32.4; implementation_name != "graalpy"
filelock==3.29.7; implementation_name == "graalpy"
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -49,7 +49,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -61,7 +61,7 @@ pip==26.0.1; implementation_name == "graalpy" and platform_system == "Windows"
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -69,11 +69,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -93,5 +93,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,11 +26,11 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -48,7 +48,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -58,7 +58,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -66,11 +66,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -90,5 +90,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,11 +26,11 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -48,7 +48,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -58,7 +58,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -66,11 +66,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -90,5 +90,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,11 +26,11 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -48,7 +48,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -58,7 +58,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -66,11 +66,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -90,5 +90,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==25.3.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -32,7 +32,7 @@ filelock==3.19.1
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -54,7 +54,7 @@ packaging==25.0
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -72,11 +72,11 @@ pyelftools==0.32
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.32.5
# via
@@ -100,7 +100,7 @@ urllib3==2.6.3
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
zipp==3.23.1
# via importlib-metadata
+9 -9
View File
@@ -10,7 +10,7 @@ attrs==26.1.0
# via
# cattrs
# requests-cache
auditwheel==6.7.0
auditwheel==6.8.1
# via -r cibuildwheel/resources/constraints.in
build==1.5.0
# via -r cibuildwheel/resources/constraints.in
@@ -18,7 +18,7 @@ cattrs==26.1.0
# via requests-cache
certifi==2026.7.22
# via requests
charset-normalizer==3.4.9
charset-normalizer==3.5.1
# via requests
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -26,11 +26,11 @@ delvewheel==1.13.0
# via -r cibuildwheel/resources/constraints.in
distlib==0.4.3
# via virtualenv
filelock==3.32.2
filelock==3.32.4
# via
# python-discovery
# virtualenv
idna==3.18
idna==3.19
# via
# requests
# url-normalize
@@ -48,7 +48,7 @@ packaging==26.3
# auditwheel
# build
# delocate
patchelf==0.17.2.4
patchelf==0.19.1.0
# via -r cibuildwheel/resources/constraints.in
pefile==2024.8.26
# via
@@ -58,7 +58,7 @@ pip==26.2.1
# via -r cibuildwheel/resources/constraints.in
pkgconf==3.0.1.post0
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.11.0
platformdirs==4.11.3
# via
# requests-cache
# virtualenv
@@ -66,11 +66,11 @@ pyelftools==0.33
# via
# abi3audit
# auditwheel
pygments==2.20.0
pygments==2.21.0
# via rich
pyproject-hooks==1.2.0
# via build
python-discovery==1.5.1
python-discovery==1.5.2
# via virtualenv
requests==2.34.2
# via
@@ -90,5 +90,5 @@ urllib3==2.7.0
# via
# requests
# requests-cache
virtualenv==21.7.1
virtualenv==21.7.4
# via -r cibuildwheel/resources/constraints.in
+34 -34
View File
@@ -1,54 +1,54 @@
[x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:c163a278006f45883c117b4166b93cdc7b574b62e58292ed9e52879579841d77 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:012f4a50472412f18bb2b450c1cce7158434cfae4ae878591c2748a13a30c2be # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:db817cd4c670f1191d74db6a94a0b115954af78861db7da660de4e93ebf2984c # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64@sha256:f130bd3e3aebb39abcdec28a89f987f0d31b52d74bac5852318303698e9a5033 # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:95440e0e72dd3a81dc8d2cf59a84d57af661456620f5bc821ff92048d0e54ff9 # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:0c87ccb5996dab6c3b7612ee4fda7b80c4ab3c44a86c2541e4a872afdf4f131b # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:266610f48ef368cca34f521813ef61ed99d396b782e528fd0b0f58aa67c2189c # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64@sha256:75327606c7666fc971bd9239c6b220fd205b4bb9563b588075164622609219ca # 2026.08.15-1
[i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:abfc526a4f9d9692ed6d53b60ffd6be764aa7a4dc1d61522a1ce5ea64138aa53 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:605a71b7fa720562ad76147860e33d97b2a884ca9d5a454b2f7f353caec40ded # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:82e74fcb11aa1d425260804292b8a25533f37eda280570b2441a465dc159351a # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686@sha256:2ccf31ab3685cf8952f2d9251f79a29c7ffcb663bbc58c10b2317a15a86ac96d # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:2962468349f2e55378e16706fb1dfc36983ab376ed1bb942959c65376671b37e # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:4458e9ec6af8588fe269d23adf2306231c15b949a9b0637a9c0943f80d6931d5 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:d3a55a555fc6ff7914238acfd73c0e56b63d9b21e6a064e1f92269f518bc265d # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686@sha256:8ca1be90979cb290909c1c945573ccdc7114505d66c563567ee6c78927fb215f # 2026.08.15-1
[aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:5d366450eeff9abe09cc93db50fd2c9832bafaf473daa7a911d8b184424bbefd # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:52e4da6e9348db7cd0b529a827623b62b7c1fe867ba515ae752fa13d41f7f46e # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:86585a1adfa6cdb4e3aea2f5bf11d6fffa37acf17aa902605d7237c55d3c88ce # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64@sha256:1fa8dcacab5e13769abb36028f98bd2c0a1af4dbde492505f774d7f0ce01e87f # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:b63ff749fee6f3f2a6b67ed3101a073db3211df1791da19e9acf96f43c0dd6ff # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:561427136aabf3787bffb294b3515748241e0962d1527ae28bea1e076bfb9d99 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:691d9ffc1b3432c3ef12bcef756d10da38c10ef8022d6a92c18e781d6aac7aef # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64@sha256:cea133e28484a93e9c40fc661256e8f1ec69b2887d0b64acbfaf48f26bbab103 # 2026.08.15-1
[ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le@sha256:405ac40dffd7a76b4864a185d0440c6449c855eaffd1a20b56af9e4cc15318a6 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le@sha256:ad99a0b35b8820b0ccd1d117e23097da224df11c98f19e2783735d5b7e717526 # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le@sha256:bc61f200bea02d2a507bb292d6210297bd12abc71fa1e8e1f05b1755495b8518 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le@sha256:0acbe90fc63807d3ce52249d1d21e5625fe105aee7f3de60583b8485d82401c8 # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le@sha256:ea4e5065bef4bfd6514d0540a7a8e69a22e0bb1b8ffee093523e95b216a84134 # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le@sha256:dd8da6e6a692832be06ace33c08e1a92704472d84dc20f2b6069b026aa19d185 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le@sha256:f1a788008370c5b5a8937eed968bb13c7d70bb53d3dfae06e0d3059c4a107a6d # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le@sha256:d70f4708a377ba4a21eee38be20e35c757e911b5ca90df0fce002fd71a6df3a8 # 2026.08.15-1
[s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x@sha256:3797dba7137e416c67ca1f45222dd382a2bfdaee8c751e95a79503adf38071e7 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x@sha256:43b1c58ab1a37f3bf45d65026c968be18f2a4dddd4f923291d1122b3e42380da # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x@sha256:b9bba263ab1309ddd2b41560f8ea15138fdb31fa31daf5858878d00b19d57d77 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x@sha256:aec126e37ce315e724217342bb62533cbfeae88b4ed5aa2a8bfd5ee4a4a1ca77 # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_s390x@sha256:840a6e20bd092a9f3ab71b76b252801f9e419646640822ce9f8ca43d1a4b9a2c # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x@sha256:2eda6ec2dc9ce2ed6da698f5dac9b3ea764bfc469e5e81206d5a829d73332c60 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x@sha256:966ec041ce4772e500da8a7e452681361cbe2b47ce882c4eb1186fd89ed9693a # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x@sha256:97af923ea31a097445fcaad1af154e1f0fd997a6d722141d55607dc3767f8782 # 2026.08.15-1
[pypy_x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:c163a278006f45883c117b4166b93cdc7b574b62e58292ed9e52879579841d77 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:012f4a50472412f18bb2b450c1cce7158434cfae4ae878591c2748a13a30c2be # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:db817cd4c670f1191d74db6a94a0b115954af78861db7da660de4e93ebf2984c # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_x86_64@sha256:95440e0e72dd3a81dc8d2cf59a84d57af661456620f5bc821ff92048d0e54ff9 # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64@sha256:0c87ccb5996dab6c3b7612ee4fda7b80c4ab3c44a86c2541e4a872afdf4f131b # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64@sha256:266610f48ef368cca34f521813ef61ed99d396b782e528fd0b0f58aa67c2189c # 2026.08.15-1
[pypy_i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:abfc526a4f9d9692ed6d53b60ffd6be764aa7a4dc1d61522a1ce5ea64138aa53 # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:605a71b7fa720562ad76147860e33d97b2a884ca9d5a454b2f7f353caec40ded # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:82e74fcb11aa1d425260804292b8a25533f37eda280570b2441a465dc159351a # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_i686@sha256:2962468349f2e55378e16706fb1dfc36983ab376ed1bb942959c65376671b37e # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686@sha256:4458e9ec6af8588fe269d23adf2306231c15b949a9b0637a9c0943f80d6931d5 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686@sha256:d3a55a555fc6ff7914238acfd73c0e56b63d9b21e6a064e1f92269f518bc265d # 2026.08.15-1
[pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:5d366450eeff9abe09cc93db50fd2c9832bafaf473daa7a911d8b184424bbefd # 2026.08.04-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:52e4da6e9348db7cd0b529a827623b62b7c1fe867ba515ae752fa13d41f7f46e # 2026.08.04-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:86585a1adfa6cdb4e3aea2f5bf11d6fffa37acf17aa902605d7237c55d3c88ce # 2026.08.04-1
manylinux2014 = quay.io/pypa/manylinux2014_aarch64@sha256:b63ff749fee6f3f2a6b67ed3101a073db3211df1791da19e9acf96f43c0dd6ff # 2026.08.15-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64@sha256:561427136aabf3787bffb294b3515748241e0962d1527ae28bea1e076bfb9d99 # 2026.08.15-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64@sha256:691d9ffc1b3432c3ef12bcef756d10da38c10ef8022d6a92c18e781d6aac7aef # 2026.08.15-1
[armv7l]
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l@sha256:bbd7f67c0fc2a9541ed462a41bd9abbfa696801483533ba44ec5fe3120e8cda6 # 2026.08.04-1
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l@sha256:1335af18598960ecc4b57ccf239cacbca847af9f197e65e495ba376d0178385a # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l@sha256:fd4998e62ec4476d76d7b180b523e21ac7557d7f41f1b1e7d02ced21a3eee8b5 # 2026.08.04-1
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l@sha256:235c282aa532e01136e5e1db0a9403463032c9281fa56d89b39e45dfb5081484 # 2026.08.15-1
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l@sha256:e073f25a6b46c38f58b67cb3d40c4c4346fc6b481b791fb4ccd721bd63bce10b # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l@sha256:c7ee1ecd4967a3ea682c814b564a900d90dc81d75b0b7c2deeb8d6819752a460 # 2026.08.15-1
[riscv64]
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64@sha256:41197d59628c256b0fde14a5dd5bb306e17665c515a8385e43cc72c1da1d7866 # 2026.08.04-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64@sha256:aaf12357d794dc375e797dce7fd71e92013bc46f269bc4cffe4da1f188080afb # 2026.08.04-1
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64@sha256:9fa1bc388ea2494e457eec44e7c16a9e66fff892d73da8af3621009e76167949 # 2026.08.15-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64@sha256:c81bcd3275ce4372b3ceb59ad132619ffe3e7c591193c2d5f2ed97aba198ec51 # 2026.08.15-1
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1 +1 @@
default = { version = "21.7.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.7.1/virtualenv.pyz", sha256 = "d63ac10e610738c3dcfa51ee0799e6b69ce2964d76cab734542684baf0ed3a5f" }
default = { version = "21.7.4", url = "https://github.com/pypa/get-virtualenv/releases/download/21.7.4/virtualenv.pyz", sha256 = "2dfdb6785b762b8a7a7a31d413c16516aa785552d05f61435b072fde1cb340cc" }
+1 -1
View File
@@ -53,7 +53,7 @@ def remove_on_error(path: Path) -> Generator[None, None, None]:
shutil.rmtree(path)
elif path.exists() or path.is_symlink():
path.unlink()
except BaseException as cleanup_exception:
except BaseException as cleanup_exception: # noqa: BLE001
msg = f"Failed to remove {path}. Please remove it manually."
raise BaseExceptionGroup(msg, [original_exception, cleanup_exception]) from None
raise
+1 -1
View File
@@ -12,7 +12,7 @@ def define_env(env: Any) -> None: # noqa: ANN401
"Hook function for mkdocs-macros"
@env.macro # type: ignore[untyped-decorator]
def subprocess_run(*args: str) -> str:
def subprocess_run(*args: str) -> str: # type: ignore[misc]
"Run a subprocess and return the stdout"
env = os.environ.copy()
scripts = sysconfig.get_path("scripts")
+4 -4
View File
@@ -75,8 +75,8 @@ ref: working-examples
| [markupsafe][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Safely add untrusted strings to HTML/XML markup. |
| [Rtree][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Rtree: spatial index for Python GIS |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Example pybind11 module built with a CMake-based build system |
| [KDEpy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Kernel Density Estimation in Python |
| [dd-trace-py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Uses custom alternate arch emulation on GitHub |
| [KDEpy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Kernel Density Estimation in Python |
| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] ![pyodide icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [tgcalls][] | ![github icon][] | ![apple icon][] ![windows icon][] | Python `pybind11` binding to Telegram's WebRTC library with third party dependencies like `OpenSSL`, `MozJPEG`, `FFmpeg`, etc. |
| [python-rapidjson][] | ![travisci icon][] ![gitlab icon][] | ![windows icon][] ![linux icon][] | Python wrapper around rapidjson |
@@ -110,8 +110,8 @@ ref: working-examples
| [cf-units][] | ![github icon][] | ![apple icon][] ![linux icon][] | Units of measure as required by the Climate and Forecast (CF) Metadata Conventions |
| [etebase-py][] | ![travisci icon][] | ![linux icon][] | Python bindings to a Rust library using `setuptools-rust`, and `sccache` for improved speed. |
| [SiPM][] | ![github icon][] | ![apple icon][] ![linux icon][] | High performance library for SiPM detectors simulation using C++17, OpenMP and AVX2 intrinsics. |
| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
| [aalink][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Async Python interface for Ableton Link. |
| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
| [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy |
| [ril][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A python binding to Rust Imaging library using maturin and Pyo3, utilizes Github Action cache to improve speed. Builds abi3 wheels. |
| [GSD][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Cython and NumPy project with 64-bit wheels. |
@@ -186,8 +186,8 @@ ref: working-examples
[markupsafe]: https://github.com/pallets/markupsafe
[Rtree]: https://github.com/Toblerity/rtree
[pybind11 cmake_example]: https://github.com/pybind/cmake_example
[KDEpy]: https://github.com/tommyod/KDEpy
[dd-trace-py]: https://github.com/DataDog/dd-trace-py
[KDEpy]: https://github.com/tommyod/KDEpy
[sourmash]: https://github.com/sourmash-bio/sourmash
[tgcalls]: https://github.com/MarshalX/tgcalls
[python-rapidjson]: https://github.com/python-rapidjson/python-rapidjson
@@ -221,8 +221,8 @@ ref: working-examples
[cf-units]: https://github.com/SciTools/cf-units
[etebase-py]: https://github.com/etesync/etebase-py
[SiPM]: https://github.com/EdoPro98/SimSiPM
[numpythia]: https://github.com/scikit-hep/numpythia
[aalink]: https://github.com/artfwo/aalink
[numpythia]: https://github.com/scikit-hep/numpythia
[pyjet]: https://github.com/scikit-hep/pyjet
[ril]: https://github.com/Cryptex-github/ril-py
[GSD]: https://github.com/glotzerlab/gsd
+25 -2
View File
@@ -116,10 +116,27 @@ files = [
"bin/*.py",
"noxfile.py",
]
disallow_any_decorated = true
disallow_any_unimported = true
disallow_untyped_globals = true
disallow_redefinition = true
warn_unused_configs = true
strict = true
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
enable_error_code = [
"deprecated",
"exhaustive-match",
"ignore-without-code",
"mutable-override",
"possibly-undefined",
"redundant-expr",
"redundant-self",
"truthy-bool",
"truthy-iterable",
"unimported-reveal",
"unused-awaitable",
]
warn_unreachable = false
native_parser = true
[[tool.mypy.overrides]]
module = [
@@ -130,6 +147,10 @@ module = [
]
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = ["cibuildwheel.bashlex_eval"]
disable_error_code = ["no-any-unimported"]
[tool.pylint]
py-version = "3.11"
@@ -166,6 +187,7 @@ messages_control.disable = [
"wrong-import-position",
"unused-argument", # Handled by Ruff
"import-outside-toplevel", # Handled by Ruff
"broad-exception-caught", # Handled by Ruff
"broad-exception-raised", # Could be improved eventually
"consider-using-in", # MyPy can't narrow "in"
]
@@ -217,6 +239,7 @@ ignore = [
"PT007", # Lists of tuples in Pytest
"PYI025", # Set as AbstractSet
"PTH123", # open -> Path.open
"TRY002", # Create your own exception
]
flake8-unused-arguments.ignore-variadic-names = true
flake8-tidy-imports.ban-relative-imports = "all"
@@ -234,7 +257,7 @@ future-annotations = true
[tool.ruff.lint.per-file-ignores]
"unit_test/*" = ["PLC1901", "TID252"]
"test/*" = ["TID252"]
"test/*" = ["TID252", "N999"]
"bin/*" = ["TID251"]
"cibuildwheel/resources/install_certifi.py" = ["PTH"]
+49 -11
View File
@@ -619,24 +619,54 @@ def test_repair_error(
assert error in capfd.readouterr().err
# This also tests integration with pkgconf, because Meson uses it to find Python.
# This also tests integration with pkgconf, which Meson uses to find Python and
# OpenBLAS.
@needs_emulator
def test_meson(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
# Alter spam.filter to return the value of a Fortran function.
new_meson_project(
spam_c_top_level_add="int fortran_func_();",
spam_c_function_add="sts = fortran_func_();",
project_args_add="'fortran',",
extension_args_add="'fortran.f90', link_language: 'fortran',",
extension_args_add=dedent(
"""\
'fortran.f90',
link_language: 'fortran',
dependencies: [dependency('openblas', method: 'pkg-config')],
"""
),
# Alter spam.filter to call an OpenBLAS function, and return the value of a
# Fortran function.
spam_c_top_level_add=dedent(
"""\
#include <cblas.h>
int fortran_func_();
"""
),
spam_c_function_add=dedent(
"""\
openblas_get_config();
sts = fortran_func_();
"""
),
).generate(tmp_path)
# TODO: remove once meson-python has a release with Android support.
pyproject_path = tmp_path / "pyproject.toml"
pyproject_path.write_text(
pyproject_path.read_text().replace(
"meson-python", "meson-python @ git+https://github.com/mesonbuild/meson-python@main"
# Add a before-build script to download OpenBLAS.
before_build = tmp_path / "cibw_before_build.sh"
before_build.write_text(
dedent(
"""\
#!/bin/sh
set -eu
openblas_dir=$(pwd)/openblas
rm -rf $openblas_dir
mkdir -p $openblas_dir
pip install \\
--target $openblas_dir \\
--index-url https://chaquo.com/pypi-upstream/ \\
chaquopy-openblas==0.3.33
"""
)
)
before_build.chmod(0o755)
# Add Fortran code.
(tmp_path / "fortran.f90").write_text(
@@ -652,7 +682,15 @@ def test_meson(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None:
script = 'import spam; print(f"result: {spam.filter("")}")'
cibuildwheel_run(
tmp_path,
add_env={**cp313_env, "CIBW_TEST_COMMAND": f"python -c '{script}'"},
add_env={
**cp313_env,
"CIBW_BEFORE_BUILD": str(before_build),
"CIBW_ENVIRONMENT": (
'PKG_CONFIG_PATH="$(pwd)/openblas/chaquopy/lib/pkgconfig" '
'AUDITWHEEL_LD_LIBRARY_PATH="$(pwd)/openblas/chaquopy/lib"'
),
"CIBW_TEST_COMMAND": f"python -c '{script}'",
},
)
assert "result: 42" in capfd.readouterr().out
+29 -1
View File
@@ -29,6 +29,7 @@ from cibuildwheel.oci_container import (
TYPE_CHECKING = False
if TYPE_CHECKING:
from collections.abc import Iterator
from typing import Any
# Test utilities
@@ -84,6 +85,18 @@ def test_no_lf(container_engine: OCIContainerEngineConfig) -> None:
assert container.call(["printf", "hello"], capture_output=True) == "hello"
def test_abnormal_exit(container_engine: OCIContainerEngineConfig) -> None:
container = OCIContainer(
engine=container_engine, image=DEFAULT_IMAGE, oci_platform=DEFAULT_OCI_PLATFORM
)
with container:
# kill the shell without a newline, so the write below still goes
# through the same buffer and the call fails on read, not on write
container.bash_stdin.write(b"exit")
with pytest.raises(RuntimeError):
container.call(["echo", "hello"])
def test_debug_info(container_engine: OCIContainerEngineConfig) -> None:
container = OCIContainer(
engine=container_engine, image=DEFAULT_IMAGE, oci_platform=DEFAULT_OCI_PLATFORM
@@ -139,6 +152,7 @@ def test_container_removed(container_engine: OCIContainerEngineConfig) -> None:
) as container:
assert container.name is not None
container_name = container.name
docker_containers_listing = ""
for _ in range(timeout):
docker_containers_listing = subprocess.run(
f"{container.engine.name} container ls",
@@ -330,7 +344,7 @@ def test_podman_vfs(
# This requires that we write configuration files and point to them
# with environment variables before we run podman
# https://github.com/containers/common/blob/main/docs/containers.conf.5.md
vfs_containers_conf_data = {
vfs_containers_conf_data: dict[str, dict[str, Any]] = {
"containers": {
"default_capabilities": [
"CHOWN",
@@ -348,6 +362,20 @@ def test_podman_vfs(
},
"engine": {"cgroup_manager": "cgroupfs", "events_logger": "file"},
}
# Setting CONTAINERS_CONF makes podman ignore its usual config files, so
# carry over the default OCI runtime; the fallback found on PATH can be
# too old for the OCI spec version podman generates (e.g. Ubuntu 24.04's
# crun 1.14.1 with podman 5.x).
oci_runtime = subprocess.run(
["podman", "info", "--format", "{{.Host.OCIRuntime.Path}}"],
check=True,
capture_output=True,
text=True,
).stdout.strip()
runtime_name = Path(oci_runtime).name
vfs_containers_conf_data["engine"]["runtime"] = runtime_name
vfs_containers_conf_data["engine"]["runtimes"] = {runtime_name: [oci_runtime]}
# https://github.com/containers/storage/blob/main/docs/containers-storage.conf.5.md
storage_root = vfs_path / ".local/share/containers/vfs-storage"
run_root = vfs_path / ".local/share/containers/vfs-runroot"