diff --git a/run_release.py b/run_release.py index 45979432..8f2f6738 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 @@ -1013,21 +1014,35 @@ 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: - pre_release_tags = {"rc", "b", "a"} - if any(tag in str(db["release"]) for tag in pre_release_tags): +def modify_the_prereleases_page(db: ReleaseShelf) -> None: + 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-release 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-release page" + "The release has not been added to the pre-releases page" + ) + + +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" ) @@ -1329,7 +1344,8 @@ 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( git_repo=args.repo, 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 + )