From 1e73c5ba5b28e2cbdae551849a43438d1e63211c Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Thu, 20 Feb 2025 20:51:11 +0000 Subject: [PATCH 01/17] Allow memoryview[bytes] in write() and writelines() --- stdlib/asyncio/transports.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index c28ae234f2cc..388ce3fa6200 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -24,8 +24,8 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: bytes | bytearray | memoryview) -> None: ... - def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview]) -> None: ... + def write(self, data: bytes | bytearray | memoryview[int] | memoryview[bytes]) -> None: ... + def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[int] | memoryview[bytes]]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 6774a6a4211b3b0e77b2960e90212c5c4a894a9e Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Thu, 20 Feb 2025 20:57:30 +0000 Subject: [PATCH 02/17] Update transports.pyi --- stdlib/asyncio/transports.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index 388ce3fa6200..c2485a2b026b 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -24,8 +24,8 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: bytes | bytearray | memoryview[int] | memoryview[bytes]) -> None: ... - def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[int] | memoryview[bytes]]) -> None: ... + def write(self, data: bytes | bytearray | memoryview | memoryview[bytes]) -> None: ... + def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview | memoryview[bytes]]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 6d92650ec4cce78b3a4a4f9f93c4699734f24daa Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 13:45:42 +0000 Subject: [PATCH 03/17] ReadableBuffer --- stdlib/asyncio/transports.pyi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index c2485a2b026b..76525a9ae1c8 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -3,6 +3,7 @@ from asyncio.protocols import BaseProtocol from collections.abc import Iterable, Mapping from socket import _Address from typing import Any +from _typeshed import ReadableBuffer # Keep asyncio.__all__ updated with any changes to __all__ here __all__ = ("BaseTransport", "ReadTransport", "WriteTransport", "Transport", "DatagramTransport", "SubprocessTransport") @@ -24,8 +25,8 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: bytes | bytearray | memoryview | memoryview[bytes]) -> None: ... - def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview | memoryview[bytes]]) -> None: ... + def write(self, data: ReadableBuffer) -> None: ... + def writelines(self, list_of_data: ReadableBuffer]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 521e9a3ecb6f14f88dca502536abebb2174d364e Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 13:46:17 +0000 Subject: [PATCH 04/17] Update transports.pyi --- stdlib/asyncio/transports.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index 76525a9ae1c8..59d5a89cae52 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -26,7 +26,7 @@ class WriteTransport(BaseTransport): def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... def write(self, data: ReadableBuffer) -> None: ... - def writelines(self, list_of_data: ReadableBuffer]) -> None: ... + def writelines(self, list_of_data: Iterable[ReadableBuffer]]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 2df164c0c49a8d3f48ec3fd5d6c5b5a32cf29928 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:11:11 +0000 Subject: [PATCH 05/17] Update transports.pyi --- stdlib/asyncio/transports.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index 59d5a89cae52..f019623921e2 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -26,7 +26,7 @@ class WriteTransport(BaseTransport): def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... def write(self, data: ReadableBuffer) -> None: ... - def writelines(self, list_of_data: Iterable[ReadableBuffer]]) -> None: ... + def writelines(self, list_of_data: Iterable[ReadableBuffer]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From c1731024f9a203a4529fcadf98286f23aa3e596d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:13:33 +0000 Subject: [PATCH 06/17] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/asyncio/transports.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index f019623921e2..e5c1ba626664 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -1,9 +1,9 @@ +from _typeshed import ReadableBuffer from asyncio.events import AbstractEventLoop from asyncio.protocols import BaseProtocol from collections.abc import Iterable, Mapping from socket import _Address from typing import Any -from _typeshed import ReadableBuffer # Keep asyncio.__all__ updated with any changes to __all__ here __all__ = ("BaseTransport", "ReadTransport", "WriteTransport", "Transport", "DatagramTransport", "SubprocessTransport") From 444cf59f6bb1ca5087e2c3d5eab09bcd6920af39 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:26:07 +0000 Subject: [PATCH 07/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index ded1933dd659..1ed5331c13e6 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -5,6 +5,7 @@ from collections.abc import Callable from enum import Enum from typing import Any, ClassVar, Final, Literal from typing_extensions import TypeAlias +from _typeshed import ReadableBuffer from . import constants, events, futures, protocols, transports @@ -76,7 +77,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin, transports.Transport): def get_extra_info(self, name: str, default: Any | None = None) -> dict[str, Any]: ... @property def _protocol_paused(self) -> bool: ... - def write(self, data: bytes | bytearray | memoryview) -> None: ... + def write(self, data: ReadableBuffer) -> None: ... def can_write_eof(self) -> Literal[False]: ... if sys.version_info >= (3, 11): def get_write_buffer_limits(self) -> tuple[int, int]: ... From 66e7166c013d92585a7960b615fdad7e8f581f37 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:28:03 +0000 Subject: [PATCH 08/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index 1ed5331c13e6..adf590aa0eae 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,11 +1,10 @@ -import ssl +from _typeshed import ReadableBufferimport ssl import sys from collections import deque from collections.abc import Callable from enum import Enum from typing import Any, ClassVar, Final, Literal from typing_extensions import TypeAlias -from _typeshed import ReadableBuffer from . import constants, events, futures, protocols, transports From 63488099e26f8d42f3ed21f55c0d094d1e93e62e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:28:12 +0000 Subject: [PATCH 09/17] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/asyncio/sslproto.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index adf590aa0eae..e27897b380e5 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,5 +1,6 @@ from _typeshed import ReadableBufferimport ssl import sys +from _typeshed import ReadableBuffer from collections import deque from collections.abc import Callable from enum import Enum From 77a14c244dfda3bb16a68bc26bb8a534975ee618 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:28:23 +0000 Subject: [PATCH 10/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index e27897b380e5..0fdad8494f92 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,4 +1,5 @@ -from _typeshed import ReadableBufferimport ssl +from _typeshed import ReadableBuffer +import ssl import sys from _typeshed import ReadableBuffer from collections import deque From 18cd54dfe4e53ca4374f9fb084140a00f8359ea6 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:28:37 +0000 Subject: [PATCH 11/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index 0fdad8494f92..4ecccfcbe588 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,7 +1,6 @@ from _typeshed import ReadableBuffer import ssl import sys -from _typeshed import ReadableBuffer from collections import deque from collections.abc import Callable from enum import Enum From edc4b61375e4f20f1313f3c42679688e4bc1a05f Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 14:29:01 +0000 Subject: [PATCH 12/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index 4ecccfcbe588..d343860f9793 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,6 +1,6 @@ -from _typeshed import ReadableBuffer import ssl import sys +from _typeshed import ReadableBuffer from collections import deque from collections.abc import Callable from enum import Enum From 01d37280ed33fecb89a82888c025ded2780472be Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 16:19:39 +0000 Subject: [PATCH 13/17] Update sslproto.pyi --- stdlib/asyncio/sslproto.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index d343860f9793..eb4a4c92a3ea 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -1,6 +1,5 @@ import ssl import sys -from _typeshed import ReadableBuffer from collections import deque from collections.abc import Callable from enum import Enum @@ -77,7 +76,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin, transports.Transport): def get_extra_info(self, name: str, default: Any | None = None) -> dict[str, Any]: ... @property def _protocol_paused(self) -> bool: ... - def write(self, data: ReadableBuffer) -> None: ... + def write(self, data: bytes | bytearray | memoryview[object]) -> None: ... def can_write_eof(self) -> Literal[False]: ... if sys.version_info >= (3, 11): def get_write_buffer_limits(self) -> tuple[int, int]: ... From 5d99818012c0430a72275de900b9a6ba54c3ed34 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Fri, 21 Feb 2025 16:20:43 +0000 Subject: [PATCH 14/17] Update transports.pyi --- stdlib/asyncio/transports.pyi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index e5c1ba626664..7a23676b01db 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -1,4 +1,3 @@ -from _typeshed import ReadableBuffer from asyncio.events import AbstractEventLoop from asyncio.protocols import BaseProtocol from collections.abc import Iterable, Mapping @@ -25,8 +24,8 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: ReadableBuffer) -> None: ... - def writelines(self, list_of_data: Iterable[ReadableBuffer]) -> None: ... + def write(self, data: bytes | bytearray | memoryview[object]) -> None: ... + def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[object]]) -> None: ... def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 5bf531ebe68fd1aca30fd2432d08c31cbb480f5d Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Thu, 20 Mar 2025 13:33:14 +0000 Subject: [PATCH 15/17] Apply suggestions from code review Co-authored-by: Sebastian Rittau --- stdlib/asyncio/sslproto.pyi | 2 +- stdlib/asyncio/transports.pyi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index eb4a4c92a3ea..bfe987c7c0ed 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -76,7 +76,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin, transports.Transport): def get_extra_info(self, name: str, default: Any | None = None) -> dict[str, Any]: ... @property def _protocol_paused(self) -> bool: ... - def write(self, data: bytes | bytearray | memoryview[object]) -> None: ... + def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape def can_write_eof(self) -> Literal[False]: ... if sys.version_info >= (3, 11): def get_write_buffer_limits(self) -> tuple[int, int]: ... diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index 7a23676b01db..9bc3b5ccd623 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -24,8 +24,8 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: bytes | bytearray | memoryview[object]) -> None: ... - def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[object]]) -> None: ... + def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape + def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[Any]]) -> None: ... # any memoryview format or shape def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 4aa443082edd5a55d88eaaf6611ec120e9e88463 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:34:52 +0000 Subject: [PATCH 16/17] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/asyncio/sslproto.pyi | 2 +- stdlib/asyncio/transports.pyi | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/stdlib/asyncio/sslproto.pyi b/stdlib/asyncio/sslproto.pyi index bfe987c7c0ed..ab102f124c2e 100644 --- a/stdlib/asyncio/sslproto.pyi +++ b/stdlib/asyncio/sslproto.pyi @@ -76,7 +76,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin, transports.Transport): def get_extra_info(self, name: str, default: Any | None = None) -> dict[str, Any]: ... @property def _protocol_paused(self) -> bool: ... - def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape + def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape def can_write_eof(self) -> Literal[False]: ... if sys.version_info >= (3, 11): def get_write_buffer_limits(self) -> tuple[int, int]: ... diff --git a/stdlib/asyncio/transports.pyi b/stdlib/asyncio/transports.pyi index 9bc3b5ccd623..bce54897f18f 100644 --- a/stdlib/asyncio/transports.pyi +++ b/stdlib/asyncio/transports.pyi @@ -24,8 +24,10 @@ class WriteTransport(BaseTransport): def set_write_buffer_limits(self, high: int | None = None, low: int | None = None) -> None: ... def get_write_buffer_size(self) -> int: ... def get_write_buffer_limits(self) -> tuple[int, int]: ... - def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape - def writelines(self, list_of_data: Iterable[bytes | bytearray | memoryview[Any]]) -> None: ... # any memoryview format or shape + def write(self, data: bytes | bytearray | memoryview[Any]) -> None: ... # any memoryview format or shape + def writelines( + self, list_of_data: Iterable[bytes | bytearray | memoryview[Any]] + ) -> None: ... # any memoryview format or shape def write_eof(self) -> None: ... def can_write_eof(self) -> bool: ... def abort(self) -> None: ... From 43d46bb4840db667815004c8d8eb0db0ef4eb274 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Thu, 20 Mar 2025 15:34:52 +0000 Subject: [PATCH 17/17] Update pytype_exclude_list.txt --- tests/pytype_exclude_list.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/pytype_exclude_list.txt b/tests/pytype_exclude_list.txt index 4eac426de8f6..bad4109bf3c7 100644 --- a/tests/pytype_exclude_list.txt +++ b/tests/pytype_exclude_list.txt @@ -5,6 +5,10 @@ stdlib/builtins.pyi stdlib/typing.pyi +# can't subscript memoryview for some reason +stdlib/asyncio/sslproto.pyi +stdlib/asyncio/transports.pyi + # errors about import statements stubs/mysqlclient/MySQLdb/__init__.pyi stubs/mysqlclient/MySQLdb/connections.pyi