Sphinx 8.1.3__py3-none-any.whl → 8.2.0rc1__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 (193) 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 +48 -40
  55. sphinx/domains/python/__init__.py +402 -211
  56. sphinx/domains/python/_annotations.py +114 -57
  57. sphinx/domains/python/_object.py +151 -67
  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 +21 -0
  73. sphinx/ext/apidoc/__main__.py +9 -0
  74. sphinx/ext/apidoc/_cli.py +356 -0
  75. sphinx/ext/apidoc/_generate.py +356 -0
  76. sphinx/ext/apidoc/_shared.py +66 -0
  77. sphinx/ext/autodoc/__init__.py +829 -480
  78. sphinx/ext/autodoc/directive.py +57 -21
  79. sphinx/ext/autodoc/importer.py +184 -67
  80. sphinx/ext/autodoc/mock.py +25 -10
  81. sphinx/ext/autodoc/preserve_defaults.py +17 -9
  82. sphinx/ext/autodoc/type_comment.py +56 -29
  83. sphinx/ext/autodoc/typehints.py +49 -26
  84. sphinx/ext/autosectionlabel.py +28 -11
  85. sphinx/ext/autosummary/__init__.py +271 -143
  86. sphinx/ext/autosummary/generate.py +121 -51
  87. sphinx/ext/coverage.py +152 -91
  88. sphinx/ext/doctest.py +169 -101
  89. sphinx/ext/duration.py +12 -6
  90. sphinx/ext/extlinks.py +33 -21
  91. sphinx/ext/githubpages.py +8 -8
  92. sphinx/ext/graphviz.py +175 -109
  93. sphinx/ext/ifconfig.py +11 -6
  94. sphinx/ext/imgconverter.py +48 -25
  95. sphinx/ext/imgmath.py +127 -97
  96. sphinx/ext/inheritance_diagram.py +177 -103
  97. sphinx/ext/intersphinx/__init__.py +22 -13
  98. sphinx/ext/intersphinx/__main__.py +3 -1
  99. sphinx/ext/intersphinx/_cli.py +18 -14
  100. sphinx/ext/intersphinx/_load.py +91 -82
  101. sphinx/ext/intersphinx/_resolve.py +108 -74
  102. sphinx/ext/intersphinx/_shared.py +2 -2
  103. sphinx/ext/linkcode.py +28 -12
  104. sphinx/ext/mathjax.py +60 -29
  105. sphinx/ext/napoleon/__init__.py +19 -7
  106. sphinx/ext/napoleon/docstring.py +229 -231
  107. sphinx/ext/todo.py +44 -49
  108. sphinx/ext/viewcode.py +105 -57
  109. sphinx/extension.py +3 -1
  110. sphinx/highlighting.py +13 -7
  111. sphinx/io.py +9 -13
  112. sphinx/jinja2glue.py +29 -26
  113. sphinx/locale/__init__.py +8 -9
  114. sphinx/parsers.py +8 -7
  115. sphinx/project.py +2 -2
  116. sphinx/pycode/__init__.py +31 -21
  117. sphinx/pycode/ast.py +6 -3
  118. sphinx/pycode/parser.py +14 -8
  119. sphinx/pygments_styles.py +4 -5
  120. sphinx/registry.py +192 -92
  121. sphinx/roles.py +58 -7
  122. sphinx/search/__init__.py +75 -54
  123. sphinx/search/en.py +11 -13
  124. sphinx/search/fi.py +1 -1
  125. sphinx/search/ja.py +8 -6
  126. sphinx/search/nl.py +1 -1
  127. sphinx/search/zh.py +19 -21
  128. sphinx/testing/fixtures.py +26 -29
  129. sphinx/testing/path.py +26 -62
  130. sphinx/testing/restructuredtext.py +14 -8
  131. sphinx/testing/util.py +21 -19
  132. sphinx/texinputs/make.bat.jinja +50 -50
  133. sphinx/texinputs/sphinx.sty +4 -3
  134. sphinx/texinputs/sphinxlatexadmonitions.sty +1 -1
  135. sphinx/texinputs/sphinxlatexobjects.sty +29 -10
  136. sphinx/themes/basic/static/searchtools.js +8 -5
  137. sphinx/theming.py +49 -61
  138. sphinx/transforms/__init__.py +17 -38
  139. sphinx/transforms/compact_bullet_list.py +5 -3
  140. sphinx/transforms/i18n.py +8 -21
  141. sphinx/transforms/post_transforms/__init__.py +142 -93
  142. sphinx/transforms/post_transforms/code.py +5 -5
  143. sphinx/transforms/post_transforms/images.py +28 -24
  144. sphinx/transforms/references.py +3 -1
  145. sphinx/util/__init__.py +109 -60
  146. sphinx/util/_files.py +39 -23
  147. sphinx/util/_importer.py +4 -1
  148. sphinx/util/_inventory_file_reader.py +76 -0
  149. sphinx/util/_io.py +2 -2
  150. sphinx/util/_lines.py +6 -3
  151. sphinx/util/_pathlib.py +40 -2
  152. sphinx/util/build_phase.py +2 -0
  153. sphinx/util/cfamily.py +19 -14
  154. sphinx/util/console.py +44 -179
  155. sphinx/util/display.py +9 -10
  156. sphinx/util/docfields.py +140 -122
  157. sphinx/util/docstrings.py +1 -1
  158. sphinx/util/docutils.py +118 -77
  159. sphinx/util/fileutil.py +25 -26
  160. sphinx/util/http_date.py +2 -0
  161. sphinx/util/i18n.py +77 -64
  162. sphinx/util/images.py +8 -6
  163. sphinx/util/inspect.py +147 -38
  164. sphinx/util/inventory.py +215 -116
  165. sphinx/util/logging.py +33 -33
  166. sphinx/util/matching.py +12 -4
  167. sphinx/util/nodes.py +18 -13
  168. sphinx/util/osutil.py +38 -39
  169. sphinx/util/parallel.py +22 -13
  170. sphinx/util/parsing.py +2 -1
  171. sphinx/util/png.py +6 -2
  172. sphinx/util/requests.py +33 -2
  173. sphinx/util/rst.py +3 -2
  174. sphinx/util/tags.py +1 -1
  175. sphinx/util/template.py +18 -10
  176. sphinx/util/texescape.py +8 -6
  177. sphinx/util/typing.py +148 -122
  178. sphinx/versioning.py +3 -3
  179. sphinx/writers/html.py +3 -1
  180. sphinx/writers/html5.py +61 -50
  181. sphinx/writers/latex.py +80 -65
  182. sphinx/writers/manpage.py +19 -38
  183. sphinx/writers/texinfo.py +44 -45
  184. sphinx/writers/text.py +48 -30
  185. sphinx/writers/xml.py +11 -8
  186. {sphinx-8.1.3.dist-info → sphinx-8.2.0rc1.dist-info}/LICENSE.rst +1 -1
  187. {sphinx-8.1.3.dist-info → sphinx-8.2.0rc1.dist-info}/METADATA +23 -15
  188. {sphinx-8.1.3.dist-info → sphinx-8.2.0rc1.dist-info}/RECORD +190 -186
  189. {sphinx-8.1.3.dist-info → sphinx-8.2.0rc1.dist-info}/WHEEL +1 -1
  190. sphinx/builders/html/transforms.py +0 -90
  191. sphinx/ext/apidoc.py +0 -721
  192. sphinx/util/exceptions.py +0 -74
  193. {sphinx-8.1.3.dist-info → sphinx-8.2.0rc1.dist-info}/entry_points.txt +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple
