Sphinx 8.1.2__py3-none-any.whl → 8.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +8 -4
- sphinx/__main__.py +2 -0
- sphinx/_cli/__init__.py +2 -5
- sphinx/_cli/util/colour.py +34 -11
- sphinx/_cli/util/errors.py +128 -61
- sphinx/addnodes.py +51 -35
- sphinx/application.py +362 -230
- sphinx/builders/__init__.py +87 -64
- sphinx/builders/_epub_base.py +65 -56
- sphinx/builders/changes.py +17 -23
- sphinx/builders/dirhtml.py +8 -13
- sphinx/builders/epub3.py +70 -38
- sphinx/builders/gettext.py +93 -73
- sphinx/builders/html/__init__.py +240 -186
- sphinx/builders/html/_assets.py +9 -2
- sphinx/builders/html/_build_info.py +3 -0
- sphinx/builders/latex/__init__.py +64 -54
- sphinx/builders/latex/constants.py +14 -11
- sphinx/builders/latex/nodes.py +2 -0
- sphinx/builders/latex/theming.py +8 -9
- sphinx/builders/latex/transforms.py +7 -5
- sphinx/builders/linkcheck.py +193 -149
- sphinx/builders/manpage.py +17 -17
- sphinx/builders/singlehtml.py +28 -16
- sphinx/builders/texinfo.py +28 -21
- sphinx/builders/text.py +10 -15
- sphinx/builders/xml.py +10 -19
- sphinx/cmd/build.py +49 -119
- sphinx/cmd/make_mode.py +35 -31
- sphinx/cmd/quickstart.py +78 -62
- sphinx/config.py +265 -163
- sphinx/directives/__init__.py +51 -54
- sphinx/directives/admonitions.py +107 -0
- sphinx/directives/code.py +24 -19
- sphinx/directives/other.py +21 -42
- sphinx/directives/patches.py +28 -16
- sphinx/domains/__init__.py +54 -31
- sphinx/domains/_domains_container.py +22 -17
- sphinx/domains/_index.py +5 -8
- sphinx/domains/c/__init__.py +366 -245
- sphinx/domains/c/_ast.py +378 -256
- sphinx/domains/c/_ids.py +89 -31
- sphinx/domains/c/_parser.py +283 -214
- sphinx/domains/c/_symbol.py +269 -198
- sphinx/domains/changeset.py +39 -24
- sphinx/domains/citation.py +54 -24
- sphinx/domains/cpp/__init__.py +517 -362
- sphinx/domains/cpp/_ast.py +999 -682
- sphinx/domains/cpp/_ids.py +133 -65
- sphinx/domains/cpp/_parser.py +746 -588
- sphinx/domains/cpp/_symbol.py +692 -489
- sphinx/domains/index.py +10 -8
- sphinx/domains/javascript.py +152 -74
- sphinx/domains/math.py +50 -40
- sphinx/domains/python/__init__.py +402 -211
- sphinx/domains/python/_annotations.py +134 -61
- sphinx/domains/python/_object.py +155 -68
- sphinx/domains/rst.py +94 -49
- sphinx/domains/std/__init__.py +510 -249
- sphinx/environment/__init__.py +345 -61
- sphinx/environment/adapters/asset.py +7 -1
- sphinx/environment/adapters/indexentries.py +15 -20
- sphinx/environment/adapters/toctree.py +19 -9
- sphinx/environment/collectors/__init__.py +3 -1
- sphinx/environment/collectors/asset.py +18 -15
- sphinx/environment/collectors/dependencies.py +8 -10
- sphinx/environment/collectors/metadata.py +6 -4
- sphinx/environment/collectors/title.py +3 -1
- sphinx/environment/collectors/toctree.py +4 -4
- sphinx/errors.py +1 -3
- sphinx/events.py +4 -4
- sphinx/ext/apidoc/__init__.py +66 -0
- sphinx/ext/apidoc/__main__.py +9 -0
- sphinx/ext/apidoc/_cli.py +356 -0
- sphinx/ext/apidoc/_extension.py +262 -0
- sphinx/ext/apidoc/_generate.py +356 -0
- sphinx/ext/apidoc/_shared.py +99 -0
- sphinx/ext/autodoc/__init__.py +837 -483
- sphinx/ext/autodoc/directive.py +57 -21
- sphinx/ext/autodoc/importer.py +184 -67
- sphinx/ext/autodoc/mock.py +25 -10
- sphinx/ext/autodoc/preserve_defaults.py +17 -9
- sphinx/ext/autodoc/type_comment.py +56 -29
- sphinx/ext/autodoc/typehints.py +49 -26
- sphinx/ext/autosectionlabel.py +28 -11
- sphinx/ext/autosummary/__init__.py +281 -142
- sphinx/ext/autosummary/generate.py +121 -51
- sphinx/ext/coverage.py +152 -91
- sphinx/ext/doctest.py +169 -101
- sphinx/ext/duration.py +12 -6
- sphinx/ext/extlinks.py +33 -21
- sphinx/ext/githubpages.py +8 -8
- sphinx/ext/graphviz.py +175 -109
- sphinx/ext/ifconfig.py +11 -6
- sphinx/ext/imgconverter.py +48 -25
- sphinx/ext/imgmath.py +127 -97
- sphinx/ext/inheritance_diagram.py +177 -103
- sphinx/ext/intersphinx/__init__.py +22 -13
- sphinx/ext/intersphinx/__main__.py +3 -1
- sphinx/ext/intersphinx/_cli.py +18 -14
- sphinx/ext/intersphinx/_load.py +91 -82
- sphinx/ext/intersphinx/_resolve.py +108 -74
- sphinx/ext/intersphinx/_shared.py +2 -2
- sphinx/ext/linkcode.py +28 -12
- sphinx/ext/mathjax.py +60 -29
- sphinx/ext/napoleon/__init__.py +19 -7
- sphinx/ext/napoleon/docstring.py +229 -231
- sphinx/ext/todo.py +44 -49
- sphinx/ext/viewcode.py +105 -57
- sphinx/extension.py +3 -1
- sphinx/highlighting.py +13 -7
- sphinx/io.py +9 -13
- sphinx/jinja2glue.py +29 -26
- sphinx/locale/__init__.py +8 -9
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2155 -2050
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2175 -2070
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +3 -3
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2690 -2585
- sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.js +63 -0
- sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.po +4216 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2096 -1991
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2248 -2143
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2201 -2096
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2282 -2177
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2261 -2156
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2604 -2499
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2631 -2526
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2078 -1973
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2633 -2528
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2449 -2344
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2241 -2136
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +504 -500
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +513 -509
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2644 -2539
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +504 -500
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +501 -497
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2609 -2504
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +499 -495
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2265 -2160
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2621 -2516
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2567 -2462
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2631 -2526
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2214 -2109
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2218 -2113
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2088 -1983
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2247 -2142
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2227 -2122
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2316 -2211
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +2 -2
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2442 -2336
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2657 -2552
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2243 -2138
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2244 -2139
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2660 -2555
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2134 -2029
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2614 -2509
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2167 -2062
- sphinx/locale/sphinx.pot +2069 -1964
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2661 -2556
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2213 -2108
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2229 -2124
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2608 -2503
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2167 -2062
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2204 -2099
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2659 -2554
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2045 -1940
- sphinx/parsers.py +8 -7
- sphinx/project.py +2 -2
- sphinx/pycode/__init__.py +31 -21
- sphinx/pycode/ast.py +6 -3
- sphinx/pycode/parser.py +14 -8
- sphinx/pygments_styles.py +4 -5
- sphinx/registry.py +192 -92
- sphinx/roles.py +58 -7
- sphinx/search/__init__.py +75 -54
- sphinx/search/en.py +11 -13
- sphinx/search/fi.py +1 -1
- sphinx/search/ja.py +8 -6
- sphinx/search/nl.py +1 -1
- sphinx/search/zh.py +19 -21
- sphinx/testing/fixtures.py +26 -29
- sphinx/testing/path.py +26 -62
- sphinx/testing/restructuredtext.py +14 -8
- sphinx/testing/util.py +21 -19
- sphinx/texinputs/make.bat.jinja +50 -50
- sphinx/texinputs/sphinx.sty +4 -3
- sphinx/texinputs/sphinxlatexadmonitions.sty +1 -1
- sphinx/texinputs/sphinxlatexobjects.sty +29 -10
- sphinx/themes/basic/static/searchtools.js +8 -5
- sphinx/theming.py +49 -61
- sphinx/transforms/__init__.py +17 -38
- sphinx/transforms/compact_bullet_list.py +5 -3
- sphinx/transforms/i18n.py +8 -21
- sphinx/transforms/post_transforms/__init__.py +142 -93
- sphinx/transforms/post_transforms/code.py +5 -5
- sphinx/transforms/post_transforms/images.py +28 -24
- sphinx/transforms/references.py +3 -1
- sphinx/util/__init__.py +109 -60
- sphinx/util/_files.py +39 -23
- sphinx/util/_importer.py +4 -1
- sphinx/util/_inventory_file_reader.py +76 -0
- sphinx/util/_io.py +2 -2
- sphinx/util/_lines.py +6 -3
- sphinx/util/_pathlib.py +40 -2
- sphinx/util/build_phase.py +2 -0
- sphinx/util/cfamily.py +19 -14
- sphinx/util/console.py +44 -179
- sphinx/util/display.py +9 -10
- sphinx/util/docfields.py +140 -122
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -77
- sphinx/util/fileutil.py +25 -26
- sphinx/util/http_date.py +2 -0
- sphinx/util/i18n.py +77 -64
- sphinx/util/images.py +8 -6
- sphinx/util/inspect.py +147 -38
- sphinx/util/inventory.py +215 -116
- sphinx/util/logging.py +33 -33
- sphinx/util/matching.py +12 -4
- sphinx/util/nodes.py +18 -13
- sphinx/util/osutil.py +38 -39
- sphinx/util/parallel.py +22 -13
- sphinx/util/parsing.py +2 -1
- sphinx/util/png.py +6 -2
- sphinx/util/requests.py +33 -2
- sphinx/util/rst.py +3 -2
- sphinx/util/tags.py +1 -1
- sphinx/util/template.py +18 -10
- sphinx/util/texescape.py +8 -6
- sphinx/util/typing.py +148 -122
- sphinx/versioning.py +3 -3
- sphinx/writers/html.py +3 -1
- sphinx/writers/html5.py +63 -52
- sphinx/writers/latex.py +83 -67
- sphinx/writers/manpage.py +19 -38
- sphinx/writers/texinfo.py +47 -47
- sphinx/writers/text.py +50 -32
- sphinx/writers/xml.py +11 -8
- {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/LICENSE.rst +1 -1
- {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/METADATA +25 -15
- sphinx-8.2.0.dist-info/RECORD +606 -0
- {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/WHEEL +1 -1
- sphinx/builders/html/transforms.py +0 -90
- sphinx/ext/apidoc.py +0 -721
- sphinx/util/exceptions.py +0 -74
- sphinx-8.1.2.dist-info/RECORD +0 -598
- {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/entry_points.txt +0 -0
|
@@ -18,14 +18,12 @@ import argparse
|
|
|
18
18
|
import importlib
|
|
19
19
|
import inspect
|
|
20
20
|
import locale
|
|
21
|
-
import os
|
|
22
21
|
import pkgutil
|
|
23
22
|
import pydoc
|
|
24
23
|
import re
|
|
25
24
|
import sys
|
|
26
|
-
from os import path
|
|
27
25
|
from pathlib import Path
|
|
28
|
-
from typing import TYPE_CHECKING,
|
|
26
|
+
from typing import TYPE_CHECKING, NamedTuple
|
|
29
27
|
|
|
30
28
|
from jinja2 import TemplateNotFound
|
|
31
29
|
from jinja2.sandbox import SandboxedEnvironment
|
|
@@ -38,7 +36,7 @@ from sphinx.errors import PycodeError
|
|
|
38
36
|
from sphinx.ext.autodoc.importer import import_module
|
|
39
37
|
from sphinx.ext.autosummary import (
|
|
40
38
|
ImportExceptionGroup,
|
|
41
|
-
|
|
39
|
+
_get_documenter,
|
|
42
40
|
import_by_name,
|
|
43
41
|
import_ivar_by_name,
|
|
44
42
|
)
|
|
@@ -46,28 +44,38 @@ from sphinx.locale import __
|
|
|
46
44
|
from sphinx.pycode import ModuleAnalyzer
|
|
47
45
|
from sphinx.registry import SphinxComponentRegistry
|
|
48
46
|
from sphinx.util import logging, rst
|
|
47
|
+
from sphinx.util._pathlib import _StrPath
|
|
49
48
|
from sphinx.util.inspect import getall, safe_getattr
|
|
50
49
|
from sphinx.util.osutil import ensuredir
|
|
51
50
|
from sphinx.util.template import SphinxTemplateLoader
|
|
52
51
|
|
|
53
52
|
if TYPE_CHECKING:
|
|
53
|
+
import os
|
|
54
54
|
from collections.abc import Sequence, Set
|
|
55
55
|
from gettext import NullTranslations
|
|
56
|
+
from typing import Any
|
|
56
57
|
|
|
57
58
|
from sphinx.application import Sphinx
|
|
59
|
+
from sphinx.events import EventManager
|
|
58
60
|
from sphinx.ext.autodoc import Documenter
|
|
59
61
|
|
|
60
62
|
logger = logging.getLogger(__name__)
|
|
61
63
|
|
|
62
64
|
|
|
65
|
+
class _DummyEvents:
|
|
66
|
+
def emit_firstresult(self, *args: Any) -> None:
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
|
|
63
70
|
class DummyApplication:
|
|
64
71
|
"""Dummy Application class for sphinx-autogen command."""
|
|
65
72
|
|
|
66
73
|
def __init__(self, translator: NullTranslations) -> None:
|
|
67
74
|
self.config = Config()
|
|
75
|
+
self.events = _DummyEvents()
|
|
68
76
|
self.registry = SphinxComponentRegistry()
|
|
69
77
|
self.messagelog: list[str] = []
|
|
70
|
-
self.srcdir = '/'
|
|
78
|
+
self.srcdir = _StrPath('/')
|
|
71
79
|
self.translator = translator
|
|
72
80
|
self.verbosity = 0
|
|
73
81
|
self._warncount = 0
|
|
@@ -88,7 +96,7 @@ class AutosummaryEntry(NamedTuple):
|
|
|
88
96
|
recursive: bool
|
|
89
97
|
|
|
90
98
|
|
|
91
|
-
def setup_documenters(app:
|
|
99
|
+
def setup_documenters(app: Sphinx) -> None:
|
|
92
100
|
from sphinx.ext.autodoc import (
|
|
93
101
|
AttributeDocumenter,
|
|
94
102
|
ClassDocumenter,
|
|
@@ -129,10 +137,10 @@ class AutosummaryRenderer:
|
|
|
129
137
|
def __init__(self, app: Sphinx) -> None:
|
|
130
138
|
if isinstance(app, Builder):
|
|
131
139
|
msg = 'Expected a Sphinx application object!'
|
|
132
|
-
raise
|
|
140
|
+
raise TypeError(msg)
|
|
133
141
|
|
|
134
142
|
system_templates_path = [
|
|
135
|
-
|
|
143
|
+
package_dir.joinpath('ext', 'autosummary', 'templates')
|
|
136
144
|
]
|
|
137
145
|
loader = SphinxTemplateLoader(
|
|
138
146
|
app.srcdir, app.config.templates_path, system_templates_path
|
|
@@ -197,16 +205,25 @@ def _split_full_qualified_name(name: str) -> tuple[str | None, str]:
|
|
|
197
205
|
|
|
198
206
|
|
|
199
207
|
class ModuleScanner:
|
|
200
|
-
def __init__(
|
|
201
|
-
self
|
|
208
|
+
def __init__(
|
|
209
|
+
self,
|
|
210
|
+
obj: Any,
|
|
211
|
+
*,
|
|
212
|
+
config: Config,
|
|
213
|
+
events: EventManager,
|
|
214
|
+
registry: SphinxComponentRegistry,
|
|
215
|
+
) -> None:
|
|
216
|
+
self.config = config
|
|
217
|
+
self.events = events
|
|
218
|
+
self.registry = registry
|
|
202
219
|
self.object = obj
|
|
203
220
|
|
|
204
221
|
def get_object_type(self, name: str, value: Any) -> str:
|
|
205
|
-
return
|
|
222
|
+
return _get_documenter(value, self.object, registry=self.registry).objtype
|
|
206
223
|
|
|
207
224
|
def is_skipped(self, name: str, value: Any, objtype: str) -> bool:
|
|
208
225
|
try:
|
|
209
|
-
return self.
|
|
226
|
+
return self.events.emit_firstresult(
|
|
210
227
|
'autodoc-skip-member', objtype, name, value, False, {}
|
|
211
228
|
)
|
|
212
229
|
except Exception as exc:
|
|
@@ -229,7 +246,7 @@ class ModuleScanner:
|
|
|
229
246
|
except PycodeError:
|
|
230
247
|
attr_docs = {}
|
|
231
248
|
|
|
232
|
-
for name in members_of(self.object, self.
|
|
249
|
+
for name in members_of(self.object, config=self.config):
|
|
233
250
|
try:
|
|
234
251
|
value = safe_getattr(self.object, name)
|
|
235
252
|
except AttributeError:
|
|
@@ -251,7 +268,7 @@ class ModuleScanner:
|
|
|
251
268
|
except AttributeError:
|
|
252
269
|
imported = False
|
|
253
270
|
|
|
254
|
-
respect_module_all = not self.
|
|
271
|
+
respect_module_all = not self.config.autosummary_ignore_module_all
|
|
255
272
|
if (
|
|
256
273
|
# list all members up
|
|
257
274
|
imported_members
|
|
@@ -265,15 +282,19 @@ class ModuleScanner:
|
|
|
265
282
|
return members
|
|
266
283
|
|
|
267
284
|
|
|
268
|
-
def members_of(obj: Any,
|
|
285
|
+
def members_of(obj: Any, *, config: Config) -> Sequence[str]:
|
|
269
286
|
"""Get the members of ``obj``, possibly ignoring the ``__all__`` module attribute
|
|
270
287
|
|
|
271
|
-
Follows the ``
|
|
288
|
+
Follows the ``config.autosummary_ignore_module_all`` setting.
|
|
272
289
|
"""
|
|
273
|
-
if
|
|
290
|
+
if config.autosummary_ignore_module_all:
|
|
274
291
|
return dir(obj)
|
|
275
292
|
else:
|
|
276
|
-
|
|
293
|
+
if (obj___all__ := getall(obj)) is not None:
|
|
294
|
+
# return __all__, even if empty.
|
|
295
|
+
return obj___all__
|
|
296
|
+
# if __all__ is not set, return dir(obj)
|
|
297
|
+
return dir(obj)
|
|
277
298
|
|
|
278
299
|
|
|
279
300
|
def generate_autosummary_content(
|
|
@@ -283,34 +304,55 @@ def generate_autosummary_content(
|
|
|
283
304
|
template: AutosummaryRenderer,
|
|
284
305
|
template_name: str,
|
|
285
306
|
imported_members: bool,
|
|
286
|
-
app: Any,
|
|
287
307
|
recursive: bool,
|
|
288
308
|
context: dict[str, Any],
|
|
289
309
|
modname: str | None = None,
|
|
290
310
|
qualname: str | None = None,
|
|
311
|
+
*,
|
|
312
|
+
config: Config,
|
|
313
|
+
events: EventManager,
|
|
314
|
+
registry: SphinxComponentRegistry,
|
|
291
315
|
) -> str:
|
|
292
|
-
doc =
|
|
316
|
+
doc = _get_documenter(obj, parent, registry=registry)
|
|
293
317
|
|
|
294
318
|
ns: dict[str, Any] = {}
|
|
295
319
|
ns.update(context)
|
|
296
320
|
|
|
297
321
|
if doc.objtype == 'module':
|
|
298
|
-
scanner = ModuleScanner(
|
|
322
|
+
scanner = ModuleScanner(obj, config=config, events=events, registry=registry)
|
|
299
323
|
ns['members'] = scanner.scan(imported_members)
|
|
300
324
|
|
|
301
|
-
respect_module_all = not
|
|
325
|
+
respect_module_all = not config.autosummary_ignore_module_all
|
|
302
326
|
imported_members = imported_members or (
|
|
303
327
|
'__all__' in dir(obj) and respect_module_all
|
|
304
328
|
)
|
|
305
329
|
|
|
306
330
|
ns['functions'], ns['all_functions'] = _get_members(
|
|
307
|
-
doc,
|
|
331
|
+
doc,
|
|
332
|
+
obj,
|
|
333
|
+
{'function'},
|
|
334
|
+
config=config,
|
|
335
|
+
events=events,
|
|
336
|
+
registry=registry,
|
|
337
|
+
imported=imported_members,
|
|
308
338
|
)
|
|
309
339
|
ns['classes'], ns['all_classes'] = _get_members(
|
|
310
|
-
doc,
|
|
340
|
+
doc,
|
|
341
|
+
obj,
|
|
342
|
+
{'class'},
|
|
343
|
+
config=config,
|
|
344
|
+
events=events,
|
|
345
|
+
registry=registry,
|
|
346
|
+
imported=imported_members,
|
|
311
347
|
)
|
|
312
348
|
ns['exceptions'], ns['all_exceptions'] = _get_members(
|
|
313
|
-
doc,
|
|
349
|
+
doc,
|
|
350
|
+
obj,
|
|
351
|
+
{'exception'},
|
|
352
|
+
config=config,
|
|
353
|
+
events=events,
|
|
354
|
+
registry=registry,
|
|
355
|
+
imported=imported_members,
|
|
314
356
|
)
|
|
315
357
|
ns['attributes'], ns['all_attributes'] = _get_module_attrs(name, ns['members'])
|
|
316
358
|
ispackage = hasattr(obj, '__path__')
|
|
@@ -332,7 +374,13 @@ def generate_autosummary_content(
|
|
|
332
374
|
# Otherwise, use get_modules method normally
|
|
333
375
|
if respect_module_all and '__all__' in dir(obj):
|
|
334
376
|
imported_modules, all_imported_modules = _get_members(
|
|
335
|
-
doc,
|
|
377
|
+
doc,
|
|
378
|
+
obj,
|
|
379
|
+
{'module'},
|
|
380
|
+
config=config,
|
|
381
|
+
events=events,
|
|
382
|
+
registry=registry,
|
|
383
|
+
imported=True,
|
|
336
384
|
)
|
|
337
385
|
skip += all_imported_modules
|
|
338
386
|
public_members = getall(obj)
|
|
@@ -349,16 +397,27 @@ def generate_autosummary_content(
|
|
|
349
397
|
ns['members'] = dir(obj)
|
|
350
398
|
ns['inherited_members'] = set(dir(obj)) - set(obj.__dict__.keys())
|
|
351
399
|
ns['methods'], ns['all_methods'] = _get_members(
|
|
352
|
-
doc,
|
|
400
|
+
doc,
|
|
401
|
+
obj,
|
|
402
|
+
{'method'},
|
|
403
|
+
config=config,
|
|
404
|
+
events=events,
|
|
405
|
+
registry=registry,
|
|
406
|
+
include_public={'__init__'},
|
|
353
407
|
)
|
|
354
408
|
ns['attributes'], ns['all_attributes'] = _get_members(
|
|
355
|
-
doc,
|
|
409
|
+
doc,
|
|
410
|
+
obj,
|
|
411
|
+
{'attribute', 'property'},
|
|
412
|
+
config=config,
|
|
413
|
+
events=events,
|
|
414
|
+
registry=registry,
|
|
356
415
|
)
|
|
357
416
|
|
|
358
417
|
if modname is None or qualname is None:
|
|
359
418
|
modname, qualname = _split_full_qualified_name(name)
|
|
360
419
|
|
|
361
|
-
if doc.objtype in
|
|
420
|
+
if doc.objtype in {'method', 'attribute', 'property'}:
|
|
362
421
|
ns['class'] = qualname.rsplit('.', 1)[0]
|
|
363
422
|
|
|
364
423
|
if doc.objtype == 'class':
|
|
@@ -380,9 +439,9 @@ def generate_autosummary_content(
|
|
|
380
439
|
return template.render(doc.objtype, ns)
|
|
381
440
|
|
|
382
441
|
|
|
383
|
-
def _skip_member(
|
|
442
|
+
def _skip_member(obj: Any, name: str, objtype: str, *, events: EventManager) -> bool:
|
|
384
443
|
try:
|
|
385
|
-
return
|
|
444
|
+
return events.emit_firstresult(
|
|
386
445
|
'autodoc-skip-member', objtype, name, obj, False, {}
|
|
387
446
|
)
|
|
388
447
|
except Exception as exc:
|
|
@@ -403,9 +462,9 @@ def _get_class_members(obj: Any) -> dict[str, Any]:
|
|
|
403
462
|
return {name: member.object for name, member in members.items()}
|
|
404
463
|
|
|
405
464
|
|
|
406
|
-
def _get_module_members(
|
|
465
|
+
def _get_module_members(obj: Any, *, config: Config) -> dict[str, Any]:
|
|
407
466
|
members = {}
|
|
408
|
-
for name in members_of(obj,
|
|
467
|
+
for name in members_of(obj, config=config):
|
|
409
468
|
try:
|
|
410
469
|
members[name] = safe_getattr(obj, name)
|
|
411
470
|
except AttributeError:
|
|
@@ -413,9 +472,11 @@ def _get_module_members(app: Sphinx, obj: Any) -> dict[str, Any]:
|
|
|
413
472
|
return members
|
|
414
473
|
|
|
415
474
|
|
|
416
|
-
def _get_all_members(
|
|
475
|
+
def _get_all_members(
|
|
476
|
+
doc: type[Documenter], obj: Any, *, config: Config
|
|
477
|
+
) -> dict[str, Any]:
|
|
417
478
|
if doc.objtype == 'module':
|
|
418
|
-
return _get_module_members(
|
|
479
|
+
return _get_module_members(obj, config=config)
|
|
419
480
|
elif doc.objtype == 'class':
|
|
420
481
|
return _get_class_members(obj)
|
|
421
482
|
return {}
|
|
@@ -423,23 +484,25 @@ def _get_all_members(doc: type[Documenter], app: Sphinx, obj: Any) -> dict[str,
|
|
|
423
484
|
|
|
424
485
|
def _get_members(
|
|
425
486
|
doc: type[Documenter],
|
|
426
|
-
app: Sphinx,
|
|
427
487
|
obj: Any,
|
|
428
488
|
types: set[str],
|
|
429
489
|
*,
|
|
490
|
+
config: Config,
|
|
491
|
+
events: EventManager,
|
|
492
|
+
registry: SphinxComponentRegistry,
|
|
430
493
|
include_public: Set[str] = frozenset(),
|
|
431
494
|
imported: bool = True,
|
|
432
495
|
) -> tuple[list[str], list[str]]:
|
|
433
496
|
items: list[str] = []
|
|
434
497
|
public: list[str] = []
|
|
435
498
|
|
|
436
|
-
all_members = _get_all_members(doc,
|
|
499
|
+
all_members = _get_all_members(doc, obj, config=config)
|
|
437
500
|
for name, value in all_members.items():
|
|
438
|
-
documenter =
|
|
501
|
+
documenter = _get_documenter(value, obj, registry=registry)
|
|
439
502
|
if documenter.objtype in types:
|
|
440
503
|
# skip imported members if expected
|
|
441
504
|
if imported or getattr(value, '__module__', None) == obj.__name__:
|
|
442
|
-
skipped = _skip_member(
|
|
505
|
+
skipped = _skip_member(value, name, documenter.objtype, events=events)
|
|
443
506
|
if skipped is True:
|
|
444
507
|
pass
|
|
445
508
|
elif skipped is False:
|
|
@@ -461,7 +524,7 @@ def _get_module_attrs(name: str, members: Any) -> tuple[list[str], list[str]]:
|
|
|
461
524
|
analyzer = ModuleAnalyzer.for_module(name)
|
|
462
525
|
attr_docs = analyzer.find_attr_docs()
|
|
463
526
|
for namespace, attr_name in attr_docs:
|
|
464
|
-
if namespace
|
|
527
|
+
if not namespace and attr_name in members:
|
|
465
528
|
attrs.append(attr_name)
|
|
466
529
|
if not attr_name.startswith('_'):
|
|
467
530
|
public.append(attr_name)
|
|
@@ -529,12 +592,15 @@ def generate_autosummary_docs(
|
|
|
529
592
|
logger.info(__('[autosummary] writing to %s'), output_dir)
|
|
530
593
|
|
|
531
594
|
if base_path is not None:
|
|
532
|
-
|
|
595
|
+
base_path = Path(base_path)
|
|
596
|
+
source_paths = [base_path / filename for filename in sources]
|
|
597
|
+
else:
|
|
598
|
+
source_paths = list(map(Path, sources))
|
|
533
599
|
|
|
534
600
|
template = AutosummaryRenderer(app)
|
|
535
601
|
|
|
536
602
|
# read
|
|
537
|
-
items = find_autosummary_in_files(
|
|
603
|
+
items = find_autosummary_in_files(source_paths)
|
|
538
604
|
|
|
539
605
|
# keep track of new files
|
|
540
606
|
new_files: list[Path] = []
|
|
@@ -549,7 +615,7 @@ def generate_autosummary_docs(
|
|
|
549
615
|
# a :toctree: option
|
|
550
616
|
continue
|
|
551
617
|
|
|
552
|
-
path = output_dir or
|
|
618
|
+
path = output_dir or Path(entry.path).resolve()
|
|
553
619
|
ensuredir(path)
|
|
554
620
|
|
|
555
621
|
try:
|
|
@@ -583,11 +649,13 @@ def generate_autosummary_docs(
|
|
|
583
649
|
template,
|
|
584
650
|
entry.template,
|
|
585
651
|
imported_members,
|
|
586
|
-
app,
|
|
587
652
|
entry.recursive,
|
|
588
653
|
context,
|
|
589
654
|
modname,
|
|
590
655
|
qualname,
|
|
656
|
+
config=app.config,
|
|
657
|
+
events=app.events,
|
|
658
|
+
registry=app.registry,
|
|
591
659
|
)
|
|
592
660
|
|
|
593
661
|
file_path = Path(path, filename_map.get(name, name) + suffix)
|
|
@@ -627,7 +695,9 @@ def generate_autosummary_docs(
|
|
|
627
695
|
# -- Finding documented entries in files ---------------------------------------
|
|
628
696
|
|
|
629
697
|
|
|
630
|
-
def find_autosummary_in_files(
|
|
698
|
+
def find_autosummary_in_files(
|
|
699
|
+
filenames: Sequence[str | os.PathLike[str]],
|
|
700
|
+
) -> list[AutosummaryEntry]:
|
|
631
701
|
"""Find out what items are documented in source/*.rst.
|
|
632
702
|
|
|
633
703
|
See `find_autosummary_in_lines`.
|
|
@@ -636,13 +706,13 @@ def find_autosummary_in_files(filenames: list[str]) -> list[AutosummaryEntry]:
|
|
|
636
706
|
for filename in filenames:
|
|
637
707
|
with open(filename, encoding='utf-8', errors='ignore') as f:
|
|
638
708
|
lines = f.read().splitlines()
|
|
639
|
-
|
|
709
|
+
documented.extend(find_autosummary_in_lines(lines, filename=filename))
|
|
640
710
|
return documented
|
|
641
711
|
|
|
642
712
|
|
|
643
713
|
def find_autosummary_in_docstring(
|
|
644
714
|
name: str,
|
|
645
|
-
filename: str | None = None,
|
|
715
|
+
filename: str | os.PathLike[str] | None = None,
|
|
646
716
|
) -> list[AutosummaryEntry]:
|
|
647
717
|
"""Find out what items are documented in the given object's docstring.
|
|
648
718
|
|
|
@@ -669,7 +739,7 @@ def find_autosummary_in_docstring(
|
|
|
669
739
|
def find_autosummary_in_lines(
|
|
670
740
|
lines: list[str],
|
|
671
741
|
module: str | None = None,
|
|
672
|
-
filename: str | None = None,
|
|
742
|
+
filename: str | os.PathLike[str] | None = None,
|
|
673
743
|
) -> list[AutosummaryEntry]:
|
|
674
744
|
"""Find out what items appear in autosummary:: directives in the
|
|
675
745
|
given lines.
|
|
@@ -709,7 +779,7 @@ def find_autosummary_in_lines(
|
|
|
709
779
|
if m:
|
|
710
780
|
toctree = m.group(1)
|
|
711
781
|
if filename:
|
|
712
|
-
toctree =
|
|
782
|
+
toctree = str(Path(filename).parent / toctree)
|
|
713
783
|
continue
|
|
714
784
|
|
|
715
785
|
m = template_arg_re.match(line)
|
|
@@ -849,11 +919,11 @@ def main(argv: Sequence[str] = (), /) -> None:
|
|
|
849
919
|
|
|
850
920
|
app = DummyApplication(sphinx.locale.get_translator())
|
|
851
921
|
logging.setup(app, sys.stdout, sys.stderr) # type: ignore[arg-type]
|
|
852
|
-
setup_documenters(app)
|
|
922
|
+
setup_documenters(app) # type: ignore[arg-type]
|
|
853
923
|
args = get_parser().parse_args(argv or sys.argv[1:])
|
|
854
924
|
|
|
855
925
|
if args.templates:
|
|
856
|
-
app.config.templates_path.append(
|
|
926
|
+
app.config.templates_path.append(str(Path(args.templates).resolve()))
|
|
857
927
|
app.config.autosummary_ignore_module_all = not args.respect_module_all
|
|
858
928
|
|
|
859
929
|
written_files = generate_autosummary_docs(
|