Skip to content

Commit 3c85f36

Browse files
authored
Reduce code duplication in the email module (#7558)
1 parent 1ceb486 commit 3c85f36

File tree

10 files changed

+31
-35
lines changed

10 files changed

+31
-35
lines changed

stdlib/email/__init__.pyi

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from email.message import Message
22
from email.policy import Policy
3-
from typing import IO, Callable
3+
from typing import IO, Callable, TypeVar, Union
4+
5+
# Definitions imported by multiple submodules in typeshed
6+
_MessageT = TypeVar("_MessageT", bound=Message) # noqa: Y018
7+
_ParamType = Union[str, tuple[str | None, str | None, str]]
8+
_ParamsType = Union[str, None, tuple[str, str | None, str]]
49

510
def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
611
def message_from_bytes(s: bytes, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...

stdlib/email/feedparser.pyi

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1+
from email import _MessageT
12
from email.message import Message
23
from email.policy import Policy
3-
from typing import Callable, Generic, TypeVar, overload
4+
from typing import Callable, Generic, overload
45

56
__all__ = ["FeedParser", "BytesFeedParser"]
67

7-
_M = TypeVar("_M", bound=Message)
8-
9-
class FeedParser(Generic[_M]):
8+
class FeedParser(Generic[_MessageT]):
109
@overload
1110
def __init__(self: FeedParser[Message], _factory: None = ..., *, policy: Policy = ...) -> None: ...
1211
@overload
13-
def __init__(self, _factory: Callable[[], _M], *, policy: Policy = ...) -> None: ...
12+
def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
1413
def feed(self, data: str) -> None: ...
15-
def close(self) -> _M: ...
14+
def close(self) -> _MessageT: ...
1615

17-
class BytesFeedParser(Generic[_M]):
16+
class BytesFeedParser(Generic[_MessageT]):
1817
@overload
1918
def __init__(self: BytesFeedParser[Message], _factory: None = ..., *, policy: Policy = ...) -> None: ...
2019
@overload
21-
def __init__(self, _factory: Callable[[], _M], *, policy: Policy = ...) -> None: ...
20+
def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
2221
def feed(self, data: bytes) -> None: ...
23-
def close(self) -> _M: ...
22+
def close(self) -> _MessageT: ...

stdlib/email/message.pyi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1+
from email import _ParamsType, _ParamType
12
from email.charset import Charset
23
from email.contentmanager import ContentManager
34
from email.errors import MessageDefect
45
from email.policy import Policy
5-
from typing import Any, Generator, Iterator, Sequence, TypeVar, Union
6+
from typing import Any, Generator, Iterator, Sequence, TypeVar
67

78
__all__ = ["Message", "EmailMessage"]
89

910
_T = TypeVar("_T")
1011

1112
_PayloadType = list[Message] | str | bytes
1213
_CharsetType = Charset | str | None
13-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
14-
_ParamType = Union[str, tuple[str | None, str | None, str]]
1514
_HeaderType = Any
1615

1716
class Message:

stdlib/email/mime/application.pyi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
from collections.abc import Callable
2+
from email import _ParamsType
13
from email.mime.nonmultipart import MIMENonMultipart
24
from email.policy import Policy
3-
from typing import Callable, Union
45

56
__all__ = ["MIMEApplication"]
67

7-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
8-
98
class MIMEApplication(MIMENonMultipart):
109
def __init__(
1110
self,

stdlib/email/mime/audio.pyi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
from collections.abc import Callable
2+
from email import _ParamsType
13
from email.mime.nonmultipart import MIMENonMultipart
24
from email.policy import Policy
3-
from typing import Callable, Union
45

56
__all__ = ["MIMEAudio"]
67

7-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
8-
98
class MIMEAudio(MIMENonMultipart):
109
def __init__(
1110
self,

stdlib/email/mime/base.pyi

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import email.message
2+
from email import _ParamsType
23
from email.policy import Policy
3-
from typing import Union
44

55
__all__ = ["MIMEBase"]
66

7-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
8-
97
class MIMEBase(email.message.Message):
108
def __init__(self, _maintype: str, _subtype: str, *, policy: Policy | None = ..., **_params: _ParamsType) -> None: ...

stdlib/email/mime/image.pyi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
from collections.abc import Callable
2+
from email import _ParamsType
13
from email.mime.nonmultipart import MIMENonMultipart
24
from email.policy import Policy
3-
from typing import Callable, Union
45

56
__all__ = ["MIMEImage"]
67

7-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
8-
98
class MIMEImage(MIMENonMultipart):
109
def __init__(
1110
self,

stdlib/email/mime/multipart.pyi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1+
from collections.abc import Sequence
2+
from email import _ParamsType
13
from email.message import Message
24
from email.mime.base import MIMEBase
35
from email.policy import Policy
4-
from typing import Sequence, Union
56

67
__all__ = ["MIMEMultipart"]
78

8-
_ParamsType = Union[str, None, tuple[str, str | None, str]]
9-
109
class MIMEMultipart(MIMEBase):
1110
def __init__(
1211
self,

stdlib/email/parser.pyi

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import email.feedparser
2+
from email import _MessageT
23
from email.message import Message
34
from email.policy import Policy
4-
from typing import BinaryIO, Callable, TextIO, TypeVar
5+
from typing import BinaryIO, Callable, TextIO
56

67
__all__ = ["Parser", "HeaderParser", "BytesParser", "BytesHeaderParser", "FeedParser", "BytesFeedParser"]
78

8-
_M = TypeVar("_M", bound=Message)
9-
10-
FeedParser = email.feedparser.FeedParser[_M]
11-
BytesFeedParser = email.feedparser.BytesFeedParser[_M]
9+
FeedParser = email.feedparser.FeedParser[_MessageT]
10+
BytesFeedParser = email.feedparser.BytesFeedParser[_MessageT]
1211

1312
class Parser:
1413
def __init__(self, _class: Callable[[], Message] | None = ..., *, policy: Policy = ...) -> None: ...

stdlib/email/utils.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import datetime
22
import sys
3+
from email import _ParamType
34
from email.charset import Charset
4-
from typing import Union, overload
5+
from typing import overload
56

67
__all__ = [
78
"collapse_rfc2231_value",
@@ -21,7 +22,6 @@ __all__ = [
2122
"unquote",
2223
]
2324

24-
_ParamType = Union[str, tuple[str | None, str | None, str]]
2525
_PDTZ = tuple[int, int, int, int, int, int, int, int, int, int | None]
2626

2727
def quote(str: str) -> str: ...

0 commit comments

Comments
 (0)