From 061e9e9757bc5aaae8da35248bc42852f8bd26bf Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 16 Sep 2019 10:23:50 -0400 Subject: [PATCH 1/8] Add public missing asyncio stubs for windows and proactor files, and any necessary private return/argument types. --- stdlib/3/asyncio/proactor_events.pyi | 30 ++++++++++++++ stdlib/3/asyncio/selector_events.pyi | 26 +++++++++++++ stdlib/3/asyncio/transports.pyi | 5 +++ stdlib/3/asyncio/windows_events.pyi | 58 ++++++++++++++++++++++++++++ stdlib/3/asyncio/windows_utils.pyi | 21 ++++++++++ 5 files changed, 140 insertions(+) create mode 100644 stdlib/3/asyncio/proactor_events.pyi create mode 100644 stdlib/3/asyncio/selector_events.pyi create mode 100644 stdlib/3/asyncio/windows_events.pyi create mode 100644 stdlib/3/asyncio/windows_utils.pyi diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi new file mode 100644 index 000000000000..9818115c7cf3 --- /dev/null +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -0,0 +1,30 @@ + +from typing import Any, Mapping +from . import base_events, transports, events, streams, futures +import socket + +class _ProactorBasePipeTransport(transports._FlowControlMixin, transports.BaseTransport): + + def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __repr__(self) -> str: ... + def __del__(self) -> None: ... + def get_write_buffer_size(self) -> int: ... + +class _ProactorReadPipeTransport(_ProactorBasePipeTransport, transports.ReadTransport): + + def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + +class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, transports.WriteTransport): + + def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + +class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): + + def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + +class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): + pass + +class BaseProactorEventLoop(base_events.BaseEventLoop): + + def __init__(self, proactor: Any) -> None: ... diff --git a/stdlib/3/asyncio/selector_events.pyi b/stdlib/3/asyncio/selector_events.pyi new file mode 100644 index 000000000000..b0624739bc55 --- /dev/null +++ b/stdlib/3/asyncio/selector_events.pyi @@ -0,0 +1,26 @@ + +from typing import Optional, Any, Generator +from . import base_events, events +from socket import socket +from asyncio import coroutine +import selectors +import sys + +class BaseSelectorEventLoop(base_events.BaseEventLoop): + + def __init__(self, selector: selectors.BaseSelector = ...) -> None: ... + if sys.version_info >= (3, 7): + async def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, ssl: events._SSLContext = ..., + sock: Optional[socket] = ..., server_hostname: str = ..., + ssl_handshake_timeout: Optional[float]) -> events._TransProtPair: ... + async def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, sock: Optional[socket] = ..., + backlog: int = ..., ssl: events._SSLContext = ..., ssl_handshake_timeout: Optional[float] = ..., + start_serving: bool = ...) -> events.AbstractServer: ... + else: + @coroutine + def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, + ssl: events._SSLContext = ..., sock: Optional[socket] = ..., + server_hostname: str = ...) -> Generator[Any, None, events._TransProtPair]: ... + @coroutine + def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, + sock: Optional[socket] = ..., backlog: int = ..., ssl: events._SSLContext = ...) -> Generator[Any, None, events.AbstractServer]: ... diff --git a/stdlib/3/asyncio/transports.pyi b/stdlib/3/asyncio/transports.pyi index ea6ab4adb67b..e135cf9bd70d 100644 --- a/stdlib/3/asyncio/transports.pyi +++ b/stdlib/3/asyncio/transports.pyi @@ -1,6 +1,7 @@ import sys from typing import Dict, Any, TypeVar, Mapping, List, Optional, Tuple from asyncio.protocols import BaseProtocol +from asyncio.events import AbstractEventLoop __all__: List[str] @@ -43,3 +44,7 @@ class SubprocessTransport(BaseTransport): def send_signal(self, signal: int) -> int: ... def terminate(self) -> None: ... def kill(self) -> None: ... + +class _FlowControlMixin(Transport): + def __init__(self, extra: Mapping[Any, Any] = ..., loop: AbstractEventLoop = ...) -> None: ... + def get_write_buffer_limits(self) -> Tuple[int, int]: ... diff --git a/stdlib/3/asyncio/windows_events.pyi b/stdlib/3/asyncio/windows_events.pyi new file mode 100644 index 000000000000..f978322505ad --- /dev/null +++ b/stdlib/3/asyncio/windows_events.pyi @@ -0,0 +1,58 @@ + +from typing import Callable, Tuple, List, IO, Any +import socket +from . import proactor_events, events, futures, windows_utils, selector_events + +NULL: int = ... +INFINITE: int = ... +ERROR_CONNECTION_REFUSED: int = ... +ERROR_CONNECTION_ABORTED: int = ... +CONNECT_PIPE_INIT_DELAY: float = ... +CONNECT_PIPE_MAX_DELAY: float = ... + +class PipeServer: + + def __init__(self, address: str) -> None: ... + def __del__(self) -> None: ... + def closed(self) -> bool: ... + def close(self) -> None: ... + +class _WindowsSelectorEventLoop(selector_events.BaseSelectorEventLoop): ... + +class ProactorEventLoop(proactor_events.BaseProactorEventLoop): + + def __init__(self, proactor: IocpProactor = ...) -> None: ... + async def create_pipe_connection(self, protocol_factory: Callable[[], events.AbstractEventLoopPolicy], address: str) -> Tuple[proactor_events._ProactorDuplexPipeTransport, events.AbstractEventLoopPolicy]: ... + async def start_serving_pipe(self, protocol_factory, address) -> List[PipeServer]: ... + +class IocpProactor: + + def __init__(self, concurrency: int = ...): ... + def __repr__(self) -> str: ... + def __del__(self) -> None: ... + def set_loop(self, loop: events.AbstractEventLoop) -> None: ... + def select(self, timeout: int = ...) -> List[futures.Future]: ... + def recv(self, conn: socket.socket, nbytes: int, flags: int = ...) -> futures.Future: ... + def recv_into(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future: ... + def send(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future: ... + def accept(self, listener: socket.socket) -> futures.Future: ... + def connect(self, conn: socket.socket, address: bytes) -> futures.Future: ... + def sendfile(self, sock: socket.socket, file: IO[bytes], offset: int, count: int) -> futures.Future: ... + def accept_pipe(self, pipe: socket.socket) -> futures.Future: ... + async def connect_pipe(self, address: bytes) -> windows_utils.PipeHandle: ... + def wait_for_handle(self, handle: windows_utils.PipeHandle, timeout: int = ...) -> bool: ... + def close(self) -> None: ... + +SelectorEventLoop = _WindowsSelectorEventLoop + +class WindowsSelectorEventLoopPolicy(events.BaseDefaultEventLoopPolicy): + _loop_factory: events.AbstractEventLoop = ... + def get_child_watcher(self) -> Any: ... + def set_child_watcher(self, watcher: Any) -> None: ... + +class WindowsProactorEventLoopPolicy(events.BaseDefaultEventLoopPolicy): + _loop_factory: events.AbstractEventLoop = ... + def get_child_watcher(self) -> Any: ... + def set_child_watcher(self, watcher: Any) -> None: ... + +DefaultEventLoopPolicy = WindowsSelectorEventLoopPolicy diff --git a/stdlib/3/asyncio/windows_utils.pyi b/stdlib/3/asyncio/windows_utils.pyi new file mode 100644 index 000000000000..e7f02ed321d5 --- /dev/null +++ b/stdlib/3/asyncio/windows_utils.pyi @@ -0,0 +1,21 @@ + +from typing import Tuple, Callable +from types import TracebackType + +BUFSIZE: int = ... +PIPE: int = ... +STDOUT: int = ... + +def pipe(*, duplex: bool = ..., overlapped: Tuple[bool, bool] = ..., bufsize: int = ...) -> Tuple[int, int]: ... + +class PipeHandle: + + def __init__(self, handle: int) -> None: ... + def __repr__(self) -> str: ... + def __del__(self) -> None: ... + def __enter__(self) -> PipeHandle: ... + def __exit__(self, t: type, v: BaseException, tb: TracebackType) -> None: ... + @property + def handle(self) -> int: ... + def fileno(self) -> int: ... + def close(self, *, CloseHandle: Callable[[int], None] = ...) -> None: ... From ad3c45f05bcd13adf7915eae5d622894865a08df Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 7 Oct 2019 08:32:33 -0400 Subject: [PATCH 2/8] Add methods to BaseProactorEventLoop that mypy is complaining about, with note about status at runtime --- stdlib/3/asyncio/proactor_events.pyi | 31 ++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi index 9818115c7cf3..ff41c6fac461 100644 --- a/stdlib/3/asyncio/proactor_events.pyi +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -1,26 +1,28 @@ -from typing import Any, Mapping +from typing import Any, Mapping, Optional, Generator from . import base_events, transports, events, streams, futures -import socket +from asyncio import coroutine +from socket import socket +import sys class _ProactorBasePipeTransport(transports._FlowControlMixin, transports.BaseTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... def __repr__(self) -> str: ... def __del__(self) -> None: ... def get_write_buffer_size(self) -> int: ... class _ProactorReadPipeTransport(_ProactorBasePipeTransport, transports.ReadTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, transports.WriteTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket.socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): pass @@ -28,3 +30,20 @@ class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWrit class BaseProactorEventLoop(base_events.BaseEventLoop): def __init__(self, proactor: Any) -> None: ... + # The methods below don't actually exist directly, ProactorEventLoops do not implement them. However, they are + # needed to satisfy mypy + if sys.version_info >= (3, 7): + async def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, ssl: events._SSLContext = ..., + sock: Optional[socket] = ..., server_hostname: str = ..., + ssl_handshake_timeout: Optional[float]) -> events._TransProtPair: ... + async def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, sock: Optional[socket] = ..., + backlog: int = ..., ssl: events._SSLContext = ..., ssl_handshake_timeout: Optional[float] = ..., + start_serving: bool = ...) -> events.AbstractServer: ... + else: + @coroutine + def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, + ssl: events._SSLContext = ..., sock: Optional[socket] = ..., + server_hostname: str = ...) -> Generator[Any, None, events._TransProtPair]: ... + @coroutine + def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, + sock: Optional[socket] = ..., backlog: int = ..., ssl: events._SSLContext = ...) -> Generator[Any, None, events.AbstractServer]: ... From bd70a36ad41ae8e281d56ebea1e8a509f8b37646 Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 7 Oct 2019 09:06:21 -0400 Subject: [PATCH 3/8] Add specification to Future generics --- stdlib/3/asyncio/proactor_events.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi index ff41c6fac461..06605ff14b5e 100644 --- a/stdlib/3/asyncio/proactor_events.pyi +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -7,22 +7,22 @@ import sys class _ProactorBasePipeTransport(transports._FlowControlMixin, transports.BaseTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... def __repr__(self) -> str: ... def __del__(self) -> None: ... def get_write_buffer_size(self) -> int: ... class _ProactorReadPipeTransport(_ProactorBasePipeTransport, transports.ReadTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, transports.WriteTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): pass From 16547ba3bef0ed569cedb1c7ae61237ae504e2b7 Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 7 Oct 2019 09:29:03 -0400 Subject: [PATCH 4/8] Add specification to Future generics in windows_events --- stdlib/3/asyncio/windows_events.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/3/asyncio/windows_events.pyi b/stdlib/3/asyncio/windows_events.pyi index f978322505ad..882fb681ecbc 100644 --- a/stdlib/3/asyncio/windows_events.pyi +++ b/stdlib/3/asyncio/windows_events.pyi @@ -31,14 +31,14 @@ class IocpProactor: def __repr__(self) -> str: ... def __del__(self) -> None: ... def set_loop(self, loop: events.AbstractEventLoop) -> None: ... - def select(self, timeout: int = ...) -> List[futures.Future]: ... - def recv(self, conn: socket.socket, nbytes: int, flags: int = ...) -> futures.Future: ... - def recv_into(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future: ... - def send(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future: ... - def accept(self, listener: socket.socket) -> futures.Future: ... - def connect(self, conn: socket.socket, address: bytes) -> futures.Future: ... - def sendfile(self, sock: socket.socket, file: IO[bytes], offset: int, count: int) -> futures.Future: ... - def accept_pipe(self, pipe: socket.socket) -> futures.Future: ... + def select(self, timeout: int = ...) -> List[futures.Future[Any]]: ... + def recv(self, conn: socket.socket, nbytes: int, flags: int = ...) -> futures.Future[bytes]: ... + def recv_into(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future[Any]: ... + def send(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future[Any]: ... + def accept(self, listener: socket.socket) -> futures.Future[Any]: ... + def connect(self, conn: socket.socket, address: bytes) -> futures.Future[Any]: ... + def sendfile(self, sock: socket.socket, file: IO[bytes], offset: int, count: int) -> futures.Future[Any]: ... + def accept_pipe(self, pipe: socket.socket) -> futures.Future[Any]: ... async def connect_pipe(self, address: bytes) -> windows_utils.PipeHandle: ... def wait_for_handle(self, handle: windows_utils.PipeHandle, timeout: int = ...) -> bool: ... def close(self) -> None: ... From fe8a168607a987f2cdaa621f143ce50169ea5f3d Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 7 Oct 2019 09:39:35 -0400 Subject: [PATCH 5/8] After merge, problem was obvious. Child stubs finally match parents --- stdlib/3/asyncio/proactor_events.pyi | 2 +- stdlib/3/asyncio/selector_events.pyi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi index 06605ff14b5e..12369ad14d38 100644 --- a/stdlib/3/asyncio/proactor_events.pyi +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -35,7 +35,7 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): if sys.version_info >= (3, 7): async def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, ssl: events._SSLContext = ..., sock: Optional[socket] = ..., server_hostname: str = ..., - ssl_handshake_timeout: Optional[float]) -> events._TransProtPair: ... + ssl_handshake_timeout: Optional[float] = ...) -> events._TransProtPair: ... async def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, sock: Optional[socket] = ..., backlog: int = ..., ssl: events._SSLContext = ..., ssl_handshake_timeout: Optional[float] = ..., start_serving: bool = ...) -> events.AbstractServer: ... diff --git a/stdlib/3/asyncio/selector_events.pyi b/stdlib/3/asyncio/selector_events.pyi index b0624739bc55..42381de74005 100644 --- a/stdlib/3/asyncio/selector_events.pyi +++ b/stdlib/3/asyncio/selector_events.pyi @@ -12,7 +12,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): if sys.version_info >= (3, 7): async def create_unix_connection(self, protocol_factory: events._ProtocolFactory, path: str, *, ssl: events._SSLContext = ..., sock: Optional[socket] = ..., server_hostname: str = ..., - ssl_handshake_timeout: Optional[float]) -> events._TransProtPair: ... + ssl_handshake_timeout: Optional[float] = ...) -> events._TransProtPair: ... async def create_unix_server(self, protocol_factory: events._ProtocolFactory, path: str, *, sock: Optional[socket] = ..., backlog: int = ..., ssl: events._SSLContext = ..., ssl_handshake_timeout: Optional[float] = ..., start_serving: bool = ...) -> events.AbstractServer: ... From fe0fe73af56443347e460493f037685b5bfa9843 Mon Sep 17 00:00:00 2001 From: CraftSpider Date: Mon, 7 Oct 2019 09:43:44 -0400 Subject: [PATCH 6/8] Replace `pass` with `...` --- stdlib/3/asyncio/proactor_events.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi index 12369ad14d38..3ab7f43a2d63 100644 --- a/stdlib/3/asyncio/proactor_events.pyi +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -24,8 +24,7 @@ class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... -class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): - pass +class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): ... class BaseProactorEventLoop(base_events.BaseEventLoop): From bd78bc8c33748306dc0a8d78054c86d3737fccab Mon Sep 17 00:00:00 2001 From: Rune Tynan Date: Mon, 14 Oct 2019 23:30:57 -0400 Subject: [PATCH 7/8] Add asyncio constants file --- stdlib/3/asyncio/constants.pyi | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 stdlib/3/asyncio/constants.pyi diff --git a/stdlib/3/asyncio/constants.pyi b/stdlib/3/asyncio/constants.pyi new file mode 100644 index 000000000000..f15ea4fe2bab --- /dev/null +++ b/stdlib/3/asyncio/constants.pyi @@ -0,0 +1,13 @@ + +import enum + +LOG_THRESHOLD_FOR_CONNLOST_WRITES: int +ACCEPT_RETRY_DELAY: int +DEBUG_STACK_DEPTH: int +SSL_HANDSHAKE_TIMEOUT: float +SENDFILE_FALLBACK_READBUFFER_SIZE: int + +class _SendfileMode(enum.Enum): + UNSUPPORTED: int = ... + TRY_NATIVE: int = ... + FALLBACK: int = ... From 992b5566ade8bac6f823a6fd737c2ff8d20b13ba Mon Sep 17 00:00:00 2001 From: Rune Tynan Date: Mon, 14 Oct 2019 23:34:23 -0400 Subject: [PATCH 8/8] Add Optionals, fix AbstractEventLoopPolicy -> StreamReaderProtocol, and add missing _ProactorSocketTransport class --- stdlib/3/asyncio/proactor_events.pyi | 23 ++++++++++++++++++----- stdlib/3/asyncio/transports.pyi | 2 +- stdlib/3/asyncio/windows_events.pyi | 26 +++++++++++++------------- stdlib/3/asyncio/windows_utils.pyi | 4 ++-- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/stdlib/3/asyncio/proactor_events.pyi b/stdlib/3/asyncio/proactor_events.pyi index 3ab7f43a2d63..bed374734f02 100644 --- a/stdlib/3/asyncio/proactor_events.pyi +++ b/stdlib/3/asyncio/proactor_events.pyi @@ -1,31 +1,44 @@ from typing import Any, Mapping, Optional, Generator -from . import base_events, transports, events, streams, futures +from . import base_events, transports, events, streams, futures, constants from asyncio import coroutine from socket import socket import sys +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal class _ProactorBasePipeTransport(transports._FlowControlMixin, transports.BaseTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: Optional[futures.Future[Any]] = ..., extra: Optional[Mapping[Any, Any]] = ..., server: Optional[events.AbstractServer] = ...) -> None: ... def __repr__(self) -> str: ... def __del__(self) -> None: ... def get_write_buffer_size(self) -> int: ... class _ProactorReadPipeTransport(_ProactorBasePipeTransport, transports.ReadTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: Optional[futures.Future[Any]] = ..., extra: Optional[Mapping[Any, Any]] = ..., server: Optional[events.AbstractServer] = ...) -> None: ... class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, transports.WriteTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: Optional[futures.Future[Any]] = ..., extra: Optional[Mapping[Any, Any]] = ..., server: Optional[events.AbstractServer] = ...) -> None: ... class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): - def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: futures.Future[Any] = ..., extra: Mapping[Any, Any] = ..., server: events.AbstractServer = ...) -> None: ... + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: Optional[futures.Future[Any]] = ..., extra: Optional[Mapping[Any, Any]] = ..., server: Optional[events.AbstractServer] = ...) -> None: ... class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): ... +class _ProactorSocketTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): + + _sendfile_compatible: constants._SendfileMode = ... + + def __init__(self, loop: events.AbstractEventLoop, sock: socket, protocol: streams.StreamReaderProtocol, waiter: Optional[futures.Future[Any]] = ..., extra: Optional[Mapping[Any, Any]] = ..., server: Optional[events.AbstractServer] = ...) -> None: ... + def _set_extra(self, sock: socket) -> None: ... + def can_write_eof(self) -> Literal[True]: ... + def write_eof(self) -> None: ... + class BaseProactorEventLoop(base_events.BaseEventLoop): def __init__(self, proactor: Any) -> None: ... diff --git a/stdlib/3/asyncio/transports.pyi b/stdlib/3/asyncio/transports.pyi index e135cf9bd70d..67512fbb5b98 100644 --- a/stdlib/3/asyncio/transports.pyi +++ b/stdlib/3/asyncio/transports.pyi @@ -46,5 +46,5 @@ class SubprocessTransport(BaseTransport): def kill(self) -> None: ... class _FlowControlMixin(Transport): - def __init__(self, extra: Mapping[Any, Any] = ..., loop: AbstractEventLoop = ...) -> None: ... + def __init__(self, extra: Optional[Mapping[Any, Any]] = ..., loop: Optional[AbstractEventLoop] = ...) -> None: ... def get_write_buffer_limits(self) -> Tuple[int, int]: ... diff --git a/stdlib/3/asyncio/windows_events.pyi b/stdlib/3/asyncio/windows_events.pyi index 882fb681ecbc..1933f52d4ada 100644 --- a/stdlib/3/asyncio/windows_events.pyi +++ b/stdlib/3/asyncio/windows_events.pyi @@ -1,14 +1,14 @@ -from typing import Callable, Tuple, List, IO, Any +from typing import Callable, Tuple, List, IO, Any, Optional import socket -from . import proactor_events, events, futures, windows_utils, selector_events +from . import proactor_events, events, futures, windows_utils, selector_events, streams -NULL: int = ... -INFINITE: int = ... -ERROR_CONNECTION_REFUSED: int = ... -ERROR_CONNECTION_ABORTED: int = ... -CONNECT_PIPE_INIT_DELAY: float = ... -CONNECT_PIPE_MAX_DELAY: float = ... +NULL: int +INFINITE: int +ERROR_CONNECTION_REFUSED: int +ERROR_CONNECTION_ABORTED: int +CONNECT_PIPE_INIT_DELAY: float +CONNECT_PIPE_MAX_DELAY: float class PipeServer: @@ -21,17 +21,17 @@ class _WindowsSelectorEventLoop(selector_events.BaseSelectorEventLoop): ... class ProactorEventLoop(proactor_events.BaseProactorEventLoop): - def __init__(self, proactor: IocpProactor = ...) -> None: ... - async def create_pipe_connection(self, protocol_factory: Callable[[], events.AbstractEventLoopPolicy], address: str) -> Tuple[proactor_events._ProactorDuplexPipeTransport, events.AbstractEventLoopPolicy]: ... - async def start_serving_pipe(self, protocol_factory, address) -> List[PipeServer]: ... + def __init__(self, proactor: Optional[IocpProactor] = ...) -> None: ... + async def create_pipe_connection(self, protocol_factory: Callable[[], streams.StreamReaderProtocol], address: str) -> Tuple[proactor_events._ProactorDuplexPipeTransport, streams.StreamReaderProtocol]: ... + async def start_serving_pipe(self, protocol_factory: Callable[[], streams.StreamReaderProtocol], address: str) -> List[PipeServer]: ... class IocpProactor: - def __init__(self, concurrency: int = ...): ... + def __init__(self, concurrency: int = ...) -> None: ... def __repr__(self) -> str: ... def __del__(self) -> None: ... def set_loop(self, loop: events.AbstractEventLoop) -> None: ... - def select(self, timeout: int = ...) -> List[futures.Future[Any]]: ... + def select(self, timeout: Optional[int] = ...) -> List[futures.Future[Any]]: ... def recv(self, conn: socket.socket, nbytes: int, flags: int = ...) -> futures.Future[bytes]: ... def recv_into(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future[Any]: ... def send(self, conn: socket.socket, buf: socket._WriteBuffer, flags: int = ...) -> futures.Future[Any]: ... diff --git a/stdlib/3/asyncio/windows_utils.pyi b/stdlib/3/asyncio/windows_utils.pyi index e7f02ed321d5..5ba6bfbb2a0c 100644 --- a/stdlib/3/asyncio/windows_utils.pyi +++ b/stdlib/3/asyncio/windows_utils.pyi @@ -1,5 +1,5 @@ -from typing import Tuple, Callable +from typing import Tuple, Callable, Optional from types import TracebackType BUFSIZE: int = ... @@ -14,7 +14,7 @@ class PipeHandle: def __repr__(self) -> str: ... def __del__(self) -> None: ... def __enter__(self) -> PipeHandle: ... - def __exit__(self, t: type, v: BaseException, tb: TracebackType) -> None: ... + def __exit__(self, t: Optional[type], v: Optional[BaseException], tb: Optional[TracebackType]) -> None: ... @property def handle(self) -> int: ... def fileno(self) -> int: ...