From 303033fb21e0ae2aed12a62f0fb6b33e19cf9bef Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:06:40 +0200 Subject: [PATCH 1/4] Prompt to update the docs by version page --- run_release.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/run_release.py b/run_release.py index 45979432..09358251 100755 --- a/run_release.py +++ b/run_release.py @@ -9,6 +9,7 @@ import argparse import asyncio import contextlib +import datetime as dt import functools import getpass import json @@ -1031,6 +1032,21 @@ def modify_the_release_to_the_prerelease_pages(db: ReleaseShelf) -> None: ) +def modify_the_docs_by_version_page(db: ReleaseShelf) -> None: + if db["release"].is_final: + version = db["release"] + date = dt.datetime.now().strftime("%d %B %Y") + if not ask_question( + "Have you already added the docs to https://www.python.org/doc/versions/ ?\n" + "For example:\n" + f"* `Python {version} `_, " + f"documentation released on {date}." + ): + raise ReleaseException( + "The docs have not been added to the docs by version page" + ) + + def post_release_merge(db: ReleaseShelf) -> None: subprocess.check_call( ["git", "fetch", "--all"], @@ -1330,6 +1346,7 @@ def _api_key(api_key: str) -> str: Task(run_add_to_python_dot_org, "Add files to python.org download page"), Task(purge_the_cdn, "Purge the CDN of python.org/downloads"), Task(modify_the_release_to_the_prerelease_pages, "Modify the pre-release page"), + Task(modify_the_docs_by_version_page, "Update docs by version page"), ] automata = ReleaseDriver( git_repo=args.repo, From 78555a1dc16eb2054beee4c916c114ceb1795436 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:07:14 +0200 Subject: [PATCH 2/4] Simplify function name --- run_release.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/run_release.py b/run_release.py index 09358251..99d865a0 100755 --- a/run_release.py +++ b/run_release.py @@ -1014,21 +1014,21 @@ def purge_the_cdn(db: ReleaseShelf) -> None: raise RuntimeError("Failed to purge the python.org/downloads CDN") -def modify_the_release_to_the_prerelease_pages(db: ReleaseShelf) -> None: +def modify_the_prereleases_page(db: ReleaseShelf) -> None: pre_release_tags = {"rc", "b", "a"} if any(tag in str(db["release"]) for tag in pre_release_tags): if not ask_question( - "Have you already added the release to https://www.python.org/download/pre-releases/" + "Have you already added the release to https://www.python.org/download/pre-releases/ ?" ): raise ReleaseException( - "The release has not been added to the pre-release page" + "The release has not been added to the pre-releases page" ) else: if not ask_question( - "Have you already removed the release from https://www.python.org/download/pre-releases/" + "Have you already removed the release from https://www.python.org/download/pre-releases/ ?" ): raise ReleaseException( - "The release has not been removed from the pre-release page" + "The release has not been removed from the pre-releases page" ) @@ -1345,7 +1345,7 @@ def _api_key(api_key: str) -> str: Task(remove_temporary_branch, "Removing temporary release branch"), Task(run_add_to_python_dot_org, "Add files to python.org download page"), Task(purge_the_cdn, "Purge the CDN of python.org/downloads"), - Task(modify_the_release_to_the_prerelease_pages, "Modify the pre-release page"), + Task(modify_the_prereleases_page, "Modify the pre-release page"), Task(modify_the_docs_by_version_page, "Update docs by version page"), ] automata = ReleaseDriver( From a3d6910bd2ccc87c6858ddaabee64ca3650fda75 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:40:49 +0200 Subject: [PATCH 3/4] Add tests --- tests/test_run_release.py | 86 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/tests/test_run_release.py b/tests/test_run_release.py index 07a101dd..5c40d37c 100644 --- a/tests/test_run_release.py +++ b/tests/test_run_release.py @@ -88,7 +88,7 @@ def test_check_doc_unreleased_version_no_file_alpha(tmp_path: Path) -> None: run_release.check_doc_unreleased_version(cast(ReleaseShelf, db)) -def test_check_doc_unreleased_version_ok(monkeypatch, tmp_path: Path) -> None: +def test_check_doc_unreleased_version_ok(tmp_path: Path) -> None: prepare_fake_docs( tmp_path, "
New in 3.13
", @@ -124,3 +124,87 @@ def test_check_doc_unreleased_version_waived(monkeypatch, tmp_path: Path) -> Non } with fake_answers(monkeypatch, ["yes"]): run_release.check_doc_unreleased_version(cast(ReleaseShelf, db)) + + +@pytest.mark.parametrize( + ["tag", "expected"], + [ + ("3.14.0a7", "Have you already added the release to "), + ("3.13.3", "Have you already removed the release from "), + ], +) +def test_modify_the_prerelease_page_yes( + capsys, monkeypatch, tag: str, expected: str +) -> None: + # Arrange + db = {"release": Tag(tag)} + + # Act + with fake_answers(monkeypatch, ["yes"]): + run_release.modify_the_prereleases_page(cast(ReleaseShelf, db)) + + # Assert + assert expected in capsys.readouterr().out + + +@pytest.mark.parametrize( + ["tag", "expected"], + [ + ("3.14.0a7", "The release has not been added to the pre-releases page"), + ("3.13.3", "The release has not been removed from the pre-releases page"), + ], +) +def test_modify_the_prerelease_page_no(monkeypatch, tag: str, expected: str) -> None: + # Arrange + db = {"release": Tag(tag)} + + # Act + with ( + fake_answers(monkeypatch, ["no"]), + pytest.raises(run_release.ReleaseException, match=expected), + ): + run_release.modify_the_prereleases_page(cast(ReleaseShelf, db)) + + +def test_modify_the_docs_by_version_page_prerelease(capsys) -> None: + # Arrange + db = {"release": Tag("3.14.0a7")} + + # Act + run_release.modify_the_docs_by_version_page(cast(ReleaseShelf, db)) + + # Assert + assert capsys.readouterr().out == "" + + +def test_modify_the_docs_by_version_page_final_no(capsys, monkeypatch) -> None: + # Arrange + db = {"release": Tag("3.13.3")} + + # Act + with ( + fake_answers(monkeypatch, ["no"]), + pytest.raises(run_release.ReleaseException), + ): + run_release.modify_the_docs_by_version_page(cast(ReleaseShelf, db)) + + # Assert + assert ( + "* `Python 3.13.3 `_, documentation released on" + in capsys.readouterr().out + ) + + +def test_modify_the_docs_by_version_page_final_yes(capsys, monkeypatch) -> None: + # Arrange + db = {"release": Tag("3.13.3")} + + # Act + with fake_answers(monkeypatch, ["yes"]): + run_release.modify_the_docs_by_version_page(cast(ReleaseShelf, db)) + + # Assert + assert ( + "* `Python 3.13.3 `_, documentation released on" + in capsys.readouterr().out + ) From 0c98167b0fe8e8312c7013ceeec01ab1d39c326f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 22 Mar 2025 22:15:09 +0200 Subject: [PATCH 4/4] Refactor to use Tag.is_final --- run_release.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/run_release.py b/run_release.py index 99d865a0..8f2f6738 100755 --- a/run_release.py +++ b/run_release.py @@ -1015,20 +1015,19 @@ def purge_the_cdn(db: ReleaseShelf) -> None: def modify_the_prereleases_page(db: ReleaseShelf) -> None: - pre_release_tags = {"rc", "b", "a"} - if any(tag in str(db["release"]) for tag in pre_release_tags): + if db["release"].is_final: if not ask_question( - "Have you already added the release to https://www.python.org/download/pre-releases/ ?" + "Have you already removed the release from https://www.python.org/download/pre-releases/ ?" ): raise ReleaseException( - "The release has not been added to the pre-releases page" + "The release has not been removed from the pre-releases page" ) else: if not ask_question( - "Have you already removed the release from https://www.python.org/download/pre-releases/ ?" + "Have you already added the release to https://www.python.org/download/pre-releases/ ?" ): raise ReleaseException( - "The release has not been removed from the pre-releases page" + "The release has not been added to the pre-releases page" )