5
+ from typing import TYPE_CHECKING, NamedTuple
6
6
 
7
7
  from docutils import nodes
8
8
 
@@ -13,6 +13,7 @@ from sphinx.util.docutils import SphinxDirective
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from collections.abc import Set
16
+ from typing import Any, ClassVar
16
17
 
17
18
  from docutils.nodes import Node
18
19
 
@@ -22,17 +23,17 @@ if TYPE_CHECKING:
22
23
 
23
24
 
24
25
  versionlabels = {
25
- 'versionadded': _('Added in version %s'),
26
+ 'versionadded': _('Added in version %s'),
26
27
  'versionchanged': _('Changed in version %s'),
27
- 'deprecated': _('Deprecated since version %s'),
28
+ 'deprecated': _('Deprecated since version %s'),
28
29
  'versionremoved': _('Removed in version %s'),
29
30
  }
30
31
 
31
32
  versionlabel_classes = {
32
- 'versionadded': 'added',
33
- 'versionchanged': 'changed',
34
- 'deprecated': 'deprecated',
35
- 'versionremoved': 'removed',
33
+ 'versionadded': 'added',
34
+ 'versionchanged': 'changed',
35
+ 'deprecated': 'deprecated',
36
+ 'versionremoved': 'removed',
36
37
  }
37
38
 
38
39
 
@@ -41,14 +42,12 @@ class ChangeSet(NamedTuple):
41
42
  docname: str
42
43
  lineno: int
