diff --git a/stdlib/xml/dom/minidom.pyi b/stdlib/xml/dom/minidom.pyi index 7368b1f47..356ae4658 100644 --- a/stdlib/xml/dom/minidom.pyi +++ b/stdlib/xml/dom/minidom.pyi @@ -1,11 +1,11 @@ import sys import xml.dom -from _typeshed import Self -from typing import IO, Any +from _typeshed import Self, SupportsRead +from typing import Any from xml.dom.xmlbuilder import DocumentLS, DOMImplementationLS from xml.sax.xmlreader import XMLReader -def parse(file: str | IO[Any], parser: XMLReader | None = ..., bufsize: int | None = ...): ... +def parse(file: str | SupportsRead[bytes] | SupportsRead[str], parser: XMLReader | None = ..., bufsize: int | None = ...): ... def parseString(string: str | bytes, parser: XMLReader | None = ...): ... def getDOMImplementation(features=...) -> DOMImplementation | None: ... diff --git a/stdlib/xml/dom/pulldom.pyi b/stdlib/xml/dom/pulldom.pyi index ebde90a74..7ae2dcf3e 100644 --- a/stdlib/xml/dom/pulldom.pyi +++ b/stdlib/xml/dom/pulldom.pyi @@ -1,5 +1,6 @@ import sys -from typing import IO, Any, Sequence, Union +from _typeshed import SupportsRead +from typing import Any, Sequence, Union from typing_extensions import Literal from xml.dom.minidom import Document, DOMImplementation, Element, Text from xml.sax.handler import ContentHandler @@ -62,10 +63,10 @@ class ErrorHandler: def fatalError(self, exception) -> None: ... class DOMEventStream: - stream: IO[bytes] + stream: SupportsRead[bytes] | SupportsRead[str] parser: XMLReader bufsize: int - def __init__(self, stream: IO[bytes], parser: XMLReader, bufsize: int) -> None: ... + def __init__(self, stream: SupportsRead[bytes] | SupportsRead[str], parser: XMLReader, bufsize: int) -> None: ... pulldom: Any if sys.version_info < (3, 11): def __getitem__(self, pos): ... @@ -86,5 +87,7 @@ class SAX2DOM(PullDOM): default_bufsize: int -def parse(stream_or_string: str | IO[bytes], parser: XMLReader | None = ..., bufsize: int | None = ...) -> DOMEventStream: ... +def parse( + stream_or_string: str | SupportsRead[bytes] | SupportsRead[str], parser: XMLReader | None = ..., bufsize: int | None = ... +) -> DOMEventStream: ... def parseString(string: str, parser: XMLReader | None = ...) -> DOMEventStream: ... diff --git a/stdlib/xml/etree/ElementTree.pyi b/stdlib/xml/etree/ElementTree.pyi index 708735627..265f42a47 100644 --- a/stdlib/xml/etree/ElementTree.pyi +++ b/stdlib/xml/etree/ElementTree.pyi @@ -1,7 +1,6 @@ import sys -from _typeshed import FileDescriptor, StrOrBytesPath, SupportsWrite +from _typeshed import FileDescriptor, StrOrBytesPath, SupportsRead, SupportsWrite from typing import ( - IO, Any, Callable, Generator, @@ -19,7 +18,9 @@ from typing import ( from typing_extensions import Literal, SupportsIndex, TypeGuard _T = TypeVar("_T") -_File = Union[StrOrBytesPath, FileDescriptor, IO[Any]] +_FileRead = Union[StrOrBytesPath, FileDescriptor, SupportsRead[bytes], SupportsRead[str]] +_FileWriteC14N = Union[StrOrBytesPath, FileDescriptor, SupportsWrite[bytes]] +_FileWrite = Union[_FileWriteC14N, SupportsWrite[str]] VERSION: str @@ -36,7 +37,7 @@ if sys.version_info >= (3, 8): xml_data: str | bytes | None = ..., *, out: None = ..., - from_file: _File | None = ..., + from_file: _FileRead | None = ..., with_comments: bool = ..., strip_text: bool = ..., rewrite_prefixes: bool = ..., @@ -50,7 +51,7 @@ if sys.version_info >= (3, 8): xml_data: str | bytes | None = ..., *, out: SupportsWrite[str], - from_file: _File | None = ..., + from_file: _FileRead | None = ..., with_comments: bool = ..., strip_text: bool = ..., rewrite_prefixes: bool = ..., @@ -121,9 +122,9 @@ class QName: def __eq__(self, other: object) -> bool: ... class ElementTree: - def __init__(self, element: Element | None = ..., file: _File | None = ...) -> None: ... + def __init__(self, element: Element | None = ..., file: _FileRead | None = ...) -> None: ... def getroot(self) -> Element: ... - def parse(self, source: _File, parser: XMLParser | None = ...) -> Element: ... + def parse(self, source: _FileRead, parser: XMLParser | None = ...) -> Element: ... def iter(self, tag: str | None = ...) -> Generator[Element, None, None]: ... if sys.version_info < (3, 9): def getiterator(self, tag: str | None = ...) -> list[Element]: ... @@ -137,7 +138,7 @@ class ElementTree: def iterfind(self, path: str, namespaces: dict[str, str] | None = ...) -> Generator[Element, None, None]: ... def write( self, - file_or_filename: _File, + file_or_filename: _FileWrite, encoding: str | None = ..., xml_declaration: bool | None = ..., default_namespace: str | None = ..., @@ -145,7 +146,7 @@ class ElementTree: *, short_empty_elements: bool = ..., ) -> None: ... - def write_c14n(self, file: _File) -> None: ... + def write_c14n(self, file: _FileWriteC14N) -> None: ... def register_namespace(prefix: str, uri: str) -> None: ... @@ -240,8 +241,10 @@ def dump(elem: Element) -> None: ... if sys.version_info >= (3, 9): def indent(tree: Element | ElementTree, space: str = ..., level: int = ...) -> None: ... -def parse(source: _File, parser: XMLParser | None = ...) -> ElementTree: ... -def iterparse(source: _File, events: Sequence[str] | None = ..., parser: XMLParser | None = ...) -> Iterator[tuple[str, Any]]: ... +def parse(source: _FileRead, parser: XMLParser | None = ...) -> ElementTree: ... +def iterparse( + source: _FileRead, events: Sequence[str] | None = ..., parser: XMLParser | None = ... +) -> Iterator[tuple[str, Any]]: ... class XMLPullParser: def __init__(self, events: Sequence[str] | None = ..., *, _parser: XMLParser | None = ...) -> None: ... diff --git a/stdlib/xml/sax/__init__.pyi b/stdlib/xml/sax/__init__.pyi index a123e7e89..418164aa8 100644 --- a/stdlib/xml/sax/__init__.pyi +++ b/stdlib/xml/sax/__init__.pyi @@ -1,8 +1,12 @@ import sys -from typing import IO, Any, Iterable, NoReturn +from _typeshed import SupportsRead, _T_co +from typing import Any, Iterable, NoReturn, Protocol from xml.sax.handler import ContentHandler, ErrorHandler from xml.sax.xmlreader import Locator, XMLReader +class _SupportsReadClose(SupportsRead[_T_co], Protocol[_T_co]): + def close(self) -> None: ... + class SAXException(Exception): def __init__(self, msg: str, exception: Exception | None = ...) -> None: ... def getMessage(self) -> str: ... @@ -28,6 +32,8 @@ if sys.version_info >= (3, 8): else: def make_parser(parser_list: list[str] = ...) -> XMLReader: ... -def parse(source: str | IO[str] | IO[bytes], handler: ContentHandler, errorHandler: ErrorHandler = ...) -> None: ... +def parse( + source: str | _SupportsReadClose[bytes] | _SupportsReadClose[str], handler: ContentHandler, errorHandler: ErrorHandler = ... +) -> None: ... def parseString(string: bytes | str, handler: ContentHandler, errorHandler: ErrorHandler | None = ...) -> None: ... def _create_parser(parser_name: str) -> XMLReader: ...