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" + } + } +} pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    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:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy