From 29d25741abe88adafb71b3faf79459691dd49edd Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Sat, 9 Aug 2025 11:25:54 -0400 Subject: [PATCH 1/2] Generate links for typeshed PR numbers in the changelogs --- stub_uploader/update_changelog.py | 10 +++++++--- tests/test_unit.py | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/stub_uploader/update_changelog.py b/stub_uploader/update_changelog.py index 1fb597d1..8003e173 100755 --- a/stub_uploader/update_changelog.py +++ b/stub_uploader/update_changelog.py @@ -62,7 +62,8 @@ def update_changelog( if not log: print(f"{distribution}: Changelog unchanged") return - new_entry = process_git_log(log, version) + today = datetime.date.today() + new_entry = process_git_log(log, version, today) changelog = os.path.join(CHANGELOG_PATH, f"{distribution}.md") try: @@ -84,8 +85,7 @@ def update_changelog( f.write(new_entry + old_entries) -def process_git_log(log: str, version: str) -> str: - today = datetime.date.today() +def process_git_log(log: str, version: str, today: datetime.date) -> str: entry = f"## {version} ({today:%Y-%m-%d})\n" for line in log.splitlines(): if line.strip() == "": @@ -96,6 +96,10 @@ def process_git_log(log: str, version: str) -> str: else: pass # Ignore header entries. entry += "\n" + # Create hyperlinks for PR numbers. + entry = re.sub( + r"\(#(\d+)\)", r"([#\1](https://github.com/python/typeshed/pull/\1))", entry + ) # Strip multiple empty lines. return re.sub("\n\n+", "\n\n", entry) diff --git a/tests/test_unit.py b/tests/test_unit.py index b314bfa9..2f3b99c8 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -15,6 +15,7 @@ from stub_uploader.get_version import compute_stub_version, ensure_specificity from stub_uploader.metadata import Metadata, _UploadedPackages, strip_types_prefix from stub_uploader.ts_data import TypeshedData, parse_requirements, read_typeshed_data +from stub_uploader.update_changelog import process_git_log def test_strip_types_prefix() -> None: @@ -322,3 +323,25 @@ def test_upstream_repo_validation(data: dict[str, Any], expected: str | None) -> m = Metadata("foo", data) assert m.upstream_repository == expected assert type(m.upstream_repository) is type(expected) + + +def test_process_git_log() -> None: + git_log = """ +commit 126768408a69b7a3a09b7d3992970b289f92937e + + Replace `Incomplete | None = None` in third party stubs (#14063) + +commit 337fd828e819988af2d3600283d8068bbbab7f50 + + Bump setuptools to 80.7.* (#14069) +""" + expected_entry = f"""\ +## 80.7.0.{TODAY_V} ({TODAY:%Y-%m-%d}) + +Replace `Incomplete | None = None` in third party stubs ([#14063](https://github.com/python/typeshed/pull/14063)) + +Bump setuptools to 80.7.* ([#14069](https://github.com/python/typeshed/pull/14069)) + +""" + actual_entry = process_git_log(git_log, f"80.7.0.{TODAY_V}", TODAY) + assert actual_entry == expected_entry From 12ff2fcdcb408211aa39d0fe42148916549ac033 Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Mon, 11 Aug 2025 07:27:38 -0400 Subject: [PATCH 2/2] Add cases that don't generate links to tests --- tests/test_unit.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 2f3b99c8..5aeaf65d 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -334,6 +334,8 @@ def test_process_git_log() -> None: commit 337fd828e819988af2d3600283d8068bbbab7f50 Bump setuptools to 80.7.* (#14069) + + Body text #12345 python/typeshed#12345 https://example.com/#123 """ expected_entry = f"""\ ## 80.7.0.{TODAY_V} ({TODAY:%Y-%m-%d}) @@ -342,6 +344,8 @@ def test_process_git_log() -> None: Bump setuptools to 80.7.* ([#14069](https://github.com/python/typeshed/pull/14069)) +Body text #12345 python/typeshed#12345 https://example.com/#123 + """ actual_entry = process_git_log(git_log, f"80.7.0.{TODAY_V}", TODAY) assert actual_entry == expected_entry