From b0d50d39046537bd8f52ef5eae929b4675ee4f9d Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:26:34 +0200 Subject: [PATCH 1/7] Make email.policy classes generic Cf. #10762 --- stdlib/email/policy.pyi | 62 ++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/stdlib/email/policy.pyi b/stdlib/email/policy.pyi index 804044031fcd..31459e10d119 100644 --- a/stdlib/email/policy.pyi +++ b/stdlib/email/policy.pyi @@ -3,19 +3,33 @@ from collections.abc import Callable from email.contentmanager import ContentManager from email.errors import MessageDefect from email.header import Header -from email.message import Message -from typing import Any +from email.message import EmailMessage, Message +from typing import Any, TypeVar, overload from typing_extensions import Self __all__ = ["Compat32", "compat32", "Policy", "EmailPolicy", "default", "strict", "SMTP", "HTTP"] -class Policy(metaclass=ABCMeta): +_MessageT = TypeVar("_MessageT", bound=Message) + +class Policy(Generic[_MessageT], metaclass=ABCMeta): max_line_length: int | None linesep: str cte_type: str raise_on_defect: bool mangle_from_: bool - message_factory: Callable[[Policy], Message] | None + message_factory: Callable[[Policy], _MessageT] | None + @overload + def __init__( + self: Policy[Message], + *, + max_line_length: int | None = ..., + linesep: str = ..., + cte_type: str = ..., + raise_on_defect: bool = ..., + mangle_from_: bool = ..., + message_factory: None = None, + ) -> None: ... + @overload def __init__( self, *, @@ -24,11 +38,11 @@ class Policy(metaclass=ABCMeta): cte_type: str = ..., raise_on_defect: bool = ..., mangle_from_: bool = ..., - message_factory: Callable[[Policy], Message] | None = ..., + message_factory: Callable[[Policy], _MessageT], ) -> None: ... def clone(self, **kw: Any) -> Self: ... - def handle_defect(self, obj: Message, defect: MessageDefect) -> None: ... - def register_defect(self, obj: Message, defect: MessageDefect) -> None: ... + def handle_defect(self, obj: _MessageT, defect: MessageDefect) -> None: ... + def register_defect(self, obj: _MessageT, defect: MessageDefect) -> None: ... def header_max_count(self, name: str) -> int | None: ... @abstractmethod def header_source_parse(self, sourcelines: list[str]) -> tuple[str, str]: ... @@ -41,20 +55,36 @@ class Policy(metaclass=ABCMeta): @abstractmethod def fold_binary(self, name: str, value: str) -> bytes: ... -class Compat32(Policy): +class Compat32(Policy[_MessageT]): def header_source_parse(self, sourcelines: list[str]) -> tuple[str, str]: ... def header_store_parse(self, name: str, value: str) -> tuple[str, str]: ... def header_fetch_parse(self, name: str, value: str) -> str | Header: ... # type: ignore[override] def fold(self, name: str, value: str) -> str: ... def fold_binary(self, name: str, value: str) -> bytes: ... -compat32: Compat32 +compat32: Compat32[Message] -class EmailPolicy(Policy): +class EmailPolicy(Policy[_MessageT]): utf8: bool refold_source: str header_factory: Callable[[str, Any], Any] content_manager: ContentManager + @overload + def __init__( + self: EmailPolicy[EmailMessage], + *, + max_line_length: int | None = ..., + linesep: str = ..., + cte_type: str = ..., + raise_on_defect: bool = ..., + mangle_from_: bool = ..., + message_factory: None = None, + utf8: bool = ..., + refold_source: str = ..., + header_factory: Callable[[str, str], str] = ..., + content_manager: ContentManager = ..., + ) -> None: ... + @overload def __init__( self, *, @@ -63,7 +93,7 @@ class EmailPolicy(Policy): cte_type: str = ..., raise_on_defect: bool = ..., mangle_from_: bool = ..., - message_factory: Callable[[Policy], Message] | None = ..., + message_factory: Callable[[Policy], _MessageT] | None = ..., utf8: bool = ..., refold_source: str = ..., header_factory: Callable[[str, str], str] = ..., @@ -75,8 +105,8 @@ class EmailPolicy(Policy): def fold(self, name: str, value: str) -> Any: ... def fold_binary(self, name: str, value: str) -> bytes: ... -default: EmailPolicy -SMTP: EmailPolicy -SMTPUTF8: EmailPolicy -HTTP: EmailPolicy -strict: EmailPolicy +default: EmailPolicy[EmailMessage] +SMTP: EmailPolicy[EmailMessage] +SMTPUTF8: EmailPolicy[EmailMessage] +HTTP: EmailPolicy[EmailMessage] +strict: EmailPolicy[EmailMessage] From e2158fe22bce7dab08b67537df4607e78c9404a0 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:29:08 +0200 Subject: [PATCH 2/7] Add missing import --- stdlib/email/policy.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/email/policy.pyi b/stdlib/email/policy.pyi index 31459e10d119..5e265fe6703f 100644 --- a/stdlib/email/policy.pyi +++ b/stdlib/email/policy.pyi @@ -4,7 +4,7 @@ from email.contentmanager import ContentManager from email.errors import MessageDefect from email.header import Header from email.message import EmailMessage, Message -from typing import Any, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from typing_extensions import Self __all__ = ["Compat32", "compat32", "Policy", "EmailPolicy", "default", "strict", "SMTP", "HTTP"] From 1d181e3c4b8cf37fd9cbb279c8090c5461aa3504 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:41:18 +0200 Subject: [PATCH 3/7] Add parameters to Policy --- stdlib/email/__init__.pyi | 12 +++++++----- stdlib/email/_header_value_parser.pyi | 4 ++-- stdlib/email/feedparser.pyi | 8 ++++---- stdlib/email/generator.pyi | 7 ++++--- stdlib/email/headerregistry.pyi | 2 +- stdlib/email/message.pyi | 12 ++++++------ stdlib/email/mime/application.pyi | 3 ++- stdlib/email/mime/audio.pyi | 3 ++- stdlib/email/mime/base.pyi | 3 ++- stdlib/email/mime/image.pyi | 3 ++- stdlib/email/mime/message.pyi | 3 ++- stdlib/email/mime/multipart.pyi | 3 ++- stdlib/email/mime/text.pyi | 3 ++- stdlib/email/parser.pyi | 4 ++-- stdlib/email/policy.pyi | 6 +++--- 15 files changed, 43 insertions(+), 33 deletions(-) diff --git a/stdlib/email/__init__.pyi b/stdlib/email/__init__.pyi index fca302f5f1a7..dc7118b483d9 100644 --- a/stdlib/email/__init__.pyi +++ b/stdlib/email/__init__.pyi @@ -1,17 +1,19 @@ from collections.abc import Callable from email.message import Message from email.policy import Policy -from typing import IO +from typing import IO, Any from typing_extensions import TypeAlias # Definitions imported by multiple submodules in typeshed _ParamType: TypeAlias = str | tuple[str | None, str | None, str] # noqa: Y047 _ParamsType: TypeAlias = str | None | tuple[str, str | None, str] # noqa: Y047 -def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ... -def message_from_bytes(s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ... -def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ... -def message_from_binary_file(fp: IO[bytes], _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ... +# TODO: These functions should be generic over the message with appropriate +# overloads. +def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... +def message_from_bytes(s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... +def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... +def message_from_binary_file(fp: IO[bytes], _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... # Names in __all__ with no definition: # base64mime diff --git a/stdlib/email/_header_value_parser.pyi b/stdlib/email/_header_value_parser.pyi index 97008140ec5d..b241b87cc55d 100644 --- a/stdlib/email/_header_value_parser.pyi +++ b/stdlib/email/_header_value_parser.pyi @@ -37,7 +37,7 @@ class TokenList(list[TokenList | Terminal]): def as_ew_allowed(self) -> bool: ... @property def comments(self) -> list[str]: ... - def fold(self, *, policy: Policy) -> str: ... + def fold(self, *, policy: Policy[Any]) -> str: ... def pprint(self, indent: str = "") -> None: ... def ppstr(self, indent: str = "") -> str: ... @@ -300,7 +300,7 @@ if sys.version_info >= (3, 8): class MsgID(TokenList): token_type: str as_ew_allowed: bool - def fold(self, policy: Policy) -> str: ... + def fold(self, policy: Policy[Any]) -> str: ... class MessageID(MsgID): token_type: str diff --git a/stdlib/email/feedparser.pyi b/stdlib/email/feedparser.pyi index 4b7f73b9c015..64d66da7f060 100644 --- a/stdlib/email/feedparser.pyi +++ b/stdlib/email/feedparser.pyi @@ -9,16 +9,16 @@ _MessageT = TypeVar("_MessageT", bound=Message) class FeedParser(Generic[_MessageT]): @overload - def __init__(self: FeedParser[Message], _factory: None = None, *, policy: Policy = ...) -> None: ... + def __init__(self: FeedParser[Message], _factory: None = None, *, policy: Policy[Message] = ...) -> None: ... @overload - def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ... + def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy[_MessageT] = ...) -> None: ... def feed(self, data: str) -> None: ... def close(self) -> _MessageT: ... class BytesFeedParser(Generic[_MessageT]): @overload - def __init__(self: BytesFeedParser[Message], _factory: None = None, *, policy: Policy = ...) -> None: ... + def __init__(self: BytesFeedParser[Message], _factory: None = None, *, policy: Policy[Message] = ...) -> None: ... @overload - def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ... + def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy[_MessageT] = ...) -> None: ... def feed(self, data: bytes | bytearray) -> None: ... def close(self) -> _MessageT: ... diff --git a/stdlib/email/generator.pyi b/stdlib/email/generator.pyi index faa6551fc925..33b9403e77a5 100644 --- a/stdlib/email/generator.pyi +++ b/stdlib/email/generator.pyi @@ -1,6 +1,7 @@ from _typeshed import SupportsWrite from email.message import Message from email.policy import Policy +from typing import Any from typing_extensions import Self __all__ = ["Generator", "DecodedGenerator", "BytesGenerator"] @@ -14,7 +15,7 @@ class Generator: mangle_from_: bool | None = None, maxheaderlen: int | None = None, *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, ) -> None: ... def flatten(self, msg: Message, unixfrom: bool = False, linesep: str | None = None) -> None: ... @@ -25,7 +26,7 @@ class BytesGenerator(Generator): mangle_from_: bool | None = None, maxheaderlen: int | None = None, *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, ) -> None: ... class DecodedGenerator(Generator): @@ -36,5 +37,5 @@ class DecodedGenerator(Generator): maxheaderlen: int | None = None, fmt: str | None = None, *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, ) -> None: ... diff --git a/stdlib/email/headerregistry.pyi b/stdlib/email/headerregistry.pyi index e158e89818f7..e7aa478af891 100644 --- a/stdlib/email/headerregistry.pyi +++ b/stdlib/email/headerregistry.pyi @@ -25,7 +25,7 @@ class BaseHeader(str): def defects(self) -> tuple[MessageDefect, ...]: ... def __new__(cls, name: str, value: Any) -> Self: ... def init(self, name: str, *, parse_tree: TokenList, defects: Iterable[MessageDefect]) -> None: ... - def fold(self, *, policy: Policy) -> str: ... + def fold(self, *, policy: Policy[Any]) -> str: ... class UnstructuredHeader: max_count: ClassVar[Literal[1] | None] diff --git a/stdlib/email/message.pyi b/stdlib/email/message.pyi index 18852f4d3bb2..11232b52cfa5 100644 --- a/stdlib/email/message.pyi +++ b/stdlib/email/message.pyi @@ -16,7 +16,7 @@ _CharsetType: TypeAlias = Charset | str | None _HeaderType: TypeAlias = Any class Message: - policy: Policy # undocumented + policy: Policy[Any] # undocumented preamble: str | None epilogue: str | None defects: list[MessageDefect] @@ -85,8 +85,8 @@ class Message: def get_charsets(self, failobj: _T) -> list[str | _T]: ... def walk(self) -> Generator[Self, None, None]: ... def get_content_disposition(self) -> str | None: ... - def as_string(self, unixfrom: bool = False, maxheaderlen: int = 0, policy: Policy | None = None) -> str: ... - def as_bytes(self, unixfrom: bool = False, policy: Policy | None = None) -> bytes: ... + def as_string(self, unixfrom: bool = False, maxheaderlen: int = 0, policy: Policy[Any] | None = None) -> str: ... + def as_bytes(self, unixfrom: bool = False, policy: Policy[Any] | None = None) -> bytes: ... def __bytes__(self) -> bytes: ... def set_param( self, @@ -98,13 +98,13 @@ class Message: language: str = "", replace: bool = False, ) -> None: ... - def __init__(self, policy: Policy = ...) -> None: ... + def __init__(self, policy: Policy[Any] = ...) -> None: ... # The following two methods are undocumented, but a source code comment states that they are public API def set_raw(self, name: str, value: _HeaderType) -> None: ... def raw_items(self) -> Iterator[tuple[str, _HeaderType]]: ... class MIMEPart(Message): - def __init__(self, policy: Policy | None = None) -> None: ... + def __init__(self, policy: Policy[Any] | None = None) -> None: ... def get_body(self, preferencelist: Sequence[str] = ("related", "html", "plain")) -> Message | None: ... def iter_attachments(self) -> Iterator[Message]: ... def iter_parts(self) -> Iterator[Message]: ... @@ -118,7 +118,7 @@ class MIMEPart(Message): def add_attachment(self, *args: Any, content_manager: ContentManager | None = ..., **kw: Any) -> None: ... def clear(self) -> None: ... def clear_content(self) -> None: ... - def as_string(self, unixfrom: bool = False, maxheaderlen: int | None = None, policy: Policy | None = None) -> str: ... + def as_string(self, unixfrom: bool = False, maxheaderlen: int | None = None, policy: Policy[Any] | None = None) -> str: ... def is_attachment(self) -> bool: ... class EmailMessage(MIMEPart): ... diff --git a/stdlib/email/mime/application.pyi b/stdlib/email/mime/application.pyi index a7ab9dc75ce2..65fba9ab1e49 100644 --- a/stdlib/email/mime/application.pyi +++ b/stdlib/email/mime/application.pyi @@ -2,6 +2,7 @@ from collections.abc import Callable from email import _ParamsType from email.mime.nonmultipart import MIMENonMultipart from email.policy import Policy +from typing import Any __all__ = ["MIMEApplication"] @@ -12,6 +13,6 @@ class MIMEApplication(MIMENonMultipart): _subtype: str = "octet-stream", _encoder: Callable[[MIMEApplication], object] = ..., *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, **_params: _ParamsType, ) -> None: ... diff --git a/stdlib/email/mime/audio.pyi b/stdlib/email/mime/audio.pyi index 090dfb960db6..953a64f7f0ff 100644 --- a/stdlib/email/mime/audio.pyi +++ b/stdlib/email/mime/audio.pyi @@ -2,6 +2,7 @@ from collections.abc import Callable from email import _ParamsType from email.mime.nonmultipart import MIMENonMultipart from email.policy import Policy +from typing import Any __all__ = ["MIMEAudio"] @@ -12,6 +13,6 @@ class MIMEAudio(MIMENonMultipart): _subtype: str | None = None, _encoder: Callable[[MIMEAudio], object] = ..., *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, **_params: _ParamsType, ) -> None: ... diff --git a/stdlib/email/mime/base.pyi b/stdlib/email/mime/base.pyi index b733709f1b5a..e40f47796705 100644 --- a/stdlib/email/mime/base.pyi +++ b/stdlib/email/mime/base.pyi @@ -1,8 +1,9 @@ import email.message from email import _ParamsType from email.policy import Policy +from typing import Any __all__ = ["MIMEBase"] class MIMEBase(email.message.Message): - def __init__(self, _maintype: str, _subtype: str, *, policy: Policy | None = None, **_params: _ParamsType) -> None: ... + def __init__(self, _maintype: str, _subtype: str, *, policy: Policy[Any] | None = None, **_params: _ParamsType) -> None: ... diff --git a/stdlib/email/mime/image.pyi b/stdlib/email/mime/image.pyi index b47afa6ce592..0e782a035dbc 100644 --- a/stdlib/email/mime/image.pyi +++ b/stdlib/email/mime/image.pyi @@ -2,6 +2,7 @@ from collections.abc import Callable from email import _ParamsType from email.mime.nonmultipart import MIMENonMultipart from email.policy import Policy +from typing import Any __all__ = ["MIMEImage"] @@ -12,6 +13,6 @@ class MIMEImage(MIMENonMultipart): _subtype: str | None = None, _encoder: Callable[[MIMEImage], object] = ..., *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, **_params: _ParamsType, ) -> None: ... diff --git a/stdlib/email/mime/message.pyi b/stdlib/email/mime/message.pyi index 23cf58619ad9..16bee94d58eb 100644 --- a/stdlib/email/mime/message.pyi +++ b/stdlib/email/mime/message.pyi @@ -1,8 +1,9 @@ from email.message import Message from email.mime.nonmultipart import MIMENonMultipart from email.policy import Policy +from typing import Any __all__ = ["MIMEMessage"] class MIMEMessage(MIMENonMultipart): - def __init__(self, _msg: Message, _subtype: str = "rfc822", *, policy: Policy | None = None) -> None: ... + def __init__(self, _msg: Message, _subtype: str = "rfc822", *, policy: Policy[Any] | None = None) -> None: ... diff --git a/stdlib/email/mime/multipart.pyi b/stdlib/email/mime/multipart.pyi index 6163810ed94a..707550d2d7f4 100644 --- a/stdlib/email/mime/multipart.pyi +++ b/stdlib/email/mime/multipart.pyi @@ -3,6 +3,7 @@ from email import _ParamsType from email.message import Message from email.mime.base import MIMEBase from email.policy import Policy +from typing import Any __all__ = ["MIMEMultipart"] @@ -13,6 +14,6 @@ class MIMEMultipart(MIMEBase): boundary: str | None = None, _subparts: Sequence[Message] | None = None, *, - policy: Policy | None = None, + policy: Policy[Any] | None = None, **_params: _ParamsType, ) -> None: ... diff --git a/stdlib/email/mime/text.pyi b/stdlib/email/mime/text.pyi index 74d5ef4c5cae..24b67b51811b 100644 --- a/stdlib/email/mime/text.pyi +++ b/stdlib/email/mime/text.pyi @@ -1,9 +1,10 @@ from email.mime.nonmultipart import MIMENonMultipart from email.policy import Policy +from typing import Any __all__ = ["MIMEText"] class MIMEText(MIMENonMultipart): def __init__( - self, _text: str, _subtype: str = "plain", _charset: str | None = None, *, policy: Policy | None = None + self, _text: str, _subtype: str = "plain", _charset: str | None = None, *, policy: Policy[Any] | None = None ) -> None: ... diff --git a/stdlib/email/parser.pyi b/stdlib/email/parser.pyi index 28b6aca856ca..ffdf988afb96 100644 --- a/stdlib/email/parser.pyi +++ b/stdlib/email/parser.pyi @@ -8,7 +8,7 @@ from typing import IO __all__ = ["Parser", "HeaderParser", "BytesParser", "BytesHeaderParser", "FeedParser", "BytesFeedParser"] class Parser: - def __init__(self, _class: Callable[[], Message] | None = None, *, policy: Policy = ...) -> None: ... + def __init__(self, _class: Callable[[], Message] | None = None, *, policy: Policy[Message] = ...) -> None: ... def parse(self, fp: SupportsRead[str], headersonly: bool = False) -> Message: ... def parsestr(self, text: str, headersonly: bool = False) -> Message: ... @@ -17,7 +17,7 @@ class HeaderParser(Parser): def parsestr(self, text: str, headersonly: bool = True) -> Message: ... class BytesParser: - def __init__(self, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> None: ... + def __init__(self, _class: Callable[[], Message] = ..., *, policy: Policy[Message] = ...) -> None: ... def parse(self, fp: IO[bytes], headersonly: bool = False) -> Message: ... def parsebytes(self, text: bytes | bytearray, headersonly: bool = False) -> Message: ... diff --git a/stdlib/email/policy.pyi b/stdlib/email/policy.pyi index 5e265fe6703f..e49879de61ab 100644 --- a/stdlib/email/policy.pyi +++ b/stdlib/email/policy.pyi @@ -17,7 +17,7 @@ class Policy(Generic[_MessageT], metaclass=ABCMeta): cte_type: str raise_on_defect: bool mangle_from_: bool - message_factory: Callable[[Policy], _MessageT] | None + message_factory: Callable[[Policy[_MessageT]], _MessageT] | None @overload def __init__( self: Policy[Message], @@ -38,7 +38,7 @@ class Policy(Generic[_MessageT], metaclass=ABCMeta): cte_type: str = ..., raise_on_defect: bool = ..., mangle_from_: bool = ..., - message_factory: Callable[[Policy], _MessageT], + message_factory: Callable[[Policy[_MessageT]], _MessageT], ) -> None: ... def clone(self, **kw: Any) -> Self: ... def handle_defect(self, obj: _MessageT, defect: MessageDefect) -> None: ... @@ -93,7 +93,7 @@ class EmailPolicy(Policy[_MessageT]): cte_type: str = ..., raise_on_defect: bool = ..., mangle_from_: bool = ..., - message_factory: Callable[[Policy], _MessageT] | None = ..., + message_factory: Callable[[Policy[_MessageT]], _MessageT] | None = ..., utf8: bool = ..., refold_source: str = ..., header_factory: Callable[[str, str], str] = ..., From eb9dcfca134fb11fab1704b163251bb845f909d1 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:43:46 +0200 Subject: [PATCH 4/7] Force use of message_factory in an overload --- stdlib/email/policy.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/email/policy.pyi b/stdlib/email/policy.pyi index e49879de61ab..ba1cd712a8ba 100644 --- a/stdlib/email/policy.pyi +++ b/stdlib/email/policy.pyi @@ -93,7 +93,7 @@ class EmailPolicy(Policy[_MessageT]): cte_type: str = ..., raise_on_defect: bool = ..., mangle_from_: bool = ..., - message_factory: Callable[[Policy[_MessageT]], _MessageT] | None = ..., + message_factory: Callable[[Policy[_MessageT]], _MessageT], utf8: bool = ..., refold_source: str = ..., header_factory: Callable[[str, str], str] = ..., From 0c778dc0558dda10ea6cf707b10ba2b2e0556955 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:52:15 +0200 Subject: [PATCH 5/7] Use Incomplete --- stdlib/email/__init__.pyi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/stdlib/email/__init__.pyi b/stdlib/email/__init__.pyi index dc7118b483d9..55caf7b32926 100644 --- a/stdlib/email/__init__.pyi +++ b/stdlib/email/__init__.pyi @@ -1,3 +1,4 @@ +from _typeshed import Incomplete from collections.abc import Callable from email.message import Message from email.policy import Policy @@ -10,10 +11,14 @@ _ParamsType: TypeAlias = str | None | tuple[str, str | None, str] # noqa: Y047 # TODO: These functions should be generic over the message with appropriate # overloads. -def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... -def message_from_bytes(s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... -def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... -def message_from_binary_file(fp: IO[bytes], _class: Callable[[], Message] = ..., *, policy: Policy[Any] = ...) -> Message: ... +def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ...) -> Message: ... +def message_from_bytes( + s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ... +) -> Message: ... +def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ...) -> Message: ... +def message_from_binary_file( + fp: IO[bytes], _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ... +) -> Message: ... # Names in __all__ with no definition: # base64mime From f97d62c33465ac422aee13add74e634633d4081c Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 25 Sep 2023 13:52:51 +0200 Subject: [PATCH 6/7] Add issue number --- stdlib/email/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/email/__init__.pyi b/stdlib/email/__init__.pyi index 55caf7b32926..53ee114b00c7 100644 --- a/stdlib/email/__init__.pyi +++ b/stdlib/email/__init__.pyi @@ -10,7 +10,7 @@ _ParamType: TypeAlias = str | tuple[str | None, str | None, str] # noqa: Y047 _ParamsType: TypeAlias = str | None | tuple[str, str | None, str] # noqa: Y047 # TODO: These functions should be generic over the message with appropriate -# overloads. +# overloads. (#10762) def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ...) -> Message: ... def message_from_bytes( s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy[Incomplete] = ... From e4d3925f24dd99d58fffe92f2efa4d0c723dc1ff Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 11:52:57 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/email/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/email/__init__.pyi b/stdlib/email/__init__.pyi index 53ee114b00c7..c839187af074 100644 --- a/stdlib/email/__init__.pyi +++ b/stdlib/email/__init__.pyi @@ -2,7 +2,7 @@ from _typeshed import Incomplete from collections.abc import Callable from email.message import Message from email.policy import Policy -from typing import IO, Any +from typing import IO from typing_extensions import TypeAlias # Definitions imported by multiple submodules in typeshed