43
44
  module: str | None
44
- descname: str | None
45
+ descname: str
45
46
  content: str
46
47
 
47
48
 
48
49
  class VersionChange(SphinxDirective):
49
- """
50
- Directive to describe a change/addition/deprecation in a specific version.
51
- """
50
+ """Directive to describe a change/addition/deprecation in a specific version."""
52
51
 
53
52
  has_content = True
54
53
  required_arguments = 1
@@ -64,7 +63,9 @@ class VersionChange(SphinxDirective):
64
63
  node['version'] = self.arguments[0]
65
64
  text = versionlabels[self.name] % self.arguments[0]
66
65
  if len(self.arguments) == 2:
67
- inodes, messages = self.parse_inline(self.arguments[1], lineno=self.lineno + 1)
66
+ inodes, messages = self.parse_inline(
67
+ self.arguments[1], lineno=self.lineno + 1
68
+ )
68
69
  para = nodes.paragraph(self.arguments[1], '', *inodes, translatable=False)
69
70
  self.set_source_info(para)
70
71
  node.append(para)
@@ -81,21 +82,29 @@ class VersionChange(SphinxDirective):
81
82
  content.source = node[0].source
82
83
  content.line = node[0].line
83
84
  content += node[0].children
84
- node[0].replace_self(nodes.paragraph('', '', content, translatable=False))
85
+ node[0].replace_self(
86
+ nodes.paragraph('', '', content, translatable=False)
87
+ )
85
88
 
86
89
  para = node[0]
87
90
  para.insert(0, nodes.inline('', '%s: ' % text, classes=classes))
88
91
  elif len(node) > 0:
89
92
  # the contents do not starts with a paragraph
90
- para = nodes.paragraph('', '',
91
- nodes.inline('', '%s: ' % text, classes=classes),
92
- translatable=False)
93
+ para = nodes.paragraph(
94
+ '',
95
+ '',
96
+ nodes.inline('', '%s: ' % text, classes=classes),
97
+ translatable=False,
98
+ )
93
99
  node.insert(0, para)
94
100
  else:
95
101
  # the contents are empty
96
- para = nodes.paragraph('', '',
97
- nodes.inline('', '%s.' % text, classes=classes),
98
- translatable=False)
102
+ para = nodes.paragraph(
103
+ '',
104
+ '',
105
+ nodes.inline('', '%s.' % text, classes=classes),
106
+ translatable=False,
107
+ )
99
108
  node.append(para)
100
109
 
101
110
  domain = self.env.domains.changeset_domain
@@ -113,7 +122,7 @@ class ChangeSetDomain(Domain):
113
122
  label = 'changeset'
114
123
 
115
124
  initial_data: dict[str, dict[str, list[ChangeSet]]] = {
116
- 'changes': {}, # version -> list of ChangeSet
125
+ 'changes': {}, # version -> list of ChangeSet
117
126
  }
118
127
 
119
128
  @property
@@ -123,9 +132,15 @@ class ChangeSetDomain(Domain):
123
132
  def note_changeset(self, node: addnodes.versionmodified) -> None:
124
133
  version = node['version']
125
134
  module = self.env.ref_context.get('py:module')
126
- objname = self.env.temp_data.get('object')
127
- changeset = ChangeSet(node['type'], self.env.docname, node.line, # type: ignore[arg-type]
128
- module, objname, node.astext())
135
+ objname = self.env.current_document.obj_desc_name
136
+ changeset = ChangeSet(
137
+ node['type'],
138
+ self.env.docname,
139
+ node.line, # type: ignore[arg-type]
140
+ module,
141
+ objname,
142
+ node.astext(),
143
+ )
129
144
  self.changesets.setdefault(version, []).append(changeset)
130
145
 
131
146
  def clear_doc(self, docname: str) -> None:
@@ -143,7 +158,7 @@ class ChangeSetDomain(Domain):
143
158
  changes.append(changeset)
144
159
 
145
160
  def process_doc(
146
- self, env: BuildEnvironment, docname: str, document: nodes.document,
161
+ self, env: BuildEnvironment, docname: str, document: nodes.document
147
162
  ) -> None:
148
163
  pass # nothing to do here. All changesets are registered on calling directive.
149
164
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Any, cast
5
+ from typing import TYPE_CHECKING, cast
6
6
 
7
7
  from docutils import nodes
8
8
 
@@ -15,6 +15,7 @@ from sphinx.util.nodes import copy_source_info, make_refnode
15
15
 
16
16
  if TYPE_CHECKING:
17
17
  from collections.abc import Set
