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() == [ + 'Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: