Skip to content

xml: improve bytes types #9110

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Nov 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions stdlib/xml/dom/expatbuilder.pyi
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from _typeshed import Incomplete
from _typeshed import Incomplete, ReadableBuffer, SupportsRead
from typing import Any, NoReturn
from xml.dom.minidom import Document, DOMImplementation, Node, TypeInfo
from xml.dom.xmlbuilder import DOMBuilderFilter, Options
Expand Down Expand Up @@ -30,8 +30,8 @@ class ExpatBuilder:
def getParser(self): ...
def reset(self) -> None: ...
def install(self, parser) -> None: ...
def parseFile(self, file) -> Document: ...
def parseString(self, string: str) -> Document: ...
def parseFile(self, file: SupportsRead[ReadableBuffer | str]) -> Document: ...
def parseString(self, string: str | ReadableBuffer) -> Document: ...
def start_doctype_decl_handler(self, doctypeName, systemId, publicId, has_internal_subset) -> None: ...
def end_doctype_decl_handler(self) -> None: ...
def pi_handler(self, target, data) -> None: ...
Expand Down Expand Up @@ -87,14 +87,14 @@ class ParseEscape(Exception): ...
class InternalSubsetExtractor(ExpatBuilder):
subset: Any | None
def getSubset(self) -> Any | None: ...
def parseFile(self, file) -> None: ... # type: ignore[override]
def parseString(self, string: str) -> None: ... # type: ignore[override]
def parseFile(self, file: SupportsRead[ReadableBuffer | str]) -> None: ... # type: ignore[override]
def parseString(self, string: str | ReadableBuffer) -> None: ... # type: ignore[override]
def start_doctype_decl_handler(self, name, publicId, systemId, has_internal_subset) -> None: ... # type: ignore[override]
def end_doctype_decl_handler(self) -> NoReturn: ...
def start_element_handler(self, name, attrs) -> NoReturn: ...

def parse(file, namespaces: bool = ...): ...
def parseString(string: str, namespaces: bool = ...): ...
def parse(file: str | SupportsRead[ReadableBuffer | str], namespaces: bool = ...): ...
def parseString(string: str | ReadableBuffer, namespaces: bool = ...): ...
def parseFragment(file, context, namespaces: bool = ...): ...
def parseFragmentString(string: str, context, namespaces: bool = ...): ...
def makeBuilder(options: Options) -> ExpatBuilderNS | ExpatBuilder: ...
6 changes: 3 additions & 3 deletions stdlib/xml/dom/minidom.pyi
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import sys
import xml.dom
from _typeshed import Incomplete, Self, SupportsRead, SupportsWrite
from _typeshed import Incomplete, ReadableBuffer, Self, SupportsRead, SupportsWrite
from typing_extensions import Literal
from xml.dom.xmlbuilder import DocumentLS, DOMImplementationLS
from xml.sax.xmlreader import XMLReader

def parse(file: str | SupportsRead[bytes] | SupportsRead[str], parser: XMLReader | None = ..., bufsize: int | None = ...): ...
def parseString(string: str | bytes, parser: XMLReader | None = ...): ...
def parse(file: str | SupportsRead[ReadableBuffer | str], parser: XMLReader | None = ..., bufsize: int | None = ...): ...
def parseString(string: str | ReadableBuffer, parser: XMLReader | None = ...): ...
def getDOMImplementation(features=...) -> DOMImplementation | None: ...

class Node(xml.dom.Node):
Expand Down
3 changes: 2 additions & 1 deletion stdlib/xml/etree/ElementInclude.pyi
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import sys
from _typeshed import StrOrBytesPath
from collections.abc import Callable
from xml.etree.ElementTree import Element

Expand All @@ -11,7 +12,7 @@ if sys.version_info >= (3, 9):

class FatalIncludeError(SyntaxError): ...

def default_loader(href: str | bytes | int, parse: str, encoding: str | None = ...) -> str | Element: ...
def default_loader(href: StrOrBytesPath | int, parse: str, encoding: str | None = ...) -> str | Element: ...

