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.

Files changed (328) hide show
  1. sphinx/__init__.py +8 -4
  2. sphinx/__main__.py +2 -0
  3. sphinx/_cli/__init__.py +2 -5
  4. sphinx/_cli/util/colour.py +34 -11
  5. sphinx/_cli/util/errors.py +128 -61
  6. sphinx/addnodes.py +51 -35
  7. sphinx/application.py +362 -230
  8. sphinx/builders/__init__.py +87 -64
  9. sphinx/builders/_epub_base.py +65 -56
  10. sphinx/builders/changes.py +17 -23
  11. sphinx/builders/dirhtml.py +8 -13
  12. sphinx/builders/epub3.py +70 -38
  13. sphinx/builders/gettext.py +93 -73
  14. sphinx/builders/html/__init__.py +240 -186
  15. sphinx/builders/html/_assets.py +9 -2
  16. sphinx/builders/html/_build_info.py +3 -0
  17. sphinx/builders/latex/__init__.py +64 -54
  18. sphinx/builders/latex/constants.py +14 -11
  19. sphinx/builders/latex/nodes.py +2 -0
  20. sphinx/builders/latex/theming.py +8 -9
  21. sphinx/builders/latex/transforms.py +7 -5
  22. sphinx/builders/linkcheck.py +193 -149
  23. sphinx/builders/manpage.py +17 -17
  24. sphinx/builders/singlehtml.py +28 -16
  25. sphinx/builders/texinfo.py +28 -21
  26. sphinx/builders/text.py +10 -15
  27. sphinx/builders/xml.py +10 -19
  28. sphinx/cmd/build.py +49 -119
  29. sphinx/cmd/make_mode.py +35 -31
  30. sphinx/cmd/quickstart.py +78 -62
  31. sphinx/config.py +265 -163
  32. sphinx/directives/__init__.py +51 -54
  33. sphinx/directives/admonitions.py +107 -0
  34. sphinx/directives/code.py +24 -19
  35. sphinx/directives/other.py +21 -42
  36. sphinx/directives/patches.py +28 -16
  37. sphinx/domains/__init__.py +54 -31
  38. sphinx/domains/_domains_container.py +22 -17
  39. sphinx/domains/_index.py +5 -8
  40. sphinx/domains/c/__init__.py +366 -245
  41. sphinx/domains/c/_ast.py +378 -256
  42. sphinx/domains/c/_ids.py +89 -31
  43. sphinx/domains/c/_parser.py +283 -214
  44. sphinx/domains/c/_symbol.py +269 -198
  45. sphinx/domains/changeset.py +39 -24
  46. sphinx/domains/citation.py +54 -24
  47. sphinx/domains/cpp/__init__.py +517 -362
  48. sphinx/domains/cpp/_ast.py +999 -682
  49. sphinx/domains/cpp/_ids.py +133 -65
  50. sphinx/domains/cpp/_parser.py +746 -588
  51. sphinx/domains/cpp/_symbol.py +692 -489
  52. sphinx/domains/index.py +10 -8
  53. sphinx/domains/javascript.py +152 -74
  54. sphinx/domains/math.py +50 -40
  55. sphinx/domains/python/__init__.py +402 -211
  56. sphinx/domains/python/_annotations.py +134 -61
  57. sphinx/domains/python/_object.py +155 -68
  58. sphinx/domains/rst.py +94 -49
  59. sphinx/domains/std/__init__.py +510 -249
  60. sphinx/environment/__init__.py +345 -61
  61. sphinx/environment/adapters/asset.py +7 -1
  62. sphinx/environment/adapters/indexentries.py +15 -20
  63. sphinx/environment/adapters/toctree.py +19 -9
  64. sphinx/environment/collectors/__init__.py +3 -1
  65. sphinx/environment/collectors/asset.py +18 -15
  66. sphinx/environment/collectors/dependencies.py +8 -10
  67. sphinx/environment/collectors/metadata.py +6 -4
  68. sphinx/environment/collectors/title.py +3 -1
  69. sphinx/environment/collectors/toctree.py +4 -4
  70. sphinx/errors.py +1 -3
  71. sphinx/events.py +4 -4
  72. sphinx/ext/apidoc/__init__.py +66 -0
  73. sphinx/ext/apidoc/__main__.py +9 -0
  74. sphinx/ext/apidoc/_cli.py +356 -0
  75. sphinx/ext/apidoc/_extension.py +262 -0
  76. sphinx/ext/apidoc/_generate.py +356 -0
  77. sphinx/ext/apidoc/_shared.py +99 -0
  78. sphinx/ext/autodoc/__init__.py +837 -483
  79. sphinx/ext/autodoc/directive.py +57 -21
  80. sphinx/ext/autodoc/importer.py +184 -67
  81. sphinx/ext/autodoc/mock.py +25 -10
  82. sphinx/ext/autodoc/preserve_defaults.py +17 -9
  83. sphinx/ext/autodoc/type_comment.py +56 -29
  84. sphinx/ext/autodoc/typehints.py +49 -26
  85. sphinx/ext/autosectionlabel.py +28 -11
  86. sphinx/ext/autosummary/__init__.py +281 -142
  87. sphinx/ext/autosummary/generate.py +121 -51
  88. sphinx/ext/coverage.py +152 -91
  89. sphinx/ext/doctest.py +169 -101
  90. sphinx/ext/duration.py +12 -6
  91. sphinx/ext/extlinks.py +33 -21
  92. sphinx/ext/githubpages.py +8 -8
  93. sphinx/ext/graphviz.py +175 -109
  94. sphinx/ext/ifconfig.py +11 -6
  95. sphinx/ext/imgconverter.py +48 -25
  96. sphinx/ext/imgmath.py +127 -97
  97. sphinx/ext/inheritance_diagram.py +177 -103
  98. sphinx/ext/intersphinx/__init__.py +22 -13
  99. sphinx/ext/intersphinx/__main__.py +3 -1
  100. sphinx/ext/intersphinx/_cli.py +18 -14
  101. sphinx/ext/intersphinx/_load.py +91 -82
  102. sphinx/ext/intersphinx/_resolve.py +108 -74
  103. sphinx/ext/intersphinx/_shared.py +2 -2
  104. sphinx/ext/linkcode.py +28 -12
  105. sphinx/ext/mathjax.py +60 -29
  106. sphinx/ext/napoleon/__init__.py +19 -7
  107. sphinx/ext/napoleon/docstring.py +229 -231
  108. sphinx/ext/todo.py +44 -49
  109. sphinx/ext/viewcode.py +105 -57
  110. sphinx/extension.py +3 -1
  111. sphinx/highlighting.py +13 -7
  112. sphinx/io.py +9 -13
  113. sphinx/jinja2glue.py +29 -26
  114. sphinx/locale/__init__.py +8 -9
  115. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  116. sphinx/locale/ar/LC_MESSAGES/sphinx.po +2155 -2050
  117. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  118. sphinx/locale/bg/LC_MESSAGES/sphinx.po +2045 -1940
  119. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  120. sphinx/locale/bn/LC_MESSAGES/sphinx.po +2175 -2070
  121. sphinx/locale/ca/LC_MESSAGES/sphinx.js +3 -3
  122. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/ca/LC_MESSAGES/sphinx.po +2690 -2585
  124. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.js +63 -0
  125. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.mo +0 -0
  126. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.po +4216 -0
  127. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  128. sphinx/locale/cak/LC_MESSAGES/sphinx.po +2096 -1991
  129. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  130. sphinx/locale/cs/LC_MESSAGES/sphinx.po +2248 -2143
  131. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  132. sphinx/locale/cy/LC_MESSAGES/sphinx.po +2201 -2096
  133. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  134. sphinx/locale/da/LC_MESSAGES/sphinx.po +2282 -2177
  135. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  136. sphinx/locale/de/LC_MESSAGES/sphinx.po +2261 -2156
  137. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  138. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2045 -1940
  139. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  140. sphinx/locale/el/LC_MESSAGES/sphinx.po +2604 -2499
  141. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  142. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2045 -1940
  143. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2045 -1940
  145. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  146. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2631 -2526
  147. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  148. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2045 -1940
  149. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  150. sphinx/locale/eo/LC_MESSAGES/sphinx.po +2078 -1973
  151. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  152. sphinx/locale/es/LC_MESSAGES/sphinx.po +2633 -2528
  153. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  154. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2045 -1940
  155. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  156. sphinx/locale/et/LC_MESSAGES/sphinx.po +2449 -2344
  157. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  158. sphinx/locale/eu/LC_MESSAGES/sphinx.po +2241 -2136
  159. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  160. sphinx/locale/fa/LC_MESSAGES/sphinx.po +504 -500
  161. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  162. sphinx/locale/fi/LC_MESSAGES/sphinx.po +499 -495
  163. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  164. sphinx/locale/fr/LC_MESSAGES/sphinx.po +513 -509
  165. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  166. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +499 -495
  167. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  168. sphinx/locale/gl/LC_MESSAGES/sphinx.po +2644 -2539
  169. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  170. sphinx/locale/he/LC_MESSAGES/sphinx.po +499 -495
  171. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  172. sphinx/locale/hi/LC_MESSAGES/sphinx.po +504 -500
  173. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  174. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +499 -495
  175. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  176. sphinx/locale/hr/LC_MESSAGES/sphinx.po +501 -497
  177. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  178. sphinx/locale/hu/LC_MESSAGES/sphinx.po +499 -495
  179. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  180. sphinx/locale/id/LC_MESSAGES/sphinx.po +2609 -2504
  181. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  182. sphinx/locale/is/LC_MESSAGES/sphinx.po +499 -495
  183. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  184. sphinx/locale/it/LC_MESSAGES/sphinx.po +2265 -2160
  185. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  186. sphinx/locale/ja/LC_MESSAGES/sphinx.po +2621 -2516
  187. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  188. sphinx/locale/ka/LC_MESSAGES/sphinx.po +2567 -2462
  189. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  190. sphinx/locale/ko/LC_MESSAGES/sphinx.po +2631 -2526
  191. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  192. sphinx/locale/lt/LC_MESSAGES/sphinx.po +2214 -2109
  193. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  194. sphinx/locale/lv/LC_MESSAGES/sphinx.po +2218 -2113
  195. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  196. sphinx/locale/mk/LC_MESSAGES/sphinx.po +2088 -1983
  197. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  198. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2247 -2142
  199. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  200. sphinx/locale/ne/LC_MESSAGES/sphinx.po +2227 -2122
  201. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  202. sphinx/locale/nl/LC_MESSAGES/sphinx.po +2316 -2211
  203. sphinx/locale/pl/LC_MESSAGES/sphinx.js +2 -2
  204. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  205. sphinx/locale/pl/LC_MESSAGES/sphinx.po +2442 -2336
  206. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  207. sphinx/locale/pt/LC_MESSAGES/sphinx.po +2045 -1940
  208. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  209. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2657 -2552
  210. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  211. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2243 -2138
  212. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  213. sphinx/locale/ro/LC_MESSAGES/sphinx.po +2244 -2139
  214. sphinx/locale/ru/LC_MESSAGES/sphinx.js +1 -1
  215. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  216. sphinx/locale/ru/LC_MESSAGES/sphinx.po +2660 -2555
  217. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  218. sphinx/locale/si/LC_MESSAGES/sphinx.po +2134 -2029
  219. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  220. sphinx/locale/sk/LC_MESSAGES/sphinx.po +2614 -2509
  221. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  222. sphinx/locale/sl/LC_MESSAGES/sphinx.po +2167 -2062
  223. sphinx/locale/sphinx.pot +2069 -1964
  224. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  225. sphinx/locale/sq/LC_MESSAGES/sphinx.po +2661 -2556
  226. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  227. sphinx/locale/sr/LC_MESSAGES/sphinx.po +2213 -2108
  228. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  229. sphinx/locale/sv/LC_MESSAGES/sphinx.po +2229 -2124
  230. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  231. sphinx/locale/te/LC_MESSAGES/sphinx.po +2045 -1940
  232. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  233. sphinx/locale/tr/LC_MESSAGES/sphinx.po +2608 -2503
  234. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  235. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2167 -2062
  236. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  237. sphinx/locale/ur/LC_MESSAGES/sphinx.po +2045 -1940
  238. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  239. sphinx/locale/vi/LC_MESSAGES/sphinx.po +2204 -2099
  240. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  241. sphinx/locale/yue/LC_MESSAGES/sphinx.po +2045 -1940
  242. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  243. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2045 -1940
  244. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  245. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2659 -2554
  246. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  247. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2045 -1940
  248. sphinx/parsers.py +8 -7
  249. sphinx/project.py +2 -2
  250. sphinx/pycode/__init__.py +31 -21
  251. sphinx/pycode/ast.py +6 -3
  252. sphinx/pycode/parser.py +14 -8
  253. sphinx/pygments_styles.py +4 -5
  254. sphinx/registry.py +192 -92
  255. sphinx/roles.py +58 -7
  256. sphinx/search/__init__.py +75 -54
  257. sphinx/search/en.py +11 -13
  258. sphinx/search/fi.py +1 -1
  259. sphinx/search/ja.py +8 -6
  260. sphinx/search/nl.py +1 -1
  261. sphinx/search/zh.py +19 -21
  262. sphinx/testing/fixtures.py +26 -29
  263. sphinx/testing/path.py +26 -62
  264. sphinx/testing/restructuredtext.py +14 -8
  265. sphinx/testing/util.py +21 -19
  266. sphinx/texinputs/make.bat.jinja +50 -50
  267. sphinx/texinputs/sphinx.sty +4 -3
  268. sphinx/texinputs/sphinxlatexadmonitions.sty +1 -1
  269. sphinx/texinputs/sphinxlatexobjects.sty +29 -10
  270. sphinx/themes/basic/static/searchtools.js +8 -5
  271. sphinx/theming.py +49 -61
  272. sphinx/transforms/__init__.py +17 -38
  273. sphinx/transforms/compact_bullet_list.py +5 -3
  274. sphinx/transforms/i18n.py +8 -21
  275. sphinx/transforms/post_transforms/__init__.py +142 -93
  276. sphinx/transforms/post_transforms/code.py +5 -5
  277. sphinx/transforms/post_transforms/images.py +28 -24
  278. sphinx/transforms/references.py +3 -1
  279. sphinx/util/__init__.py +109 -60
  280. sphinx/util/_files.py +39 -23
  281. sphinx/util/_importer.py +4 -1
  282. sphinx/util/_inventory_file_reader.py +76 -0
  283. sphinx/util/_io.py +2 -2
  284. sphinx/util/_lines.py +6 -3
  285. sphinx/util/_pathlib.py +40 -2
  286. sphinx/util/build_phase.py +2 -0
  287. sphinx/util/cfamily.py +19 -14
  288. sphinx/util/console.py +44 -179
  289. sphinx/util/display.py +9 -10
  290. sphinx/util/docfields.py +140 -122
  291. sphinx/util/docstrings.py +1 -1
  292. sphinx/util/docutils.py +118 -77
  293. sphinx/util/fileutil.py +25 -26
  294. sphinx/util/http_date.py +2 -0
  295. sphinx/util/i18n.py +77 -64
  296. sphinx/util/images.py +8 -6
  297. sphinx/util/inspect.py +147 -38
  298. sphinx/util/inventory.py +215 -116
  299. sphinx/util/logging.py +33 -33
  300. sphinx/util/matching.py +12 -4
  301. sphinx/util/nodes.py +18 -13
  302. sphinx/util/osutil.py +38 -39
  303. sphinx/util/parallel.py +22 -13
  304. sphinx/util/parsing.py +2 -1
  305. sphinx/util/png.py +6 -2
  306. sphinx/util/requests.py +33 -2
  307. sphinx/util/rst.py +3 -2
  308. sphinx/util/tags.py +1 -1
  309. sphinx/util/template.py +18 -10
  310. sphinx/util/texescape.py +8 -6
  311. sphinx/util/typing.py +148 -122
  312. sphinx/versioning.py +3 -3
  313. sphinx/writers/html.py +3 -1
  314. sphinx/writers/html5.py +63 -52
  315. sphinx/writers/latex.py +83 -67
  316. sphinx/writers/manpage.py +19 -38
  317. sphinx/writers/texinfo.py +47 -47
  318. sphinx/writers/text.py +50 -32
  319. sphinx/writers/xml.py +11 -8
  320. {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/LICENSE.rst +1 -1
  321. {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/METADATA +25 -15
  322. sphinx-8.2.0.dist-info/RECORD +606 -0
  323. {sphinx-8.1.2.dist-info → sphinx-8.2.0.dist-info}/WHEEL +1 -1
  324. sphinx/builders/html/transforms.py +0 -90
  325. sphinx/ext/apidoc.py +0 -721
  326. sphinx/util/exceptions.py +0 -74
  327. sphinx-8.1.2.dist-info/RECORD +0 -598
  328. {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, Any, NamedTuple
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
- get_documenter,
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: Any) -> None:
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 ValueError(msg)
140
+ raise TypeError(msg)
133
141
 
134
142
  system_templates_path = [
135
- os.path.join(package_dir, 'ext', 'autosummary', 'templates')
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__(self, app: Any, obj: Any) -> None:
201
- self.app = app
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 get_documenter(self.app, value, self.object).objtype
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.app.emit_firstresult(
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.app.config):
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.app.config.autosummary_ignore_module_all
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, conf: Config) -> Sequence[str]:
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 ``conf.autosummary_ignore_module_all`` setting.
288
+ Follows the ``config.autosummary_ignore_module_all`` setting.
272
289
  """
273
- if conf.autosummary_ignore_module_all:
290
+ if config.autosummary_ignore_module_all:
274
291
  return dir(obj)
275
292
  else:
276
- return getall(obj) or dir(obj)
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 = get_documenter(app, obj, parent)
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(app, obj)
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 app.config.autosummary_ignore_module_all
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, app, obj, {'function'}, imported=imported_members
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, app, obj, {'class'}, imported=imported_members
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, app, obj, {'exception'}, imported=imported_members
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, app, obj, {'module'}, imported=True
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, app, obj, {'method'}, include_public={'__init__'}
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, app, obj, {'attribute', 'property'}
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 ('method', 'attribute', 'property'):
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(app: Sphinx, obj: Any, name: str, objtype: str) -> bool:
442
+ def _skip_member(obj: Any, name: str, objtype: str, *, events: EventManager) -> bool:
384
443
  try:
385
- return app.emit_firstresult(
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(app: Sphinx, obj: Any) -> dict[str, Any]:
465
+ def _get_module_members(obj: Any, *, config: Config) -> dict[str, Any]:
407
466
  members = {}
408
- for name in members_of(obj, app.config):
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(doc: type[Documenter], app: Sphinx, obj: Any) -> dict[str, Any]:
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(app, obj)
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, app, obj)
499
+ all_members = _get_all_members(doc, obj, config=config)
437
500
  for name, value in all_members.items():
438
- documenter = get_documenter(app, value, obj)
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(app, value, name, documenter.objtype)
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 == '' and attr_name in members:
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
- sources = [os.path.join(base_path, filename) for filename in sources]
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(sources)
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 os.path.abspath(entry.path)
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(filenames: list[str]) -> list[AutosummaryEntry]:
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
- documented.extend(find_autosummary_in_lines(lines, filename=filename))
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 = os.path.join(os.path.dirname(filename), 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(path.abspath(args.templates))
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(