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
|
@@ -6,25 +6,29 @@ import operator
|
|
|
6
6
|
import token
|
|
7
7
|
from collections import deque
|
|
8
8
|
from inspect import Parameter
|
|
9
|
-
from typing import TYPE_CHECKING
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
10
|
|
|
11
11
|
from docutils import nodes
|
|
12
12
|
|
|
13
13
|
from sphinx import addnodes
|
|
14
|
-
from sphinx.addnodes import
|
|
14
|
+
from sphinx.addnodes import pending_xref, pending_xref_condition
|
|
15
|
+
from sphinx.locale import _
|
|
15
16
|
from sphinx.pycode.parser import Token, TokenProcessor
|
|
16
17
|
from sphinx.util.inspect import signature_from_str
|
|
17
18
|
|
|
18
19
|
if TYPE_CHECKING:
|
|
19
20
|
from collections.abc import Iterable, Iterator
|
|
21
|
+
from typing import Any
|
|
20
22
|
|
|
21
23
|
from docutils.nodes import Element, Node
|
|
22
24
|
|
|
25
|
+
from sphinx.addnodes import desc_signature
|
|
23
26
|
from sphinx.environment import BuildEnvironment
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
def parse_reftarget(
|
|
27
|
-
|
|
29
|
+
def parse_reftarget(
|
|
30
|
+
reftarget: str, suppress_prefix: bool = False
|
|
31
|
+
) -> tuple[str, str, str, bool]:
|
|
28
32
|
"""Parse a type string and return (reftype, reftarget, title, refspecific flag)"""
|
|
29
33
|
refspecific = False
|
|
30
34
|
if reftarget.startswith('.'):
|
|
@@ -50,12 +54,15 @@ def parse_reftarget(reftarget: str, suppress_prefix: bool = False,
|
|
|
50
54
|
return reftype, reftarget, title, refspecific
|
|
51
55
|
|
|
52
56
|
|
|
53
|
-
def type_to_xref(
|
|
54
|
-
|
|
57
|
+
def type_to_xref(
|
|
58
|
+
target: str, env: BuildEnvironment, *, suppress_prefix: bool = False
|
|
59
|
+
) -> addnodes.pending_xref:
|
|
55
60
|
"""Convert a type string to a cross reference node."""
|
|
56
61
|
if env:
|
|
57
|
-
kwargs = {
|
|
58
|
-
|
|
62
|
+
kwargs = {
|
|
63
|
+
'py:module': env.ref_context.get('py:module'),
|
|
64
|
+
'py:class': env.ref_context.get('py:class'),
|
|
65
|
+
}
|
|
59
66
|
else:
|
|
60
67
|
kwargs = {}
|
|
61
68
|
|
|
@@ -66,14 +73,22 @@ def type_to_xref(target: str, env: BuildEnvironment, *,
|
|
|
66
73
|
# nested classes. But python domain can't access the real python object because this
|
|
67
74
|
# module should work not-dynamically.
|
|
68
75
|
shortname = title.split('.')[-1]
|
|
69
|
-
contnodes: list[Node] = [
|
|
70
|
-
|
|
76
|
+
contnodes: list[Node] = [
|
|
77
|
+
pending_xref_condition('', shortname, condition='resolved'),
|
|
78
|
+
pending_xref_condition('', title, condition='*'),
|
|
79
|
+
]
|
|
71
80
|
else:
|
|
72
81
|
contnodes = [nodes.Text(title)]
|
|
73
82
|
|
|
74
|
-
return pending_xref(
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
return pending_xref(
|
|
84
|
+
'',
|
|
85
|
+
*contnodes,
|
|
86
|
+
refdomain='py',
|
|
87
|
+
reftype=reftype,
|
|
88
|
+
reftarget=target,
|
|
89
|
+
refspecific=refspecific,
|
|
90
|
+
**kwargs,
|
|
91
|
+
)
|
|
77
92
|
|
|
78
93
|
|
|
79
94
|
def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
|
|
@@ -82,19 +97,21 @@ def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
|
|
|
82
97
|
|
|
83
98
|
def unparse(node: ast.AST) -> list[Node]:
|
|
84
99
|
if isinstance(node, ast.Attribute):
|
|
85
|
-
return [nodes.Text(f
|
|
100
|
+
return [nodes.Text(f'{unparse(node.value)[0]}.{node.attr}')]
|
|
86
101
|
if isinstance(node, ast.BinOp):
|
|
87
102
|
result: list[Node] = unparse(node.left)
|
|
88
103
|
result.extend(unparse(node.op))
|
|
89
104
|
result.extend(unparse(node.right))
|
|
90
105
|
return result
|
|
91
106
|
if isinstance(node, ast.BitOr):
|
|
92
|
-
return [
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
return [
|
|
108
|
+
addnodes.desc_sig_space(),
|
|
109
|
+
addnodes.desc_sig_punctuation('', '|'),
|
|
110
|
+
addnodes.desc_sig_space(),
|
|
111
|
+
]
|
|
95
112
|
if isinstance(node, ast.Constant):
|
|
96
113
|
if node.value is Ellipsis:
|
|
97
|
-
return [addnodes.desc_sig_punctuation('',
|
|
114
|
+
return [addnodes.desc_sig_punctuation('', '...')]
|
|
98
115
|
if isinstance(node.value, bool):
|
|
99
116
|
return [addnodes.desc_sig_keyword('', repr(node.value))]
|
|
100
117
|
if isinstance(node.value, int):
|
|
@@ -140,7 +157,7 @@ def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
|
|
|
140
157
|
result.append(addnodes.desc_sig_punctuation('', ']'))
|
|
141
158
|
|
|
142
159
|
# Wrap the Text nodes inside brackets by literal node if the subscript is a Literal
|
|
143
|
-
if result[0] in
|
|
160
|
+
if result[0] in {'Literal', 'typing.Literal'}:
|
|
144
161
|
for i, subnode in enumerate(result[1:], start=1):
|
|
145
162
|
if isinstance(subnode, nodes.Text):
|
|
146
163
|
result[i] = nodes.literal('', '', subnode)
|
|
@@ -157,8 +174,10 @@ def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
|
|
|
157
174
|
result.pop()
|
|
158
175
|
result.pop()
|
|
159
176
|
else:
|
|
160
|
-
result = [
|
|
161
|
-
|
|
177
|
+
result = [
|
|
178
|
+
addnodes.desc_sig_punctuation('', '('),
|
|
179
|
+
addnodes.desc_sig_punctuation('', ')'),
|
|
180
|
+
]
|
|
162
181
|
|
|
163
182
|
return result
|
|
164
183
|
if isinstance(node, ast.Call):
|
|
@@ -211,8 +230,11 @@ def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
|
|
|
211
230
|
if isinstance(node, nodes.literal):
|
|
212
231
|
result.append(node[0])
|
|
213
232
|
elif isinstance(node, nodes.Text) and node.strip():
|
|
214
|
-
if (
|
|
215
|
-
|
|
233
|
+
if (
|
|
234
|
+
result
|
|
235
|
+
and isinstance(result[-1], addnodes.desc_sig_punctuation)
|
|
236
|
+
and result[-1].astext() == '~'
|
|
237
|
+
):
|
|
216
238
|
result.pop()
|
|
217
239
|
result.append(type_to_xref(str(node), env, suppress_prefix=True))
|
|
218
240
|
else:
|
|
@@ -244,8 +266,7 @@ class _TypeParameterListParser(TokenProcessor):
|
|
|
244
266
|
else:
|
|
245
267
|
if current == token.INDENT:
|
|
246
268
|
tokens += self.fetch_until(token.DEDENT)
|
|
247
|
-
elif current.match(
|
|
248
|
-
[token.OP, ':'], [token.OP, '='], [token.OP, ',']):
|
|
269
|
+
elif current.match([token.OP, ':'], [token.OP, '='], [token.OP, ',']):
|
|
249
270
|
tokens.pop()
|
|
250
271
|
break
|
|
251
272
|
return tokens
|
|
@@ -254,7 +275,9 @@ class _TypeParameterListParser(TokenProcessor):
|
|
|
254
275
|
while current := self.fetch_token():
|
|
255
276
|
if current == token.NAME:
|
|
256
277
|
tp_name = current.value.strip()
|
|
257
|
-
if self.previous and self.previous.match(
|
|
278
|
+
if self.previous and self.previous.match(
|
|
279
|
+
[token.OP, '*'], [token.OP, '**']
|
|
280
|
+
):
|
|
258
281
|
if self.previous == [token.OP, '*']:
|
|
259
282
|
tp_kind = Parameter.VAR_POSITIONAL
|
|
260
283
|
else:
|
|
@@ -275,9 +298,14 @@ class _TypeParameterListParser(TokenProcessor):
|
|
|
275
298
|
tokens = self.fetch_type_param_spec()
|
|
276
299
|
tp_default = self._build_identifier(tokens)
|
|
277
300
|
|
|
278
|
-
if
|
|
279
|
-
|
|
280
|
-
|
|
301
|
+
if (
|
|
302
|
+
tp_kind != Parameter.POSITIONAL_OR_KEYWORD
|
|
303
|
+
and tp_ann != Parameter.empty
|
|
304
|
+
):
|
|
305
|
+
msg = (
|
|
306
|
+
'type parameter bound or constraint is not allowed '
|
|
307
|
+
f'for {tp_kind.description} parameters'
|
|
308
|
+
)
|
|
281
309
|
raise SyntaxError(msg)
|
|
282
310
|
|
|
283
311
|
type_param = (tp_name, tp_kind, tp_default, tp_ann)
|
|
@@ -315,12 +343,22 @@ class _TypeParameterListParser(TokenProcessor):
|
|
|
315
343
|
idents.append(ident)
|
|
316
344
|
# determine if the next token is an unpack operator depending
|
|
317
345
|
# on the left and right hand side of the operator symbol
|
|
318
|
-
is_unpack_operator = (
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
346
|
+
is_unpack_operator = op.match([token.OP, '*'], [token.OP, '**']) and not (
|
|
347
|
+
tok.match(
|
|
348
|
+
token.NAME,
|
|
349
|
+
token.NUMBER,
|
|
350
|
+
token.STRING,
|
|
351
|
+
[token.OP, ')'],
|
|
352
|
+
[token.OP, ']'],
|
|
353
|
+
[token.OP, '}'],
|
|
354
|
+
)
|
|
355
|
+
and after.match(
|
|
356
|
+
token.NAME,
|
|
357
|
+
token.NUMBER,
|
|
358
|
+
token.STRING,
|
|
359
|
+
[token.OP, '('],
|
|
360
|
+
[token.OP, '['],
|
|
361
|
+
[token.OP, '{'],
|
|
324
362
|
)
|
|
325
363
|
)
|
|
326
364
|
|
|
@@ -356,28 +394,33 @@ class _TypeParameterListParser(TokenProcessor):
|
|
|
356
394
|
[token.OP, '@'], [token.OP, '/'], [token.OP, '//'], [token.OP, '%'],
|
|
357
395
|
[token.OP, '<<'], [token.OP, '>>'], [token.OP, '>>>'],
|
|
358
396
|
[token.OP, '<='], [token.OP, '>='], [token.OP, '=='], [token.OP, '!='],
|
|
359
|
-
):
|
|
397
|
+
): # fmt: skip
|
|
360
398
|
return f' {tok.value} '
|
|
361
399
|
|
|
362
400
|
return tok.value
|
|
363
401
|
|
|
364
402
|
|
|
365
403
|
def _parse_type_list(
|
|
366
|
-
tp_list: str,
|
|
404
|
+
tp_list: str,
|
|
405
|
+
env: BuildEnvironment,
|
|
367
406
|
multi_line_parameter_list: bool = False,
|
|
407
|
+
trailing_comma: bool = True,
|
|
368
408
|
) -> addnodes.desc_type_parameter_list:
|
|
369
409
|
"""Parse a list of type parameters according to PEP 695."""
|
|
370
410
|
type_params = addnodes.desc_type_parameter_list(tp_list)
|
|
371
411
|
type_params['multi_line_parameter_list'] = multi_line_parameter_list
|
|
412
|
+
type_params['multi_line_trailing_comma'] = trailing_comma
|
|
372
413
|
# formal parameter names are interpreted as type parameter names and
|
|
373
414
|
# type annotations are interpreted as type parameter bound or constraints
|
|
374
415
|
parser = _TypeParameterListParser(tp_list)
|
|
375
416
|
parser.parse()
|
|
376
|
-
for
|
|
417
|
+
for tp_name, tp_kind, tp_default, tp_ann in parser.type_params:
|
|
377
418
|
# no positional-only or keyword-only allowed in a type parameters list
|
|
378
419
|
if tp_kind in {Parameter.POSITIONAL_ONLY, Parameter.KEYWORD_ONLY}:
|
|
379
|
-
msg = (
|
|
380
|
-
|
|
420
|
+
msg = (
|
|
421
|
+
'positional-only or keyword-only parameters '
|
|
422
|
+
'are prohibited in type parameter lists'
|
|
423
|
+
)
|
|
381
424
|
raise SyntaxError(msg)
|
|
382
425
|
|
|
383
426
|
node = addnodes.desc_type_parameter()
|
|
@@ -395,8 +438,7 @@ def _parse_type_list(
|
|
|
395
438
|
node += addnodes.desc_sig_punctuation('', ':')
|
|
396
439
|
node += addnodes.desc_sig_space()
|
|
397
440
|
|
|
398
|
-
type_ann_expr = addnodes.desc_sig_name('', '',
|
|
399
|
-
*annotation) # type: ignore[arg-type]
|
|
441
|
+
type_ann_expr = addnodes.desc_sig_name('', '', *annotation) # type: ignore[arg-type]
|
|
400
442
|
# a type bound is ``T: U`` whereas type constraints
|
|
401
443
|
# must be enclosed with parentheses. ``T: (U, V)``
|
|
402
444
|
if tp_ann.startswith('(') and tp_ann.endswith(')'):
|
|
@@ -416,31 +458,35 @@ def _parse_type_list(
|
|
|
416
458
|
node += addnodes.desc_sig_space()
|
|
417
459
|
node += addnodes.desc_sig_operator('', '=')
|
|
418
460
|
node += addnodes.desc_sig_space()
|
|
419
|
-
node += nodes.inline(
|
|
420
|
-
|
|
421
|
-
|
|
461
|
+
node += nodes.inline(
|
|
462
|
+
'', tp_default, classes=['default_value'], support_smartquotes=False
|
|
463
|
+
)
|
|
422
464
|
|
|
423
465
|
type_params += node
|
|
424
466
|
return type_params
|
|
425
467
|
|
|
426
468
|
|
|
427
469
|
def _parse_arglist(
|
|
428
|
-
arglist: str,
|
|
470
|
+
arglist: str,
|
|
471
|
+
env: BuildEnvironment,
|
|
472
|
+
multi_line_parameter_list: bool = False,
|
|
473
|
+
trailing_comma: bool = True,
|
|
429
474
|
) -> addnodes.desc_parameterlist:
|
|
430
475
|
"""Parse a list of arguments using AST parser"""
|
|
431
476
|
params = addnodes.desc_parameterlist(arglist)
|
|
432
477
|
params['multi_line_parameter_list'] = multi_line_parameter_list
|
|
478
|
+
params['multi_line_trailing_comma'] = trailing_comma
|
|
433
479
|
sig = signature_from_str('(%s)' % arglist)
|
|
434
480
|
last_kind = None
|
|
435
481
|
for param in sig.parameters.values():
|
|
436
482
|
if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY:
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
params +=
|
|
483
|
+
params += _positional_only_separator()
|
|
484
|
+
if param.kind == param.KEYWORD_ONLY and last_kind in {
|
|
485
|
+
param.POSITIONAL_OR_KEYWORD,
|
|
486
|
+
param.POSITIONAL_ONLY,
|
|
487
|
+
None,
|
|
488
|
+
}:
|
|
489
|
+
params += _keyword_only_separator()
|
|
444
490
|
|
|
445
491
|
node = addnodes.desc_parameter()
|
|
446
492
|
if param.kind == param.VAR_POSITIONAL:
|
|
@@ -464,23 +510,48 @@ def _parse_arglist(
|
|
|
464
510
|
node += addnodes.desc_sig_space()
|
|
465
511
|
else:
|
|
466
512
|
node += addnodes.desc_sig_operator('', '=')
|
|
467
|
-
node += nodes.inline(
|
|
468
|
-
|
|
513
|
+
node += nodes.inline(
|
|
514
|
+
'', param.default, classes=['default_value'], support_smartquotes=False
|
|
515
|
+
)
|
|
469
516
|
|
|
470
517
|
params += node
|
|
471
518
|
last_kind = param.kind
|
|
472
519
|
|
|
473
520
|
if last_kind == Parameter.POSITIONAL_ONLY:
|
|
474
|
-
|
|
475
|
-
params += addnodes.desc_parameter('', '', addnodes.desc_sig_operator('', '/'))
|
|
521
|
+
params += _positional_only_separator()
|
|
476
522
|
|
|
477
523
|
return params
|
|
478
524
|
|
|
479
525
|
|
|
526
|
+
def _positional_only_separator() -> addnodes.desc_parameter:
|
|
527
|
+
# PEP 570: Separator for positional only parameters: /
|
|
528
|
+
positional_only_abbr = nodes.abbreviation(
|
|
529
|
+
'/', '/', explanation=_('Positional-only parameter separator (PEP 570)')
|
|
530
|
+
)
|
|
531
|
+
positional_only_op = addnodes.desc_sig_operator(
|
|
532
|
+
'/', '', positional_only_abbr, classes=['positional-only-separator']
|
|
533
|
+
)
|
|
534
|
+
return addnodes.desc_parameter('/', '', positional_only_op)
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def _keyword_only_separator() -> addnodes.desc_parameter:
|
|
538
|
+
# PEP 3102: Separator for keyword only parameters: *
|
|
539
|
+
keyword_only_abbr = nodes.abbreviation(
|
|
540
|
+
'*', '*', explanation=_('Keyword-only parameters separator (PEP 3102)')
|
|
541
|
+
)
|
|
542
|
+
keyword_only_op = addnodes.desc_sig_operator(
|
|
543
|
+
'*', '', keyword_only_abbr, classes=['keyword-only-separator']
|
|
544
|
+
)
|
|
545
|
+
return addnodes.desc_parameter('*', '', keyword_only_op)
|
|
546
|
+
|
|
547
|
+
|
|
480
548
|
def _pseudo_parse_arglist(
|
|
481
|
-
signode: desc_signature,
|
|
549
|
+
signode: desc_signature,
|
|
550
|
+
arglist: str,
|
|
551
|
+
multi_line_parameter_list: bool = False,
|
|
552
|
+
trailing_comma: bool = True,
|
|
482
553
|
) -> None:
|
|
483
|
-
"""
|
|
554
|
+
"""'Parse' a list of arguments separated by commas.
|
|
484
555
|
|
|
485
556
|
Arguments can have "optional" annotations given by enclosing them in
|
|
486
557
|
brackets. Currently, this will split at any comma, even if it's inside a
|
|
@@ -488,6 +559,7 @@ def _pseudo_parse_arglist(
|
|
|
488
559
|
"""
|
|
489
560
|
paramlist = addnodes.desc_parameterlist()
|
|
490
561
|
paramlist['multi_line_parameter_list'] = multi_line_parameter_list
|
|
562
|
+
paramlist['multi_line_trailing_comma'] = trailing_comma
|
|
491
563
|
stack: list[Element] = [paramlist]
|
|
492
564
|
try:
|
|
493
565
|
for argument in arglist.split(','):
|
|
@@ -508,7 +580,8 @@ def _pseudo_parse_arglist(
|
|
|
508
580
|
argument = argument[:-1].strip()
|
|
509
581
|
if argument:
|
|
510
582
|
stack[-1] += addnodes.desc_parameter(
|
|
511
|
-
'', '', addnodes.desc_sig_name(argument, argument)
|
|
583
|
+
'', '', addnodes.desc_sig_name(argument, argument)
|
|
584
|
+
)
|
|
512
585
|
while ends_open:
|
|
513
586
|
stack.append(addnodes.desc_optional())
|
|
514
587
|
stack[-2] += stack[-1]
|
|
@@ -517,7 +590,7 @@ def _pseudo_parse_arglist(
|
|
|
517
590
|
stack.pop()
|
|
518
591
|
ends_close -= 1
|
|
519
592
|
if len(stack) != 1:
|
|
520
|
-
raise IndexError
|
|
593
|
+
raise IndexError # NoQA: TRY301
|
|
521
594
|
except IndexError:
|
|
522
595
|
# if there are too few or too many elements on the stack, just give up
|
|
523
596
|
# and treat the whole argument list as one argument, discarding the
|