diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000000..ed4884a9fed --- /dev/null +++ b/.coveragerc @@ -0,0 +1,6 @@ +# .coveragerc to control coverage.py + +[report] +# Regexes for lines to exclude from consideration +exclude_also = + if TYPE_CHECKING: diff --git a/pep_sphinx_extensions/pep_processor/html/pep_html_translator.py b/pep_sphinx_extensions/pep_processor/html/pep_html_translator.py index e8893790ef6..5f468ac8896 100644 --- a/pep_sphinx_extensions/pep_processor/html/pep_html_translator.py +++ b/pep_sphinx_extensions/pep_processor/html/pep_html_translator.py @@ -1,14 +1,32 @@ from __future__ import annotations -from typing import TYPE_CHECKING +import datetime as dt +import json -from docutils import nodes import sphinx.writers.html5 as html5 +from docutils import nodes +TYPE_CHECKING = False if TYPE_CHECKING: from sphinx.builders import html +def create_release_list(release_dates: dict[str, str]) -> str: + releases = [] + for version, date in release_dates.items(): + if version.endswith("beta 1"): + beta = " (No new features beyond this point.)" + else: + beta = "" + date = dt.datetime.strptime(date, "%Y-%m-%d").date() + new = f"{version}: {date.strftime('%A, %Y-%m-%d')}{beta}" + releases.append(new) + + release_list = "\n".join(f"
  • {release}" for release in releases) + + return f'' + + class PEPTranslator(html5.HTML5Translator): """Custom RST -> HTML translation rules for PEPs.""" @@ -46,13 +64,34 @@ def should_be_compact_paragraph(node: nodes.paragraph) -> bool: return True def visit_paragraph(self, node: nodes.paragraph) -> None: - """Remove

    tags if possible.""" + """Remove

    tags if possible and add dates to release PEPs.""" + if self.should_be_compact_paragraph(node): self.context.append("") else: self.body.append(self.starttag(node, "p", "")) self.context.append("

    \n") + title = None + for title_node in self.document.findall(nodes.title): + title = title_node.astext() + break + + if title.endswith("Release Schedule"): + version = title.split()[4] + + for i, child in enumerate(node.children): + if isinstance(child, nodes.Text): + text = child.astext() + if text in ("[ACTUAL]", "[EXPECTED]"): + with open("peps/release-dates.json", encoding="utf-8") as f: + release_dates = json.load(f) + + category = text[1:-1].lower() + text = create_release_list(release_dates[version][category]) + + node.children[i] = nodes.raw("", text, format="html") + def depart_paragraph(self, _: nodes.paragraph) -> None: """Add corresponding end tag from `visit_paragraph`.""" self.body.append(self.context.pop()) diff --git a/pep_sphinx_extensions/tests/pep_processor/html/test_pep_html_translator.py b/pep_sphinx_extensions/tests/pep_processor/html/test_pep_html_translator.py new file mode 100644 index 00000000000..93ff050d9de --- /dev/null +++ b/pep_sphinx_extensions/tests/pep_processor/html/test_pep_html_translator.py @@ -0,0 +1,30 @@ +from pep_sphinx_extensions.pep_processor.html import pep_html_translator + + +def test_create_release_list(): + # Arrange + release_dates = { + "3.14.0 alpha 7": "2025-04-08", + "3.14.0 beta 1": "2025-05-06", + "3.14.0 beta 2": "2025-05-27", + "3.14.0 beta 3": "2025-06-17", + "3.14.0 beta 4": "2025-07-08", + "3.14.0 candidate 1": "2025-07-22", + "3.14.0 candidate 2": "2025-08-26", + "3.14.0 final": "2025-10-07", + } + + # Act + result = pep_html_translator.create_release_list(release_dates) + + # Assert + assert result.splitlines() == [ + '", + ] diff --git a/peps/pep-0745.rst b/peps/pep-0745.rst index 6c79ff20b25..2668c1f42ef 100644 --- a/peps/pep-0745.rst +++ b/peps/pep-0745.rst @@ -35,25 +35,11 @@ in a 12-month release cadence between feature versions, as defined by Actual: -- 3.14 development begins: Wednesday, 2024-05-08 -- 3.14.0 alpha 1: Tuesday, 2024-10-15 -- 3.14.0 alpha 2: Tuesday, 2024-11-19 -- 3.14.0 alpha 3: Tuesday, 2024-12-17 -- 3.14.0 alpha 4: Tuesday, 2025-01-14 -- 3.14.0 alpha 5: Tuesday, 2025-02-11 -- 3.14.0 alpha 6: Friday, 2025-03-14 +[ACTUAL] Expected: -- 3.14.0 alpha 7: Tuesday, 2025-04-08 -- 3.14.0 beta 1: Tuesday, 2025-05-06 - (No new features beyond this point.) -- 3.14.0 beta 2: Tuesday, 2025-05-27 -- 3.14.0 beta 3: Tuesday, 2025-06-17 -- 3.14.0 beta 4: Tuesday, 2025-07-08 -- 3.14.0 candidate 1: Tuesday, 2025-07-22 -- 3.14.0 candidate 2: Tuesday, 2025-08-26 -- 3.14.0 final: Tuesday, 2025-10-07 +[EXPECTED] Subsequent bugfix releases every two months. diff --git a/peps/release-dates.json b/peps/release-dates.json new file mode 100644 index 00000000000..689d5e75271 --- /dev/null +++ b/peps/release-dates.json @@ -0,0 +1,23 @@ +{ + "3.14": { + "actual": { + "3.14 development begins": "2024-05-08", + "3.14.0 alpha 1": "2024-10-15", + "3.14.0 alpha 2": "2024-11-19", + "3.14.0 alpha 3": "2024-12-17", + "3.14.0 alpha 4": "2025-01-14", + "3.14.0 alpha 5": "2025-02-11", + "3.14.0 alpha 6": "2025-03-14" + }, + "expected": { + "3.14.0 alpha 7": "2025-04-08", + "3.14.0 beta 1": "2025-05-06", + "3.14.0 beta 2": "2025-05-27", + "3.14.0 beta 3": "2025-06-17", + "3.14.0 beta 4": "2025-07-08", + "3.14.0 candidate 1": "2025-07-22", + "3.14.0 candidate 2": "2025-08-26", + "3.14.0 final": "2025-10-07" + } + } +}