Skip to content

Commit 40dc55c

Browse files
authored
Major update for the xml module (#13349)
1 parent 0647903 commit 40dc55c

15 files changed

+1029
-581
lines changed

pyrightconfig.stricter.json

-5
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@
2323
"stdlib/tkinter/scrolledtext.pyi",
2424
"stdlib/tkinter/tix.pyi",
2525
"stdlib/tkinter/ttk.pyi",
26-
"stdlib/xml/dom/NodeFilter.pyi",
27-
"stdlib/xml/dom/expatbuilder.pyi",
28-
"stdlib/xml/dom/minidom.pyi",
29-
"stdlib/xml/dom/pulldom.pyi",
30-
"stdlib/xml/sax",
3126
"stubs/aiofiles/aiofiles/tempfile/temptypes.pyi",
3227
"stubs/antlr4-python3-runtime",
3328
"stubs/Authlib",

stdlib/xml/dom/NodeFilter.pyi

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from typing import Literal
2+
from xml.dom.minidom import Node
3+
14
class NodeFilter:
2-
FILTER_ACCEPT: int
3-
FILTER_REJECT: int
4-
FILTER_SKIP: int
5+
FILTER_ACCEPT: Literal[1]
6+
FILTER_REJECT: Literal[2]
7+
FILTER_SKIP: Literal[3]
58

69
SHOW_ALL: int
710
SHOW_ELEMENT: int
@@ -16,4 +19,4 @@ class NodeFilter:
1619
SHOW_DOCUMENT_TYPE: int
1720
SHOW_DOCUMENT_FRAGMENT: int
1821
SHOW_NOTATION: int
19-
def acceptNode(self, node) -> int: ...
22+
def acceptNode(self, node: Node) -> int: ...

stdlib/xml/dom/__init__.pyi

+84-53
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,100 @@
1-
from typing import Any, Final
1+
from typing import Any, Final, Literal
22

33
from .domreg import getDOMImplementation as getDOMImplementation, registerDOMImplementation as registerDOMImplementation
44

55
class Node:
6-
ELEMENT_NODE: int
7-
ATTRIBUTE_NODE: int
8-
TEXT_NODE: int
9-
CDATA_SECTION_NODE: int
10-
ENTITY_REFERENCE_NODE: int
11-
ENTITY_NODE: int
12-
PROCESSING_INSTRUCTION_NODE: int
13-
COMMENT_NODE: int
14-
DOCUMENT_NODE: int
15-
DOCUMENT_TYPE_NODE: int
16-
DOCUMENT_FRAGMENT_NODE: int
17-
NOTATION_NODE: int
6+
ELEMENT_NODE: Literal[1]
7+
ATTRIBUTE_NODE: Literal[2]
8+
TEXT_NODE: Literal[3]
9+
CDATA_SECTION_NODE: Literal[4]
10+
ENTITY_REFERENCE_NODE: Literal[5]
11+
ENTITY_NODE: Literal[6]
12+
PROCESSING_INSTRUCTION_NODE: Literal[7]
13+
COMMENT_NODE: Literal[8]
14+
DOCUMENT_NODE: Literal[9]
15+
DOCUMENT_TYPE_NODE: Literal[10]
16+
DOCUMENT_FRAGMENT_NODE: Literal[11]
17+
NOTATION_NODE: Literal[12]
1818

1919
# ExceptionCode
20-
INDEX_SIZE_ERR: Final[int]
21-
DOMSTRING_SIZE_ERR: Final[int]
22-
HIERARCHY_REQUEST_ERR: Final[int]
23-
WRONG_DOCUMENT_ERR: Final[int]
24-
INVALID_CHARACTER_ERR: Final[int]
25-
NO_DATA_ALLOWED_ERR: Final[int]
26-
NO_MODIFICATION_ALLOWED_ERR: Final[int]
27-
NOT_FOUND_ERR: Final[int]
28-
NOT_SUPPORTED_ERR: Final[int]
29-
INUSE_ATTRIBUTE_ERR: Final[int]
30-
INVALID_STATE_ERR: Final[int]
31-
SYNTAX_ERR: Final[int]
32-
INVALID_MODIFICATION_ERR: Final[int]
33-
NAMESPACE_ERR: Final[int]
34-
INVALID_ACCESS_ERR: Final[int]
35-
VALIDATION_ERR: Final[int]
20+
INDEX_SIZE_ERR: Final = 1
21+
DOMSTRING_SIZE_ERR: Final = 2
22+
HIERARCHY_REQUEST_ERR: Final = 3
23+
WRONG_DOCUMENT_ERR: Final = 4
24+
INVALID_CHARACTER_ERR: Final = 5
25+
NO_DATA_ALLOWED_ERR: Final = 6
26+
NO_MODIFICATION_ALLOWED_ERR: Final = 7
27+
NOT_FOUND_ERR: Final = 8
28+
NOT_SUPPORTED_ERR: Final = 9
29+
INUSE_ATTRIBUTE_ERR: Final = 10
30+
INVALID_STATE_ERR: Final = 11
31+
SYNTAX_ERR: Final = 12
32+
INVALID_MODIFICATION_ERR: Final = 13
33+
NAMESPACE_ERR: Final = 14
34+
INVALID_ACCESS_ERR: Final = 15
35+
VALIDATION_ERR: Final = 16
3636

3737
class DOMException(Exception):
3838
code: int
3939
def __init__(self, *args: Any, **kw: Any) -> None: ...
4040
def _get_code(self) -> int: ...
4141

42-
class IndexSizeErr(DOMException): ...
43-
class DomstringSizeErr(DOMException): ...
44-
class HierarchyRequestErr(DOMException): ...
45-
class WrongDocumentErr(DOMException): ...
46-
class InvalidCharacterErr(DOMException): ...
47-
class NoDataAllowedErr(DOMException): ...
48-
class NoModificationAllowedErr(DOMException): ...
49-
class NotFoundErr(DOMException): ...
50-
class NotSupportedErr(DOMException): ...
51-
class InuseAttributeErr(DOMException): ...
52-
class InvalidStateErr(DOMException): ...
53-
class SyntaxErr(DOMException): ...
54-
class InvalidModificationErr(DOMException): ...
55-
class NamespaceErr(DOMException): ...
56-
class InvalidAccessErr(DOMException): ...
57-
class ValidationErr(DOMException): ...
42+
class IndexSizeErr(DOMException):
43+
code: Literal[1]
44+
45+
class DomstringSizeErr(DOMException):
46+
code: Literal[2]
47+
48+
class HierarchyRequestErr(DOMException):
49+
code: Literal[3]
50+
51+
class WrongDocumentErr(DOMException):
52+
code: Literal[4]
53+
54+
class InvalidCharacterErr(DOMException):
55+
code: Literal[5]
56+
57+
class NoDataAllowedErr(DOMException):
58+
code: Literal[6]
59+
60+
class NoModificationAllowedErr(DOMException):
61+
code: Literal[7]
62+
63+
class NotFoundErr(DOMException):
64+
code: Literal[8]
65+
66+
class NotSupportedErr(DOMException):
67+
code: Literal[9]
68+
69+
class InuseAttributeErr(DOMException):
70+
code: Literal[10]
71+
72+
class InvalidStateErr(DOMException):
73+
code: Literal[11]
74+
75+
class SyntaxErr(DOMException):
76+
code: Literal[12]
77+
78+
class InvalidModificationErr(DOMException):
79+
code: Literal[13]
80+
81+
class NamespaceErr(DOMException):
82+
code: Literal[14]
83+
84+
class InvalidAccessErr(DOMException):
85+
code: Literal[15]
86+
87+
class ValidationErr(DOMException):
88+
code: Literal[16]
5889

5990
class UserDataHandler:
60-
NODE_CLONED: int
61-
NODE_IMPORTED: int
62-
NODE_DELETED: int
63-
NODE_RENAMED: int
64-
65-
XML_NAMESPACE: Final[str]
66-
XMLNS_NAMESPACE: Final[str]
67-
XHTML_NAMESPACE: Final[str]
91+
NODE_CLONED: Literal[1]
92+
NODE_IMPORTED: Literal[2]
93+
NODE_DELETED: Literal[3]
94+
NODE_RENAMED: Literal[4]
95+
96+
XML_NAMESPACE: Final = "http://www.w3.org/XML/1998/namespace"
97+
XMLNS_NAMESPACE: Final = "http://www.w3.org/2000/xmlns/"
98+
XHTML_NAMESPACE: Final = "http://www.w3.org/1999/xhtml"
6899
EMPTY_NAMESPACE: Final[None]
69100
EMPTY_PREFIX: Final[None]

stdlib/xml/dom/expatbuilder.pyi

+66-45
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
from _typeshed import Incomplete, ReadableBuffer, SupportsRead
1+
from _typeshed import ReadableBuffer, SupportsRead
22
from typing import Any, NoReturn
3-
from xml.dom.minidom import Document, DOMImplementation, Node, TypeInfo
3+
from typing_extensions import TypeAlias
4+
from xml.dom.minidom import Document, DocumentFragment, DOMImplementation, Element, Node, TypeInfo
45
from xml.dom.xmlbuilder import DOMBuilderFilter, Options
6+
from xml.parsers.expat import XMLParserType
7+
8+
_Model: TypeAlias = tuple[int, int, str | None, tuple[Any, ...]] # same as in pyexpat
59

610
TEXT_NODE = Node.TEXT_NODE
711
CDATA_SECTION_NODE = Node.CDATA_SECTION_NODE
@@ -10,45 +14,56 @@ FILTER_ACCEPT = DOMBuilderFilter.FILTER_ACCEPT
1014
FILTER_REJECT = DOMBuilderFilter.FILTER_REJECT
1115
FILTER_SKIP = DOMBuilderFilter.FILTER_SKIP
1216
FILTER_INTERRUPT = DOMBuilderFilter.FILTER_INTERRUPT
13-
theDOMImplementation: DOMImplementation | None
17+
theDOMImplementation: DOMImplementation
1418

1519
class ElementInfo:
16-
tagName: Incomplete
17-
def __init__(self, tagName, model: Incomplete | None = None) -> None: ...
18-
def getAttributeType(self, aname) -> TypeInfo: ...
19-
def getAttributeTypeNS(self, namespaceURI, localName) -> TypeInfo: ...
20+
tagName: str
21+
def __init__(self, tagName: str, model: _Model | None = None) -> None: ...
22+
def getAttributeType(self, aname: str) -> TypeInfo: ...
23+
def getAttributeTypeNS(self, namespaceURI: str | None, localName: str) -> TypeInfo: ...
2024
def isElementContent(self) -> bool: ...
2125
def isEmpty(self) -> bool: ...
22-
def isId(self, aname) -> bool: ...
23-
def isIdNS(self, euri, ename, auri, aname) -> bool: ...
26+
def isId(self, aname: str) -> bool: ...
27+
def isIdNS(self, euri: str, ename: str, auri: str, aname: str) -> bool: ...
2428

2529
class ExpatBuilder:
2630
document: Document # Created in self.reset()
27-
curNode: Incomplete # Created in self.reset()
31+
curNode: DocumentFragment | Element | Document # Created in self.reset()
2832
def __init__(self, options: Options | None = None) -> None: ...
29-
def createParser(self): ...
30-
def getParser(self): ...
33+
def createParser(self) -> XMLParserType: ...
34+
def getParser(self) -> XMLParserType: ...
3135
def reset(self) -> None: ...
32-
def install(self, parser) -> None: ...
36+
def install(self, parser: XMLParserType) -> None: ...
3337
def parseFile(self, file: SupportsRead[ReadableBuffer | str]) -> Document: ...
3438
def parseString(self, string: str | ReadableBuffer) -> Document: ...
35-
def start_doctype_decl_handler(self, doctypeName, systemId, publicId, has_internal_subset) -> None: ...
39+
def start_doctype_decl_handler(
40+
self, doctypeName: str, systemId: str | None, publicId: str | None, has_internal_subset: bool
41+
) -> None: ...
3642
def end_doctype_decl_handler(self) -> None: ...
37-
def pi_handler(self, target, data) -> None: ...
38-
def character_data_handler_cdata(self, data) -> None: ...
39-
def character_data_handler(self, data) -> None: ...
43+
def pi_handler(self, target: str, data: str) -> None: ...
44+
def character_data_handler_cdata(self, data: str) -> None: ...
45+
def character_data_handler(self, data: str) -> None: ...
4046
def start_cdata_section_handler(self) -> None: ...
4147
def end_cdata_section_handler(self) -> None: ...
42-
def entity_decl_handler(self, entityName, is_parameter_entity, value, base, systemId, publicId, notationName) -> None: ...
43-
def notation_decl_handler(self, notationName, base, systemId, publicId) -> None: ...
44-
def comment_handler(self, data) -> None: ...
45-
def external_entity_ref_handler(self, context, base, systemId, publicId) -> int: ...
46-
def first_element_handler(self, name, attributes) -> None: ...
47-
def start_element_handler(self, name, attributes) -> None: ...
48-
def end_element_handler(self, name) -> None: ...
49-
def element_decl_handler(self, name, model) -> None: ...
50-
def attlist_decl_handler(self, elem, name, type, default, required) -> None: ...
51-
def xml_decl_handler(self, version, encoding, standalone) -> None: ...
48+
def entity_decl_handler(
49+
self,
50+
entityName: str,
51+
is_parameter_entity: bool,
52+
value: str | None,
53+
base: str | None,
54+
systemId: str,
55+
publicId: str | None,
56+
notationName: str | None,
57+
) -> None: ...
58+
def notation_decl_handler(self, notationName: str, base: str | None, systemId: str, publicId: str | None) -> None: ...
59+
def comment_handler(self, data: str) -> None: ...
60+
def external_entity_ref_handler(self, context: str, base: str | None, systemId: str | None, publicId: str | None) -> int: ...
61+
def first_element_handler(self, name: str, attributes: list[str]) -> None: ...
62+
def start_element_handler(self, name: str, attributes: list[str]) -> None: ...
63+
def end_element_handler(self, name: str) -> None: ...
64+
def element_decl_handler(self, name: str, model: _Model) -> None: ...
65+
def attlist_decl_handler(self, elem: str, name: str, type: str, default: str | None, required: bool) -> None: ...
66+
def xml_decl_handler(self, version: str, encoding: str | None, standalone: int) -> None: ...
5267

5368
class FilterVisibilityController:
5469
filter: DOMBuilderFilter
@@ -57,7 +72,7 @@ class FilterVisibilityController:
5772
def acceptNode(self, node: Node) -> int: ...
5873

5974
class FilterCrutch:
60-
def __init__(self, builder) -> None: ...
75+
def __init__(self, builder: ExpatBuilder) -> None: ...
6176

6277
class Rejecter(FilterCrutch):
6378
def start_element_handler(self, *args: Any) -> None: ...
@@ -68,33 +83,39 @@ class Skipper(FilterCrutch):
6883
def end_element_handler(self, *args: Any) -> None: ...
6984

7085
class FragmentBuilder(ExpatBuilder):
71-
fragment: Incomplete | None
72-
originalDocument: Incomplete
73-
context: Incomplete
74-
def __init__(self, context, options: Options | None = None) -> None: ...
86+
fragment: DocumentFragment | None
87+
originalDocument: Document
88+
context: Node
89+
def __init__(self, context: Node, options: Options | None = None) -> None: ...
90+
def reset(self) -> None: ...
91+
def parseFile(self, file: SupportsRead[ReadableBuffer | str]) -> DocumentFragment: ... # type: ignore[override]
92+
def parseString(self, string: ReadableBuffer | str) -> DocumentFragment: ... # type: ignore[override]
93+
def external_entity_ref_handler(self, context: str, base: str | None, systemId: str | None, publicId: str | None) -> int: ...
7594

7695
class Namespaces:
77-
def createParser(self): ...
78-
def install(self, parser) -> None: ...
79-
def start_namespace_decl_handler(self, prefix, uri) -> None: ...
80-
def start_element_handler(self, name, attributes) -> None: ...
81-
def end_element_handler(self, name) -> None: ...
96+
def createParser(self) -> XMLParserType: ...
97+
def install(self, parser: XMLParserType) -> None: ...
98+
def start_namespace_decl_handler(self, prefix: str | None, uri: str) -> None: ...
99+
def start_element_handler(self, name: str, attributes: list[str]) -> None: ...
100+
def end_element_handler(self, name: str) -> None: ... # only exists if __debug__
82101

83102
class ExpatBuilderNS(Namespaces, ExpatBuilder): ...
84103
class FragmentBuilderNS(Namespaces, FragmentBuilder): ...
85104
class ParseEscape(Exception): ...
86105

87106
class InternalSubsetExtractor(ExpatBuilder):
88-
subset: Any | None
89-
def getSubset(self) -> Any | None: ...
107+
subset: str | list[str] | None = None
108+
def getSubset(self) -> str: ...
90109
def parseFile(self, file: SupportsRead[ReadableBuffer | str]) -> None: ... # type: ignore[override]
91110
def parseString(self, string: str | ReadableBuffer) -> None: ... # type: ignore[override]
92-
def start_doctype_decl_handler(self, name, publicId, systemId, has_internal_subset) -> None: ... # type: ignore[override]
111+
def start_doctype_decl_handler( # type: ignore[override]
112+
self, name: str, publicId: str | None, systemId: str | None, has_internal_subset: bool
113+
) -> None: ...
93114
def end_doctype_decl_handler(self) -> NoReturn: ...
94-
def start_element_handler(self, name, attrs) -> NoReturn: ...
115+
def start_element_handler(self, name: str, attrs: list[str]) -> NoReturn: ...
95116

96-
def parse(file: str | SupportsRead[ReadableBuffer | str], namespaces: bool = True): ...
97-
def parseString(string: str | ReadableBuffer, namespaces: bool = True): ...
98-
def parseFragment(file, context, namespaces: bool = True): ...
99-
def parseFragmentString(string: str, context, namespaces: bool = True): ...
117+
def parse(file: str | SupportsRead[ReadableBuffer | str], namespaces: bool = True) -> Document: ...
118+
def parseString(string: str | ReadableBuffer, namespaces: bool = True) -> Document: ...
119+
def parseFragment(file: str | SupportsRead[ReadableBuffer | str], context: Node, namespaces: bool = True) -> DocumentFragment: ...
120+
def parseFragmentString(string: str | ReadableBuffer, context: Node, namespaces: bool = True) -> DocumentFragment: ...
100121
def makeBuilder(options: Options) -> ExpatBuilderNS | ExpatBuilder: ...

0 commit comments

Comments
 (0)