Skip to content

Commit 7dc6acc

Browse files
hugovkStanFromIrelandmerwok
authored
[3.13] gh-84232: Fix pydoc docs.python.org link generation (GH-139995) (#143099)
Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Éric <merwok@netwok.org>
1 parent a9a8ca3 commit 7dc6acc

File tree

8 files changed

+395
-7
lines changed

8 files changed

+395
-7
lines changed

.gitattributes

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ Include/opcode.h generated
8080
Include/opcode_ids.h generated
8181
Include/token.h generated
8282
Lib/_opcode_metadata.py generated
83-
Lib/keyword.py generated
8483
Lib/idlelib/help.html generated
84+
Lib/keyword.py generated
85+
Lib/pydoc_data/topics.py generated
86+
Lib/pydoc_data/module_docs.py generated
8587
Lib/test/certdata/*.pem generated
8688
Lib/test/certdata/*.0 generated
8789
Lib/test/levenshtein_examples.json generated

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ repos:
2828
files: ^Tools/wasm/
2929
- id: ruff-format
3030
name: Run Ruff (format) on Doc/
31-
args: [--check]
31+
args: [--exit-non-zero-on-fix]
3232
files: ^Doc/
3333
- id: ruff-format
3434
name: Run Ruff (format) on Tools/wasm/
35-
args: [--check, --config=Tools/wasm/.ruff.toml]
35+
args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml]
3636
files: ^Tools/wasm/
3737

3838
- repo: https://github.com/psf/black-pre-commit-mirror

Doc/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ doctest:
140140
pydoc-topics: BUILDER = pydoc-topics
141141
pydoc-topics: build
142142
@echo "Building finished; now run this:" \
143-
"cp build/pydoc-topics/topics.py ../Lib/pydoc_data/topics.py"
143+
"cp build/pydoc-topics/topics.py ../Lib/pydoc_data/topics.py" \
144+
"&& cp build/pydoc-topics/module_docs.py ../Lib/pydoc_data/module_docs.py"
144145

145146
.PHONY: gettext
146147
gettext: BUILDER = gettext

Doc/tools/extensions/pydoc_topics.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class PydocTopicsBuilder(TextBuilder):
109109
def init(self) -> None:
110110
super().init()
111111
self.topics: dict[str, str] = {}
112+
self.module_docs: dict[str, str] = {}
112113

113114
def get_outdated_docs(self) -> str:
114115
# Return a string describing what an update build will build.
@@ -130,6 +131,15 @@ def write_documents(self, _docnames: Set[str]) -> None:
130131
continue
131132
doc_labels.setdefault(docname, []).append((topic_label, label_id))
132133

134+
py_domain = env.domains['py']
135+
for module_name, module_info in py_domain.data['modules'].items():
136+
docname = module_info[0]
137+
if docname.startswith('library/'):
138+
doc_file = docname.replace('library/', '')
139+
self.module_docs[module_name] = (
140+
f"{doc_file}#module-{module_name}"
141+
)
142+
133143
for docname, label_ids in status_iterator(
134144
doc_labels.items(),
135145
"building topics... ",
@@ -161,6 +171,22 @@ def finish(self) -> None:
161171
"""
162172
self.outdir.joinpath("topics.py").write_text(topics, encoding="utf-8")
163173

174+
module_docs_repr = "\n".join(
175+
f" '{module}': '{doc_file}',"
176+
for module, doc_file in sorted(self.module_docs.items())
177+
)
178+
module_docs = f"""\
179+
# Autogenerated by Sphinx on {asctime()}
180+
# as part of the release process.
181+
182+
module_docs = {{
183+
{module_docs_repr}
184+
}}
185+
"""
186+
self.outdir.joinpath("module_docs.py").write_text(
187+
module_docs, encoding="utf-8"
188+
)
189+
164190

165191
def _display_labels(item: tuple[str, Sequence[tuple[str, str]]]) -> str:
166192
_docname, label_ids = item

Lib/pydoc.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,10 +574,20 @@ def getdocloc(self, object, basedir=sysconfig.get_path('stdlib')):
574574
(file.startswith(basedir) and
575575
not file.startswith(os.path.join(basedir, 'site-packages')))) and
576576
object.__name__ not in ('xml.etree', 'test.test_pydoc.pydoc_mod')):
577-
if docloc.startswith(("http://", "https://")):
578-
docloc = "{}/{}.html".format(docloc.rstrip("/"), object.__name__.lower())
577+
578+
try:
579+
from pydoc_data import module_docs
580+
except ImportError:
581+
module_docs = None
582+
583+
if module_docs and object.__name__ in module_docs.module_docs:
584+
doc_name = module_docs.module_docs[object.__name__]
585+
if docloc.startswith(("http://", "https://")):
586+
docloc = "{}/{}".format(docloc.rstrip("/"), doc_name)
587+
else:
588+
docloc = os.path.join(docloc, doc_name)
579589
else:
580-
docloc = os.path.join(docloc, object.__name__.lower() + ".html")
590+
docloc = None
581591
else:
582592
docloc = None
583593
return docloc

0 commit comments

Comments
 (0)