diff --git a/.github/workflows/stdlib.yml b/.github/workflows/stdlib.yml new file mode 100644 index 000000000..6aa7d180c --- /dev/null +++ b/.github/workflows/stdlib.yml @@ -0,0 +1,217 @@ +name: stdlib + +on: + workflow_dispatch: + inputs: + sha: + description: "The full SHA of a commit with completed build workflows." + required: true + type: string + filters: + description: "Optional CI filters, restricted to available artifacts (e.g., 'platform:linux,python:3.14,build:pgo')." + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ inputs.sha }}-${{ inputs.filters }} + cancel-in-progress: false + +env: + FORCE_COLOR: 1 + +permissions: + actions: read + contents: read + +jobs: + generate-matrix: + name: Generate test matrix + runs-on: ubuntu-latest + outputs: + linux-matrix-0: ${{ steps.set-matrix.outputs.linux-matrix-0 }} + linux-matrix-1: ${{ steps.set-matrix.outputs.linux-matrix-1 }} + macos-matrix: ${{ steps.set-matrix.outputs.macos-matrix }} + windows-matrix: ${{ steps.set-matrix.outputs.windows-matrix }} + any-linux-0: ${{ steps.set-matrix.outputs.any-linux-0 }} + any-linux-1: ${{ steps.set-matrix.outputs.any-linux-1 }} + any-macos: ${{ steps.set-matrix.outputs.any-macos }} + any-windows: ${{ steps.set-matrix.outputs.any-windows }} + linux-run-id: ${{ steps.set-matrix.outputs.linux-run-id }} + macos-run-id: ${{ steps.set-matrix.outputs.macos-run-id }} + windows-run-id: ${{ steps.set-matrix.outputs.windows-run-id }} + steps: + # The helper may not exist at the commit whose artifacts we are testing. + - name: Check out workflow helper + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ github.workflow_sha }} + path: workflow-tools + sparse-checkout: scripts/stdlib_test_matrix.py + sparse-checkout-cone-mode: false + persist-credentials: false + + - name: Check out target configuration + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ inputs.sha }} + path: target + persist-credentials: false + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + with: + enable-cache: false + + - name: Generate test matrix + id: set-matrix + working-directory: target + env: + GH_TOKEN: ${{ github.token }} + INPUT_SHA: ${{ inputs.sha }} + INPUT_FILTERS: ${{ inputs.filters }} + run: | + uv run ci-matrix.py --platform linux --event push --labels "${INPUT_FILTERS}" > linux.json + uv run ci-matrix.py --platform darwin --event push --labels "${INPUT_FILTERS}" > macos.json + uv run ci-matrix.py --platform windows --event push --labels "${INPUT_FILTERS}" > windows.json + + uv run --script ../workflow-tools/scripts/stdlib_test_matrix.py \ + --repository "${GITHUB_REPOSITORY}" \ + --sha "${INPUT_SHA}" \ + --matrix-dir . \ + --github-output "${GITHUB_OUTPUT}" + + linux-0: + name: linux / ${{ matrix.target_triple }} / ${{ matrix.python }} / ${{ matrix.build_options }} + if: ${{ needs.generate-matrix.outputs.any-linux-0 == 'true' }} + needs: generate-matrix + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.generate-matrix.outputs.linux-matrix-0) }} + steps: &linux_steps + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ inputs.sha }} + persist-credentials: false + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + with: + enable-cache: false + + - name: Download distribution + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + github-token: ${{ github.token }} + run-id: ${{ needs.generate-matrix.outputs.linux-run-id }} + name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }} + path: dist + + - name: Run stdlib tests + env: + JUNIT_FILENAME: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml + MATRIX_LIBC: ${{ matrix.libc }} + run: | + if [ "${MATRIX_LIBC}" = "musl" ]; then + sudo apt install --yes musl-dev + unset LD_LIBRARY_PATH + fi + + uv run --no-dev test-distribution.py --junit-xml "${JUNIT_FILENAME}" --stdlib dist/*.tar.zst + + - name: Upload JUnit test results + if: ${{ always() }} + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}-junit + path: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml + + linux-1: + name: linux / ${{ matrix.target_triple }} / ${{ matrix.python }} / ${{ matrix.build_options }} + if: ${{ needs.generate-matrix.outputs.any-linux-1 == 'true' }} + needs: generate-matrix + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.generate-matrix.outputs.linux-matrix-1) }} + steps: *linux_steps + + macos: + name: macos / ${{ matrix.target_triple }} / ${{ matrix.python }} / ${{ matrix.build_options }} + if: ${{ needs.generate-matrix.outputs.any-macos == 'true' }} + needs: generate-matrix + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.generate-matrix.outputs.macos-matrix) }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ inputs.sha }} + persist-credentials: false + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + with: + enable-cache: false + + - name: Download distribution + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + github-token: ${{ github.token }} + run-id: ${{ needs.generate-matrix.outputs.macos-run-id }} + name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }} + path: dist + + - name: Run stdlib tests + env: + JUNIT_FILENAME: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml + run: uv run --no-dev test-distribution.py --junit-xml "${JUNIT_FILENAME}" --stdlib dist/*.tar.zst + + - name: Upload JUnit test results + if: ${{ always() }} + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}-junit + path: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml + + windows: + name: windows / ${{ matrix.target_triple }} / ${{ matrix.python }} / ${{ matrix.build_options }} + if: ${{ needs.generate-matrix.outputs.any-windows == 'true' }} + needs: generate-matrix + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.generate-matrix.outputs.windows-matrix) }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ inputs.sha }} + persist-credentials: false + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + with: + enable-cache: false + + - name: Download distribution + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + github-token: ${{ github.token }} + run-id: ${{ needs.generate-matrix.outputs.windows-run-id }} + name: cpython-${{ matrix.python }}-${{ matrix.vcvars }}-${{ matrix.build_options }} + path: dist + + - name: Run stdlib tests + env: + JUNIT_FILENAME: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml + run: | + $Dists = Resolve-Path -Path "dist/*.tar.zst" -Relative + uv run --no-dev test-distribution.py --junit-xml $env:JUNIT_FILENAME --stdlib $Dists + + - name: Upload JUnit test results + if: ${{ always() }} + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}-junit + path: junit-cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }}.xml diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 1c98755af..eefbb6e85 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -66,10 +66,14 @@ tar -xf "Python-${PYTHON_VERSION}.tar.xz" PIP_WHEEL="${ROOT}/pip-${PIP_VERSION}-py3-none-any.whl" SETUPTOOLS_WHEEL="${ROOT}/setuptools-${SETUPTOOLS_VERSION}-py3-none-any.whl" -cat Setup.local -mv Setup.local "Python-${PYTHON_VERSION}/Modules/Setup.local" +# Put critical config files in logs to aid debugging. +for f in Setup.local Makefile.extra stdlib-test-annotations.json; do + echo "BEGIN $f" + cat $f + echo "END $f" +done -cat Makefile.extra +mv Setup.local "Python-${PYTHON_VERSION}/Modules/Setup.local" pushd "Python-${PYTHON_VERSION}" @@ -1438,7 +1442,7 @@ cp -av Modules/config.c.in "${ROOT}/out/python/build/Modules/" cp -av Python/frozen.c "${ROOT}/out/python/build/Python/" cp -av Modules/Setup* "${ROOT}/out/python/build/Modules/" -# Copy the test hardness runner for convenience. +# Copy the test harness runner for convenience. # As of Python 3.13, the test harness runner has been removed so we provide a compatibility script if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then cp -av "${ROOT}/run_tests-13.py" "${ROOT}/out/python/build/run_tests.py" @@ -1446,6 +1450,10 @@ else cp -av Tools/scripts/run_tests.py "${ROOT}/out/python/build/" fi +# Copy standard library test annotations so it is in the artifact and the +# distribution self-describes expected test wonkiness. +cp -av "${ROOT}/stdlib-test-annotations.json" "${ROOT}/out/python/build/stdlib-test-annotations.json" + # Don't hard-code the build-time prefix into the pkg-config files. See # the description of `pcfiledir` in `man pkg-config`. find "${ROOT}/out/python/install/lib/pkgconfig" -name \*.pc -type f -exec \ diff --git a/cpython-unix/build.py b/cpython-unix/build.py index cf4d7afd3..889a0ab1e 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -25,6 +25,7 @@ meets_python_maximum_version, meets_python_minimum_version, parse_setup_line, + stdlib_test_annotations, ) from pythonbuild.docker import ( build_docker_image, @@ -58,6 +59,7 @@ SUPPORT = ROOT / "cpython-unix" EXTENSION_MODULES = SUPPORT / "extension-modules.yml" TARGETS_CONFIG = SUPPORT / "targets.yml" +STDLIB_TEST_ANNOTATIONS = ROOT / "stdlib-test-annotations.yml" LINUX_ALLOW_SYSTEM_LIBRARIES = { "c", @@ -771,6 +773,13 @@ def build_cpython( setuptools_archive = download_entry("setuptools", DOWNLOADS_PATH) pip_archive = download_entry("pip", DOWNLOADS_PATH) + test_annotations = stdlib_test_annotations( + STDLIB_TEST_ANNOTATIONS, + python_version, + target_triple, + parsed_build_options, + ) + ems = extension_modules_config(EXTENSION_MODULES) setup = derive_setup_local( @@ -847,6 +856,14 @@ def build_cpython( build_env.copy_file(fh.name, dest_name="Makefile.extra") + # Install the derived test annotations. + with tempfile.NamedTemporaryFile("w", encoding="utf-8") as fh: + os.chmod(fh.name, 0o644) + test_annotations.json_dump(fh) + fh.flush() + + build_env.copy_file(fh.name, dest_name="stdlib-test-annotations.json") + env = { "PIP_VERSION": DOWNLOADS["pip"]["version"], "PYTHON_VERSION": python_version, @@ -1139,7 +1156,7 @@ def main(): write_dockerfiles(SUPPORT, BUILD) elif action == "makefiles": targets = get_targets(TARGETS_CONFIG) - write_triples_makefiles(targets, BUILD, SUPPORT) + write_triples_makefiles(targets, ROOT, BUILD, SUPPORT) write_target_settings(targets, BUILD / "targets") write_package_versions(BUILD / "versions") diff --git a/cpython-windows/build.py b/cpython-windows/build.py index 9b36600c3..c153bc881 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -22,6 +22,7 @@ meets_python_maximum_version, meets_python_minimum_version, parse_config_c, + stdlib_test_annotations, ) from pythonbuild.downloads import DOWNLOADS from pythonbuild.utils import ( @@ -39,6 +40,7 @@ BUILD = ROOT / "build" DIST = ROOT / "dist" SUPPORT = ROOT / "cpython-windows" +STDLIB_TEST_ANNOTATIONS = ROOT / "stdlib-test-annotations.yml" LOG_PREFIX = [None] LOG_FH = [None] @@ -128,7 +130,6 @@ "_zstd": ["zstd"], } - # Tests to run during PGO profiling. # # This set was copied from test.libregrtest.pgo in the CPython source @@ -1457,6 +1458,13 @@ def build_cpython( if freethreaded and meets_python_minimum_version(python_version, "3.15"): pcbuild_directory = f"{build_directory}t" + test_annotations = stdlib_test_annotations( + STDLIB_TEST_ANNOTATIONS, + python_version, + target_triple, + parsed_build_options, + ) + tempdir_opts = ( {"ignore_cleanup_errors": True} if sys.version_info >= (3, 12) else {} ) @@ -1816,6 +1824,12 @@ def build_cpython( out_dir / "python" / "build" / "run_tests.py", ) + # Install a JSON file annotating tests. + with (out_dir / "python" / "build" / "stdlib-test-annotations.json").open( + "w", encoding="utf-8" + ) as fh: + test_annotations.json_dump(fh) + licenses_dir = out_dir / "python" / "licenses" licenses_dir.mkdir() for f in sorted(os.listdir(ROOT)): diff --git a/pyproject.toml b/pyproject.toml index c52450b9a..79e4df0a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,13 +3,14 @@ name = "python-build-standalone" version = "0.1.0" description = "Produces standalone, highly-redistributable builds of Python." readme = "README.rst" -requires-python = ">=3.10" +requires-python = ">=3.11" dependencies = [ "boto3>=1.37", "boto3-stubs[s3]>=1.42", "docker>=7.1.0", "jinja2>=3.1.5", "jsonschema>=4.23.0", + "junitparser>=4.0.2", "pyyaml>=6.0.2", "six>=1.17.0", "tomli>=2.2.1", diff --git a/pythonbuild/cpython.py b/pythonbuild/cpython.py index 100c71736..ceb9e5400 100644 --- a/pythonbuild/cpython.py +++ b/pythonbuild/cpython.py @@ -2,13 +2,15 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. +import dataclasses +import json import pathlib import re import tarfile from collections import defaultdict from collections.abc import Iterable from dataclasses import dataclass, field -from typing import IO +from typing import IO, Optional import jsonschema import yaml @@ -141,6 +143,65 @@ }, } +STDLIB_TEST_ANNOTATION_COMMON_PROPERTIES = { + "reason": {"type": "string"}, + "targets": { + "type": "array", + "items": {"type": "string"}, + }, + "ignore-targets": { + "type": "array", + "items": {"type": "string"}, + }, + "minimum-python-version": {"type": "string"}, + "maximum-python-version": {"type": "string"}, + "build-option": {"type": "string"}, + "no-build-option": {"type": "string"}, +} + +STDLIB_TEST_ANNOTATIONS_SCHEMA = { + "type": "object", + "properties": { + "harness-skips": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + **STDLIB_TEST_ANNOTATION_COMMON_PROPERTIES, + }, + "additionalProperties": False, + "required": ["name", "reason"], + }, + }, + "module-excludes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "module": {"type": "string"}, + **STDLIB_TEST_ANNOTATION_COMMON_PROPERTIES, + }, + "additionalProperties": False, + "required": ["module", "reason"], + }, + }, + "expected-failures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "dont-verify": {"type": "boolean"}, + "intermittent": {"type": "boolean"}, + **STDLIB_TEST_ANNOTATION_COMMON_PROPERTIES, + }, + "additionalProperties": False, + "required": ["name", "reason"], + }, + }, + }, +} # Packages that define tests. STDLIB_TEST_PACKAGES = { @@ -1059,3 +1120,139 @@ def extension_modules_config(yaml_path: pathlib.Path): jsonschema.validate(data, EXTENSION_MODULES_SCHEMA) return data + + +TEST_ANNOTATION_HARNESS_SKIP = "harness-skip" +TEST_ANNOTATION_MODULE_EXCLUDE = "module-exclude" +TEST_ANNOTATION_TEST_FAILURE = "test-failure" + + +@dataclasses.dataclass +class TestAnnotation: + # Describes the type of annotation. + flavor: str + # Name/pattern of test. + name: str + # Describes why the annotation exists. + reason: str + # Whether the test is expected to fail. + expect_test_failure: bool + # Whether to skip verification of failures. + dont_verify: bool + # Whether test failure is intermittent. Should only be true if + # expect_test_failure also true. + intermittent_test_failure: bool + # Whether to exclude loading the test module when running tests. + exclude_testing: bool + + +@dataclasses.dataclass +class TestAnnotations: + annotations: list[TestAnnotation] + + def json_dump(self, of): + data = [dataclasses.asdict(a) for a in self.annotations] + json.dump(data, of, indent=2) + + +def filter_stdlib_test_entry( + flavor: str, + test, + python_version: str, + target_triple: str, + build_options: set[str], +) -> Optional[TestAnnotation]: + name = test["name"] + + if targets := test.get("targets"): + matches_target = any(re.match(p, target_triple) for p in targets) + else: + matches_target = True + + for m in test.get("ignore-targets", []): + if re.match(m, target_triple): + matches_target = False + + if not matches_target: + log(f"ignoring {flavor} rule (target doesn't match): {name}") + return None + + python_minimum_version = test.get("minimum-python-version", "1.0") + python_maximum_version = test.get("maximum-python-version", "100.0") + + if not meets_python_minimum_version(python_version, python_minimum_version): + log( + f"ignoring {flavor} rule ({python_version} < {python_minimum_version} (min)): {name}" + ) + return None + + if not meets_python_maximum_version(python_version, python_maximum_version): + log( + f"ignoring {flavor} rule ({python_version} > {python_maximum_version} (max)): {name}" + ) + return None + + if option := test.get("build-option"): + if option not in build_options: + log(f"ignoring {flavor} rule (build option {option} not present): {name}") + return None + + if option := test.get("no-build-option"): + if option in build_options: + log(f"ignoring {flavor} rule (build option {option} is present): {name}") + return None + + # Filtering complete. This rule applies to the current build. + + log(f"relevant {flavor} test rule: {name}: {test['reason']}") + + return TestAnnotation( + flavor=flavor, + name=name, + reason=test["reason"], + expect_test_failure=True, + dont_verify=test.get("dont-verify", False), + intermittent_test_failure=test.get("intermittent", False), + exclude_testing=test.get("exclude", False), + ) + + +def stdlib_test_annotations( + yaml_path: pathlib.Path, + python_version: str, + target_triple: str, + build_options: set[str], +) -> TestAnnotations: + """Processes the test-annotations.yml file for a given build configuration.""" + with yaml_path.open("r", encoding="utf-8") as fh: + data = yaml.load(fh, Loader=yaml.SafeLoader) + + jsonschema.validate(data, STDLIB_TEST_ANNOTATIONS_SCHEMA) + + annotations = [] + + log(f"processing {len(data['expected-failures'])} stdlib test annotations") + + raw_entries = [] + + for entry in data["harness-skips"]: + raw_entries.append((TEST_ANNOTATION_HARNESS_SKIP, entry)) + + for entry in data["module-excludes"]: + entry["name"] = entry["module"] + raw_entries.append((TEST_ANNOTATION_MODULE_EXCLUDE, entry)) + + for entry in data["expected-failures"]: + raw_entries.append((TEST_ANNOTATION_TEST_FAILURE, entry)) + + for flavor, entry in raw_entries: + if a := filter_stdlib_test_entry( + flavor, + entry, + python_version, + target_triple, + build_options, + ): + annotations.append(a) + + return TestAnnotations(annotations) diff --git a/pythonbuild/testdist.py b/pythonbuild/testdist.py index c8d73ee31..905e5c3d2 100644 --- a/pythonbuild/testdist.py +++ b/pythonbuild/testdist.py @@ -3,23 +3,63 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. import argparse +import concurrent.futures +import dataclasses +import enum import json import os +import re +import shlex import subprocess import tempfile from pathlib import Path from typing import Optional +from junitparser import JUnitXml + +from .cpython import ( + TEST_ANNOTATION_HARNESS_SKIP, + TEST_ANNOTATION_MODULE_EXCLUDE, + TEST_ANNOTATION_TEST_FAILURE, + TestAnnotation, + meets_python_minimum_version, +) from .utils import extract_python_archive +# Tests in the standard library that are slow. +# +# Roughly in order from slowest to fastest. +STDLIB_SLOW_TESTS = [ + "test_subprocess", + "test_signal", + "test_socket", + "test.test_multiprocessing_spawn.test_processes", + "test.test_multiprocessing_forkserver.test_processes", + "test_regrtest", + "test.test_concurrent_futures.test_process_pool", + "test_tarfile", + "test_socket", + "test_remote_pdb", + "test_threading", + "test.test_concurrent_futures.test_as_completed", + "test.test_multiprocessing_spawn.test_misc", + "test.test_asyncio.test_tasks", + "test_zipfile", + "test_pickle", +] + +# Maximum wall run time of a single test before timing it out. +TIMEOUT_SECONDS = 300 + def run_dist_python( dist_root: Path, python_info, args: list[str], extra_env: Optional[dict[str, str]] = None, + log_exec=False, **runargs, -) -> subprocess.CompletedProcess[str]: +) -> subprocess.CompletedProcess[bytes]: """Runs a `python` process from an extracted PBS distribution. This function attempts to isolate the spawned interpreter from any @@ -35,8 +75,13 @@ def run_dist_python( if extra_env: env.update(extra_env) + all_args = [str(dist_root / python_info["python_exe"])] + args + + if log_exec: + print(f"executing: {shlex.join(all_args)}") + return subprocess.run( - [str(dist_root / python_info["python_exe"])] + args, + all_args, cwd=dist_root, env=env, **runargs, @@ -63,44 +108,476 @@ def run_custom_unittests(pbs_source_dir: Path, dist_root: Path, python_info) -> return res.returncode -def run_stdlib_tests(dist_root: Path, python_info, harness_args: list[str]) -> int: +def run_stdlib_tests( + dist_root: Path, + python_info, + skip_main=False, + verbose_expected_failures=False, + raw_harness_args: Optional[list[str]] = None, +) -> tuple[int, JUnitXml]: """Run Python stdlib tests for a PBS distribution. The passed path is the `python` directory from the extracted distribution archive. """ - args = [ - str(dist_root / python_info["run_tests"]), + + dist_name = f"cpython-{python_info['python_version']}-{python_info['build_options']}-{python_info['target_triple']}" + + stdlib_test_annotations_path = dist_root / "build" / "stdlib-test-annotations.json" + + with stdlib_test_annotations_path.open("r", encoding="utf-8") as fh: + annotations = json.load(fh) + + expect_failures = set() + module_excludes = set() + intermittent = set() + dont_verify = set() + + for raw_annotation in annotations: + annotation = TestAnnotation(**raw_annotation) + + name = annotation.name + flavor = annotation.flavor + reason = annotation.reason + + if flavor == TEST_ANNOTATION_HARNESS_SKIP: + print(f"not running the stdlib test harness: {reason}") + + # Add a GitHub Actions annotation to improve observability of this scenario. + + if "CI" in os.environ: + print( + f"::notice title={dist_name} stdlib test harness skipped::{reason}" + ) + + return 0, JUnitXml() + + elif flavor == TEST_ANNOTATION_MODULE_EXCLUDE: + print(f"excluding module {name}: {reason}") + module_excludes.add(name) + continue + + elif flavor == TEST_ANNOTATION_TEST_FAILURE: + print(f"expected test failure {name}: {reason}") + expect_failures.add(name) + + if annotation.intermittent_test_failure: + intermittent.add(name) + if annotation.dont_verify: + dont_verify.add(name) + + else: + raise Exception(f"unhandled test annotation flavor: {flavor}") + + base_args = [ + "-u", + "-W", + "default", + "-bb", + "-E", + "-m", + "test", ] - args.extend(harness_args) + if not raw_harness_args: + # Enable all resources for both the main run and expected-failure checks. + base_args.extend(["-u", "all"]) + + args = list(base_args) + + td = tempfile.TemporaryDirectory() + junit_path = Path(td.name) / "junit.xml" + + if raw_harness_args: + # Honor an explicit harness destination; relative paths are interpreted + # from the distribution root, where the subprocess runs. + parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) + parser.add_argument("--junit-xml", type=Path) + harness_options, _ = parser.parse_known_args(raw_harness_args) + if harness_options.junit_xml is not None: + junit_path = dist_root / harness_options.junit_xml + else: + # Insert before forwarded arguments, which may contain `--`. + args.extend(["--junit-xml", str(junit_path)]) + args.extend(raw_harness_args) + else: + args.extend( + [ + # Display test output on failure. Makes it easier to debug failures. + "-W", + # Re-run failed tests in verbose mode to aid debugging. + "-w", + # Make order non-deterministic to help flush out failures. + "--randomize", + # Run tests in parallel using all available CPUs. + "-j", + "0", + # Force abort tests taking too long to execute. This can prevent + # some runaway tests in CI. + "--timeout", + str(TIMEOUT_SECONDS), + # Print slowest tests to make it easier to audit our slow tests list. + "-o", + # Write test results to a junit XML file. + "--junit-xml", + str(junit_path), + ] + ) + + # 3.14 added a test harness feature to prioritize running tests. Prioritize + # running slow tests first to mitigate long poles slowing down harness execution. + if meets_python_minimum_version(python_info["python_version"], "3.14"): + args.extend(["--prioritize", ",".join(STDLIB_SLOW_TESTS)]) + + for test_name in sorted(expect_failures): + args.extend(["--ignore", test_name]) + + if module_excludes: + # --exclude is a boolean argument that changes positional arguments to + # denotes excludes. As of at least 3.15 there doesn't appear to be a + # way to select tests to run via positional arguments while also + # excluding certain modules from being loaded. + args.append("--exclude") + args.extend(sorted(module_excludes)) + + codes = [] + + if not skip_main: + codes.append( + run_dist_python(dist_root, python_info, args, log_exec=True).returncode + ) + if codes[-1] != 0: + print(f"main test harness failed ({codes[-1]})") + else: + print("main test harness passed") + else: + print("main test harness skipped") + + try: + junit = JUnitXml.fromfile(str(junit_path)) + except FileNotFoundError: + junit = JUnitXml() + + if not raw_harness_args: + for result in _run_stdlib_expected_failures( + dist_root, + python_info, + base_args, + expect_failures, + intermittent, + dont_verify, + verbose_expected_failures=verbose_expected_failures, + ): + if result.unexpected: + codes.append(1) + else: + codes.append(0) + + # Concatenate all the junit test suites together. + if result.junit is not None: + junit += result.junit + + if any(code != 0 for code in codes): + return 1, junit + else: + return 0, junit + + +class TestResultReason(enum.StrEnum): + NONE = "" + EXPECTED = "expected" + UNKNOWN_TEST = "unknown test" + INTERMITTENT_PASS_ALLOWED = "intermittent pass allowed" + DONT_VERIFY_PASS_ALLOWED = "dont-verify annotation allows pass" + DONT_VERIFY_FAIL_ALLOWED = "dont-verify annotation allows fail" + UNEXPECTED_PASS = "unexpected pass" + + +@dataclasses.dataclass +class ExpectedFailureResult: + test_name: str + code: int + output: bytes + fails: bool + result_reason: TestResultReason + unexpected: bool + intermittent: bool + dont_verify: bool + junit: Optional[JUnitXml] + + +def _run_stdlib_expected_failures( + dist_root: Path, + python_info, + base_args: list[str], + expect_failures: set[str], + intermittent: set[str], + dont_verify: set[str], + verbose_expected_failures: bool, +) -> list[ExpectedFailureResult]: + results = [] + unexpected_tests: set[str] = set() + + with concurrent.futures.ThreadPoolExecutor() as executor: + fs = [] + + for test_name in sorted(expect_failures): + fs.append( + executor.submit( + _check_stdlib_expected_failure, + dist_root, + python_info, + base_args, + test_name, + test_name in intermittent, + test_name in dont_verify, + ) + ) - return run_dist_python(dist_root, python_info, args).returncode + for i, f in enumerate(concurrent.futures.as_completed(fs)): + res: ExpectedFailureResult = f.result() + + results.append(res) + + if res.unexpected: + unexpected_tests.add(res.test_name) + + unexpected_suffix = "" + if len(unexpected_tests) > 0: + unexpected_suffix = f"/{len(unexpected_tests)}" + + fail_result = "yes" if res.fails else "no" + + if res.result_reason != TestResultReason.NONE: + fail_result += f" ({res.result_reason})" + + print( + f"[{i + 1}/{len(expect_failures)}{unexpected_suffix}] verifying {res.test_name} fails... {fail_result}" + ) + + print_output = verbose_expected_failures or res.result_reason in ( + TestResultReason.DONT_VERIFY_FAIL_ALLOWED, + TestResultReason.UNKNOWN_TEST, + ) + + if print_output: + for line in res.output.decode("utf-8", errors="ignore").splitlines(): + print(f"> {line}") + + if unexpected_tests: + print("unexpected test results:") + for t in sorted(unexpected_tests): + print(t) + + return results + + +RE_TEST_RUN_COUNT = re.compile(rb"^Total tests: run=(\d+)", re.MULTILINE) + +RE_TEST_CRASHED = re.compile(rb"^test test_.+ crashed", re.MULTILINE) + +RE_TEST_UNCAUGHT_EXCEPTION = re.compile( + rb"test_.+ failed \(uncaught exception\)", re.MULTILINE +) + +RE_TEST_SKIPPED = re.compile(rb"^test_.+ skipped", re.MULTILINE) + + +def _check_stdlib_expected_failure( + dist_root: Path, + python_info, + base_args: list[str], + test_name: str, + intermittent: bool, + dont_verify: bool, +) -> ExpectedFailureResult: + args = list(base_args) + + args.extend( + [ + "-v", + "--timeout", + str(TIMEOUT_SECONDS), + ] + ) + + # Always provide the test_* name as a positional argument to limit + # which tests are loaded. Otherwise we load all test files and incur + # substantial overhead. + + parts = test_name.split(".") + + # time.datetimetester is loaded by test_datetime. This pattern was removed + # in 3.11. + if test_name.startswith("test.datetimetester."): + module_name = "test_datetime" + + # distutils.tests is loaded by test_distutils. This pattern was removed + # in 3.12. + elif test_name.startswith("distutils.tests."): + module_name = "test_distutils" + + elif test_name.startswith("test."): + module_name = parts[1] + + else: + raise ValueError(f"unknown test module pattern: {test_name}") + + args.extend(["-m", test_name]) + + with tempfile.TemporaryDirectory() as td: + junit_path = Path(td) / "junit.xml" + args.extend(["--junit-xml", str(junit_path)]) + + args.append(module_name) + + # We sniff stdout for certain string patterns. Non-deterministic color + # sequences undermines those efforts. So prevent the test harness from + # emitting colors. + extra_env = { + "NO_COLOR": "1", + } + + res = run_dist_python( + dist_root, python_info, args, extra_env=extra_env, capture_output=True + ) + + try: + junit = JUnitXml.fromfile(str(junit_path)) + except FileNotFoundError: + junit = None + + unexpected = False + fails = False + result_reason = None + + # Since we're running 1 test at a time, the test harness should always + # run at least 1 test. If no tests are executed, it means we have a test + # annotation referencing an unknown test. i.e. the test annotation is wrong + # (likely incorrect minimum/maximum Python versions). Treat this as a hard + # error to force our test annotations track reality. + # + # But this condition can also materialize if there's an error setting up + # tests, including importing them. Said errors take precedence. Ditto for + # if the load of the module itself self-skips. + crashed = RE_TEST_CRASHED.search(res.stdout) is not None + uncaught_exception = RE_TEST_UNCAUGHT_EXCEPTION.search(res.stdout) is not None + load_error = b"\nERROR: setUpClass" in res.stdout + skipped = RE_TEST_SKIPPED.search(res.stdout) is not None + + if not crashed and not uncaught_exception and not load_error and not skipped: + # 3.13+ syntax. + if m := RE_TEST_RUN_COUNT.search(res.stdout): + if m.group(1) == b"0": + fails = False + result_reason = TestResultReason.UNKNOWN_TEST + unexpected = True + + # 3.11-3.12 syntax. + elif b"NO TESTS RAN" in res.stdout: + fails = False + result_reason = TestResultReason.UNKNOWN_TEST + unexpected = True + + # 3.10 syntax. + elif b"NO TEST RUN" in res.stdout: + fails = False + result_reason = TestResultReason.UNKNOWN_TEST + unexpected = True + + if result_reason is None: + if res.returncode != 0: + fails = True + result_reason = ( + TestResultReason.DONT_VERIFY_FAIL_ALLOWED + if dont_verify + else TestResultReason.EXPECTED + ) + elif intermittent: + fails = False + result_reason = TestResultReason.INTERMITTENT_PASS_ALLOWED + elif dont_verify: + fails = False + result_reason = TestResultReason.DONT_VERIFY_PASS_ALLOWED + else: + fails = False + result_reason = TestResultReason.UNEXPECTED_PASS + unexpected = True + + return ExpectedFailureResult( + test_name, + res.returncode, + res.stdout, + fails, + result_reason, + unexpected, + intermittent, + dont_verify, + junit=junit, + ) def main(pbs_source_dir: Path, raw_args: list[str]) -> int: """test-distribution.py functionality.""" - parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser( + description=""" + Runs unit tests against a Python distribution. + + By default, this executes custom PBS unit tests. The unittests from + the distribution's Python standard library can be ran by adding --stdlib. + + By default, the stdlib test harness is run with opinionated behavior + where we automatically exclude running tests annotated as failing followed + by running each of these annotated tests in isolation to validate their + test annotations. e.g. we validate that failures actually fail. + + If arguments are passed after a `--` separator argument, the execution + behavior changes to a proxy to the stdlib test harness and arguments passed + after `--` are passed directly to `python -m test`, allowing you to invoke + the stdlib test harness with arbitrary arguments. + + The --stdlib-no-main (implies --stdlib) can be used to just run annotated + test failures. This can be useful for debugging these tests. + """ + ) + parser.add_argument( + "--junit-xml", + type=Path, + help="Write test results to a JUnit XML file at the specified path", + ) parser.add_argument( "--stdlib", action="store_true", help="Run the stdlib test harness", ) + parser.add_argument( + "--stdlib-no-main", + action="store_true", + help="Skip running the main invocation of the stdlib test harness - only failures will be processed", + ) + parser.add_argument( + "--verbose-expected-failures", + action="store_true", + help="Print details of tests that failed expectedly (helps with debugging failures)", + ) parser.add_argument( "dist", nargs=1, help="Path to distribution to test", ) parser.add_argument( - "harness_args", + "stdlib_harness_args", nargs=argparse.REMAINDER, - help="Raw arguments to pass to Python's test harness", + help="Raw arguments to pass to the stdlib test harness", ) args = parser.parse_args(raw_args) + if args.stdlib_no_main: + args.stdlib = True + dist_path_raw = Path(args.dist[0]) td = None @@ -117,11 +594,28 @@ def main(pbs_source_dir: Path, raw_args: list[str]) -> int: python_info = json.load(fh) codes = [] + junit = JUnitXml() + # TODO support junit capture codes.append(run_custom_unittests(pbs_source_dir, dist_path, python_info)) - if args.stdlib: - codes.append(run_stdlib_tests(dist_path, python_info, args.harness_args)) + if args.stdlib or args.stdlib_harness_args: + code, junit_stdlib = run_stdlib_tests( + dist_path, + python_info, + skip_main=args.stdlib_no_main, + verbose_expected_failures=args.verbose_expected_failures, + raw_harness_args=args.stdlib_harness_args, + ) + codes.append(code) + junit += junit_stdlib + + junit_xml_path: Optional[Path] = args.junit_xml + if junit_xml_path is not None: + junit_xml_path.parent.mkdir(parents=True, exist_ok=True) + with junit_xml_path.open("w", encoding="utf-8") as fh: + junit.update_statistics() + junit.write(fh, pretty=True) if len(codes) == 0: print("no tests run") diff --git a/pythonbuild/utils.py b/pythonbuild/utils.py index c463b5364..ab5003932 100644 --- a/pythonbuild/utils.py +++ b/pythonbuild/utils.py @@ -182,7 +182,10 @@ def write_if_different(p: pathlib.Path, data: bytes): def write_triples_makefiles( - targets, dest_dir: pathlib.Path, support_search_dir: pathlib.Path + targets, + root_dir: pathlib.Path, + dest_dir: pathlib.Path, + support_search_dir: pathlib.Path, ): """Write out makefiles containing make variable settings derived from config.""" dest_dir.mkdir(parents=True, exist_ok=True) @@ -213,10 +216,13 @@ def write_triples_makefiles( % (entry, DOWNLOADS[entry]["version"], host_platform) ) - lines.append( - "PYTHON_SUPPORT_FILES := $(PYTHON_SUPPORT_FILES) %s\n" - % (support_search_dir / "extension-modules.yml") - ) + extra_support_files = [ + support_search_dir / "extension-modules.yml", + root_dir / "stdlib-test-annotations.yml", + ] + + for p in extra_support_files: + lines.append(f"PYTHON_SUPPORT_FILES := $(PYTHON_SUPPORT_FILES) {p}\n") write_if_different(makefile_path, "".join(lines).encode("ascii")) diff --git a/scripts/stdlib_test_matrix.py b/scripts/stdlib_test_matrix.py new file mode 100644 index 000000000..058f09177 --- /dev/null +++ b/scripts/stdlib_test_matrix.py @@ -0,0 +1,195 @@ +# /// script +# requires-python = ">=3.11" +# dependencies = [] +# /// +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +"""Generate a stdlib test matrix from existing GitHub Actions build artifacts. + +Requires an authenticated gh CLI (or GH_TOKEN). For local use: + + uv run scripts/stdlib_test_matrix.py --repository OWNER/REPO --sha SHA \ + --matrix-dir /path/to/matrices + +The matrix directory must contain linux.json, macos.json, and windows.json from +ci-matrix.py at the requested SHA, with any desired filters already applied. +Generate the inputs without sharding. Linux entries are sharded after artifact +filtering. The final matrix is printed as JSON; --github-output additionally +writes workflow step outputs. +""" + +from __future__ import annotations + +import argparse +import json +import subprocess +import sys +from pathlib import Path +from typing import Any + +PLATFORMS = ("linux", "macos", "windows") +MATRIX_SIZE_LIMIT = 256 +# Keep this in sync with the Linux jobs and outputs in stdlib.yml. +LINUX_SHARD_COUNT = 2 + + +def load_candidates(matrix_dir: Path) -> dict[str, Any]: + """Read the unsharded ci-matrix.py outputs for each platform.""" + matrices = {} + for platform in PLATFORMS: + with (matrix_dir / f"{platform}.json").open(encoding="utf-8") as source: + matrices[platform] = json.load(source)["python-build"] + return matrices + + +def github_api(endpoint: str, *, paginate: bool = False, **params: str) -> Any: + command = ["gh", "api", "--method", "GET", endpoint, "-f", "per_page=100"] + for name, value in params.items(): + command.extend(["-f", f"{name}={value}"]) + if paginate: + command.extend(["--paginate", "--slurp"]) + result = subprocess.run(command, check=True, stdout=subprocess.PIPE, text=True) + return json.loads(result.stdout) + + +def find_build_run(repository: str, sha: str, platform: str) -> str | None: + """Select the latest successful platform build for the requested commit.""" + response = github_api( + f"repos/{repository}/actions/workflows/{platform}.yml/runs", + head_sha=sha, + status="success", + ) + runs = response["workflow_runs"] + return str(runs[0]["id"]) if runs else None + + +def list_artifacts(repository: str, run_id: str) -> set[str]: + """Collect unexpired artifact names across all pages of the selected run.""" + pages = github_api( + f"repos/{repository}/actions/runs/{run_id}/artifacts", paginate=True + ) + return { + artifact["name"] + for page in pages + for artifact in page["artifacts"] + if not artifact["expired"] + } + + +def intersect_matrix(matrix: dict[str, Any], artifacts: set[str]) -> dict[str, Any]: + entries = [] + for entry in matrix["include"]: + if entry["run"] != "true": + continue + # Windows artifact names use vcvars rather than the target triple. + target = entry.get("vcvars", entry["target_triple"]) + name = f"cpython-{entry['python']}-{target}-{entry['build_options']}" + if name in artifacts: + entries.append(entry) + return {**matrix, "include": entries} + + +def shard_linux_matrix(matrix: dict[str, Any]) -> dict[str, Any]: + """Pack filtered entries into the workflow's Linux jobs, including empty shards.""" + entries = matrix["include"] + if len(entries) > MATRIX_SIZE_LIMIT * LINUX_SHARD_COUNT: + raise ValueError( + f"Filtered Linux matrix has {len(entries)} entries, exceeding " + f"{LINUX_SHARD_COUNT} shards of {MATRIX_SIZE_LIMIT}; add Linux jobs " + "to stdlib.yml and increase LINUX_SHARD_COUNT." + ) + return { + f"linux-{index}": { + **matrix, + "include": entries[ + index * MATRIX_SIZE_LIMIT : (index + 1) * MATRIX_SIZE_LIMIT + ], + } + for index in range(LINUX_SHARD_COUNT) + } + + +def generate_test_matrix( + repository: str, sha: str, matrix_dir: Path +) -> tuple[dict[str, Any], dict[str, str]]: + candidates = load_candidates(matrix_dir) + matrices = {} + run_ids = {} + for platform in PLATFORMS: + artifacts: set[str] = set() + if any(entry["run"] == "true" for entry in candidates[platform]["include"]): + run_id = find_build_run(repository, sha, platform) + if run_id is None: + print( + f"No successful {platform} build workflow found for {sha}; " + f"skipping {platform}.", + file=sys.stderr, + ) + else: + artifacts = list_artifacts(repository, run_id) + run_ids[platform] = run_id + filtered = intersect_matrix(candidates[platform], artifacts) + if platform == "linux": + matrices.update(shard_linux_matrix(filtered)) + else: + matrices[platform] = filtered + + if not any(matrix["include"] for matrix in matrices.values()): + raise ValueError( + "No unexpired distribution artifacts match the requested test matrix " + "in successful build workflows." + ) + return matrices, run_ids + + +def write_github_outputs( + path: Path, matrices: dict[str, Any], run_ids: dict[str, str] +) -> None: + with path.open("a", encoding="utf-8") as output: + for key, matrix in matrices.items(): + matrix_key = ( + key.replace("linux-", "linux-matrix-") + if key.startswith("linux-") + else f"{key}-matrix" + ) + print( + f"{matrix_key}={json.dumps(matrix, separators=(',', ':'))}", file=output + ) + print(f"any-{key}={str(bool(matrix['include'])).lower()}", file=output) + for platform, run_id in run_ids.items(): + print(f"{platform}-run-id={run_id}", file=output) + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repository", required=True, help="GitHub OWNER/REPO") + parser.add_argument( + "--sha", required=True, help="Commit with completed build workflows" + ) + parser.add_argument( + "--matrix-dir", + type=Path, + default=Path.cwd(), + help="Directory containing linux.json, macos.json, and windows.json", + ) + parser.add_argument( + "--github-output", type=Path, help="Optional GitHub step output file" + ) + args = parser.parse_args(argv) + try: + matrices, run_ids = generate_test_matrix( + args.repository, args.sha, args.matrix_dir.resolve() + ) + if args.github_output is not None: + write_github_outputs(args.github_output, matrices, run_ids) + print(json.dumps(matrices, indent=2)) + except (OSError, ValueError, subprocess.CalledProcessError) as error: + print(f"Error generating stdlib test matrix: {error}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/stdlib-test-annotations.yml b/stdlib-test-annotations.yml new file mode 100644 index 000000000..562a1eced --- /dev/null +++ b/stdlib-test-annotations.yml @@ -0,0 +1,2779 @@ +--- +# This file defines metadata about Python standard library tests. +# +# The file consists of keys defining different groups of annotations. +# See each key for documentation. +# +# All entries share a common set of fields to support describing the +# annotation and filtering which annotations apply to which builds. +# +# * reason - human readable context describing the failure +# * targets - list of regular expressions matching target triples to +#. determine if rule is active. Missing or empty matches all targets. +# * ignore-targets - list of regular expressions matching target tripels +#. to determine if rule is ignored. Takes precedence over "targets." +# * minimum-python-version - X.Y Python version we must be equal or newer +#. to for the rule to apply. +# * maximum-python-version - X.Y Python version we must be equal or less +#. than for the rule to apply. +# * build-option - A build option (e.g. `pgo`) that must be present for this +#. rule to be enabled. +# * no-build-option - A build option (e.g. `freethreaded`) that must not be +#. present for this rule to be enabled. + +# harness-skips declares builds to skip running the Python stdlib test harness. +# +# Ideally this feature doesn't need to exist. But sometimes the test harness is +# so broken we need to do this. +harness-skips: + - name: "musl-debug-skip-3.14+" + reason: "`cannot get C stack on this system` error leads to widespread failure" + minimum-python-version: "3.14" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + +# module-excludes annotates modules to exclude from loading. +# +# The stdlib test runner applies this filter based on the name of the +# module file/directory within a directory. So values here need to be +# child most module paths. e.g. to exclude module `foo.bar.baz`, you +# need to use module name `baz` and not `foo.bar.baz`. +module-excludes: + - module: test_call + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "import failure due to missing _testcapi" + maximum-python-version: "3.12" + + - module: test_capi + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "import failure due to missing _testcapi" + + - module: test_code + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "import failure due to missing _testcapi" + + - module: test_ctypes + targets: + - ".+-unknown-linux-musl" + reason: "Module import failures" + + - module: test_datetime + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "import failure due to missing _testcapi" + + - module: test_sqlite3 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "import failure due to missing _testcapi" + + - module: test_stable_abi_ctypes + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "import failure due to missing _testcapi" + + - module: test_regrtest_noop1 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "import failure due to missing _testcapi" + + # Tons of failures. Just exclude entirely instead of running. + - module: test_traceback + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: tons of failures, mostly due to missing _testcapi + + - module: test__xxsubinterpreters + maximum-python-version: "3.12" + build-option: "static" + reason: "skipped due to missing _testcapi" + +# expected-failures is a list of tests that are expected to fail. +# +# * name - pattern identifying the test or group of tests +# * intermittent - indicates the failure is intermittent. +# * dont-verify - boolean indicating to not verify the failing test actually +#. fails. Useful for intermittent / flaky tests. +expected-failures: + - name: distutils.tests.test_archive_util.ArchiveUtilTestCase.test_tarfile_vs_tar + minimum-python-version: "3.11" + maximum-python-version: "3.11" + reason: "differing element" + intermittent: true + + - name: distutils.tests.test_install_lib.InstallLibTestCase.test_byte_compile + maximum-python-version: "3.11" + reason: "TypeError: byte_compile() got an unexpected keyword argument 'dry_run'" + + - name: distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile_optimized + maximum-python-version: "3.11" + reason: "TypeError: byte_compile() got an unexpected keyword argument 'dry_run'" + + - name: distutils.tests.test_build_ext.BuildExtTestCase.test_deployment_target_higher_ok + reason: wrong deployment target + maximum-python-version: "3.11" + targets: + - ".+-apple-darwin" + + - name: distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_deployment_target_higher_ok + reason: wrong deployment target + maximum-python-version: "3.11" + targets: + - ".+-apple-darwin" + + # Looks like it is dependent on the system temp dir, which can vary in CI. + - name: distutils.tests.test_sysconfig.SysconfigTestCase.test_srcdir + maximum-python-version: "3.11" + targets: + - ".+-apple-darwin" + reason: "AssertionError: '/var/folders/1r/b8l6nzhj4zdbz5jmjdhqbprw00[64 chars]rwin' != '/private/var/folders/1r/b8l6nzhj4zdbz5jmjd[72 chars]rwin'" + intermittent: true + + - name: test.test_array.ByteTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.DoubleTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.FloatTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.IntTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.LongLongTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.LongTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.ShortTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnicodeTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnsignedByteTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnsignedIntTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnsignedLongLongTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnsignedLongTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_array.UnsignedShortTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + # This test moved to a sub-module in 3.12. + - name: test.test_ast.ModuleStateTests.test_subinterpreter + maximum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "missing _testcapi" + + - name: test.test_ast.test_ast.ModuleStateTests.test_subinterpreter + minimum-python-version: "3.12" + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "missing _testcapi" + + - name: test.test_atexit.SubinterpreterTest.test_atexit_with_low_memory + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "missing _testcapi" + + - name: test.test_atexit.SubinterpreterTest.test_callback_on_subinterpreter_teardown + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_atexit.SubinterpreterTest.test_callbacks_leak + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_atexit.SubinterpreterTest.test_callbacks_leak_refcycle + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_audit.AuditTest.test_unraisablehook + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "AssertionError" + + - name: test.test_audit.AuditTest.test_builtin__import__ + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "ModuleNotFoundError: No module named '_testcapi'. Did you mean: 'test_capi'?" + + - name: test.test_audit.AuditTest.test_import_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "ModuleNotFoundError: No module named '_testcapi'. Did you mean: 'test_capi'?" + + - name: test.test_audit.AuditTest.test_import_statement + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "ModuleNotFoundError: No module named '_testcapi'. Did you mean: 'test_capi'?" + + # Looks like a race condition in freethreaded builds. + - name: test.test_buffer.TestBufferProtocol.test_array_alignment + minimum-python-version: "3.15" + build-option: "freethreaded" + reason: "AssertionError: Lists differ: [0, 4, 0, 0, 0, 0, 0, 0, 0, 0] != [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" + intermittent: true + + - name: test.test_buffer.TestBufferProtocol.test_pybuffer_size_from_format + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "missing _testcapi" + + - name: test.test_build_details.CPythonBuildDetailsTests.test_platform + minimum-python-version: "3.14" + reason: platform key doesn't match when cross compiling - possible PBS quirk/bug. + targets: + - ".+-apple-darwin" + - ".+-unknown-linux-.+" + dont-verify: true + + - name: test.test_bytes.ByteArrayTest.test_obsolete_write_lock + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "_testcapi missing" + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_set + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_set + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_zero + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_zero + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_zero + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_zero + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_warn + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: AssertionError + + - name: test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_warn + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: AssertionError + + - name: test.test_call.TestRecursion.test_margin_is_sufficient + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: missing _testcapi + minimum-python-version: "3.14" + + - name: test.test_capi.test_misc.Test_testinternalcapi.test_threadstate_set_stack_protection + minimum-python-version: "3.14" + targets: + - ".+-pc-windows-.+" + build-option: "freethreaded" + reason: "Assertion failed: ts->c_stack_soft_limit < ts->c_stack_top" + intermittent: true + + - name: test.test_capi.test_run.CAPITest.test_run_fileexflags + minimum-python-version: "3.12" + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + # test_capi is module excluded above in static builds. It fails to + # import / load tests on static builds, leading to a false positive of + # this test not being found. Exclude static builds here to prevent + # our test harness from getting confused. + no-build-option: "static" + reason: "crash" + + - name: test.test_cmath.CMathTests.test_polar_errno + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "_testcapi missing" + + - name: test.test_cmd_line.CmdLineTest.test_pythonmalloc + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_codecs.BasicUnicodeTest.test_basics_capi + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "_testcapi missing" + + - name: test.test_concurrent_futures.test_interpreter_pool.InterpreterPoolExecutorTest.test_blocking + build-option: "freethreaded" + minimum-python-version: "3.15" + reason: "sometimes times out - possible test deadlock" + intermittent: true + + - name: test.test_concurrent_futures.test_shutdown.ProcessPoolForkProcessPoolShutdownTest.test_interpreter_shutdown + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_concurrent_futures.test_shutdown.ProcessPoolForkserverProcessPoolShutdownTest.test_interpreter_shutdown + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_coroutines.CAPITest.test_tp_await_1 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_coroutines.CAPITest.test_tp_await_2 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_coroutines.CAPITest.test_tp_await_3 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_ctypes.test_callbacks.Callbacks.test_i38748_stackCorruption + targets: + - "i686-pc-windows-msvc" + minimum-python-version: "3.12" + reason: "OSError: exception: access violation writing 0x00000005" + + - name: test.test_ctypes.test_callbacks.StdcallCallbacks.test_i38748_stackCorruption + targets: + - "i686-pc-windows-msvc" + minimum-python-version: "3.12" + reason: "OSError: exception: access violation writing 0x00000005" + + # Looks racy on freethreaded builds. + #- name: test.datetimetester.ExtensionModuleTests_Fast.test_concurrent_initialization_subinterpreter + # minimum-python-version: "3.15" + # build-option: "freethreaded" + # reason: "AssertionError: b'aaaaaaa' != b'aaaaaaaa'" + # intermittent: true + + - name: test.datetimetester.ZoneInfoTest_Fast.test_system_transitions + targets: + - "x86_64-apple-darwin" + maximum-python-version: "3.10" + reason: "AttributeError: module 'time' has no attribute 'tzset'" + intermittent: true + + - name: test.datetimetester.IranTest_Pure.test_system_transitions + targets: + - "x86_64-apple-darwin" + maximum-python-version: "3.10" + reason: "AttributeError: module 'time' has no attribute 'tzset'" + intermittent: true + + - name: test.datetimetester.ZoneInfoTest_Pure.test_system_transitions + targets: + - "x86_64-apple-darwin" + maximum-python-version: "3.10" + reason: "AttributeError: module 'time' has no attribute 'tzset'" + intermittent: true + + - name: test.datetimetester.IranTest_Fast.test_system_transitions + targets: + - "x86_64-apple-darwin" + maximum-python-version: "3.10" + reason: "AttributeError: module 'time' has no attribute 'tzset'" + intermittent: true + + - name: test.test_dict.CAPITest.test_getitem_knownhash + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: missing _testcapi + + #- name: test.test_dict.CAPITest.test_splittable_setattr_after_pop + # targets: + # - ".+-unknown-linux-musl" + # build-option: "static" + # maximum-python-version: "3.10" + # reason: missing _testcapi + + - name: test.test_dict.DictTest.test_splittable_setattr_after_pop + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: missing _testcapi + + - name: test.test_docxmlrpc.DocXMLRPCHTTPGETServer.* + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_exceptions.ExceptionTests.testSettingException + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_memory_error_in_subinterp + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_MemoryError + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_exception_with_doc + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_memory_error_cleanup + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_memory_error_in_PyErr_PrintEx + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_recursion_normalizing_infinite_exception + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_recursion_normalizing_with_no_memory + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_exceptions.ExceptionTests.test_recursion_normalizing_exception + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.13" + maximum-python-version: "3.13" + reason: "_testcapi missing" + + - name: test.test_faulthandler.FaultHandlerTests.test_fatal_error + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_faulthandler.FaultHandlerTests.test_fatal_error_without_gil + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_fcntl.TestFcntl.test_fcntl_bad_file_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_fcntl.TestFcntl.test_flock_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_fileio.COtherFileTests.testInvalidFd_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_finalization.LegacyFinalizationTest.test_legacy + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_finalization.LegacyFinalizationTest.test_legacy_resurrect + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_finalization.LegacyFinalizationTest.test_legacy_self_cycle + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_finalization.SimpleFinalizationTest.test_non_gc + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_finalization.SimpleFinalizationTest.test_non_gc_resurrect + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_float.IEEEFormatTestCase.test_serialized_float_rounding + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "_testcapi missing" + + - name: test.test_format.FormatTest.test_precision_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_frame.TestFrameCApi.test_basic + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.13" + reason: _testcapi missing + + # This test has a weird pass/fail matrix. Test might be self-skipping or something. + + # aarch64 passes w/o pgo and on freethreaded+pgo + - name: test.test_frame_pointer_unwind.FramePointerUnwindTests.test_manual_unwind_respects_frame_pointers + minimum-python-version: "3.15" + targets: + - aarch64-unknown-linux-gnu + build-option: "pgo" + no-build-option: "freethreaded" + reason: "AssertionError: 0 not greater than 0 : expected to find Python frames on aarch64 with env {'PYTHON_JIT': '1'}" + + - name: test.test_frame_pointer_unwind.FramePointerUnwindTests.test_manual_unwind_respects_frame_pointers + minimum-python-version: "3.15" + targets: + - x86_64.*-unknown-linux-musl + build-option: "static" + reason: "AssertionError: 0 not greater than 0 : expected to find Python frames on aarch64 with env {'PYTHON_JIT': '1'}" + + - name: test.test_functools.TestPartialC.test_recursive_pickle + targets: + - ".+-apple-darwin" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + build-option: "pgo" + reason: crash + intermittent: true + + - name: test.test_functools.TestPartialCSubclass.test_recursive_pickle + targets: + - ".+-apple-darwin" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + build-option: "pgo" + reason: crash + intermittent: true + + - name: test.test_functools.TestPartialPy.test_recursive_pickle + targets: + - ".+-apple-darwin" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + build-option: "pgo" + reason: crash + intermittent: true + + - name: test.test_functools.TestPartialPySubclass.test_recursive_pickle + targets: + - ".+-apple-darwin" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + build-option: "pgo" + reason: crash + intermittent: true + + - name: test.test_gc.GCCallbackTests.test_collect_garbage + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_gc.GCCallbackTests.test_refcount_errors + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "AssertionError: Regex didn't match: b'gcmodule\\.c:[0-9]+:" + intermittent: true + + - name: test.test_gc.GCTests.test_legacy_finalizer + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_gc.GCTests.test_legacy_finalizer_newclass + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_gc.GCTests.test_garbage_at_shutdown + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "AssertionError: 1 != 0" + + - name: test.test_genericclass.CAPITest.test_c_class + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + # Test appears to be racy on freethreaded builds. + #- name: test.test_hashlib.HashlibTestCase.test_threaded_hashing_fast + # minimum-python-version: "3.15" + # build-option: "freethreaded" + # reason: "appears to be racy on freethreaded builds" + # intermittent: true + + - name: test.test_httpservers.BaseHTTPServerTestCase.* + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_httpservers.CGIHTTPServerTestCase.* + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_httpservers.CGIHTTPServerTestCase.test_large_content_length_truncated + maximum-python-version: "3.14" + reason: "intermittent failure: http.client.RemoteDisconnected: Remote end closed connection without response" + intermittent: true + + - name: test.test_httpservers.RequestHandlerLoggingTestCase.* + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_httpservers.HTTP09ServerTestCase.* + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test__interpchannels.ChannelTests.test_send_recv_different_interpreters_and_threads + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test__interpreters.CreateTests.test_in_thread + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test__interpreters.CreateTests.test_in_threaded_subinterpreter + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test__interpreters.RunFuncTests.test_in_thread + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test__interpreters.RunStringTests.test_in_thread + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_imp.ImportTests.test_create_builtin_subinterp + maximum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "_testcapi missing" + + - name: test.test_imp.ImportTests.test_issue16421_multiple_modules_in_one_dll + maximum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "_testcapi missing" + + - name: test.test_imp.ImportTests.test_issue24748_load_module_skips_sys_modules_check + maximum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: "_testcapi missing" + + - name: test.test_import.CircularImportTests.test_singlephase_circular + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.13" + reason: _testsinglephase shared library expectation + + - name: test.test_import.ImportTests.test_from_import_missing_attr_has_name_and_so_path + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_import.ModexportTests.test_from_modexport + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_create_nonmodule + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_create_nonmodule_gil_used + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_empty_slots + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_exception + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_gil_used + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_null + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.ModexportTests.test_from_modexport_smoke + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.SinglephaseInitTests.* + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: shared library expectations + + - name: test.test_import.SubinterpImportTests.test_builtin_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_import.SubinterpImportTests.test_disallowed_reimport + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testsinglephase shared library expectation" + + - name: test.test_import.SubinterpImportTests.test_frozen_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_import.SubinterpImportTests.test_isolated_config + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_import.SubinterpImportTests.test_multi_init_extension_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: shared library expectations + + - name: test.test_import.SubinterpImportTests.test_multi_init_extension_non_isolated_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: _testmultiphase shared library expectations + + - name: test.test_import.SubinterpImportTests.test_multi_init_extension_per_interpreter_gil_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: _testmultiphase shared library expectations + + - name: test.test_import.SubinterpImportTests.test_pyinit_function_raises_exception + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testsinglephase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_import.SubinterpImportTests.test_python_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_import.SubinterpImportTests.test_singlephase_check_with_setting_and_override + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: _testsinglephase shared library expectations + + - name: test.test_import.SubinterpImportTests.test_single_init_extension_compat + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: _testsinglephase shared library expectations + + - name: test.test_import.SubinterpImportTests.test_testmultiphase_exec_multiple + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.15" + reason: "AttributeError: module '_testmultiphase' has no attribute '__file__'. Did you mean '.__name__' instead of '.__file__'?" + + - name: test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_is_package + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_load_module_API + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module_reuse + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_bad_modules + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_short_name + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_submodule + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_LoaderTests.test_is_package + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Source_LoaderTests.test_load_module_API + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Source_LoaderTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Source_LoaderTests.test_module_reuse + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AttributeError: 'NoneType' object has no attribute 'rfind'" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_bad_modules + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_finder.Frozen_FinderTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AssertionError: None is not true" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable_nonascii + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_functionality + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_twice + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonascii + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_null_slots + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_reload + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_try_registration + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_functionality + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_short_name + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_submodule + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_twice + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonascii + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_null_slots + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_reload + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_try_registration + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "ImportError: Dynamic loading not supported" + + - name: test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable_nonascii + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "AssertionError: 'fo_6ja' != 'foó'" + + - name: test.test_importlib.extension.test_finder.Source_FinderTests.test_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.11" + reason: "AssertionError: None is not true" + + - name: test.test_importlib.test_threaded_import.* + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_multiprocessing_pool_circular_import + targets: + - ".+-unknown-linux-musl" + reason: "segfault at least on debug builds" + # Test sniffs memory and self-skips. This check is not reliable. + intermittent: true + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_concurrent_futures_circular_import + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + minimum-python-version: "3.11" + reason: "segfault" + intermittent: true + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_meta_path + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_module_init + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_path_hooks + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_importlib.test_threaded_import.ThreadedImportTests.test_side_effect_import + minimum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_importlib.test_util.IncompatibleExtensionModuleRestrictionsTests.test_incomplete_multi_phase_init_module + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func_no_signature + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_builtins + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_builtins_no_signature + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_decorated_builtins + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func_no_signature + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_inspect.TestSignatureObject.test_signature_on_builtins + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_inspect.TestSignatureObject.test_signature_on_builtins_no_signature + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_inspect.TestSignatureObject.test_signature_on_decorated_builtins + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_int.IntStrDigitLimitsTests.test_int_max_str_digits_is_per_interpreter + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int + targets: + - ".+-pc-windows-.+" + # Seems to be fixed in 3.14. + maximum-python-version: "3.13" + reason: "AssertionError: 0.015625 not less than or equal to 0.0078125" + intermittent: true + + - name: test.test_int.IntSubclassStrDigitLimitsTests.test_int_max_str_digits_is_per_interpreter + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_interpreters.CreateTests.test_in_thread + # Moved to test__interpreters in 3.13. + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.TestInterpreterRun.test_in_thread + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.CreateTests.test_in_thread + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.LowLevelTests.test_is_running + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterCall.test_call_in_thread + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + minimum-python-version: "3.13" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterClose.test_created_with_capi + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + minimum-python-version: "3.13" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterCall.test_stateless_func_returns_arg + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.14" + reason: missing _testinternalcapi + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterCall.test_stateless_funcs + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.14" + reason: missing _testinternalcapi + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterExec.test_in_thread + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_interpreters.test_api.TestInterpreterIsRunning.test_created_with_capi + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_itertools.TestBasicOps.test_count_threading + minimum-python-version: "3.13" + build-option: "freethreaded" + reason: "test appears racy on freethreaded builds" + intermittent: true + + - name: test.test_io.CTextIOWrapperTest.test_device_encoding + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_io.PyTextIOWrapperTest.test_device_encoding + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test__locale._LocaleTests.test_alt_digits_nl_langinfo + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + reason: "AssertionError: 1 not greater than or equal to 10 : ['0123456789']" + + # This one still fails on static builds on 3.14+. + - name: test.test__locale._LocaleTests.test_alt_digits_nl_langinfo + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: 1 not greater than or equal to 10 : ['0123456789']" + + - name: test.test__locale._LocaleTests.test_lc_numeric_localeconv + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: '.' != ','" + + - name: test.test__locale._LocaleTests.test_lc_numeric_localeconv + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.14" + reason: "AssertionError: '.' != ','" + + - name: test.test__locale._LocaleTests.test_lc_numeric_nl_langinfo + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: '.' != ','" + + # This one still fails on static builds on 3.14+. + - name: test.test__locale._LocaleTests.test_lc_numeric_nl_langinfo + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: '.' != ','" + + - name: test.test_locale.TestEnUSCollation.test_strcoll_with_diacritic + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: 1 not less than 0" + + - name: test.test_locale.TestEnUSCollation.test_strcoll_with_diacritic + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: 1 not less than 0" + + - name: test.test_locale.TestEnUSCollation.test_strxfrm_with_diacritic + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: 1 not less than 0" + + - name: test.test_locale.TestEnUSCollation.test_strxfrm_with_diacritic + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: 1 not less than 0" + + # Passes on x86_64_v3 and x86_64_v4 for some reason. + - name: test.test_math.FMATests.test_fma_zero_result + targets: + - "x86_64(_v2)?-unknown-linux-musl" + minimum-python-version: "3.13" + maximum-python-version: "3.13" + reason: "AssertionError: False is not true : Expected a negative zero, got 0.0" + + - name: test.test_math.FMATests.test_fma_zero_result + targets: + - ".+-unknown-linux-musl" + ignore-targets: + - "x86_64_v[34]-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: False is not true : Expected a negative zero, got 0.0" + + - name: test.test_multibytecodec.Test_IncrementalEncoder.test_subinterp + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_os.ForkTests.test_fork_warns_when_non_python_thread_exists + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_os.TestInvalidFD.test_fpathconf_bad_fd + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + maximum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: didn't raise an OSError with a bad file descriptor" + + - name: test.test_os.test_os.TestInvalidFD.test_fpathconf_bad_fd + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.15" + build-option: "static" + reason: "AssertionError: didn't raise an OSError with a bad file descriptor" + + - name: test.test_os.test_os.TestInvalidFD.test_pathconf_negative_fd_uses_fd_semantics + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.15" + build-option: "static" + reason: "AssertionError: OSError not raised" + + - name: test.test_os.TestInvalidFD.test_fpathconf + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: didn't raise an OSError with a bad file descriptor" + + - name: test.test_os.test_posix.PosixTester.test_pipe2_c_limits + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.15" + build-option: "static" + reason: "ModuleNotFoundError: No module named '_testcapi'" + + - name: test.test_os.test_posix.PosixTester.test_nodev + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.15" + build-option: "static" + reason: "AssertionError: module 'posix' has no attribute 'NODEV'" + + - name: test.test_poll.PollTests.test_poll_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_posix.PosixTester.test_pipe2_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: missing _testcapi + + - name: test.test_posix.PosixTester.test_makedev + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + reason: "OverflowError: can't convert negative int to unsigned" + + - name: test.test_posix.PosixTester.test_makedev + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "OverflowError: can't convert negative int to unsigned" + + - name: test.test_pty.PtyTest.test_spawn_doesnt_hang + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.13" + reason: AssertionError + intermittent: true + + - name: test.test_pydoc.PydocServerTest.test_server + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_re.ReTests.test_locale_caching + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: None is not true" + + - name: test.test_re.ReTests.test_locale_caching + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: None is not true" + + - name: test.test_re.ReTests.test_locale_compiled + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.13" + reason: "AssertionError: None is not true" + + - name: test.test_re.ReTests.test_locale_compiled + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: None is not true" + + - name: test.test_readline.TestHistoryManipulation.test_write_read_append + targets: + - ".+-unknown-linux-musl" + reason: "AssertionError: 4 != 3" + + - name: test.test_readline.TestHistoryManipulation.test_write_read_limited_history + targets: + - ".+-unknown-linux-.+" + minimum-python-version: "3.12" + reason: TESTFN undefined + + - name: test.test_readline.TestReadline.test_write_read_limited_history + targets: + - ".+-unknown-linux-.+" + minimum-python-version: "3.12" + reason: TESTFN undefined + + - name: test.test_repl.TestInteractiveInterpreter.test_no_memory + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "AssertionError: 0 not found in (1, 120)" + + - name: test.test_signal.StressTest.test_stress_delivery_simultaneous + reason: "timeout due to potential deadlock or similar test bug" + intermittent: true + + - name: test.test_smtplib.DebuggingServerTests.* + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + minimum-python-version: "3.13" + reason: "segfault" + intermittent: true + + - name: test.test_smtplib.SMTPSimTests.* + targets: + - ".+-unknown-linux-musl" + build-option: "freethreaded" + # Should be thread safe in 3.15. + maximum-python-version: "3.14" + reason: "segfault" + intermittent: true + + - name: test.test_smtplib.SMTPUTF8SimTests.* + targets: + - ".+-unknown-linux-musl" + build-option: "freethreaded" + # Should be thread safe in 3.15. + maximum-python-version: "3.14" + reason: "segfault" + intermittent: true + + - name: test.test_socket.GeneralModuleTests.testNtoHErrors + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_socket.GeneralModuleTests.test_getaddrinfo_int_port_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_socket.GeneralModuleTests.test_listen_backlog_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_socket.NonBlockingTCPTests.testSetBlocking_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_socket.BasicTCPTest.testShutdown_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_socket.BasicTCPTest2.testShutdown_overflow + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_socket.GeneralModuleTests.test3542SocketOptions + reason: "AssertionError: False is not true : Missing RFC3542 socket option 'IPV6_RECVDSTOPTS'" + maximum-python-version: "3.10" + targets: + - ".+-apple-darwin" + + - name: test.test_socket.NonBlockingTCPTests.testLargeTimeout + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_ssl.BasicSocketTests.test_read_write_zero + targets: + - ".+-pc-windows-.+" + minimum-python-version: "3.12" + reason: ConnectionAbortedError + intermittent: true + + # These uplink/applink failures should go away once we're patching + # OpenSSL correctly following https://github.com/python/cpython/pull/131839. + # These pass on aarch64 for reasons unknown. + + - name: test.test_ssl.ContextTests.test_load_dh_params + targets: + - "i686-pc-windows-.+" + - "x86_64-pc-windows-.+" + minimum-python-version: "3.12" + reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + - name: test.test_ssl.SSLErrorTests.test_lib_reason + targets: + - "i686-pc-windows-.+" + - "x86_64-pc-windows-.+" + minimum-python-version: "3.12" + reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + #- name: test.test_ssl.SSLErrorTests.test_dh_params + # targets: + # - ".+-pc-windows-.+" + # maximum-python-version: "3.11" + # reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + #- name: test.test_ssl.ThreadedTests.test_dh_params + # targets: + # - ".+-pc-windows-.+" + # minimum-python-version: "3.12" + # reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + - name: test.test_ssl.TestSSLDebug.test_keylog_defaults + targets: + - "i686-pc-windows-.+" + - "x86_64-pc-windows-.+" + minimum-python-version: "3.12" + reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + - name: test.test_ssl.TestSSLDebug.test_keylog_filename + targets: + - "i686-pc-windows-.+" + - "x86_64-pc-windows-.+" + minimum-python-version: "3.12" + reason: "OPENSSL_Uplink(00007FFD9EB59C60,08): no OPENSSL_Applink" + + # Looks like a race condition in the test. + - name: test.test_str.StrTest.test_raiseMemError + targets: + - ".+-pc-windows-.+" + build-option: "freethreaded" + minimum-python-version: "3.14" + reason: "AssertionError: 79 != 75" + intermittent: true + + - name: test.test_strptime.StrptimeTests.test_date_locale2 + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.12" + maximum-python-version: "3.13" + reason: "AssertionError: Tuples differ: (2000, 1, 1) != (1900, 1, 1)" + + - name: test.test_strptime.StrptimeTests.test_date_locale2 + targets: + - ".+-unknown-linux-musl" + minimum-python-version: "3.14" + build-option: "static" + reason: "AssertionError: Tuples differ: (2000, 1, 1) != (1900, 1, 1)" + + - name: test.test_struct.StructTest.test_endian_table_init_subinterpreters + minimum-python-version: "3.15" + build-option: "freethreaded" + reason: "BlockingIOError: [Errno 11] Resource temporarily unavailable: '/tmp/tmpqkxa77l0/python/install/lib/python3.15t/concurrent'" + intermittent: true + + - name: test.test_subprocess.POSIXProcessTestCase.test_vfork_used_when_expected + targets: + - "aarch64-unknown-linux-musl" + minimum-python-version: "3.14" + no-build-option: "debug" + reason: "AssertionError: Regex didn't match: b'(?i)vfork'..." + + - name: test.test_subprocess.ProcessTestCase.test_executable_without_cwd + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-.+" + reason: "AssertionError: 47 != 1" + + - name: test.test_subprocess.ProcessTestCaseNoPoll.test_executable_without_cwd + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-.+" + reason: "AssertionError: 47 != 1" + + - name: test.test_support.TestSupport.test_recursion + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.11" + reason: "RecursionError: maximum recursion depth exceeded" + + - name: test.test_sysconfig.TestSysConfig.test_config_vars_depend_on_site_initialization + minimum-python-version: "3.12" + maximum-python-version: "3.13" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_sysconfig.TestSysConfig.test_config_vars_recalculation_after_site_initialization + minimum-python-version: "3.12" + maximum-python-version: "3.13" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_sysconfig.TestSysConfig.test_paths_depend_on_site_initialization + minimum-python-version: "3.12" + maximum-python-version: "3.13" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_sysconfig.TestSysConfig.test_makefile_overwrites_config_vars + minimum-python-version: "3.14" + targets: + - ".+-apple-darwin" + reason: PBS behavior differences + + - name: test.test_sysconfig.TestSysConfig.test_sysconfigdata_json + minimum-python-version: "3.14" + ignore-targets: + - ".+-pc-windows-.+" + reason: PBS behavior differences + + - name: test.test_sysconfig.TestSysConfig.test_triplet_in_ext_suffix + targets: + - "x86_64.*-unknown-linux-musl" + maximum-python-version: "3.10" + reason: "AssertionError: False is not true : .cpython-310-x86_64-linux-musl.so" + + - name: test.test_syslog.Test.test_subinterpreter_closelog + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_syslog.Test.test_subinterpreter_openlog + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_syslog.Test.test_subinterpreter_syslog + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + # Looks like a race condition in tests. + - name: test.test_sys.SizeofTest.test_objecttypes + targets: + - ".+-pc-windows-.+" + minimum-python-version: "3.14" + build-option: "freethreaded" + reason: "AssertionError: 137 != 133 : wrong size for : got 137, expected 133" + intermittent: true + + - name: test.test_sys.SysModuleTest.test_getallocatedblocks + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "_testcapi missing" + + - name: test.test_sys.TestSysJIT.test_jit_is_active + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.14" + reason: missing _testcapi + + - name: test.test_sys.UnraisableHookTest.test_custom_unraisablehook + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_sys.UnraisableHookTest.test_custom_unraisablehook_fail + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_sys.UnraisableHookTest.test_original_unraisablehook + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_sys.UnraisableHookTest.test_original_unraisablehook_exception_qualname + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: missing _testcapi + + - name: test.test_threading.SubinterpThreadingTests.test_threads_join + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.SubinterpThreadingTests.test_threads_join_2 + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.SubinterpThreadingTests.test_threads_not_allowed + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.SubinterpThreadingTests.test_daemon_threads_not_allowed + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.12" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.SubinterpThreadingTests.test_daemon_threads_fatal_error + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.ThreadingExceptionTests.test_print_exception + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "AssertionError" + + - name: test.test_threading.ThreadingExceptionTests.test_print_exception_stderr_is_none_1 + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "AssertionError" + + - name: test.test_threading.ThreadingExceptionTests.test_recursion_limit + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.10" + reason: "AssertionError: -11 != 0" + + - name: test.test_threading.ThreadJoinOnShutdown.test_4_daemon_threads + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "ConnectionRefusedError: [Errno 111] Connection refused and segfault" + intermittent: true + + - name: test.test_threading.ThreadTests.test_frame_tstate_tracing + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_threading.ThreadTests.test_import_from_another_thread + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_threading.ThreadTests.test_main_thread_after_fork + minimum-python-version: "3.12" + targets: + - "x86_64-apple-darwin" + reason: "AssertionError: b':6: DeprecationWarning: This proc[82 chars]d.\n' != b''" + + - name: test.test_threading.ThreadTests.test_native_id_after_fork + minimum-python-version: "3.13" + targets: + - "x86_64-apple-darwin" + reason: "AssertionError: b':6: DeprecationWarning: This proc[82 chars]d.\n' != b''" + + - name: test.test_threading.ThreadTests.test_PyThreadState_SetAsyncExc + targets: + - ".+-unknown-linux-musl" + build-option: "static" + reason: missing _testcapi + + - name: test.test_threading.ThreadTests.test_finalize_daemon_thread_hang + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.13" + reason: missing _testcapi + + - name: test.test_threading.ThreadTests.test_finalize_running_thread + targets: + - ".+-unknown-linux-mus" + build-option: "static" + reason: "AssertionError: 1 != 42" + + - name: test.test_multiprocessing_forkserver.test_manager.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "unknown; possible segfault" + + - name: test.test_multiprocessing_forkserver.test_misc.TestStartMethod.test_preload_resources + minimum-python-version: "3.12" + targets: + - "x86_64-apple-darwin" + build-option: "debug" + reason: "AssertionError: failed spawning forkserver or grandchild" + + - name: test.test_multiprocessing_fork.* + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfaults" + + - name: test.test_multiprocessing_fork.test_manager.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "ConnectionRefusedError: [Errno 111] Connection refused" + + - name: test.test_multiprocessing_fork.test_processes.WithProcessesTestManagerRestart.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "ConnectionRefusedError: [Errno 111] Connection refused" + + - name: test.test_multiprocessing_fork.test_threads.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_multiprocessing_forkserver.test_processes.WithProcessesTestManagerRestart.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "ConnectionRefusedError: [Errno 111] Connection refused" + + - name: test.test_multiprocessing_forkserver.* + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_multiprocessing_spawn.* + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_multiprocessing_spawn.test_manager.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_multiprocessing_spawn.test_processes.WithProcessesTestManagerRestart.test_rapid_restart + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "ConnectionRefusedError: [Errno 111] Connection refused" + + - name: test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_tracking + build-option: "freethreaded" + reason: "timeout possibly due to deadlock" + intermittent: true + + - name: test.test_multiprocessing_spawn.test_threads.* + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + minimum-python-version: "3.11" + reason: "segfault" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_basic_script + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_basic_script_no_suffix + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_directory + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_directory_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_ipython_workaround + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_package + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_package_in_zipfile + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_subpackage_in_zipfile + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_package + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_package_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_script_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_zipfile + targets: + - "x86_64-apple-darwin" + no-build-option: "pgo" + minimum-python-version: "3.12" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkCmdLineTest.test_zipfile_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_basic_script + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_basic_script_no_suffix + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_directory + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_directory_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_ipython_workaround + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_package + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_package_in_zipfile + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_subpackage_in_zipfile + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_package + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_package_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_script_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_zipfile + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_zipfile_compiled + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.12" + build-option: "debug" + reason: "DeprecationWarning: This process (pid=81234) is multi-threaded, use of fork() may lead to deadlocks in the child.\n self.pid = os.fork()\n' is not false" + + - name: test.test_multiprocessing_forkserver.test_processes.WithProcessesTestSpawnedSysPath.test_std_streams_flushed_after_preload + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.13" + build-option: "debug" + reason: "multiprocessing/forkserver.py:278: DeprecationWarning: This process (pid=82723) is multi-threaded, use of fork() may lead to deadlocks in the child." + + - name: test.test_multiprocessing_forkserver.test_threads.* + minimum-python-version: "3.11" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_multiprocessing_forkserver.test_misc.MiscTestCase.test_preload_main + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.13" + build-option: "debug" + reason: "AssertionError: b'/private/var/folders/1r/b8l6nzhj4zdbz5jmj[222 chars]()\n' != b'" + + - name: test.test_multiprocessing_forkserver.test_misc.MiscTestCase.test_preload_main_sys_argv + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.13" + build-option: "debug" + reason: "AssertionError: b'/private/var/folders/1r/b8l6nzhj4zdbz5jmj[222 chars]()\n' != b''" + + - name: test.test_perf_profiler.TestPerfTrampoline.test_trampoline_works_after_fork_with_many_code_objects + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.15" + reason: "AssertionError: '/private/var/folders/1r/b8l6nzhj4zdbz5jmj[194 chars]()\n' != ''" + + - name: test.test_perf_profiler.TestPerfTrampoline.test_trampoline_works_with_forks + targets: + - "x86_64-apple-darwin" + minimum-python-version: "3.15" + reason: "AssertionError: '/private/var/folders/1r/b8l6nzhj4zdbz5jmj[194 chars]()\n' != ''" + + - name: test.test_regrtest.ArgsTestCase.test_add_python_opts + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.14" + reason: "Something related to _testcapi or similar extension" + + - name: test.test_regrtest.ArgsTestCase.test_findleaks + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "AssertionError: Command ['/tmp/.tmpGZuURa/python/install/bin/python3.10', '-X', 'faulthandler', '-I', '-m', 'test', '--testdir=/tmp/tmp6mrz59ds', '--fail-env-changed', 'test_regrtest_noop1'] failed with exit code 2" + + - name: test.test_regrtest.ArgsTestCase.test_uncollectable + targets: + - ".+-unknown-linux-musl" + build-option: "static" + minimum-python-version: "3.11" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test_tcl.TclTest.test_evalfile_surrogates_in_result + maximum-python-version: "3.11" + ignore-targets: + - ".+-pc-windows-.+" + reason: "_tkinter.TclError: couldn't read file \"@test_169558_tmp\": invalid or incomplete multibyte or wide character" + + - name: test.test_tcl.TclTest.test_getint + maximum-python-version: "3.10" + reason: "AssertionError: 17777777777 != 2147483647" + ignore-targets: + - ".+-pc-windows-.+" + + - name: test.test_unicode.UnicodeTest.test_formatting_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_unicode.UnicodeTest.test_formatting_huge_precision_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_call_args_thread_safe + minimum-python-version: "3.13" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_call_count_thread_safe + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_method_calls_thread_safe + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_mock_calls_thread_safe + minimum-python-version: "3.13" + build-option: "debug" + reason: "segfault" + intermittent: true + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_wait_until_any_call_with_success + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_unittest.testmock.testthreadingmock.TestThreadingMock.test_wait_until_called_success + minimum-python-version: "3.13" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test_userstring.UserStringTest.test_formatting_c_limits + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.10" + reason: "missing _testcapi" + + - name: test.test_venv.BasicTest.test_executable + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_macos_env + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_multiprocessing + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_multiprocessing_recursion + minimum-python-version: "3.11" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_prefixes + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_special_chars_bash + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_special_chars_csh + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_sysconfig_symlinks + targets: + - ".+-apple-darwin" + minimum-python-version: "3.11" + maximum-python-version: "3.13" + reason: BytesWarning + + - name: test.test_venv.BasicTest.test_sysconfig + minimum-python-version: "3.11" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.BasicTest.test_sysconfig + minimum-python-version: "3.13" + targets: + - ".+-pc-windows-.+" + build-option: "freethreaded" + reason: "AssertionError: 3.14t missing suffix - likely PBS quirk" + + - name: test.test_venv.BasicTest.test_venvwlauncher + minimum-python-version: "3.13" + targets: + - ".+-pc-windows-.+" + build-option: "freethreaded" + reason: "AssertionError: 3.14t missing suffix - likely PBS quirk" + + - name: test.test_venv.BasicTest.test_zippath_from_non_installed_posix + minimum-python-version: "3.11" + targets: + - ".+-apple-darwin" + reason: crashes + + - name: test.test_venv.EnsurePipTest.test_explicit_no_pip + targets: + - ".+-apple-darwin" + reason: PBS installs pip + + - name: test.test_venv.EnsurePipTest.test_no_pip_by_default + targets: + - ".+-apple-darwin" + reason: PBS installs pip + + - name: test.test_venv.EnsurePipTest.test_with_pip + targets: + - ".+-apple-darwin" + maximum-python-version: "3.10" + reason: logic bug? + + - name: test.test_venv.EnsurePipTest.test_with_pip + targets: + - ".+-unknown-linux-musl" + maximum-python-version: "3.10" + build-option: "static" + reason: "TBD" + + - name: test.test_weakref.ReferencesTestCase.test_cfunction + targets: + - ".+-unknown-linux-musl" + build-option: "static" + maximum-python-version: "3.12" + reason: "missing _testcapi" + + - name: test.test__xxinterpchannels.ChannelTests.test_send_recv_different_interpreters_and_threads + minimum-python-version: "3.12" + maximum-python-version: "3.12" + targets: + - "aarch64-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + + - name: test.test__xxsubinterpreters.ChannelTests.test_send_recv_different_interpreters_and_threads + maximum-python-version: "3.10" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + no-build-option: "static" + reason: "segfault" + + - name: test.test__xxsubinterpreters.CreateTests.test_in_thread + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + no-build-option: "static" + intermittent: true + + - name: test.test__xxsubinterpreters.CreateTests.test_in_threaded_subinterpreter + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + no-build-option: "static" + intermittent: true + + - name: test.test__xxsubinterpreters.RunStringTests.test_in_thread + maximum-python-version: "3.12" + targets: + - ".+-unknown-linux-musl" + build-option: "debug" + reason: "segfault" + no-build-option: "static" + intermittent: true diff --git a/uv.lock b/uv.lock index 09c660678..0bd33eae2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.10" -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version < '3.11'", -] +requires-python = ">=3.11" [manifest] build-constraints = [{ name = "uv-build", specifier = "==0.11.33" }] @@ -150,18 +146,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, @@ -230,8 +214,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aws-sam-translator" }, { name = "jsonpatch" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "networkx" }, { name = "pyyaml" }, { name = "regex" }, { name = "sympy" }, @@ -248,22 +231,6 @@ version = "3.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, - { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, - { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, - { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, - { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, - { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, - { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, - { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, - { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, - { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, - { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, - { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, @@ -374,7 +341,6 @@ version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } wheels = [ @@ -603,18 +569,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] +[[package]] +name = "junitparser" +version = "4.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/97/954ee1ef04e50d8494e9f5d82d4051ed71a7618aa2c1514c1b3f24691174/junitparser-4.0.2.tar.gz", hash = "sha256:d5d07cece6d4a600ff3b7b96c8db5ffa45a91eed695cb86c45c3db113c1ca0f8", size = 25646, upload-time = "2025-06-24T04:37:32.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/87/b444f934f62ee2a1be45bb52563cf17a66b0d790eba43af4df9929e7107f/junitparser-4.0.2-py3-none-any.whl", hash = "sha256:94c3570e41fcaedc64cc3c634ca99457fe41a84dd1aa8ff74e9e12e66223a155", size = 14592, upload-time = "2025-06-24T04:37:31.322Z" }, +] + [[package]] name = "lazy-object-proxy" version = "1.12.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/08/a2/69df9c6ba6d316cfd81fe2381e464db3e6de5db45f8c43c6a23504abf8cb/lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61", size = 43681, upload-time = "2025-08-22T13:50:06.783Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/2b/d5e8915038acbd6c6a9fcb8aaf923dc184222405d3710285a1fec6e262bc/lazy_object_proxy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61d5e3310a4aa5792c2b599a7a78ccf8687292c8eb09cf187cca8f09cf6a7519", size = 26658, upload-time = "2025-08-22T13:42:23.373Z" }, - { url = "https://files.pythonhosted.org/packages/da/8f/91fc00eeea46ee88b9df67f7c5388e60993341d2a406243d620b2fdfde57/lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1ca33565f698ac1aece152a10f432415d1a2aa9a42dfe23e5ba2bc255ab91f6", size = 68412, upload-time = "2025-08-22T13:42:24.727Z" }, - { url = "https://files.pythonhosted.org/packages/07/d2/b7189a0e095caedfea4d42e6b6949d2685c354263bdf18e19b21ca9b3cd6/lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01c7819a410f7c255b20799b65d36b414379a30c6f1684c7bd7eb6777338c1b", size = 67559, upload-time = "2025-08-22T13:42:25.875Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/b013840cc43971582ff1ceaf784d35d3a579650eb6cc348e5e6ed7e34d28/lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:029d2b355076710505c9545aef5ab3f750d89779310e26ddf2b7b23f6ea03cd8", size = 66651, upload-time = "2025-08-22T13:42:27.427Z" }, - { url = "https://files.pythonhosted.org/packages/7e/6f/b7368d301c15612fcc4cd00412b5d6ba55548bde09bdae71930e1a81f2ab/lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc6e3614eca88b1c8a625fc0a47d0d745e7c3255b21dac0e30b3037c5e3deeb8", size = 66901, upload-time = "2025-08-22T13:42:28.585Z" }, - { url = "https://files.pythonhosted.org/packages/61/1b/c6b1865445576b2fc5fa0fbcfce1c05fee77d8979fd1aa653dd0f179aefc/lazy_object_proxy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:be5fe974e39ceb0d6c9db0663c0464669cf866b2851c73971409b9566e880eab", size = 26536, upload-time = "2025-08-22T13:42:29.636Z" }, { url = "https://files.pythonhosted.org/packages/01/b3/4684b1e128a87821e485f5a901b179790e6b5bc02f89b7ee19c23be36ef3/lazy_object_proxy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1cf69cd1a6c7fe2dbcc3edaa017cf010f4192e53796538cc7d5e1fedbfa4bcff", size = 26656, upload-time = "2025-08-22T13:42:30.605Z" }, { url = "https://files.pythonhosted.org/packages/3a/03/1bdc21d9a6df9ff72d70b2ff17d8609321bea4b0d3cffd2cea92fb2ef738/lazy_object_proxy-1.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efff4375a8c52f55a145dc8487a2108c2140f0bec4151ab4e1843e52eb9987ad", size = 68832, upload-time = "2025-08-22T13:42:31.675Z" }, { url = "https://files.pythonhosted.org/packages/3d/4b/5788e5e8bd01d19af71e50077ab020bc5cce67e935066cd65e1215a09ff9/lazy_object_proxy-1.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1192e8c2f1031a6ff453ee40213afa01ba765b3dc861302cd91dbdb2e2660b00", size = 69148, upload-time = "2025-08-22T13:42:32.876Z" }, @@ -654,18 +623,6 @@ version = "0.8.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/56/9c/b4b0c54d84da4a94b37bd44151e46d5e583c9534c7e02250b961b1b6d8a8/librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73", size = 177471, upload-time = "2026-02-17T16:13:06.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/5f/63f5fa395c7a8a93558c0904ba8f1c8d1b997ca6a3de61bc7659970d66bf/librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc", size = 65697, upload-time = "2026-02-17T16:11:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e0/0472cf37267b5920eff2f292ccfaede1886288ce35b7f3203d8de00abfe6/librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7", size = 68376, upload-time = "2026-02-17T16:11:08.395Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8bd1359fdcd27ab897cd5963294fa4a7c83b20a8564678e4fd12157e56a5/librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6", size = 197084, upload-time = "2026-02-17T16:11:09.774Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fe/163e33fdd091d0c2b102f8a60cc0a61fd730ad44e32617cd161e7cd67a01/librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0", size = 207337, upload-time = "2026-02-17T16:11:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/f85130582f05dcf0c8902f3d629270231d2f4afdfc567f8305a952ac7f14/librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b", size = 219980, upload-time = "2026-02-17T16:11:12.499Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/cb5e4d03659e043a26c74e08206412ac9a3742f0477d96f9761a55313b5f/librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6", size = 212921, upload-time = "2026-02-17T16:11:14.484Z" }, - { url = "https://files.pythonhosted.org/packages/b1/81/a3a01e4240579c30f3487f6fed01eb4bc8ef0616da5b4ebac27ca19775f3/librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71", size = 221381, upload-time = "2026-02-17T16:11:17.459Z" }, - { url = "https://files.pythonhosted.org/packages/08/b0/fc2d54b4b1c6fb81e77288ff31ff25a2c1e62eaef4424a984f228839717b/librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7", size = 216714, upload-time = "2026-02-17T16:11:19.197Z" }, - { url = "https://files.pythonhosted.org/packages/96/96/85daa73ffbd87e1fb287d7af6553ada66bf25a2a6b0de4764344a05469f6/librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05", size = 214777, upload-time = "2026-02-17T16:11:20.443Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/c3aa7a2360383f4bf4f04d98195f2739a579128720c603f4807f006a4225/librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891", size = 237398, upload-time = "2026-02-17T16:11:22.083Z" }, - { url = "https://files.pythonhosted.org/packages/61/19/d350ea89e5274665185dabc4bbb9c3536c3411f862881d316c8b8e00eb66/librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7", size = 54285, upload-time = "2026-02-17T16:11:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/4f/d6/45d587d3d41c112e9543a0093d883eb57a24a03e41561c127818aa2a6bcc/librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2", size = 61352, upload-time = "2026-02-17T16:11:24.207Z" }, { url = "https://files.pythonhosted.org/packages/1d/01/0e748af5e4fee180cf7cd12bd12b0513ad23b045dccb2a83191bde82d168/librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd", size = 65315, upload-time = "2026-02-17T16:11:25.152Z" }, { url = "https://files.pythonhosted.org/packages/9d/4d/7184806efda571887c798d573ca4134c80ac8642dcdd32f12c31b939c595/librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965", size = 68021, upload-time = "2026-02-17T16:11:26.129Z" }, { url = "https://files.pythonhosted.org/packages/ae/88/c3c52d2a5d5101f28d3dc89298444626e7874aa904eed498464c2af17627/librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da", size = 194500, upload-time = "2026-02-17T16:11:27.177Z" }, @@ -739,17 +696,6 @@ version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, @@ -875,17 +821,10 @@ dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, - { url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, - { url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, @@ -934,25 +873,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] -[[package]] -name = "networkx" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, -] - [[package]] name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", -] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, @@ -1052,19 +976,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, @@ -1143,14 +1054,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, @@ -1194,6 +1097,7 @@ dependencies = [ { name = "docker" }, { name = "jinja2" }, { name = "jsonschema" }, + { name = "junitparser" }, { name = "pyyaml" }, { name = "six" }, { name = "tomli" }, @@ -1220,6 +1124,7 @@ requires-dist = [ { name = "docker", specifier = ">=7.1.0" }, { name = "jinja2", specifier = ">=3.1.5" }, { name = "jsonschema", specifier = ">=4.23.0" }, + { name = "junitparser", specifier = ">=4.0.2" }, { name = "pyyaml", specifier = ">=6.0.2" }, { name = "six", specifier = ">=1.17.0" }, { name = "tomli", specifier = ">=2.2.1" }, @@ -1263,9 +1168,6 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, - { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, @@ -1286,15 +1188,6 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, @@ -1364,23 +1257,6 @@ version = "2026.2.28" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/b8/845a927e078f5e5cc55d29f57becbfde0003d52806544531ab3f2da4503c/regex-2026.2.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc48c500838be6882b32748f60a15229d2dea96e59ef341eaa96ec83538f498d", size = 488461, upload-time = "2026-02-28T02:15:48.405Z" }, - { url = "https://files.pythonhosted.org/packages/32/f9/8a0034716684e38a729210ded6222249f29978b24b684f448162ef21f204/regex-2026.2.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2afa673660928d0b63d84353c6c08a8a476ddfc4a47e11742949d182e6863ce8", size = 290774, upload-time = "2026-02-28T02:15:51.738Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ba/b27feefffbb199528dd32667cd172ed484d9c197618c575f01217fbe6103/regex-2026.2.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ab218076eb0944549e7fe74cf0e2b83a82edb27e81cc87411f76240865e04d5", size = 288737, upload-time = "2026-02-28T02:15:53.534Z" }, - { url = "https://files.pythonhosted.org/packages/18/c5/65379448ca3cbfe774fcc33774dc8295b1ee97dc3237ae3d3c7b27423c9d/regex-2026.2.28-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d63db12e45a9b9f064bfe4800cefefc7e5f182052e4c1b774d46a40ab1d9bb", size = 782675, upload-time = "2026-02-28T02:15:55.488Z" }, - { url = "https://files.pythonhosted.org/packages/aa/30/6fa55bef48090f900fbd4649333791fc3e6467380b9e775e741beeb3231f/regex-2026.2.28-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:195237dc327858a7721bf8b0bbbef797554bc13563c3591e91cd0767bacbe359", size = 850514, upload-time = "2026-02-28T02:15:57.509Z" }, - { url = "https://files.pythonhosted.org/packages/a9/28/9ca180fb3787a54150209754ac06a42409913571fa94994f340b3bba4e1e/regex-2026.2.28-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b387a0d092dac157fb026d737dde35ff3e49ef27f285343e7c6401851239df27", size = 896612, upload-time = "2026-02-28T02:15:59.682Z" }, - { url = "https://files.pythonhosted.org/packages/46/b5/f30d7d3936d6deecc3ea7bea4f7d3c5ee5124e7c8de372226e436b330a55/regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3935174fa4d9f70525a4367aaff3cb8bc0548129d114260c29d9dfa4a5b41692", size = 791691, upload-time = "2026-02-28T02:16:01.752Z" }, - { url = "https://files.pythonhosted.org/packages/f5/34/96631bcf446a56ba0b2a7f684358a76855dfe315b7c2f89b35388494ede0/regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b2b23587b26496ff5fd40df4278becdf386813ec00dc3533fa43a4cf0e2ad3c", size = 783111, upload-time = "2026-02-28T02:16:03.651Z" }, - { url = "https://files.pythonhosted.org/packages/39/54/f95cb7a85fe284d41cd2f3625e0f2ae30172b55dfd2af1d9b4eaef6259d7/regex-2026.2.28-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3b24bd7e9d85dc7c6a8bd2aa14ecd234274a0248335a02adeb25448aecdd420d", size = 767512, upload-time = "2026-02-28T02:16:05.616Z" }, - { url = "https://files.pythonhosted.org/packages/3d/af/a650f64a79c02a97f73f64d4e7fc4cc1984e64affab14075e7c1f9a2db34/regex-2026.2.28-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd477d5f79920338107f04aa645f094032d9e3030cc55be581df3d1ef61aa318", size = 773920, upload-time = "2026-02-28T02:16:08.325Z" }, - { url = "https://files.pythonhosted.org/packages/72/f8/3f9c2c2af37aedb3f5a1e7227f81bea065028785260d9cacc488e43e6997/regex-2026.2.28-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b49eb78048c6354f49e91e4b77da21257fecb92256b6d599ae44403cab30b05b", size = 846681, upload-time = "2026-02-28T02:16:10.381Z" }, - { url = "https://files.pythonhosted.org/packages/54/12/8db04a334571359f4d127d8f89550917ec6561a2fddfd69cd91402b47482/regex-2026.2.28-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a25c7701e4f7a70021db9aaf4a4a0a67033c6318752146e03d1b94d32006217e", size = 755565, upload-time = "2026-02-28T02:16:11.972Z" }, - { url = "https://files.pythonhosted.org/packages/da/bc/91c22f384d79324121b134c267a86ca90d11f8016aafb1dc5bee05890ee3/regex-2026.2.28-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9dd450db6458387167e033cfa80887a34c99c81d26da1bf8b0b41bf8c9cac88e", size = 835789, upload-time = "2026-02-28T02:16:14.036Z" }, - { url = "https://files.pythonhosted.org/packages/46/a7/4cc94fd3af01dcfdf5a9ed75c8e15fd80fcd62cc46da7592b1749e9c35db/regex-2026.2.28-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2954379dd20752e82d22accf3ff465311cbb2bac6c1f92c4afd400e1757f7451", size = 780094, upload-time = "2026-02-28T02:16:15.468Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/e5a38f420af3c77cab4a65f0c3a55ec02ac9babf04479cfd282d356988a6/regex-2026.2.28-cp310-cp310-win32.whl", hash = "sha256:1f8b17be5c27a684ea6759983c13506bd77bfc7c0347dff41b18ce5ddd2ee09a", size = 266025, upload-time = "2026-02-28T02:16:16.828Z" }, - { url = "https://files.pythonhosted.org/packages/4d/0a/205c4c1466a36e04d90afcd01d8908bac327673050c7fe316b2416d99d3d/regex-2026.2.28-cp310-cp310-win_amd64.whl", hash = "sha256:dd8847c4978bc3c7e6c826fb745f5570e518b8459ac2892151ce6627c7bc00d5", size = 277965, upload-time = "2026-02-28T02:16:18.752Z" }, - { url = "https://files.pythonhosted.org/packages/c3/4d/29b58172f954b6ec2c5ed28529a65e9026ab96b4b7016bcd3858f1c31d3c/regex-2026.2.28-cp310-cp310-win_arm64.whl", hash = "sha256:73cdcdbba8028167ea81490c7f45280113e41db2c7afb65a276f4711fa3bcbff", size = 270336, upload-time = "2026-02-28T02:16:20.735Z" }, { url = "https://files.pythonhosted.org/packages/04/db/8cbfd0ba3f302f2d09dd0019a9fcab74b63fee77a76c937d0e33161fb8c1/regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9", size = 488462, upload-time = "2026-02-28T02:16:22.616Z" }, { url = "https://files.pythonhosted.org/packages/5d/10/ccc22c52802223f2368731964ddd117799e1390ffc39dbb31634a83022ee/regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97", size = 290774, upload-time = "2026-02-28T02:16:23.993Z" }, { url = "https://files.pythonhosted.org/packages/62/b9/6796b3bf3101e64117201aaa3a5a030ec677ecf34b3cd6141b5d5c6c67d5/regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703", size = 288724, upload-time = "2026-02-28T02:16:25.403Z" }, @@ -1526,20 +1402,6 @@ version = "0.30.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, @@ -1871,17 +1733,6 @@ version = "2.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2e/64/925f213fdcbb9baeb1530449ac71a4d57fc361c053d06bf78d0c5c7cd80c/wrapt-2.1.2.tar.gz", hash = "sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e", size = 81678, upload-time = "2026-03-06T02:53:25.134Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/d2/387594fb592d027366645f3d7cc9b4d7ca7be93845fbaba6d835a912ef3c/wrapt-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a86d99a14f76facb269dc148590c01aaf47584071809a70da30555228158c", size = 60669, upload-time = "2026-03-06T02:52:40.671Z" }, - { url = "https://files.pythonhosted.org/packages/c9/18/3f373935bc5509e7ac444c8026a56762e50c1183e7061797437ca96c12ce/wrapt-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a819e39017f95bf7aede768f75915635aa8f671f2993c036991b8d3bfe8dbb6f", size = 61603, upload-time = "2026-03-06T02:54:21.032Z" }, - { url = "https://files.pythonhosted.org/packages/c2/7a/32758ca2853b07a887a4574b74e28843919103194bb47001a304e24af62f/wrapt-2.1.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5681123e60aed0e64c7d44f72bbf8b4ce45f79d81467e2c4c728629f5baf06eb", size = 113632, upload-time = "2026-03-06T02:53:54.121Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d5/eeaa38f670d462e97d978b3b0d9ce06d5b91e54bebac6fbed867809216e7/wrapt-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8b28e97a44d21836259739ae76284e180b18abbb4dcfdff07a415cf1016c3e", size = 115644, upload-time = "2026-03-06T02:54:53.33Z" }, - { url = "https://files.pythonhosted.org/packages/e3/09/2a41506cb17affb0bdf9d5e2129c8c19e192b388c4c01d05e1b14db23c00/wrapt-2.1.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cef91c95a50596fcdc31397eb6955476f82ae8a3f5a8eabdc13611b60ee380ba", size = 112016, upload-time = "2026-03-06T02:54:43.274Z" }, - { url = "https://files.pythonhosted.org/packages/64/15/0e6c3f5e87caadc43db279724ee36979246d5194fa32fed489c73643ba59/wrapt-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dad63212b168de8569b1c512f4eac4b57f2c6934b30df32d6ee9534a79f1493f", size = 114823, upload-time = "2026-03-06T02:54:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/56/b2/0ad17c8248f4e57bedf44938c26ec3ee194715f812d2dbbd9d7ff4be6c06/wrapt-2.1.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d307aa6888d5efab2c1cde09843d48c843990be13069003184b67d426d145394", size = 111244, upload-time = "2026-03-06T02:54:02.149Z" }, - { url = "https://files.pythonhosted.org/packages/ff/04/bcdba98c26f2c6522c7c09a726d5d9229120163493620205b2f76bd13c01/wrapt-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c87cf3f0c85e27b3ac7d9ad95da166bf8739ca215a8b171e8404a2d739897a45", size = 113307, upload-time = "2026-03-06T02:54:12.428Z" }, - { url = "https://files.pythonhosted.org/packages/0e/1b/5e2883c6bc14143924e465a6fc5a92d09eeabe35310842a481fb0581f832/wrapt-2.1.2-cp310-cp310-win32.whl", hash = "sha256:d1c5fea4f9fe3762e2b905fdd67df51e4be7a73b7674957af2d2ade71a5c075d", size = 57986, upload-time = "2026-03-06T02:54:26.823Z" }, - { url = "https://files.pythonhosted.org/packages/42/5a/4efc997bccadd3af5749c250b49412793bc41e13a83a486b2b54a33e240c/wrapt-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:d8f7740e1af13dff2684e4d56fe604a7e04d6c94e737a60568d8d4238b9a0c71", size = 60336, upload-time = "2026-03-06T02:54:18Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f5/a2bb833e20181b937e87c242645ed5d5aa9c373006b0467bfe1a35c727d0/wrapt-2.1.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c6cc827c00dc839350155f316f1f8b4b0c370f52b6a19e782e2bda89600c7dc", size = 58757, upload-time = "2026-03-06T02:53:51.545Z" }, { url = "https://files.pythonhosted.org/packages/c7/81/60c4471fce95afa5922ca09b88a25f03c93343f759aae0f31fb4412a85c7/wrapt-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96159a0ee2b0277d44201c3b5be479a9979cf154e8c82fa5df49586a8e7679bb", size = 60666, upload-time = "2026-03-06T02:52:58.934Z" }, { url = "https://files.pythonhosted.org/packages/6b/be/80e80e39e7cb90b006a0eaf11c73ac3a62bbfb3068469aec15cc0bc795de/wrapt-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98ba61833a77b747901e9012072f038795de7fc77849f1faa965464f3f87ff2d", size = 61601, upload-time = "2026-03-06T02:53:00.487Z" }, { url = "https://files.pythonhosted.org/packages/b0/be/d7c88cd9293c859fc74b232abdc65a229bb953997995d6912fc85af18323/wrapt-2.1.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:767c0dbbe76cae2a60dd2b235ac0c87c9cccf4898aef8062e57bead46b5f6894", size = 114057, upload-time = "2026-03-06T02:52:44.08Z" }, @@ -1966,22 +1817,6 @@ version = "0.25.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" }, - { url = "https://files.pythonhosted.org/packages/96/34/ef34ef77f1ee38fc8e4f9775217a613b452916e633c4f1d98f31db52c4a5/zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7", size = 640565, upload-time = "2025-09-14T22:15:58.177Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1b/4fdb2c12eb58f31f28c4d28e8dc36611dd7205df8452e63f52fb6261d13e/zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550", size = 5345306, upload-time = "2025-09-14T22:16:00.165Z" }, - { url = "https://files.pythonhosted.org/packages/73/28/a44bdece01bca027b079f0e00be3b6bd89a4df180071da59a3dd7381665b/zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d", size = 5055561, upload-time = "2025-09-14T22:16:02.22Z" }, - { url = "https://files.pythonhosted.org/packages/e9/74/68341185a4f32b274e0fc3410d5ad0750497e1acc20bd0f5b5f64ce17785/zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b", size = 5402214, upload-time = "2025-09-14T22:16:04.109Z" }, - { url = "https://files.pythonhosted.org/packages/8b/67/f92e64e748fd6aaffe01e2b75a083c0c4fd27abe1c8747fee4555fcee7dd/zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0", size = 5449703, upload-time = "2025-09-14T22:16:06.312Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e5/6d36f92a197c3c17729a2125e29c169f460538a7d939a27eaaa6dcfcba8e/zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0", size = 5556583, upload-time = "2025-09-14T22:16:08.457Z" }, - { url = "https://files.pythonhosted.org/packages/d7/83/41939e60d8d7ebfe2b747be022d0806953799140a702b90ffe214d557638/zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd", size = 5045332, upload-time = "2025-09-14T22:16:10.444Z" }, - { url = "https://files.pythonhosted.org/packages/b3/87/d3ee185e3d1aa0133399893697ae91f221fda79deb61adbe998a7235c43f/zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701", size = 5572283, upload-time = "2025-09-14T22:16:12.128Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1d/58635ae6104df96671076ac7d4ae7816838ce7debd94aecf83e30b7121b0/zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1", size = 4959754, upload-time = "2025-09-14T22:16:14.225Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/57e9cb0a9983e9a229dd8fd2e6e96593ef2aa82a3907188436f22b111ccd/zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150", size = 5266477, upload-time = "2025-09-14T22:16:16.343Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a9/ee891e5edf33a6ebce0a028726f0bbd8567effe20fe3d5808c42323e8542/zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab", size = 5440914, upload-time = "2025-09-14T22:16:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/58/08/a8522c28c08031a9521f27abc6f78dbdee7312a7463dd2cfc658b813323b/zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e", size = 5819847, upload-time = "2025-09-14T22:16:20.559Z" }, - { url = "https://files.pythonhosted.org/packages/6f/11/4c91411805c3f7b6f31c60e78ce347ca48f6f16d552fc659af6ec3b73202/zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74", size = 5363131, upload-time = "2025-09-14T22:16:22.206Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d6/8c4bd38a3b24c4c7676a7a3d8de85d6ee7a983602a734b9f9cdefb04a5d6/zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa", size = 436469, upload-time = "2025-09-14T22:16:25.002Z" }, - { url = "https://files.pythonhosted.org/packages/93/90/96d50ad417a8ace5f841b3228e93d1bb13e6ad356737f42e2dde30d8bd68/zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e", size = 506100, upload-time = "2025-09-14T22:16:23.569Z" }, { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" }, { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" }, { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" },