Skip to content

Commit 2a742fd

Browse files
authored
Improve docutils.parsers (#14191)
1 parent 42b1369 commit 2a742fd

18 files changed

+535
-50
lines changed

stubs/docutils/@tests/stubtest_allowlist.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ docutils.nodes.NodeVisitor.visit_\w+ # Methods are discovered dynamically on co
1111
docutils.nodes.Text.__new__
1212
docutils.parsers.recommonmark_wrapper
1313
docutils.parsers.rst.directives.admonitions.BaseAdmonition.node_class # must be overridden by base classes (pseudo-abstract)
14-
docutils.parsers.rst.directives.misc.MetaBody.__getattr__
1514
docutils.statemachine.State.nested_sm # is initialised in __init__
1615
docutils.statemachine.State.nested_sm_kwargs # is initialised in __init__
1716
docutils.statemachine.ViewList.__iter__ # doesn't exist at runtime, but the class is iterable due to __getitem__

stubs/docutils/docutils/__init__.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ApplicationError(Exception): ...
2626
class DataError(ApplicationError): ...
2727

2828
class SettingsSpec:
29-
settings_spec: ClassVar[tuple[Any, ...]]
29+
settings_spec: ClassVar[tuple[Any, ...]] # Mixed tuple structure; uses Any for flexibility in nested option definitions
3030
settings_defaults: ClassVar[dict[Any, Any] | None]
3131
settings_default_overrides: ClassVar[dict[Any, Any] | None]
3232
relative_path_settings: ClassVar[tuple[Any, ...]]

stubs/docutils/docutils/parsers/__init__.pyi

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
from typing import Any, ClassVar
1+
from typing import ClassVar, Final
22

33
from docutils import Component
4-
from docutils.nodes import document as _document
4+
from docutils.nodes import _Document
5+
6+
__docformat__: Final = "reStructuredText"
57

68
class Parser(Component):
79
component_type: ClassVar[str]
810
config_section: ClassVar[str]
9-
inputstring: Any # defined after call to setup_parse()
10-
document: Any # defined after call to setup_parse()
11-
def parse(self, inputstring: str, document: _document) -> None: ...
12-
def setup_parse(self, inputstring: str, document: _document) -> None: ...
11+
inputstring: str # defined after call to setup_parse()
12+
document: _Document # defined after call to setup_parse()
13+
def parse(self, inputstring: str, document: _Document) -> None: ...
14+
def setup_parse(self, inputstring: str, document: _Document) -> None: ...
1315
def finish_parse(self) -> None: ...
1416

1517
_parser_aliases: dict[str, str]

stubs/docutils/docutils/parsers/null.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ from typing import ClassVar
33
from docutils import parsers
44

55
class Parser(parsers.Parser):
6+
supported: ClassVar[tuple[str, ...]]
67
config_section_dependencies: ClassVar[tuple[str, ...]]
Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,50 @@
1-
def __getattr__(name: str): ... # incomplete module
1+
from types import ModuleType
2+
from typing import ClassVar
3+
4+
from docutils import nodes
5+
from docutils.transforms import Transform
6+
7+
class pending_xref(nodes.Inline, nodes.Element): ...
8+
9+
sphinx: ModuleType
10+
11+
def is_literal(node: nodes.Node) -> bool: ...
12+
13+
class _CommonMarkParser:
14+
default_config: ClassVar[dict[str, None]]
15+
def __init__(self) -> None: ...
16+
def convert_ast(self, ast): ...
17+
def default_visit(self, mdnode): ...
18+
def default_depart(self, mdnode): ...
19+
def visit_heading(self, mdnode): ...
20+
def depart_heading(self, _): ...
21+
def visit_text(self, mdnode): ...
22+
def visit_softbreak(self, _): ...
23+
def visit_linebreak(self, _): ...
24+
def visit_paragraph(self, mdnode): ...
25+
def visit_emph(self, _): ...
26+
def visit_strong(self, _): ...
27+
def visit_code(self, mdnode): ...
28+
def visit_link(self, mdnode): ...
29+
def depart_link(self, mdnode): ...
30+
def visit_image(self, mdnode): ...
31+
def visit_list(self, mdnode): ...
32+
def visit_item(self, mdnode): ...
33+
def visit_code_block(self, mdnode): ...
34+
def visit_block_quote(self, mdnode): ...
35+
def visit_html(self, mdnode): ...
36+
def visit_html_inline(self, mdnode): ...
37+
def visit_html_block(self, mdnode): ...
38+
def visit_thematic_break(self, _): ...
39+
def setup_sections(self): ...
40+
def add_section(self, section, level): ...
41+
def is_section_level(self, level, section): ...
42+
43+
class Parser(_CommonMarkParser):
44+
supported: ClassVar[tuple[str, ...]]
45+
config_section: ClassVar[str]
46+
config_section_dependencies: ClassVar[tuple[str, ...]]
47+
def get_transforms(self) -> list[type[Transform]]: ...
48+
def parse(self, inputstring: str, document: nodes.document) -> None: ...
49+
def visit_document(self, node) -> None: ...
50+
def visit_text(self, mdnode) -> None: ...

stubs/docutils/docutils/parsers/rst/__init__.pyi

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
from _typeshed import Incomplete
22
from collections.abc import Callable, Sequence
3-
from typing import Any, ClassVar, Literal
3+
from typing import Any, ClassVar, Final, Literal
44
from typing_extensions import TypeAlias
55

66
from docutils import nodes, parsers
77
from docutils.parsers.rst.states import Inliner, RSTState, RSTStateMachine
88
from docutils.statemachine import StringList
99
from docutils.transforms import Transform
10+
from docutils.utils import Reporter
11+
12+
__docformat__: Final = "reStructuredText"
1013

1114
class Parser(parsers.Parser):
12-
settings_spec: ClassVar[Incomplete]
1315
config_section_dependencies: ClassVar[tuple[str, ...]]
1416
initial_state: Literal["Body", "RFC2822Body"]
1517
state_classes: Sequence[type[RSTState]]
1618
inliner: Inliner | None
19+
statemachine: RSTStateMachine
1720
def __init__(self, rfc2822: bool = False, inliner: Inliner | None = None) -> None: ...
1821
def get_transforms(self) -> list[type[Transform]]: ...
1922
def parse(self, inputstring: str, document: nodes.document) -> None: ...
@@ -27,22 +30,23 @@ class Directive:
2730
required_arguments: ClassVar[int]
2831
optional_arguments: ClassVar[int]
2932
final_argument_whitespace: ClassVar[bool]
30-
option_spec: ClassVar[dict[str, Callable[[str], Any]] | None]
33+
option_spec: ClassVar[dict[str, Callable[[str], Incomplete]] | None]
3134
has_content: ClassVar[bool]
3235
name: str
3336
arguments: list[str]
34-
options: dict[str, Any]
37+
options: dict[str, Incomplete]
3538
content: StringList
3639
lineno: int
3740
content_offset: int
3841
block_text: str
3942
state: RSTState
4043
state_machine: RSTStateMachine = ...
44+
reporter: Reporter
4145
def __init__(
4246
self,
4347
name: str,
4448
arguments: list[str],
45-
options: dict[str, Any],
49+
options: dict[str, Incomplete],
4650
content: StringList,
4751
lineno: int,
4852
content_offset: int,

stubs/docutils/docutils/parsers/rst/directives/__init__.pyi

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from collections.abc import Callable, Container, Iterable, Sequence
22
from re import Pattern
3-
from typing import Literal
3+
from typing import Final, Literal
44

55
from docutils.languages import _LanguageModule
66
from docutils.nodes import document, system_message
77
from docutils.parsers import Parser
88
from docutils.parsers.rst import Directive
99

10+
__docformat__: Final = "reStructuredText"
11+
1012
def register_directive(name: str, directive: type[Directive]) -> None: ...
1113
def directive(
1214
directive_name: str, language_module: _LanguageModule, document: document
@@ -19,14 +21,14 @@ def uri(argument: str) -> str: ...
1921
def nonnegative_int(argument: str) -> int: ...
2022
def percentage(argument: str) -> int: ...
2123

22-
length_units: list[str]
24+
length_units: Final[list[str]]
2325

2426
def get_measure(argument: str, units: Iterable[str]) -> str: ...
2527
def length_or_unitless(argument: str) -> str: ...
2628
def length_or_percentage_or_unitless(argument: str, default: str = "") -> str: ...
2729
def class_option(argument: str) -> list[str]: ...
2830

29-
unicode_pattern: Pattern[str]
31+
unicode_pattern: Final[Pattern[str]]
3032

3133
def unicode_code(code: str) -> str: ...
3234
def single_char_or_unicode(argument: str) -> str: ...
Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,39 @@
1+
from typing import Final
2+
13
from docutils import nodes
24
from docutils.parsers.rst import Directive
35

6+
__docformat__: Final = "reStructuredText"
7+
48
class BaseAdmonition(Directive):
59
node_class: type[nodes.Admonition] # Subclasses must set this to the appropriate admonition node class.
610

7-
class Admonition(BaseAdmonition): ...
8-
class Attention(BaseAdmonition): ...
9-
class Caution(BaseAdmonition): ...
10-
class Danger(BaseAdmonition): ...
11-
class Error(BaseAdmonition): ...
12-
class Hint(BaseAdmonition): ...
13-
class Important(BaseAdmonition): ...
14-
class Note(BaseAdmonition): ...
15-
class Tip(BaseAdmonition): ...
16-
class Warning(BaseAdmonition): ...
11+
class Admonition(BaseAdmonition):
12+
node_class: type[nodes.admonition]
13+
14+
class Attention(BaseAdmonition):
15+
node_class: type[nodes.attention]
16+
17+
class Caution(BaseAdmonition):
18+
node_class: type[nodes.caution]
19+
20+
class Danger(BaseAdmonition):
21+
node_class: type[nodes.danger]
22+
23+
class Error(BaseAdmonition):
24+
node_class: type[nodes.error]
25+
26+
class Hint(BaseAdmonition):
27+
node_class: type[nodes.hint]
28+
29+
class Important(BaseAdmonition):
30+
node_class: type[nodes.important]
31+
32+
class Note(BaseAdmonition):
33+
node_class: type[nodes.note]
34+
35+
class Tip(BaseAdmonition):
36+
node_class: type[nodes.tip]
37+
38+
class Warning(BaseAdmonition):
39+
node_class: type[nodes.warning]
Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,64 @@
1-
def __getattr__(name: str): ... # incomplete module
1+
from collections.abc import Callable
2+
from typing import ClassVar, Final
3+
from typing_extensions import TypeAlias
4+
5+
from docutils import nodes
6+
from docutils.parsers.rst import Directive
7+
8+
__docformat__: Final = "reStructuredText"
9+
10+
_DirectiveFn: TypeAlias = Callable[[str], str | list[str]]
11+
12+
class BasePseudoSection(Directive):
13+
option_spec: ClassVar[dict[str, _DirectiveFn]]
14+
node_class: ClassVar[type[nodes.Node] | None]
15+
def run(self): ...
16+
17+
class Topic(BasePseudoSection):
18+
node_class: ClassVar[type[nodes.Node]]
19+
20+
class Sidebar(BasePseudoSection):
21+
node_class: ClassVar[type[nodes.Node]]
22+
option_spec: ClassVar[dict[str, _DirectiveFn]]
23+
def run(self): ...
24+
25+
class LineBlock(Directive):
26+
option_spec: ClassVar[dict[str, _DirectiveFn]]
27+
def run(self): ...
28+
29+
class ParsedLiteral(Directive):
30+
option_spec: ClassVar[dict[str, _DirectiveFn]]
31+
def run(self): ...
32+
33+
class CodeBlock(Directive):
34+
option_spec: ClassVar[dict[str, _DirectiveFn]]
35+
def run(self): ...
36+
37+
class MathBlock(Directive):
38+
option_spec: ClassVar[dict[str, _DirectiveFn]]
39+
def run(self): ...
40+
41+
class Rubric(Directive):
42+
option_spec: ClassVar[dict[str, _DirectiveFn]]
43+
def run(self): ...
44+
45+
class BlockQuote(Directive):
46+
classes: ClassVar[list[str]]
47+
def run(self): ...
48+
49+
class Epigraph(BlockQuote):
50+
classes: ClassVar[list[str]]
51+
52+
class Highlights(BlockQuote):
53+
classes: ClassVar[list[str]]
54+
55+
class PullQuote(BlockQuote):
56+
classes: ClassVar[list[str]]
57+
58+
class Compound(Directive):
59+
option_spec: ClassVar[dict[str, _DirectiveFn]]
60+
def run(self): ...
61+
62+
class Container(Directive):
63+
option_spec: ClassVar[dict[str, _DirectiveFn]]
64+
def run(self): ...
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
def __getattr__(name: str): ... # incomplete module
1+
from typing import Final
2+
3+
from docutils.parsers.rst.directives.misc import Meta as Meta, MetaBody as MetaBody
4+
5+
__docformat__: Final = "reStructuredText"

0 commit comments

Comments
 (0)