18
+ from typing import Any
18
19
 
19
20
  from docutils.nodes import Element
20
21
 
@@ -70,8 +71,14 @@ class CitationDomain(Domain):
70
71
  label = node[0].astext()
71
72
  if label in self.citations:
72
73
  path = self.env.doc2path(self.citations[label][0])
73
- logger.warning(__('duplicate citation %s, other instance in %s'), label, path,
74
- location=node, type='ref', subtype='citation')
74
+ logger.warning(
75
+ __('duplicate citation %s, other instance in %s'),
76
+ label,
77
+ path,
78
+ location=node,
79
+ type='ref',
80
+ subtype='citation',
81
+ )
75
82
  self.citations[label] = (node['docname'], node['ids'][0], node.line) # type: ignore[assignment]
76
83
 
77
84
  def note_citation_reference(self, node: pending_xref) -> None:
@@ -81,23 +88,42 @@ class CitationDomain(Domain):
81
88
  def check_consistency(self) -> None:
82
89
  for name, (docname, _labelid, lineno) in self.citations.items():
83
90
  if name not in self.citation_refs:
84
- logger.warning(__('Citation [%s] is not referenced.'), name,
85
- type='ref', subtype='citation', location=(docname, lineno))
86
-
87
- def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
88
- typ: str, target: str, node: pending_xref, contnode: Element,
89
- ) -> Element | None:
91
+ logger.warning(
92
+ __('Citation [%s] is not referenced.'),
93
+ name,
94
+ type='ref',
95
+ subtype='citation',
96
+ location=(docname, lineno),
97
+ )
98
+
99
+ def resolve_xref(
100
+ self,
101
+ env: BuildEnvironment,
102
+ fromdocname: str,
103
+ builder: Builder,
104
+ typ: str,
105
+ target: str,
106
+ node: pending_xref,
107
+ contnode: Element,
108
+ ) -> nodes.reference | None:
90
109
  docname, labelid, lineno = self.citations.get(target, ('', '', 0))
91
110
  if not docname:
92
111
  return None
93
112
 
94
- return make_refnode(builder, fromdocname, docname,
95
- labelid, contnode)
96
-
97
- def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
98
- target: str, node: pending_xref, contnode: Element,
99
- ) -> list[tuple[str, Element]]:
100
- refnode = self.resolve_xref(env, fromdocname, builder, 'ref', target, node, contnode)
113
+ return make_refnode(builder, fromdocname, docname, labelid, contnode)
114
+
115
+ def resolve_any_xref(
116
+ self,
117
+ env: BuildEnvironment,
118
+ fromdocname: str,
119
+ builder: Builder,
120
+ target: str,
121
+ node: pending_xref,
122
+ contnode: Element,
123
+ ) -> list[tuple[str, nodes.reference]]:
124
+ refnode = self.resolve_xref(
125
+ env, fromdocname, builder, 'ref', target, node, contnode
126
+ )
101
127
  if refnode is None:
102
128
  return []
103
129
  else:
@@ -117,13 +143,12 @@ class CitationDefinitionTransform(SphinxTransform):
117
143
  domain.note_citation(node)
118
144
 
119
145
  # mark citation labels as not smartquoted
120
- label = cast(nodes.label, node[0])
146
+ label = cast('nodes.label', node[0])
121
147
  label['support_smartquotes'] = False
122
148
 
123
149
 
124
150
  class CitationReferenceTransform(SphinxTransform):
125
- """
126
- Replace citation references by pending_xref nodes before the default
151
+ """Replace citation references by pending_xref nodes before the default
127
152
  docutils transform tries to resolve them.
128
153
  """
129
154
 
@@ -133,11 +158,16 @@ class CitationReferenceTransform(SphinxTransform):
133
158
  domain = self.env.domains.citation_domain
134
159
  for node in self.document.findall(nodes.citation_reference):
135
160
  target = node.astext()
136
- ref = pending_xref(target, refdomain='citation', reftype='ref',
137
- reftarget=target, refwarn=True,
138
- support_smartquotes=False,
139
- ids=node["ids"],
140
- classes=node.get('classes', []))
161
+ ref = pending_xref(
162
+ target,
163
+ refdomain='citation',
164
+ reftype='ref',
165
+ reftarget=target,
166
+ refwarn=True,
167
+ support_smartquotes=False,
168
+ ids=node['ids'],
169
+ classes=node.get('classes', []),
170
+ )
141
171
  ref += nodes.inline(target, '[%s]' % target)
142
172
  copy_source_info(node, ref)
143
173
  node.replace_self(ref)