From 0ea2a9b3260a80b4505e778af9893c4b7faac383 Mon Sep 17 00:00:00 2001 From: Daverball Date: Sat, 9 Dec 2023 19:13:01 +0100 Subject: [PATCH 1/2] gevent: Use a `TypeVarTuple` in `gevent.baseserver.BaseServer` --- stubs/gevent/@tests/stubtest_allowlist.txt | 4 ---- stubs/gevent/gevent/baseserver.pyi | 23 ++++++++++------------ stubs/gevent/gevent/server.pyi | 4 ++-- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/stubs/gevent/@tests/stubtest_allowlist.txt b/stubs/gevent/@tests/stubtest_allowlist.txt index c9008a6bfa11..534b1fb95cba 100644 --- a/stubs/gevent/@tests/stubtest_allowlist.txt +++ b/stubs/gevent/@tests/stubtest_allowlist.txt @@ -121,10 +121,6 @@ gevent._config._PositiveValueMixin.validate # internal API implementation detail we don't care about gevent._ffi.watcher.AbstractWatcherType.__new__ -# these are inconsistent due to the ParamSpec hack for positional only callables -gevent.baseserver.BaseServer.do_close -gevent.baseserver.BaseServer.do_handle - # we don't care about write/writeall allowing a named parameter gevent._fileobjectcommon.FlushingBufferedWriter.write gevent._fileobjectcommon.WriteIsWriteallMixin.write diff --git a/stubs/gevent/gevent/baseserver.pyi b/stubs/gevent/gevent/baseserver.pyi index 74ae39294f27..58247ac66f69 100644 --- a/stubs/gevent/gevent/baseserver.pyi +++ b/stubs/gevent/gevent/baseserver.pyi @@ -1,13 +1,14 @@ from collections.abc import Callable, Container from types import TracebackType -from typing import Any, Generic, Protocol -from typing_extensions import Literal, ParamSpec, Self, TypeAlias +from typing import Generic, Protocol +from typing_extensions import Literal, ParamSpec, Self, TypeAlias, TypeVarTuple, Unpack from gevent._types import _Loop from gevent.pool import Pool from gevent.socket import socket as _GeventSocket from greenlet import greenlet +_Ts = TypeVarTuple("_Ts") _P = ParamSpec("_P") class _SpawnFunc(Protocol): @@ -15,7 +16,7 @@ class _SpawnFunc(Protocol): _Spawner: TypeAlias = Pool | _SpawnFunc | int | Literal["default"] | None -class BaseServer(Generic[_P]): +class BaseServer(Generic[Unpack[_Ts]]): min_delay: float max_delay: float max_accept: int @@ -27,27 +28,23 @@ class BaseServer(Generic[_P]): family: int address: str | tuple[str, int] socket: _GeventSocket - handle: Callable[..., object] + handle: Callable[[Unpack[_Ts]], object] def __init__( self, listener: _GeventSocket | tuple[str, int] | str, - handle: Callable[_P, object] | None = None, + handle: Callable[[Unpack[_Ts]], object] | None = None, spawn: _Spawner = "default", ) -> None: ... def __enter__(self) -> Self: ... def __exit__(self, __typ: type[BaseException] | None, __value: BaseException | None, __tb: TracebackType | None) -> None: ... def set_listener(self, listener: _GeventSocket | tuple[str, int] | str) -> None: ... def set_spawn(self, spawn: _Spawner) -> None: ... - def set_handle(self, handle: Callable[_P, object]) -> None: ... + def set_handle(self, handle: Callable[[Unpack[_Ts]], object]) -> None: ... def start_accepting(self) -> None: ... def stop_accepting(self) -> None: ... - # neither of these accept keyword arguments, but if we omit them, then ParamSpec - # won't match the arguments correctly - def do_handle(self, *args: _P.args, **_: _P.kwargs) -> None: ... - def do_close(self, *args: _P.args, **_: _P.kwargs) -> None: ... - # we would like to return _P.args here, however pyright will complain - # mypy doesn't seem to mind - def do_read(self) -> tuple[Any, ...] | None: ... + def do_handle(self, *args: Unpack[_Ts]) -> None: ... + def do_close(self, *args: Unpack[_Ts]) -> None: ... + def do_read(self) -> tuple[Unpack[_Ts]] | None: ... def full(self) -> bool: ... @property def server_host(self) -> str | None: ... diff --git a/stubs/gevent/gevent/server.pyi b/stubs/gevent/gevent/server.pyi index cce84c07e4c5..53663f71abd8 100644 --- a/stubs/gevent/gevent/server.pyi +++ b/stubs/gevent/gevent/server.pyi @@ -23,7 +23,7 @@ class _SSLArguments(TypedDict, total=False): do_handshake_on_connect: bool ciphers: str -class StreamServer(BaseServer[[_GeventSocket, _Address]]): +class StreamServer(BaseServer[_GeventSocket, _Address]): backlog: int reuse_addr: ClassVar[int | None] wrap_socket = ssl_wrap_socket @@ -67,7 +67,7 @@ class StreamServer(BaseServer[[_GeventSocket, _Address]]): def do_close(self, sock: _GeventSocket, address: _Address) -> None: ... def wrap_socket_and_handle(self, client_socket: _GeventSocket, address: _StrictAddress) -> Any: ... -class DatagramServer(BaseServer[[_GeventSocket, _Address]]): +class DatagramServer(BaseServer[_GeventSocket, _Address]): reuse_addr: ClassVar[int | None] def __init__( self, From 31192e812dc12f5e15573abbd9ff22dc15ca7802 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 01:18:22 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/gevent/gevent/baseserver.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/gevent/gevent/baseserver.pyi b/stubs/gevent/gevent/baseserver.pyi index c5a978d360cb..42d15439b5c3 100644 --- a/stubs/gevent/gevent/baseserver.pyi +++ b/stubs/gevent/gevent/baseserver.pyi @@ -1,6 +1,6 @@ from collections.abc import Callable, Container from types import TracebackType -from typing import Any, Generic, Literal, Protocol +from typing import Generic, Literal, Protocol from typing_extensions import ParamSpec, Self, TypeAlias, TypeVarTuple, Unpack from gevent._types import _Loop