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"
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() == [ + '