Reduce code duplication in the email module (#7558)

This commit is contained in:
Alex Waygood
2022-04-06 11:20:14 +01:00
committed by GitHub
parent 1ceb486b75
commit 3c85f36b7f
10 changed files with 31 additions and 35 deletions

View File

@@ -1,6 +1,11 @@
from email.message import Message
from email.policy import Policy
from typing import IO, Callable
from typing import IO, Callable, TypeVar, Union
# Definitions imported by multiple submodules in typeshed
_MessageT = TypeVar("_MessageT", bound=Message) # noqa: Y018
_ParamType = Union[str, tuple[str | None, str | None, str]]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
def message_from_bytes(s: bytes, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...

View File

@@ -1,23 +1,22 @@
from email import _MessageT
from email.message import Message
from email.policy import Policy
from typing import Callable, Generic, TypeVar, overload
from typing import Callable, Generic, overload
__all__ = ["FeedParser", "BytesFeedParser"]
_M = TypeVar("_M", bound=Message)
class FeedParser(Generic[_M]):
class FeedParser(Generic[_MessageT]):
@overload
def __init__(self: FeedParser[Message], _factory: None = ..., *, policy: Policy = ...) -> None: ...
@overload
def __init__(self, _factory: Callable[[], _M], *, policy: Policy = ...) -> None: ...
def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
def feed(self, data: str) -> None: ...
def close(self) -> _M: ...
def close(self) -> _MessageT: ...
class BytesFeedParser(Generic[_M]):
class BytesFeedParser(Generic[_MessageT]):
@overload
def __init__(self: BytesFeedParser[Message], _factory: None = ..., *, policy: Policy = ...) -> None: ...
@overload
def __init__(self, _factory: Callable[[], _M], *, policy: Policy = ...) -> None: ...
def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
def feed(self, data: bytes) -> None: ...
def close(self) -> _M: ...
def close(self) -> _MessageT: ...

View File

@@ -1,8 +1,9 @@
from email import _ParamsType, _ParamType
from email.charset import Charset
from email.contentmanager import ContentManager
from email.errors import MessageDefect
from email.policy import Policy
from typing import Any, Generator, Iterator, Sequence, TypeVar, Union
from typing import Any, Generator, Iterator, Sequence, TypeVar
__all__ = ["Message", "EmailMessage"]
@@ -10,8 +11,6 @@ _T = TypeVar("_T")
_PayloadType = list[Message] | str | bytes
_CharsetType = Charset | str | None
_ParamsType = Union[str, None, tuple[str, str | None, str]]
_ParamType = Union[str, tuple[str | None, str | None, str]]
_HeaderType = Any
class Message:

View File

@@ -1,11 +1,10 @@
from collections.abc import Callable
from email import _ParamsType
from email.mime.nonmultipart import MIMENonMultipart
from email.policy import Policy
from typing import Callable, Union
__all__ = ["MIMEApplication"]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
class MIMEApplication(MIMENonMultipart):
def __init__(
self,

View File

@@ -1,11 +1,10 @@
from collections.abc import Callable
from email import _ParamsType
from email.mime.nonmultipart import MIMENonMultipart
from email.policy import Policy
from typing import Callable, Union
__all__ = ["MIMEAudio"]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
class MIMEAudio(MIMENonMultipart):
def __init__(
self,

View File

@@ -1,10 +1,8 @@
import email.message
from email import _ParamsType
from email.policy import Policy
from typing import Union
__all__ = ["MIMEBase"]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
class MIMEBase(email.message.Message):
def __init__(self, _maintype: str, _subtype: str, *, policy: Policy | None = ..., **_params: _ParamsType) -> None: ...

View File

@@ -1,11 +1,10 @@
from collections.abc import Callable
from email import _ParamsType
from email.mime.nonmultipart import MIMENonMultipart
from email.policy import Policy
from typing import Callable, Union
__all__ = ["MIMEImage"]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
class MIMEImage(MIMENonMultipart):
def __init__(
self,

View File

@@ -1,12 +1,11 @@
from collections.abc import Sequence
from email import _ParamsType
from email.message import Message
from email.mime.base import MIMEBase
from email.policy import Policy
from typing import Sequence, Union
__all__ = ["MIMEMultipart"]
_ParamsType = Union[str, None, tuple[str, str | None, str]]
class MIMEMultipart(MIMEBase):
def __init__(
self,

View File

@@ -1,14 +1,13 @@
import email.feedparser
from email import _MessageT
from email.message import Message
from email.policy import Policy
from typing import BinaryIO, Callable, TextIO, TypeVar
from typing import BinaryIO, Callable, TextIO
__all__ = ["Parser", "HeaderParser", "BytesParser", "BytesHeaderParser", "FeedParser", "BytesFeedParser"]
_M = TypeVar("_M", bound=Message)
FeedParser = email.feedparser.FeedParser[_M]
BytesFeedParser = email.feedparser.BytesFeedParser[_M]
FeedParser = email.feedparser.FeedParser[_MessageT]
BytesFeedParser = email.feedparser.BytesFeedParser[_MessageT]
class Parser:
def __init__(self, _class: Callable[[], Message] | None = ..., *, policy: Policy = ...) -> None: ...

View File

@@ -1,7 +1,8 @@
import datetime
import sys
from email import _ParamType
from email.charset import Charset
from typing import Union, overload
from typing import overload
__all__ = [
"collapse_rfc2231_value",
@@ -21,7 +22,6 @@ __all__ = [
"unquote",
]
_ParamType = Union[str, tuple[str | None, str | None, str]]
_PDTZ = tuple[int, int, int, int, int, int, int, int, int, int | None]
def quote(str: str) -> str: ...