From b58b8f3b430d846257990ffb249235ef0906221d Mon Sep 17 00:00:00 2001 From: Tarcisio Date: Thu, 28 May 2020 17:07:00 -0700 Subject: [PATCH] Make BytesIO inherit from BufferedIOBase. (#4082) Co-authored-by: Shantanu Co-authored-by: Jelle Zijlstra --- stdlib/3/gzip.pyi | 2 +- stdlib/3/io.pyi | 46 +++++++----------------- stdlib/3/lzma.pyi | 2 +- tests/stubtest_whitelists/py35.txt | 2 -- tests/stubtest_whitelists/py36.txt | 2 -- tests/stubtest_whitelists/py3_common.txt | 1 + 6 files changed, 15 insertions(+), 40 deletions(-) diff --git a/stdlib/3/gzip.pyi b/stdlib/3/gzip.pyi index 9357a71a2..67a2e5aba 100644 --- a/stdlib/3/gzip.pyi +++ b/stdlib/3/gzip.pyi @@ -82,7 +82,7 @@ class GzipFile(_compression.BaseStream): def writable(self) -> bool: ... def seekable(self) -> bool: ... def seek(self, offset: int, whence: int = ...) -> int: ... - def readline(self, size: int = ...) -> bytes: ... + def readline(self, size: Optional[int] = ...) -> bytes: ... class _GzipReader(_compression.DecompressReader): def __init__(self, fp: IO[bytes]) -> None: ... diff --git a/stdlib/3/io.pyi b/stdlib/3/io.pyi index 6d590939a..945c21b5d 100644 --- a/stdlib/3/io.pyi +++ b/stdlib/3/io.pyi @@ -64,7 +64,7 @@ class IOBase: def truncate(self, __size: Optional[int] = ...) -> int: ... def writable(self) -> bool: ... def writelines(self, __lines: Iterable[Union[bytes, bytearray]]) -> None: ... - def readline(self, __size: int = ...) -> bytes: ... + def readline(self, __size: Optional[int] = ...) -> bytes: ... def __del__(self) -> None: ... @property def closed(self) -> bool: ... @@ -85,7 +85,6 @@ class BufferedIOBase(IOBase): def read(self, __size: Optional[int] = ...) -> bytes: ... def read1(self, __size: int = ...) -> bytes: ... - class FileIO(RawIOBase): mode: str name: Union[int, str] @@ -97,52 +96,27 @@ class FileIO(RawIOBase): opener: Optional[Callable[[Union[int, str], str], int]] = ... ) -> None: ... -# TODO should extend from BufferedIOBase -class BytesIO(BinaryIO): +class BytesIO(BufferedIOBase, BinaryIO): def __init__(self, initial_bytes: bytes = ...) -> None: ... # BytesIO does not contain a "name" field. This workaround is necessary # to allow BytesIO sub-classes to add this field, as it is defined # as a read-only property on IO[]. name: Any + def __enter__(self: _T) -> _T: ... def getvalue(self) -> bytes: ... def getbuffer(self) -> memoryview: ... - # copied from IOBase - def __iter__(self) -> Iterator[bytes]: ... - def __next__(self) -> bytes: ... - def __enter__(self) -> BytesIO: ... - def __exit__(self, t: Optional[Type[BaseException]] = ..., value: Optional[BaseException] = ..., - traceback: Optional[TracebackType] = ...) -> Optional[bool]: ... - def close(self) -> None: ... - def fileno(self) -> int: ... - def flush(self) -> None: ... - def isatty(self) -> bool: ... - def readable(self) -> bool: ... - def readlines(self, __size: int = ...) -> List[bytes]: ... - def seek(self, __pos: int, __whence: int = ...) -> int: ... - def seekable(self) -> bool: ... - def tell(self) -> int: ... - def truncate(self, __size: Optional[int] = ...) -> int: ... - def writable(self) -> bool: ... - # TODO should be the next line instead - # def writelines(self, lines: List[Union[bytes, bytearray]]) -> None: ... - def writelines(self, __lines: Any) -> None: ... - def readline(self, __size: Optional[int] = ...) -> bytes: ... - def __del__(self) -> None: ... - closed: bool - # copied from BufferedIOBase - def detach(self) -> RawIOBase: ... - def readinto(self, __buffer: _bytearray_like) -> int: ... - def write(self, __b: Union[bytes, bytearray]) -> int: ... - def readinto1(self, __buffer: _bytearray_like) -> int: ... - def read(self, __size: Optional[int] = ...) -> bytes: ... if sys.version_info >= (3, 7): def read1(self, __size: Optional[int] = ...) -> bytes: ... else: - def read1(self, __size: Optional[int]) -> bytes: ... + def read1(self, __size: Optional[int]) -> bytes: ... # type: ignore class BufferedReader(BufferedIOBase): def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ... def peek(self, __size: int = ...) -> bytes: ... + if sys.version_info >= (3, 7): + def read1(self, __size: int = ...) -> bytes: ... + else: + def read1(self, __size: int) -> bytes: ... # type: ignore class BufferedWriter(BufferedIOBase): def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ... @@ -153,6 +127,10 @@ class BufferedRandom(BufferedReader, BufferedWriter): def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ... def seek(self, __target: int, __whence: int = ...) -> int: ... def tell(self) -> int: ... + if sys.version_info >= (3, 7): + def read1(self, __size: int = ...) -> bytes: ... + else: + def read1(self, __size: int) -> bytes: ... # type: ignore class BufferedRWPair(BufferedIOBase): def __init__(self, reader: RawIOBase, writer: RawIOBase, diff --git a/stdlib/3/lzma.pyi b/stdlib/3/lzma.pyi index 8755ec807..500c87fcb 100644 --- a/stdlib/3/lzma.pyi +++ b/stdlib/3/lzma.pyi @@ -92,7 +92,7 @@ class LZMAFile(io.BufferedIOBase, IO[bytes]): def peek(self, size: int = ...) -> bytes: ... def read(self, size: Optional[int] = ...) -> bytes: ... def read1(self, size: int = ...) -> bytes: ... - def readline(self, size: int = ...) -> bytes: ... + def readline(self, size: Optional[int] = ...) -> bytes: ... def write(self, data: bytes) -> int: ... def seek(self, offset: int, whence: int = ...) -> int: ... def tell(self) -> int: ... diff --git a/tests/stubtest_whitelists/py35.txt b/tests/stubtest_whitelists/py35.txt index 2218191b5..0e67c489f 100644 --- a/tests/stubtest_whitelists/py35.txt +++ b/tests/stubtest_whitelists/py35.txt @@ -25,8 +25,6 @@ ctypes.CDLL.__init__ fractions.Fraction.__new__ # private _normalize param was made keyword-only in Python 3.6 importlib.metadata importlib.resources -io.BufferedRandom.read1 -io.BufferedReader.read1 io.StringIO.readline ipaddress._BaseNetwork.__init__ json.dump diff --git a/tests/stubtest_whitelists/py36.txt b/tests/stubtest_whitelists/py36.txt index 4e37a0741..b87900181 100644 --- a/tests/stubtest_whitelists/py36.txt +++ b/tests/stubtest_whitelists/py36.txt @@ -23,8 +23,6 @@ email.message.MIMEPart.as_string enum.Enum._generate_next_value_ importlib.metadata importlib.resources -io.BufferedRandom.read1 -io.BufferedReader.read1 io.StringIO.readline ipaddress._BaseNetwork.__init__ json.loads diff --git a/tests/stubtest_whitelists/py3_common.txt b/tests/stubtest_whitelists/py3_common.txt index 9d98007b4..e011cbf5b 100644 --- a/tests/stubtest_whitelists/py3_common.txt +++ b/tests/stubtest_whitelists/py3_common.txt @@ -256,6 +256,7 @@ io.BufferedReader.truncate io.BufferedWriter.seek io.BufferedWriter.truncate io.BytesIO.readlines +io.BytesIO.seek # Parameter name for a positional-only param differs from its name in the inherited method io.FileIO.seek io.StringIO.seek io.StringIO.truncate