Skip to content

Commit 62e28b2

Browse files
authored
gevent: Use a TypeVarTuple in gevent.baseserver.BaseServer (#11138)
1 parent 897abe0 commit 62e28b2

File tree

3 files changed

+17
-19
lines changed

3 files changed

+17
-19
lines changed

stubs/gevent/@tests/stubtest_allowlist.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,6 @@ gevent._config._PositiveValueMixin.validate
120120
# internal API implementation detail we don't care about
121121
gevent._ffi.watcher.AbstractWatcherType.__new__
122122

123-
# these are inconsistent due to the ParamSpec hack for positional only callables
124-
gevent.baseserver.BaseServer.do_close
125-
gevent.baseserver.BaseServer.do_handle
126-
127123
# we don't care about write/writeall allowing a named parameter
128124
gevent._fileobjectcommon.FlushingBufferedWriter.write
129125
gevent._fileobjectcommon.WriteIsWriteallMixin.write
@@ -175,6 +171,11 @@ gevent.socket.socket.closed
175171
gevent.socket.wait_readwrite
176172
gevent.socket.wait_write
177173

174+
# See https://github.com/python/typeshed/pull/14503/files#r2247065318 for why a
175+
# default of `0` is exposed, even though the physical default that stubtest
176+
# can see is `-1`.
177+
gevent.socket.SocketType.__init__
178+
178179
# we have punted on ssl, the gevent version of these functions have an additional
179180
# argument for timeouts/blocking and there are some with different default values
180181
# for nbytes/length, for now we ignore that fact

stubs/gevent/gevent/baseserver.pyi

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from collections.abc import Callable, Container
22
from types import TracebackType
3-
from typing import Any, Generic, Literal, Protocol, type_check_only
4-
from typing_extensions import ParamSpec, Self, TypeAlias
3+
from typing import Generic, Literal, Protocol, type_check_only
4+
from typing_extensions import ParamSpec, Self, TypeAlias, TypeVarTuple, Unpack
55

66
from gevent._types import _Loop
77
from gevent.pool import Pool
88
from gevent.socket import socket as _GeventSocket
99
from greenlet import greenlet
1010

11+
_Ts = TypeVarTuple("_Ts")
1112
_P = ParamSpec("_P")
1213

1314
@type_check_only
@@ -16,7 +17,7 @@ class _SpawnFunc(Protocol):
1617

1718
_Spawner: TypeAlias = Pool | _SpawnFunc | int | Literal["default"] | None
1819

19-
class BaseServer(Generic[_P]):
20+
class BaseServer(Generic[Unpack[_Ts]]):
2021
min_delay: float
2122
max_delay: float
2223
max_accept: int
@@ -28,27 +29,23 @@ class BaseServer(Generic[_P]):
2829
family: int
2930
address: str | tuple[str, int]
3031
socket: _GeventSocket
31-
handle: Callable[..., object]
32+
handle: Callable[[Unpack[_Ts]], object]
3233
def __init__(
3334
self,
3435
listener: _GeventSocket | tuple[str, int] | str,
35-
handle: Callable[_P, object] | None = None,
36+
handle: Callable[[Unpack[_Ts]], object] | None = None,
3637
spawn: _Spawner = "default",
3738
) -> None: ...
3839
def __enter__(self) -> Self: ...
3940
def __exit__(self, typ: type[BaseException] | None, value: BaseException | None, tb: TracebackType | None, /) -> None: ...
4041
def set_listener(self, listener: _GeventSocket | tuple[str, int] | str) -> None: ...
4142
def set_spawn(self, spawn: _Spawner) -> None: ...
42-
def set_handle(self, handle: Callable[_P, object]) -> None: ...
43+
def set_handle(self, handle: Callable[[Unpack[_Ts]], object]) -> None: ...
4344
def start_accepting(self) -> None: ...
4445
def stop_accepting(self) -> None: ...
45-
# neither of these accept keyword arguments, but if we omit them, then ParamSpec
46-
# won't match the arguments correctly
47-
def do_handle(self, *args: _P.args, **_: _P.kwargs) -> None: ...
48-
def do_close(self, *args: _P.args, **_: _P.kwargs) -> None: ...
49-
# we would like to return _P.args here, however pyright will complain
50-
# mypy doesn't seem to mind
51-
def do_read(self) -> tuple[Any, ...] | None: ...
46+
def do_handle(self, *args: Unpack[_Ts]) -> None: ...
47+
def do_close(self, *args: Unpack[_Ts]) -> None: ...
48+
def do_read(self) -> tuple[Unpack[_Ts]] | None: ...
5249
def full(self) -> bool: ...
5350
@property
5451
def server_host(self) -> str | None: ...

stubs/gevent/gevent/server.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class _SSLArguments(TypedDict, total=False):
2424
do_handshake_on_connect: bool
2525
ciphers: str
2626

27-
class StreamServer(BaseServer[[_GeventSocket, _Address]]):
27+
class StreamServer(BaseServer[_GeventSocket, _Address]):
2828
backlog: int
2929
reuse_addr: ClassVar[int | None]
3030
wrap_socket = ssl_wrap_socket
@@ -68,7 +68,7 @@ class StreamServer(BaseServer[[_GeventSocket, _Address]]):
6868
def do_close(self, sock: _GeventSocket, address: _Address) -> None: ...
6969
def wrap_socket_and_handle(self, client_socket: _GeventSocket, address: _StrictAddress) -> Any: ...
7070

71-
class DatagramServer(BaseServer[[_GeventSocket, _Address]]):
71+
class DatagramServer(BaseServer[_GeventSocket, _Address]):
7272
reuse_addr: ClassVar[int | None]
7373
def __init__(
7474
self,

0 commit comments

Comments
 (0)