From dac266e44d52dac1db641825d899929d614c45a2 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Tue, 26 May 2026 12:16:38 -0700 Subject: [PATCH 1/4] Suffix with +dev for PEP 440 compliance --- release.py | 2 +- tests/test_release.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/release.py b/release.py index 6d587467..153e8a56 100755 --- a/release.py +++ b/release.py @@ -471,7 +471,7 @@ def tweak_patchlevel( "f": "PY_RELEASE_LEVEL_FINAL", }[tag.level] new_constants = template.format( - tag=tag, level_def=level_def, plus=done and "+" or "" + tag=tag, level_def=level_def, plus=done and "+dev" or "" ) if tag.as_tuple() >= (3, 7, 0, "a", 3): new_constants = new_constants.expandtabs() diff --git a/tests/test_release.py b/tests/test_release.py index 84ee2d58..aee2b87e 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -102,6 +102,22 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: assert expected in new_contents +def test_tweak_patchlevel_done(tmp_path: Path) -> None: + # Arrange + tag = release.Tag("3.14.0b2") + + original_patchlevel_file = Path(__file__).parent / "patchlevel.h" + patchlevel_file = tmp_path / "patchlevel.h" + patchlevel_file.write_text(original_patchlevel_file.read_text()) + + # Act + release.tweak_patchlevel(tag, filename=str(patchlevel_file), done=True) + + # Assert + new_contents = patchlevel_file.read_text() + assert '#define PY_VERSION "3.14.0b2+dev"' in new_contents + + @pytest.mark.parametrize( [ "test_tag", From d15bb7194cf8f883ad5491f38e5376ff1cc3d27c Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Tue, 26 May 2026 14:10:55 -0700 Subject: [PATCH 2/4] Gate on 3.15+ --- release.py | 10 +++++++--- tests/test_release.py | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/release.py b/release.py index 153e8a56..4a30a205 100755 --- a/release.py +++ b/release.py @@ -470,9 +470,13 @@ def tweak_patchlevel( "rc": "PY_RELEASE_LEVEL_GAMMA", "f": "PY_RELEASE_LEVEL_FINAL", }[tag.level] - new_constants = template.format( - tag=tag, level_def=level_def, plus=done and "+dev" or "" - ) + if done: + # 3.15+ uses "+dev" for PEP 440 local-version compliance; older + # branches keep the bare "+" they were released with. + plus = "+dev" if tag.as_tuple() >= (3, 15) else "+" + else: + plus = "" + new_constants = template.format(tag=tag, level_def=level_def, plus=plus) if tag.as_tuple() >= (3, 7, 0, "a", 3): new_constants = new_constants.expandtabs() constant_replace(filename, new_constants) diff --git a/tests/test_release.py b/tests/test_release.py index aee2b87e..09fb7c00 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -102,9 +102,21 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: assert expected in new_contents -def test_tweak_patchlevel_done(tmp_path: Path) -> None: +@pytest.mark.parametrize( + ["test_tag", "expected_py_version"], + [ + # 3.14 and earlier keep the bare "+" they were released with. + ("3.14.0b2", '#define PY_VERSION "3.14.0b2+"'), + # 3.15+ uses "+dev" for PEP 440 local-version compliance. + ("3.15.0b1", '#define PY_VERSION "3.15.0b1+dev"'), + ("3.16.0a1", '#define PY_VERSION "3.16.0a1+dev"'), + ], +) +def test_tweak_patchlevel_done( + tmp_path: Path, test_tag: str, expected_py_version: str +) -> None: # Arrange - tag = release.Tag("3.14.0b2") + tag = release.Tag(test_tag) original_patchlevel_file = Path(__file__).parent / "patchlevel.h" patchlevel_file = tmp_path / "patchlevel.h" @@ -115,7 +127,7 @@ def test_tweak_patchlevel_done(tmp_path: Path) -> None: # Assert new_contents = patchlevel_file.read_text() - assert '#define PY_VERSION "3.14.0b2+dev"' in new_contents + assert expected_py_version in new_contents @pytest.mark.parametrize( From 35adea95a7b61dd51f092516ede4a4bf34b0d30e Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Tue, 26 May 2026 14:11:43 -0700 Subject: [PATCH 3/4] Fix comment --- release.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release.py b/release.py index 4a30a205..b40c3ca0 100755 --- a/release.py +++ b/release.py @@ -471,8 +471,8 @@ def tweak_patchlevel( "f": "PY_RELEASE_LEVEL_FINAL", }[tag.level] if done: - # 3.15+ uses "+dev" for PEP 440 local-version compliance; older - # branches keep the bare "+" they were released with. + # 3.15+ uses "+dev" for PEP 440 local-version compliance; + # 3.14 and earlier keep the bare "+" suffix. plus = "+dev" if tag.as_tuple() >= (3, 15) else "+" else: plus = "" From 1f62057a23f9321c20d3a242a8ba3df7e7afcf38 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Tue, 26 May 2026 14:12:46 -0700 Subject: [PATCH 4/4] Fix another comment --- tests/test_release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_release.py b/tests/test_release.py index 09fb7c00..2259b1b1 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -105,7 +105,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: @pytest.mark.parametrize( ["test_tag", "expected_py_version"], [ - # 3.14 and earlier keep the bare "+" they were released with. + # 3.14 and earlier keep the bare "+" suffix. ("3.14.0b2", '#define PY_VERSION "3.14.0b2+"'), # 3.15+ uses "+dev" for PEP 440 local-version compliance. ("3.15.0b1", '#define PY_VERSION "3.15.0b1+dev"'),