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"
)