diff --git a/add_to_pydotorg.py b/add_to_pydotorg.py index ab382475..3fae8d8d 100755 --- a/add_to_pydotorg.py +++ b/add_to_pydotorg.py @@ -81,7 +81,6 @@ def run_cmd( # Update this list when new release managers are added. release_to_sigstore_identity_and_oidc_issuer = { - "3.8": ("lukasz@langa.pl", github_oidc_provider), "3.9": ("lukasz@langa.pl", github_oidc_provider), "3.10": ("pablogsal@python.org", google_oidc_provider), "3.11": ("pablogsal@python.org", google_oidc_provider), @@ -91,10 +90,19 @@ def run_cmd( } +def macos_universal2_description(version: tuple[int, int, int]) -> str: + if version >= (3, 14): + return "for macOS 10.15 and later" + elif version >= (3, 12, 6): + return "for macOS 10.13 and later" + else: + return "for macOS 10.9 and later" + + def get_file_descriptions( release: str, ) -> list[tuple[re.Pattern[str], tuple[str, str, bool, str]]]: - v = minor_version_tuple(release) + v = base_version_tuple(release) rx = re.compile # value is (file "name", OS slug, download button, file "description"). # OS=None means no ReleaseFile object. Only one matching *file* (not regex) @@ -125,13 +133,13 @@ def get_file_descriptions( ), ( rx(r"-amd64\.exe$"), - ("Windows installer (64-bit)", "windows", v >= (3, 9), "Recommended"), + ("Windows installer (64-bit)", "windows", True, "Recommended"), ), ( rx(r"-embed-win32\.zip$"), ("Windows embeddable package (32-bit)", "windows", False, ""), ), - (rx(r"\.exe$"), ("Windows installer (32-bit)", "windows", v < (3, 9), "")), + (rx(r"\.exe$"), ("Windows installer (32-bit)", "windows", False, "")), ( rx(r"-macosx10\.5(_rev\d)?\.(dm|pk)g$"), ( @@ -165,7 +173,7 @@ def get_file_descriptions( "macOS 64-bit universal2 installer", "macos", True, - f"for macOS {'10.13' if v >= (3, 12, 6) else '10.9'} and later", + macos_universal2_description(v), ), ), ( @@ -211,6 +219,12 @@ def base_version(release: str) -> str: return ".".join(m.groups()[:3]) +def base_version_tuple(release: str) -> tuple[int, int, int]: + m = tag_cre.match(release) + assert m is not None, f"Invalid release: {release}" + return int(m.groups()[0]), int(m.groups()[1]), int(m.groups()[2]) + + def minor_version(release: str) -> str: m = tag_cre.match(release) assert m is not None, f"Invalid release: {release}" diff --git a/tests/test_add_to_pydotorg.py b/tests/test_add_to_pydotorg.py index 300f7fb4..7a32971e 100644 --- a/tests/test_add_to_pydotorg.py +++ b/tests/test_add_to_pydotorg.py @@ -90,6 +90,19 @@ def test_base_version(release: str, expected: str) -> None: assert add_to_pydotorg.base_version(release) == expected +@pytest.mark.parametrize( + ["release", "expected"], + [ + ("3.9.0a0", (3, 9, 0)), + ("3.10.0b3", (3, 10, 0)), + ("3.11.0rc2", (3, 11, 0)), + ("3.12.15", (3, 12, 15)), + ], +) +def test_base_version_tuple(release: str, expected: tuple[int, int, int]) -> None: + assert add_to_pydotorg.base_version_tuple(release) == expected + + @pytest.mark.parametrize( ["release", "expected"], [ @@ -116,6 +129,25 @@ def test_minor_version_tuple(release: str, expected: tuple[int, int]) -> None: assert add_to_pydotorg.minor_version_tuple(release) == expected +@pytest.mark.parametrize( + ["release", "expected"], + [ + ((3, 9, 0), "for macOS 10.9 and later"), + ((3, 10, 0), "for macOS 10.9 and later"), + ((3, 11, 0), "for macOS 10.9 and later"), + ((3, 12, 0), "for macOS 10.9 and later"), + ((3, 12, 5), "for macOS 10.9 and later"), + ((3, 12, 6), "for macOS 10.13 and later"), + ((3, 13, 0), "for macOS 10.13 and later"), + ((3, 14, 0), "for macOS 10.15 and later"), + ], +) +def test_macos_universal2_description( + release: tuple[int, int, int], expected: str +) -> None: + assert add_to_pydotorg.macos_universal2_description(release) == expected + + def test_list_files(fs: FakeFilesystem) -> None: # Arrange fake_ftp_root = "/fake_ftp_root" @@ -185,7 +217,7 @@ def test_list_files(fs: FakeFilesystem) -> None: "macOS 64-bit universal2 installer", "macos", True, - "for macOS 10.13 and later", + "for macOS 10.15 and later", ), ( "python-3.14.0b3-x86_64-linux-android.tar.gz",