From 11982d8dd8825103d593e8ce0e38fe94d46bdba7 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Thu, 6 Nov 2025 15:18:51 +0200 Subject: [PATCH 1/3] Update other version numbers in README.rst --- release.py | 30 ++++++++++++++++++++++++++++-- tests/test_release.py | 41 ++++++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/release.py b/release.py index 20feb4cf..98b73f3e 100755 --- a/release.py +++ b/release.py @@ -448,13 +448,39 @@ def tweak_readme(tag: Tag, filename: str = "README.rst") -> None: # Update first line: "This is Python version 3.14.0 alpha 7" # and update length of underline in second line to match. - lines = readme.read_text().splitlines() + content = readme.read_text() + lines = content.splitlines() this_is = f"This is Python version {tag.long_name}" underline = "=" * len(this_is) lines[0] = this_is lines[1] = underline + content = "\n".join(lines) - readme.write_text("\n".join(lines)) + DOCS_URL = r"https://docs\.python\.org/" + X_Y = r"\d+\.\d+" + + # Replace in: 3.14 `_ + content = re.sub( + rf"{X_Y} (<{DOCS_URL}){X_Y}(/whatsnew/){X_Y}(\.html>`_)", + rf"{tag.basic_version} \g<1>{tag.basic_version}\g<2>{tag.basic_version}\g<3>", + content, + ) + + # Replace in: `Documentation for Python 3.14 `_ + content = re.sub( + rf"(`Documentation for Python ){X_Y}( <{DOCS_URL}){X_Y}(/>`_)", + rf"\g<1>{tag.basic_version}\g<2>{tag.basic_version}\g<3>", + content, + ) + + # Replace in "for Python 3.14 release details" + content = re.sub( + rf"(for Python ){X_Y}( release details)", + rf"\g<1>{tag.basic_version}\g<2>", + content, + ) + + readme.write_text(content) print("done") diff --git a/tests/test_release.py b/tests/test_release.py index 1947f0dd..cb8a8eff 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -71,32 +71,57 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: @pytest.mark.parametrize( - ["test_tag", "expected_version", "expected_underline"], + [ + "test_tag", + "expected_version", + "expected_underline", + "expected_whatsnew", + "expected_docs", + "expected_release_details_text", + ], [ ( "3.14.0a6", "This is Python version 3.14.0 alpha 6", "=====================================", + "3.14 `_", + "`Documentation for Python 3.14 `_", + "for Python 3.14 release details", ), ( "3.14.0b2", "This is Python version 3.14.0 beta 2", "====================================", + "3.14 `_", + "`Documentation for Python 3.14 `_", + "for Python 3.14 release details", ), ( "3.14.0rc2", "This is Python version 3.14.0 release candidate 2", "=================================================", + "3.14 `_", + "`Documentation for Python 3.14 `_", + "for Python 3.14 release details", ), ( - "3.14.1", - "This is Python version 3.14.1", + "3.15.1", + "This is Python version 3.15.1", "=============================", + "3.15 `_", + "`Documentation for Python 3.15 `_", + "for Python 3.15 release details", ), ], ) def test_tweak_readme( - tmp_path: Path, test_tag: str, expected_version: str, expected_underline: str + tmp_path: Path, + test_tag: str, + expected_version: str, + expected_underline: str, + expected_whatsnew: str, + expected_docs: str, + expected_release_details_text: str, ) -> None: # Arrange tag = release.Tag(test_tag) @@ -110,8 +135,10 @@ def test_tweak_readme( release.tweak_readme(tag, filename=str(readme_file)) # Assert - original_lines = original_contents.splitlines() - new_lines = readme_file.read_text().splitlines() + new_contents = readme_file.read_text() + new_lines = new_contents.splitlines() assert new_lines[0] == expected_version assert new_lines[1] == expected_underline - assert new_lines[2:] == original_lines[2:] + assert expected_whatsnew in new_contents + assert expected_docs in new_contents + assert expected_release_details_text in new_contents From a1b2a4f22368670b8d143cc8af8aeaacf1c3d957 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Thu, 6 Nov 2025 16:18:27 +0200 Subject: [PATCH 2/3] Update PEP number in README.rst --- release.py | 29 ++++++++++++++++++++++++++--- tests/test_release.py | 14 +++++++------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/release.py b/release.py index 98b73f3e..4a037004 100755 --- a/release.py +++ b/release.py @@ -11,6 +11,7 @@ import datetime import glob import hashlib +import json import optparse import os import re @@ -19,9 +20,11 @@ import subprocess import sys import tempfile +import urllib.request from collections.abc import Generator, Sequence from contextlib import contextmanager from dataclasses import dataclass +from functools import cache from pathlib import Path from typing import ( Any, @@ -442,6 +445,22 @@ def tweak_patchlevel( print("done") +@cache +def get_pep_number(version: str) -> str: + """Fetch PEP number for a Python version from the devguide. + + Returns the PEP number as a string, or "TODO" if not found. + """ + url = "https://raw.githubusercontent.com/python/devguide/main/include/release-cycle.json" + with urllib.request.urlopen(url, timeout=10) as response: + data = json.loads(response.read().decode()) + if version in data: + pep = data[version].get("pep") + if pep: + return str(pep) + return "TODO" + + def tweak_readme(tag: Tag, filename: str = "README.rst") -> None: print(f"Updating {filename}...", end=" ") readme = Path(filename) @@ -473,10 +492,14 @@ def tweak_readme(tag: Tag, filename: str = "README.rst") -> None: content, ) - # Replace in "for Python 3.14 release details" + # Get PEP number for this version + pep_number = get_pep_number(tag.basic_version) + pep_padded = pep_number.zfill(4) if pep_number != "TODO" else "TODO" + + # Replace in: `PEP 745 `__ for Python 3.14 content = re.sub( - rf"(for Python ){X_Y}( release details)", - rf"\g<1>{tag.basic_version}\g<2>", + rf"(`PEP )\d+( `__ for Python ){X_Y}", + rf"\g<1>{pep_number}\g<2>{pep_padded}\g<3>{tag.basic_version}", content, ) diff --git a/tests/test_release.py b/tests/test_release.py index cb8a8eff..e3a3f5d6 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -77,7 +77,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: "expected_underline", "expected_whatsnew", "expected_docs", - "expected_release_details_text", + "expected_pep_line", ], [ ( @@ -86,7 +86,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: "=====================================", "3.14 `_", "`Documentation for Python 3.14 `_", - "for Python 3.14 release details", + "`PEP 745 `__ for Python 3.14", ), ( "3.14.0b2", @@ -94,7 +94,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: "====================================", "3.14 `_", "`Documentation for Python 3.14 `_", - "for Python 3.14 release details", + "`PEP 745 `__ for Python 3.14", ), ( "3.14.0rc2", @@ -102,7 +102,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: "=================================================", "3.14 `_", "`Documentation for Python 3.14 `_", - "for Python 3.14 release details", + "`PEP 745 `__ for Python 3.14", ), ( "3.15.1", @@ -110,7 +110,7 @@ def test_tweak_patchlevel(tmp_path: Path) -> None: "=============================", "3.15 `_", "`Documentation for Python 3.15 `_", - "for Python 3.15 release details", + "`PEP 790 `__ for Python 3.15", ), ], ) @@ -121,7 +121,7 @@ def test_tweak_readme( expected_underline: str, expected_whatsnew: str, expected_docs: str, - expected_release_details_text: str, + expected_pep_line: str, ) -> None: # Arrange tag = release.Tag(test_tag) @@ -141,4 +141,4 @@ def test_tweak_readme( assert new_lines[1] == expected_underline assert expected_whatsnew in new_contents assert expected_docs in new_contents - assert expected_release_details_text in new_contents + assert expected_pep_line in new_contents From 97e6f146d3ab40ef3bfc70575cca1510aacf42fc Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:08:19 +0200 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- release.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/release.py b/release.py index 4a037004..a1c84df6 100755 --- a/release.py +++ b/release.py @@ -447,11 +447,11 @@ def tweak_patchlevel( @cache def get_pep_number(version: str) -> str: - """Fetch PEP number for a Python version from the devguide. + """Fetch PEP number for a Python version from peps.python.org. Returns the PEP number as a string, or "TODO" if not found. """ - url = "https://raw.githubusercontent.com/python/devguide/main/include/release-cycle.json" + url = "https://peps.python.org/api/release-cycle.json" with urllib.request.urlopen(url, timeout=10) as response: data = json.loads(response.read().decode()) if version in data: @@ -468,7 +468,7 @@ def tweak_readme(tag: Tag, filename: str = "README.rst") -> None: # Update first line: "This is Python version 3.14.0 alpha 7" # and update length of underline in second line to match. content = readme.read_text() - lines = content.splitlines() + lines = content.split("\n") this_is = f"This is Python version {tag.long_name}" underline = "=" * len(this_is) lines[0] = this_is