Skip to content

Commit 1019939

Browse files
BHUVANSH855hugovk
andauthored
Infra: Link target release to release PEP in PEP 0 (#5058)
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
1 parent 7a3cf60 commit 1019939

5 files changed

Lines changed: 99 additions & 7 deletions

File tree

pep_sphinx_extensions/pep_zero_generator/pep_index_generator.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,45 @@ def write_peps_json(peps: list[parser.PEP], path: Path) -> None:
6060
Path(path, "api", "peps.json").write_text(json_peps, encoding="utf-8")
6161

6262

63+
def build_release_peps(peps: list[parser.PEP]) -> dict[str, int]:
64+
"""Map each Python version to its release-schedule PEP number.
65+
66+
Handles release PEPs that cover multiple versions jointly
67+
(e.g. "2.6, 3.0"), so individual versions also resolve.
68+
"""
69+
release_peps: dict[str, int] = {}
70+
71+
for pep in peps:
72+
if pep.python_version and "release" in pep.topic:
73+
for version in map(str.strip, pep.python_version.split(",")):
74+
release_peps[version] = pep.number
75+
76+
return release_peps
77+
78+
6379
def create_pep_zero(app: Sphinx, env: BuildEnvironment, docnames: list[str]) -> None:
6480
peps = _parse_peps(Path(app.srcdir))
6581

66-
numerical_index_text = writer.PEPZeroWriter().write_numerical_index(peps)
82+
release_peps = build_release_peps(peps)
83+
84+
numerical_index_text = writer.PEPZeroWriter(
85+
release_peps
86+
).write_numerical_index(peps)
6787
subindices.update_sphinx("numerical", numerical_index_text, docnames, env)
6888

69-
pep0_text = writer.PEPZeroWriter().write_pep0(peps, builder=env.settings["builder"])
89+
pep0_text = writer.PEPZeroWriter(
90+
release_peps
91+
).write_pep0(peps, builder=env.settings["builder"])
7092
pep0_path = subindices.update_sphinx("pep-0000", pep0_text, docnames, env)
7193
peps.append(parser.PEP(pep0_path))
7294

73-
subindices.generate_subindices(SUBINDICES_BY_TOPIC, peps, docnames, env)
95+
subindices.generate_subindices(
96+
SUBINDICES_BY_TOPIC,
97+
peps,
98+
release_peps,
99+
docnames,
100+
env,
101+
)
74102

75103
write_peps_json(peps, Path(app.outdir))
76104

pep_sphinx_extensions/pep_zero_generator/subindices.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def update_sphinx(filename: str, text: str, docnames: list[str], env: BuildEnvir
3535
def generate_subindices(
3636
subindices: dict[str, str],
3737
peps: list[PEP],
38+
release_peps: dict[str, int],
3839
docnames: list[str],
3940
env: BuildEnvironment,
4041
) -> None:
@@ -58,8 +59,11 @@ def generate_subindices(
5859
5960
{additional_description}
6061
"""
61-
subindex_text = writer.PEPZeroWriter().write_pep0(
62-
filtered_peps, header, subindex_intro, is_pep0=False,
62+
subindex_text = writer.PEPZeroWriter(release_peps).write_pep0(
63+
filtered_peps,
64+
header,
65+
subindex_intro,
66+
is_pep0=False,
6367
)
6468
update_sphinx(f"topic/{subindex}", subindex_text, docnames, env)
6569

pep_sphinx_extensions/pep_zero_generator/writer.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ class PEPZeroWriter:
5959
801: "Warsaw",
6060
}
6161

62-
def __init__(self):
62+
def __init__(self, release_peps: dict[str, int] | None = None):
6363
self.output: list[str] = []
64+
self.release_peps = release_peps or {}
6465

6566
def emit_text(self, content: str) -> None:
6667
# Appends content argument to the output list
@@ -87,7 +88,17 @@ def emit_pep_row(
8788
self.emit_text(f" - :pep:`{title.replace('`', '')} <{number}>`")
8889
self.emit_text(f" - {authors}")
8990
if python_version is not None:
90-
self.emit_text(f" - {python_version}")
91+
linked_versions = []
92+
93+
for version in map(str.strip, python_version.split(",")):
94+
release_pep = self.release_peps.get(version)
95+
96+
if release_pep is not None:
97+
linked_versions.append(f":pep:`{version} <{release_pep}>`")
98+
else:
99+
linked_versions.append(version)
100+
101+
self.emit_text(f" - {', '.join(linked_versions)}")
91102

92103
def emit_column_headers(self, *, include_version=True) -> None:
93104
"""Output the column headers for the PEP indices."""

pep_sphinx_extensions/tests/pep_zero_generator/test_pep_index_generator.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,13 @@ def test_create_pep_json():
99
out = pep_index_generator.create_pep_json(peps)
1010

1111
assert '"url": "https://peps.python.org/pep-0008/"' in out
12+
13+
14+
def test_build_release_peps_links_individual_versions_from_joint_release_pep():
15+
peps = [
16+
parser.PEP(PEP_ROOT / "pep-0361.rst"), # "2.6, 3.0" joint release PEP
17+
]
18+
19+
release_peps = pep_index_generator.build_release_peps(peps)
20+
21+
assert release_peps == {"2.6": 361, "3.0": 361}

pep_sphinx_extensions/tests/pep_zero_generator/test_writer.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,42 @@ def test_sort_authors():
8686

8787
# Assert
8888
assert out == ["Aardvark, Alfred", "lowercase, laurence", "Zebra, Zoë"]
89+
90+
91+
@pytest.mark.parametrize(
92+
("python_version", "expected"),
93+
[
94+
("3.14", " - :pep:`3.14 <745>`"),
95+
(
96+
"2.4, 2.5, 2.6",
97+
" - :pep:`2.4 <320>`, :pep:`2.5 <356>`, :pep:`2.6 <361>`",
98+
),
99+
("2.4, 2.9", " - :pep:`2.4 <320>`, 2.9"),
100+
("1.5.2", " - 1.5.2"),
101+
("", " - "),
102+
],
103+
)
104+
def test_emit_pep_row_links_python_version_to_release_pep(
105+
python_version,
106+
expected,
107+
):
108+
# Arrange
109+
release_peps = {
110+
"2.4": 320,
111+
"2.5": 356,
112+
"2.6": 361,
113+
"3.14": 745,
114+
}
115+
pep0_writer = writer.PEPZeroWriter(release_peps=release_peps)
116+
117+
# Act
118+
pep0_writer.emit_pep_row(
119+
shorthand="Active",
120+
number=999,
121+
title="Test PEP",
122+
authors="Test Author",
123+
python_version=python_version,
124+
)
125+
126+
# Assert
127+
assert expected in pep0_writer.output

0 commit comments

Comments
 (0)