Skip to content

Commit da40768

Browse files
Commit
1 parent a18843d commit da40768

File tree

6 files changed

+390
-4
lines changed

6 files changed

+390
-4
lines changed

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+
doc_file + f"#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
@@ -579,10 +579,20 @@ def getdocloc(self, object, basedir=sysconfig.get_path('stdlib')):
579579
(file.startswith(basedir) and
580580
not file.startswith(os.path.join(basedir, 'site-packages')))) and
581581
object.__name__ not in ('xml.etree', 'test.test_pydoc.pydoc_mod')):
582-
if docloc.startswith(("http://", "https://")):
583-
docloc = "{}/{}.html".format(docloc.rstrip("/"), object.__name__.lower())
582+
583+
try:
584+
from pydoc_data import module_docs
585+
except ImportError:
586+
module_docs = None
587+
588+
if object.__name__ in module_docs.module_docs:
589+
doc_name = module_docs.module_docs[object.__name__]
590+
if docloc.startswith(("http://", "https://")):
591+
docloc = "{}/{}".format(docloc.rstrip("/"), doc_name)
592+
else:
593+
docloc = os.path.join(docloc, doc_name)
584594
else:
585-
docloc = os.path.join(docloc, object.__name__.lower() + ".html")
595+
docloc = None
586596
else:
587597
docloc = None
588598
return docloc

0 commit comments

Comments
 (0)