diff --git a/pep_sphinx_extensions/pep_theme/static/style.css b/pep_sphinx_extensions/pep_theme/static/style.css index 70e1cbf08bf..36393159ab2 100644 --- a/pep_sphinx_extensions/pep_theme/static/style.css +++ b/pep_sphinx_extensions/pep_theme/static/style.css @@ -232,14 +232,17 @@ table td + td { } /* Common column widths for PEP status tables */ table.pep-zero-table tr td:nth-child(1) { - width: 5.5%; + width: 5%; } table.pep-zero-table tr td:nth-child(2) { - width: 6.5%; + width: 7%; } table.pep-zero-table tr td:nth-child(3), table.pep-zero-table tr td:nth-child(4){ - width: 44%; + width: 41%; +} +table.pep-zero-table tr td:nth-child(5) { + width: 6%; } /* Authors & Sponsors table */ #authors-owners table td, diff --git a/pep_sphinx_extensions/pep_zero_generator/parser.py b/pep_sphinx_extensions/pep_zero_generator/parser.py index 193186c74ff..bd8bf9e6884 100644 --- a/pep_sphinx_extensions/pep_zero_generator/parser.py +++ b/pep_sphinx_extensions/pep_zero_generator/parser.py @@ -140,6 +140,8 @@ def details(self) -> dict[str, str | int]: "shorthand": self.shorthand, # the author list as a comma-separated with only last names "authors": ", ".join(author.full_name for author in self.authors), + # The targeted Python-Version (if present) or the empty string + "python_version": self.python_version or "", } @property diff --git a/pep_sphinx_extensions/pep_zero_generator/writer.py b/pep_sphinx_extensions/pep_zero_generator/writer.py index 69a5fe4bc6f..f8232d0ceb0 100644 --- a/pep_sphinx_extensions/pep_zero_generator/writer.py +++ b/pep_sphinx_extensions/pep_zero_generator/writer.py @@ -74,14 +74,22 @@ def emit_author_table_separator(self, max_name_len: int) -> None: self.output.append(author_table_separator) def emit_pep_row( - self, *, shorthand: str, number: int, title: str, authors: str + self, + *, + shorthand: str, + number: int, + title: str, + authors: str, + python_version: str | None = None, ) -> None: self.emit_text(f" * - {shorthand}") self.emit_text(f" - :pep:`{number} <{number}>`") self.emit_text(f" - :pep:`{title.replace('`', '')} <{number}>`") self.emit_text(f" - {authors}") + if python_version is not None: + self.emit_text(f" - {python_version}") - def emit_column_headers(self) -> None: + def emit_column_headers(self, *, include_version=True) -> None: """Output the column headers for the PEP indices.""" self.emit_text(".. list-table::") self.emit_text(" :header-rows: 1") @@ -92,6 +100,8 @@ def emit_column_headers(self) -> None: self.emit_text(" - PEP") self.emit_text(" - Title") self.emit_text(" - Authors") + if include_version: + self.emit_text(" - ") # for Python-Version def emit_title(self, text: str, *, symbol: str = "=") -> None: self.output.append(text) @@ -101,17 +111,25 @@ def emit_title(self, text: str, *, symbol: str = "=") -> None: def emit_subtitle(self, text: str) -> None: self.emit_title(text, symbol="-") + def emit_table(self, peps: list[PEP]) -> None: + include_version = any(pep.details["python_version"] for pep in peps) + self.emit_column_headers(include_version=include_version) + for pep in peps: + details = pep.details + if not include_version: + details.pop("python_version") + self.emit_pep_row(**details) + def emit_pep_category(self, category: str, peps: list[PEP]) -> None: self.emit_subtitle(category) - self.emit_column_headers() - for pep in peps: - self.emit_pep_row(**pep.details) + self.emit_table(peps) # list-table must have at least one body row if len(peps) == 0: self.emit_text(" * -") self.emit_text(" -") self.emit_text(" -") self.emit_text(" -") + self.emit_text(" -") self.emit_newline() def write_pep0( @@ -180,19 +198,21 @@ def write_pep0( # PEPs by number self.emit_title("Numerical Index") - self.emit_column_headers() - for pep in peps: - self.emit_pep_row(**pep.details) + self.emit_table(peps) self.emit_newline() # Reserved PEP numbers if is_pep0: self.emit_title("Reserved PEP Numbers") - self.emit_column_headers() + self.emit_column_headers(include_version=False) for number, claimants in sorted(self.RESERVED.items()): self.emit_pep_row( - shorthand="", number=number, title="RESERVED", authors=claimants + shorthand="", + number=number, + title="RESERVED", + authors=claimants, + python_version=None, ) self.emit_newline() diff --git a/pep_sphinx_extensions/tests/pep_zero_generator/test_parser.py b/pep_sphinx_extensions/tests/pep_zero_generator/test_parser.py index daeb77c709a..d2bd324ea0b 100644 --- a/pep_sphinx_extensions/tests/pep_zero_generator/test_parser.py +++ b/pep_sphinx_extensions/tests/pep_zero_generator/test_parser.py @@ -40,15 +40,35 @@ def test_pep_equal(): assert pep_a == pep_b -def test_pep_details(monkeypatch): - pep8 = parser.PEP(PEP_ROOT / "pep-0008.rst") +@pytest.mark.parametrize( + ("test_input", "expected"), + [ + ( + "pep-0008.rst", + { + "authors": "Guido van Rossum, Barry Warsaw, Nick Coghlan", + "number": 8, + "shorthand": ":abbr:`PA (Process, Active)`", + "title": "Style Guide for Python Code", + "python_version": "", + }, + ), + ( + "pep-0719.rst", + { + "authors": "Thomas Wouters", + "number": 719, + "shorthand": ":abbr:`IA (Informational, Active)`", + "title": "Python 3.13 Release Schedule", + "python_version": "3.13", + }, + ), + ], +) +def test_pep_details(test_input, expected): + pep = parser.PEP(PEP_ROOT / test_input) - assert pep8.details == { - "authors": "Guido van Rossum, Barry Warsaw, Nick Coghlan", - "number": 8, - "shorthand": ":abbr:`PA (Process, Active)`", - "title": "Style Guide for Python Code", - } + assert pep.details == expected @pytest.mark.parametrize(