diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 85d904e72..0dd46a050 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -34,6 +34,7 @@ "stubs/click-default-group", "stubs/commonmark", "stubs/dateparser", + "stubs/defusedxml", "stubs/docutils", "stubs/Flask-SocketIO", "stubs/fpdf2", @@ -47,9 +48,9 @@ "stubs/ldap3", "stubs/Markdown", "stubs/mysqlclient", + "stubs/networkx", "stubs/oauthlib", "stubs/openpyxl", - "stubs/networkx", "stubs/passlib", "stubs/peewee", "stubs/pexpect", diff --git a/stubs/defusedxml/METADATA.toml b/stubs/defusedxml/METADATA.toml new file mode 100644 index 000000000..04dfe1b42 --- /dev/null +++ b/stubs/defusedxml/METADATA.toml @@ -0,0 +1,7 @@ +version = "0.7.*" +upstream_repository = "https://github.com/tiran/defusedxml" +partial_stub = true + +[tool.stubtest] +ignore_missing_stub = true +stubtest_requirements = ["lxml"] diff --git a/stubs/defusedxml/defusedxml/ElementTree.pyi b/stubs/defusedxml/defusedxml/ElementTree.pyi new file mode 100644 index 000000000..c40bda55d --- /dev/null +++ b/stubs/defusedxml/defusedxml/ElementTree.pyi @@ -0,0 +1,47 @@ +from _typeshed import Incomplete +from collections.abc import Iterator, Sequence +from typing import Any +from xml.dom.minidom import Element +from xml.etree.ElementTree import ElementTree, ParseError as ParseError, XMLParser as _XMLParser, tostring as tostring + +class DefusedXMLParser(_XMLParser): + forbid_dtd: bool + forbid_entities: bool + forbid_external: bool + def __init__( + self, + html=..., + target: Incomplete | None = None, + encoding: str | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, + ) -> None: ... + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset) -> None: ... + def defused_entity_decl(self, name, is_parameter_entity, value, base, sysid, pubid, notation_name) -> None: ... + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name) -> None: ... + def defused_external_entity_ref_handler(self, context, base, sysid, pubid) -> None: ... + +XMLTreeBuilder = DefusedXMLParser +XMLParse = DefusedXMLParser +XMLParser = DefusedXMLParser + +# wrapper to xml.etree.ElementTree.parse +def parse( + source, parser: XMLParser | None = None, forbid_dtd: bool = False, forbid_entities: bool = True, forbid_external: bool = True +) -> ElementTree: ... + +# wrapper to xml.etree.ElementTree.iterparse +def iterparse( + source, + events: Sequence[str] | None = None, + parser: XMLParser | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> Iterator[tuple[str, Any]]: ... +def fromstring(text, forbid_dtd: bool = False, forbid_entities: bool = True, forbid_external: bool = True) -> Element: ... + +XML = fromstring + +__all__ = ["ParseError", "XML", "XMLParse", "XMLParser", "XMLTreeBuilder", "fromstring", "iterparse", "parse", "tostring"] diff --git a/stubs/defusedxml/defusedxml/__init__.pyi b/stubs/defusedxml/defusedxml/__init__.pyi new file mode 100644 index 000000000..396800468 --- /dev/null +++ b/stubs/defusedxml/defusedxml/__init__.pyi @@ -0,0 +1,9 @@ +from .common import ( + DefusedXmlException as DefusedXmlException, + DTDForbidden as DTDForbidden, + EntitiesForbidden as EntitiesForbidden, + ExternalReferenceForbidden as ExternalReferenceForbidden, + NotSupportedError as NotSupportedError, +) + +__all__ = ["DefusedXmlException", "DTDForbidden", "EntitiesForbidden", "ExternalReferenceForbidden", "NotSupportedError"] diff --git a/stubs/defusedxml/defusedxml/cElementTree.pyi b/stubs/defusedxml/defusedxml/cElementTree.pyi new file mode 100644 index 000000000..8fe92b53a --- /dev/null +++ b/stubs/defusedxml/defusedxml/cElementTree.pyi @@ -0,0 +1,13 @@ +from .ElementTree import ( + XML as XML, + ParseError as ParseError, + XMLParse as XMLParse, + XMLParser as XMLParser, + XMLTreeBuilder as XMLTreeBuilder, + fromstring as fromstring, + iterparse as iterparse, + parse as parse, + tostring as tostring, +) + +__all__ = ["ParseError", "XML", "XMLParse", "XMLParser", "XMLTreeBuilder", "fromstring", "iterparse", "parse", "tostring"] diff --git a/stubs/defusedxml/defusedxml/common.pyi b/stubs/defusedxml/defusedxml/common.pyi new file mode 100644 index 000000000..c4afb1901 --- /dev/null +++ b/stubs/defusedxml/defusedxml/common.pyi @@ -0,0 +1,29 @@ +from _typeshed import Incomplete + +PY3: bool + +class DefusedXmlException(ValueError): ... + +class DTDForbidden(DefusedXmlException): + name: Incomplete + sysid: Incomplete + pubid: Incomplete + def __init__(self, name, sysid, pubid) -> None: ... + +class EntitiesForbidden(DefusedXmlException): + name: Incomplete + value: Incomplete + base: Incomplete + sysid: Incomplete + pubid: Incomplete + notation_name: Incomplete + def __init__(self, name, value, base, sysid, pubid, notation_name) -> None: ... + +class ExternalReferenceForbidden(DefusedXmlException): + context: Incomplete + base: Incomplete + sysid: Incomplete + pubid: Incomplete + def __init__(self, context, base, sysid, pubid) -> None: ... + +class NotSupportedError(DefusedXmlException): ... diff --git a/stubs/defusedxml/defusedxml/expatbuilder.pyi b/stubs/defusedxml/defusedxml/expatbuilder.pyi new file mode 100644 index 000000000..0c6f4b7b9 --- /dev/null +++ b/stubs/defusedxml/defusedxml/expatbuilder.pyi @@ -0,0 +1,34 @@ +from _typeshed import SupportsRead +from xml.dom.expatbuilder import ExpatBuilder as _ExpatBuilder, Namespaces as _Namespaces +from xml.dom.minidom import Document +from xml.dom.xmlbuilder import Options + +__origin__: str + +class DefusedExpatBuilder(_ExpatBuilder): + forbid_dtd: bool + forbid_entities: bool + forbid_external: bool + def __init__( + self, options: Options | None = None, forbid_dtd: bool = False, forbid_entities: bool = True, forbid_external: bool = True + ) -> None: ... + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset) -> None: ... + def defused_entity_decl(self, name, is_parameter_entity, value, base, sysid, pubid, notation_name) -> None: ... + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name) -> None: ... + def defused_external_entity_ref_handler(self, context, base, sysid, pubid) -> None: ... + def install(self, parser) -> None: ... + +class DefusedExpatBuilderNS(_Namespaces, DefusedExpatBuilder): + def install(self, parser) -> None: ... + def reset(self) -> None: ... + +def parse( + file: str | SupportsRead[bytes | str], + namespaces: bool = True, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> Document: ... +def parseString( + string: str, namespaces: bool = True, forbid_dtd: bool = False, forbid_entities: bool = True, forbid_external: bool = True +) -> Document: ... diff --git a/stubs/defusedxml/defusedxml/expatreader.pyi b/stubs/defusedxml/defusedxml/expatreader.pyi new file mode 100644 index 000000000..7453fee13 --- /dev/null +++ b/stubs/defusedxml/defusedxml/expatreader.pyi @@ -0,0 +1,10 @@ +from _typeshed import Incomplete + +# Cannot type most things here as DefusedExpatParser is based off of +# xml.sax.expatreader, which is an undocumented module and lacks types at the moment. + +__origin__: str + +DefusedExpatParser = Incomplete + +def create_parser(*args, **kwargs): ... diff --git a/stubs/defusedxml/defusedxml/lxml.pyi b/stubs/defusedxml/defusedxml/lxml.pyi new file mode 100644 index 000000000..10cb30a4a --- /dev/null +++ b/stubs/defusedxml/defusedxml/lxml.pyi @@ -0,0 +1,47 @@ +import threading +from _typeshed import Incomplete + +# Not bothering with types here as lxml support is supposed to be dropped in a future version +# of defusedxml + +LXML3: Incomplete +__origin__: str +tostring: Incomplete + +# Should be imported from lxml.etree.ElementBase, but lxml lacks types +class _ElementBase: ... + +class RestrictedElement(_ElementBase): + blacklist: Incomplete + def __iter__(self): ... + def iterchildren(self, tag: Incomplete | None = ..., reversed: bool = ...): ... + def iter(self, tag: Incomplete | None = ..., *tags): ... + def iterdescendants(self, tag: Incomplete | None = ..., *tags): ... + def itersiblings(self, tag: Incomplete | None = ..., preceding: bool = ...): ... + def getchildren(self): ... + def getiterator(self, tag: Incomplete | None = ...): ... + +class GlobalParserTLS(threading.local): + parser_config: Incomplete + element_class: Incomplete + def createDefaultParser(self): ... + def setDefaultParser(self, parser) -> None: ... + def getDefaultParser(self): ... + +getDefaultParser: Incomplete + +def check_docinfo(elementtree, forbid_dtd: bool = ..., forbid_entities: bool = ...) -> None: ... +def parse( + source, + parser: Incomplete | None = ..., + base_url: Incomplete | None = ..., + forbid_dtd: bool = ..., + forbid_entities: bool = ..., +): ... +def fromstring( + text, parser: Incomplete | None = ..., base_url: Incomplete | None = ..., forbid_dtd: bool = ..., forbid_entities: bool = ... +): ... + +XML = fromstring + +def iterparse(*args, **kwargs) -> None: ... diff --git a/stubs/defusedxml/defusedxml/minidom.pyi b/stubs/defusedxml/defusedxml/minidom.pyi new file mode 100644 index 000000000..177f8b1a8 --- /dev/null +++ b/stubs/defusedxml/defusedxml/minidom.pyi @@ -0,0 +1,19 @@ +from _typeshed import Incomplete + +__origin__: str + +def parse( + file, + parser: Incomplete | None = None, + bufsize: int | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +): ... +def parseString( + string: str, + parser: Incomplete | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +): ... diff --git a/stubs/defusedxml/defusedxml/pulldom.pyi b/stubs/defusedxml/defusedxml/pulldom.pyi new file mode 100644 index 000000000..173065abc --- /dev/null +++ b/stubs/defusedxml/defusedxml/pulldom.pyi @@ -0,0 +1,21 @@ +from xml.dom.pulldom import DOMEventStream + +from .expatreader import DefusedExpatParser + +__origin__: str + +def parse( + stream_or_string, + parser: DefusedExpatParser | None = None, + bufsize: int | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> DOMEventStream: ... +def parseString( + string: str, + parser: DefusedExpatParser | None = None, + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> DOMEventStream: ... diff --git a/stubs/defusedxml/defusedxml/sax.pyi b/stubs/defusedxml/defusedxml/sax.pyi new file mode 100644 index 000000000..a4c32eda5 --- /dev/null +++ b/stubs/defusedxml/defusedxml/sax.pyi @@ -0,0 +1,24 @@ +from _typeshed import Incomplete +from xml.sax import ErrorHandler as _ErrorHandler + +from .expatreader import DefusedExpatParser + +__origin__: str + +def parse( + source, + handler, + errorHandler: _ErrorHandler = ..., + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> None: ... +def parseString( + string, + handler, + errorHandler: _ErrorHandler = ..., + forbid_dtd: bool = False, + forbid_entities: bool = True, + forbid_external: bool = True, +) -> None: ... +def make_parser(parser_list: list[Incomplete] = []) -> DefusedExpatParser: ... diff --git a/stubs/defusedxml/defusedxml/xmlrpc.pyi b/stubs/defusedxml/defusedxml/xmlrpc.pyi new file mode 100644 index 000000000..cddcb3f51 --- /dev/null +++ b/stubs/defusedxml/defusedxml/xmlrpc.pyi @@ -0,0 +1,25 @@ +from _typeshed import Incomplete +from xmlrpc.client import ExpatParser + +__origin__: str +MAX_DATA: int = 31457280 + +def defused_gzip_decode(data, limit: int | None = None): ... + +# Couldn't type this as a class deriving from gzip.GzipFile +# since overwriting `read` method does not define an optional argument +# for size when the underlying class does. +DefusedGzipDecodedResponse = Incomplete + +class DefusedExpatParser(ExpatParser): + forbid_dtd: bool + forbid_entities: bool + forbid_external: bool + def __init__(self, target, forbid_dtd: bool = False, forbid_entities: bool = True, forbid_external: bool = True) -> None: ... + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset) -> None: ... + def defused_entity_decl(self, name, is_parameter_entity, value, base, sysid, pubid, notation_name) -> None: ... + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name) -> None: ... + def defused_external_entity_ref_handler(self, context, base, sysid, pubid) -> None: ... + +def monkey_patch() -> None: ... +def unmonkey_patch() -> None: ...