From c2cffa3d1eb3059af30053a376657dabd8607e1a Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 May 2025 09:06:48 -0400 Subject: [PATCH] feat: adding pypy-eol enable group (#2393) --- bin/generate_schema.py | 1 + .../resources/cibuildwheel.schema.json | 1 + cibuildwheel/selector.py | 5 +- docs/options.md | 1 + test/utils.py | 5 +- unit_test/build_selector_test.py | 69 ++++++++++++++----- unit_test/option_prepare_test.py | 2 +- 7 files changed, 64 insertions(+), 20 deletions(-) diff --git a/bin/generate_schema.py b/bin/generate_schema.py index e5758fd7..ac97f8e9 100755 --- a/bin/generate_schema.py +++ b/bin/generate_schema.py @@ -36,6 +36,7 @@ $defs: - cpython-freethreading - cpython-prerelease - pypy + - pypy-eol - cpython-experimental-riscv64 description: A Python version or flavor to enable. additionalProperties: false diff --git a/cibuildwheel/resources/cibuildwheel.schema.json b/cibuildwheel/resources/cibuildwheel.schema.json index 46ad0020..8ffa0b75 100644 --- a/cibuildwheel/resources/cibuildwheel.schema.json +++ b/cibuildwheel/resources/cibuildwheel.schema.json @@ -16,6 +16,7 @@ "cpython-freethreading", "cpython-prerelease", "pypy", + "pypy-eol", "cpython-experimental-riscv64" ] }, diff --git a/cibuildwheel/selector.py b/cibuildwheel/selector.py index 2d78aea0..c3f9dea4 100644 --- a/cibuildwheel/selector.py +++ b/cibuildwheel/selector.py @@ -32,6 +32,7 @@ class EnableGroup(StrEnum): CPythonFreeThreading = "cpython-freethreading" CPythonPrerelease = "cpython-prerelease" PyPy = "pypy" + PyPyEoL = "pypy-eol" CPythonExperimentalRiscV64 = "cpython-experimental-riscv64" GraalPy = "graalpy" @@ -87,7 +88,9 @@ class BuildSelector: return False if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp314*"): return False - if EnableGroup.PyPy not in self.enable and fnmatch(build_id, "pp*"): + if EnableGroup.PyPy not in self.enable and fnmatch(build_id, "pp31*"): + return False + if EnableGroup.PyPyEoL not in self.enable and fnmatch(build_id, "pp3?-*"): return False if EnableGroup.CPythonExperimentalRiscV64 not in self.enable and fnmatch( build_id, "*_riscv64" diff --git a/docs/options.md b/docs/options.md index 1a79d375..2b811397 100644 --- a/docs/options.md +++ b/docs/options.md @@ -321,6 +321,7 @@ values are: The build identifiers for those variants have a `t` suffix in their `python_tag` (e.g. `cp313t-manylinux_x86_64`). - `pypy`: Enable PyPy. +- `pypy-eol`: Enable PyPy versions that have passed end of life (if still available). - `cpython-experimental-riscv64`: Enable experimental riscv64 builds. Those builds are disabled by default as they can't be uploaded to PyPI and a PEP will most likely be required before this can happen. diff --git a/test/utils.py b/test/utils.py index 7e566f50..1ed93642 100644 --- a/test/utils.py +++ b/test/utils.py @@ -254,10 +254,13 @@ def _expected_wheels( if EnableGroup.CPythonFreeThreading in enable_groups: python_abi_tags.append("cp314-cp314t") - if EnableGroup.PyPy in enable_groups: + if EnableGroup.PyPyEoL in enable_groups: python_abi_tags += [ "pp38-pypy38_pp73", "pp39-pypy39_pp73", + ] + if EnableGroup.PyPy in enable_groups: + python_abi_tags += [ "pp310-pypy310_pp73", "pp311-pypy311_pp73", ] diff --git a/unit_test/build_selector_test.py b/unit_test/build_selector_test.py index ea72bf7c..6da657fc 100644 --- a/unit_test/build_selector_test.py +++ b/unit_test/build_selector_test.py @@ -14,8 +14,8 @@ def test_build(): assert build_selector("cp311-manylinux_x86_64") assert build_selector("cp312-manylinux_x86_64") assert build_selector("cp313-manylinux_x86_64") - assert build_selector("pp36-manylinux_x86_64") - assert build_selector("pp37-manylinux_x86_64") + assert build_selector("pp310-manylinux_x86_64") + assert build_selector("pp311-manylinux_x86_64") assert build_selector("cp36-manylinux_i686") assert build_selector("cp37-manylinux_i686") assert build_selector("cp36-macosx_intel") @@ -23,20 +23,20 @@ def test_build(): assert build_selector("cp39-macosx_intel") assert build_selector("cp39-macosx_universal2") assert build_selector("cp39-macosx_arm64") - assert not build_selector("pp36-macosx_intel") - assert not build_selector("pp37-macosx_intel") + assert not build_selector("pp310-macosx_intel") + assert not build_selector("pp311-macosx_intel") assert build_selector("cp36-win32") assert build_selector("cp37-win32") - assert not build_selector("pp36-win32") - assert not build_selector("pp37-win32") + assert not build_selector("pp310-win32") + assert not build_selector("pp311-win32") assert build_selector("cp36-win_amd64") assert build_selector("cp37-win_amd64") assert build_selector("cp310-win_amd64") assert build_selector("cp311-win_amd64") assert build_selector("cp312-win_amd64") assert build_selector("cp313-win_amd64") - assert not build_selector("pp36-win_amd64") - assert not build_selector("pp37-win_amd64") + assert not build_selector("pp310-win_amd64") + assert not build_selector("pp311-win_amd64") def test_build_filter_pre(): @@ -53,24 +53,59 @@ def test_build_filter_pre(): assert not build_selector("cp313t-manylinux_x86_64") +def test_build_filter_pypy(): + build_selector = BuildSelector( + build_config="*", + skip_config="", + enable=frozenset([EnableGroup.PyPy]), + ) + assert build_selector("pp310-manylinux_x86_64") + assert build_selector("pp311-manylinux_x86_64") + assert not build_selector("pp38-manylinux_x86_64") + assert not build_selector("pp39-manylinux_x86_64") + + +def test_build_filter_pypy_eol(): + build_selector = BuildSelector( + build_config="*", + skip_config="", + enable=frozenset([EnableGroup.PyPyEoL]), + ) + assert not build_selector("pp310-manylinux_x86_64") + assert not build_selector("pp311-manylinux_x86_64") + assert build_selector("pp38-manylinux_x86_64") + assert build_selector("pp39-manylinux_x86_64") + + +def test_build_filter_pypy_all(): + build_selector = BuildSelector( + build_config="*", + skip_config="", + enable=frozenset([EnableGroup.PyPyEoL, EnableGroup.PyPy]), + ) + assert build_selector("pp310-manylinux_x86_64") + assert build_selector("pp311-manylinux_x86_64") + assert build_selector("pp38-manylinux_x86_64") + assert build_selector("pp39-manylinux_x86_64") + + def test_skip(): build_selector = BuildSelector( build_config="*", - skip_config="pp36-* cp3?-manylinux_i686 cp36-win* *-win32", + skip_config="pp310-* cp3?-manylinux_i686 cp36-win* *-win32", enable=frozenset([EnableGroup.PyPy]), ) - assert not build_selector("pp36-manylinux_x86_64") - assert build_selector("pp37-manylinux_x86_64") - assert build_selector("pp38-manylinux_x86_64") - assert build_selector("pp37-manylinux_i686") - assert build_selector("pp38-manylinux_i686") + assert not build_selector("pp310-manylinux_x86_64") + assert build_selector("pp311-manylinux_x86_64") + assert not build_selector("pp37-manylinux_i686") + assert not build_selector("pp38-manylinux_i686") assert build_selector("cp36-manylinux_x86_64") assert build_selector("cp37-manylinux_x86_64") assert not build_selector("cp36-manylinux_i686") assert not build_selector("cp37-manylinux_i686") - assert not build_selector("pp36-macosx_10_6_intel") - assert build_selector("pp37-macosx_10_6_intel") + assert not build_selector("pp39-macosx_10_6_intel") + assert build_selector("pp311-macosx_10_6_intel") assert build_selector("cp36-macosx_10_6_intel") assert build_selector("cp37-macosx_10_6_intel") assert not build_selector("cp36-win32") @@ -117,7 +152,7 @@ def test_build_limited_python(): build_config="*", skip_config="", requires_python=SpecifierSet(">=3.7"), - enable=frozenset([EnableGroup.PyPy]), + enable=frozenset([EnableGroup.PyPy, EnableGroup.PyPyEoL]), ) assert not build_selector("cp36-manylinux_x86_64") diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py index 09ff5752..2f87044a 100644 --- a/unit_test/option_prepare_test.py +++ b/unit_test/option_prepare_test.py @@ -104,7 +104,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path): [tool.cibuildwheel] manylinux-x86_64-image = "manylinux_2_28" musllinux-x86_64-image = "musllinux_1_2" -enable = ["pypy", "graalpy", "cpython-freethreading"] +enable = ["pypy", "pypy-eol", "graalpy", "cpython-freethreading"] # Before Python 3.10, use manylinux2014 [[tool.cibuildwheel.overrides]]