# TODO: loader is of type default_loader ie it takes a callable that has the
# same signature as default_loader. But default_loader has a keyword argument
Expand Down
24 changes: 13 additions & 11 deletions stdlib/xml/etree/ElementTree.pyi
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import sys
from _collections_abc import dict_keys
from _typeshed import FileDescriptor, StrOrBytesPath, SupportsRead, SupportsWrite
from _typeshed import FileDescriptor, ReadableBuffer, StrOrBytesPath, SupportsRead, SupportsWrite
from collections.abc import Callable, Generator, ItemsView, Iterable, Iterator, Mapping, Sequence
from typing import Any, TypeVar, overload
from typing_extensions import Literal, SupportsIndex, TypeAlias, TypeGuard
Expand Down Expand Up @@ -54,7 +54,7 @@ def iselement(element: object) -> TypeGuard[Element]: ...
if sys.version_info >= (3, 8):
@overload
def canonicalize(
xml_data: str | bytes | None = ...,
xml_data: str | ReadableBuffer | None = ...,
*,
out: None = ...,
from_file: _FileRead | None = ...,
Expand All @@ -68,7 +68,7 @@ if sys.version_info >= (3, 8):
) -> str: ...
@overload
def canonicalize(
xml_data: str | bytes | None = ...,
xml_data: str | ReadableBuffer | None = ...,
*,
out: SupportsWrite[str],
from_file: _FileRead | None = ...,
Expand Down Expand Up @@ -270,19 +270,19 @@ def iterparse(

class XMLPullParser:
def __init__(self, events: Sequence[str] | None = ..., *, _parser: XMLParser | None = ...) -> None: ...
def feed(self, data: str | bytes) -> None: ...
def feed(self, data: str | ReadableBuffer) -> None: ...
def close(self) -> None: ...
# Second element in the tuple could be `Element`, `tuple[str, str]` or `None`.
# Use `Any` to avoid false-positive errors.
def read_events(self) -> Iterator[tuple[str, Any]]: ...

def XML(text: str | bytes, parser: XMLParser | None = ...) -> Element: ...
def XMLID(text: str | bytes, parser: XMLParser | None = ...) -> tuple[Element, dict[str, Element]]: ...
def XML(text: str | ReadableBuffer, parser: XMLParser | None = ...) -> Element: ...
def XMLID(text: str | ReadableBuffer, parser: XMLParser | None = ...) -> tuple[Element, dict[str, Element]]: ...

# This is aliased to XML in the source.
fromstring = XML

def fromstringlist(sequence: Sequence[str | bytes], parser: XMLParser | None = ...) -> Element: ...
def fromstringlist(sequence: Sequence[str | ReadableBuffer], parser: XMLParser | None = ...) -> Element: ...

# This type is both not precise enough and too precise. The TreeBuilder
# requires the elementfactory to accept tag and attrs in its args and produce
Expand Down Expand Up @@ -313,9 +313,11 @@ class TreeBuilder:
def __init__(self, element_factory: _ElementFactory | None = ...) -> None: ...

def close(self) -> Element: ...
def data(self, __data: str | bytes) -> None: ...
def start(self, __tag: str | bytes, __attrs: dict[str | bytes, str | bytes]) -> Element: ...
def end(self, __tag: str | bytes) -> Element: ...
def data(self, __data: str) -> None: ...
# tag and attrs are passed to the element_factory, so they could be anything
# depending on what the particular factory supports.
def start(self, __tag: Any, __attrs: dict[Any, Any]) -> Element: ...
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be worth keeping the comment, but only changing the type if someone actually complains?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The existing type is pretty hard to achieve due to invariance, so I'd rather not keep it.

def end(self, __tag: str) -> Element: ...
if sys.version_info >= (3, 8):
# These two methods have pos-only parameters in the C implementation
def comment(self, __text: str | None) -> Element: ...
Expand Down Expand Up @@ -355,4 +357,4 @@ class XMLParser:
def doctype(self, __name: str, __pubid: str, __system: str) -> None: ...

def close(self) -> Any: ...
def feed(self, __data: str | bytes) -> None: ...
def feed(self, __data: str | ReadableBuffer) -> None: ...
4 changes: 2 additions & 2 deletions stdlib/xml/sax/__init__.pyi
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import sys
from _typeshed import SupportsRead, _T_co
from _typeshed import ReadableBuffer, SupportsRead, _T_co
from collections.abc import Iterable
from typing import Any, NoReturn, Protocol
from xml.sax.handler import ContentHandler as ContentHandler, ErrorHandler as ErrorHandler
Expand Down Expand Up @@ -36,5 +36,5 @@ else:
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 parseString(string: ReadableBuffer | str, handler: ContentHandler, errorHandler: ErrorHandler | None = ...) -> None: ...
def _create_parser(parser_name: str) -> XMLReader: ...