Skip to content

Commit afa2a8e

Browse files
mailbox: improve bytes handling (#9083)
- The _MessageData alias refers to objects handled in the _dump_message method: https://github.com/python/cpython/blob/016c7d37b6acfe2203542a2655080c6402b3be1f/Lib/mailbox.py#L210 - The path passed to __init__ should be a str path because there are many places in the file (search for self._path) where we join it with a str, which won't work with a bytes path.
1 parent 0884fe1 commit afa2a8e

File tree

1 file changed

+17
-22
lines changed

1 file changed

+17
-22
lines changed

stdlib/mailbox.pyi

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import email.message
2+
import io
23
import sys
3-
from _typeshed import Self, StrOrBytesPath
4+
from _typeshed import Self, StrPath, SupportsNoArgReadline, SupportsRead
45
from abc import ABCMeta, abstractmethod
56
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
67
from types import TracebackType
@@ -32,7 +33,10 @@ __all__ = [
3233

3334
_T = TypeVar("_T")
3435
_MessageT = TypeVar("_MessageT", bound=Message)
35-
_MessageData: TypeAlias = email.message.Message | bytes | str | IO[str] | IO[bytes]
36+
37+
class _SupportsReadAndReadline(SupportsRead[bytes], SupportsNoArgReadline[bytes], Protocol): ...
38+
39+
_MessageData: TypeAlias = email.message.Message | bytes | str | io.StringIO | _SupportsReadAndReadline
3640

3741
class _HasIteritems(Protocol):
3842
def iteritems(self) -> Iterator[tuple[str, _MessageData]]: ...
@@ -43,13 +47,12 @@ class _HasItems(Protocol):
4347
linesep: bytes
4448

4549
class Mailbox(Generic[_MessageT]):
46-
47-
_path: bytes | str # undocumented
50+
_path: str # undocumented
4851
_factory: Callable[[IO[Any]], _MessageT] | None # undocumented
4952
@overload
50-
def __init__(self, path: StrOrBytesPath, factory: Callable[[IO[Any]], _MessageT], create: bool = ...) -> None: ...
53+
def __init__(self, path: StrPath, factory: Callable[[IO[Any]], _MessageT], create: bool = ...) -> None: ...
5154
@overload
52-
def __init__(self, path: StrOrBytesPath, factory: None = ..., create: bool = ...) -> None: ...
55+
def __init__(self, path: StrPath, factory: None = ..., create: bool = ...) -> None: ...
5356
@abstractmethod
5457
def add(self, message: _MessageData) -> str: ...
5558
@abstractmethod
@@ -105,7 +108,7 @@ class Maildir(Mailbox[MaildirMessage]):
105108

106109
colon: str
107110
def __init__(
108-
self, dirname: StrOrBytesPath, factory: Callable[[IO[Any]], MaildirMessage] | None = ..., create: bool = ...
111+
self, dirname: StrPath, factory: Callable[[IO[Any]], MaildirMessage] | None = ..., create: bool = ...
109112
) -> None: ...
110113
def add(self, message: _MessageData) -> str: ...
111114
def remove(self, key: str) -> None: ...
@@ -146,19 +149,13 @@ class _mboxMMDF(_singlefileMailbox[_MessageT]):
146149
def get_string(self, key: str, from_: bool = ...) -> str: ...
147150

148151
class mbox(_mboxMMDF[mboxMessage]):
149-
def __init__(
150-
self, path: StrOrBytesPath, factory: Callable[[IO[Any]], mboxMessage] | None = ..., create: bool = ...
151-
) -> None: ...
152+
def __init__(self, path: StrPath, factory: Callable[[IO[Any]], mboxMessage] | None = ..., create: bool = ...) -> None: ...
152153

153154
class MMDF(_mboxMMDF[MMDFMessage]):
154-
def __init__(
155-
self, path: StrOrBytesPath, factory: Callable[[IO[Any]], MMDFMessage] | None = ..., create: bool = ...
156-
) -> None: ...
155+
def __init__(self, path: StrPath, factory: Callable[[IO[Any]], MMDFMessage] | None = ..., create: bool = ...) -> None: ...
157156

158157
class MH(Mailbox[MHMessage]):
159-
def __init__(
160-
self, path: StrOrBytesPath, factory: Callable[[IO[Any]], MHMessage] | None = ..., create: bool = ...
161-
) -> None: ...
158+
def __init__(self, path: StrPath, factory: Callable[[IO[Any]], MHMessage] | None = ..., create: bool = ...) -> None: ...
162159
def add(self, message: _MessageData) -> str: ...
163160
def remove(self, key: str) -> None: ...
164161
def __setitem__(self, key: str, message: _MessageData) -> None: ...
@@ -173,17 +170,15 @@ class MH(Mailbox[MHMessage]):
173170
def unlock(self) -> None: ...
174171
def close(self) -> None: ...
175172
def list_folders(self) -> list[str]: ...
176-
def get_folder(self, folder: StrOrBytesPath) -> MH: ...
177-
def add_folder(self, folder: StrOrBytesPath) -> MH: ...
178-
def remove_folder(self, folder: StrOrBytesPath) -> None: ...
173+
def get_folder(self, folder: StrPath) -> MH: ...
174+
def add_folder(self, folder: StrPath) -> MH: ...
175+
def remove_folder(self, folder: StrPath) -> None: ...
179176
def get_sequences(self) -> dict[str, list[int]]: ...
180177
def set_sequences(self, sequences: Mapping[str, Sequence[int]]) -> None: ...
181178
def pack(self) -> None: ...
182179

183180
class Babyl(_singlefileMailbox[BabylMessage]):
184-
def __init__(
185-
self, path: StrOrBytesPath, factory: Callable[[IO[Any]], BabylMessage] | None = ..., create: bool = ...
186-
) -> None: ...
181+
def __init__(self, path: StrPath, factory: Callable[[IO[Any]], BabylMessage] | None = ..., create: bool = ...) -> None: ...
187182
def get_message(self, key: str) -> BabylMessage: ...
188183
def get_bytes(self, key: str) -> bytes: ...
189184
def get_file(self, key: str) -> IO[bytes]: ...

0 commit comments

Comments
 (0)