From 418574f82c78f9fd5179860b36f53838dcabed8f Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 12 Feb 2022 04:22:00 +0300 Subject: [PATCH] Improve `socketserver` (#7073) Co-authored-by: Alex Waygood --- stdlib/socketserver.pyi | 43 ++++++++++-------------- tests/stubtest_allowlists/py3_common.txt | 1 + 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/stdlib/socketserver.pyi b/stdlib/socketserver.pyi index 15f04f963..f35cb051e 100644 --- a/stdlib/socketserver.pyi +++ b/stdlib/socketserver.pyi @@ -7,16 +7,23 @@ from typing import Any, BinaryIO, Callable, ClassVar, Union _RequestType = Union[_socket, tuple[bytes, _socket]] _AddressType = Union[tuple[str, int], str] +# This can possibly be generic at some point: class BaseServer: address_family: int - RequestHandlerClass: Callable[..., BaseRequestHandler] server_address: tuple[str, int] socket: _socket allow_reuse_address: bool request_queue_size: int socket_type: int timeout: float | None - def __init__(self, server_address: Any, RequestHandlerClass: Callable[..., BaseRequestHandler]) -> None: ... + def __init__( + self: Self, server_address: Any, RequestHandlerClass: Callable[[Any, Any, Self], BaseRequestHandler] + ) -> None: ... + # It is not actually a `@property`, but we need a `Self` type: + @property + def RequestHandlerClass(self: Self) -> Callable[[Any, Any, Self], BaseRequestHandler]: ... + @RequestHandlerClass.setter + def RequestHandlerClass(self: Self, val: Callable[[Any, Any, Self], BaseRequestHandler]) -> None: ... def fileno(self) -> int: ... def handle_request(self) -> None: ... def serve_forever(self, poll_interval: float = ...) -> None: ... @@ -39,50 +46,34 @@ class BaseServer: def close_request(self, request: _RequestType) -> None: ... # undocumented class TCPServer(BaseServer): + allow_reuse_port: bool + request_queue_size: int def __init__( - self, + self: Self, server_address: tuple[str, int], - RequestHandlerClass: Callable[..., BaseRequestHandler], + RequestHandlerClass: Callable[[Any, Any, Self], BaseRequestHandler], bind_and_activate: bool = ..., ) -> None: ... def get_request(self) -> tuple[_socket, Any]: ... - def finish_request(self, request: _RequestType, client_address: _AddressType) -> None: ... - def handle_error(self, request: _RequestType, client_address: _AddressType) -> None: ... - def process_request(self, request: _RequestType, client_address: _AddressType) -> None: ... - def verify_request(self, request: _RequestType, client_address: _AddressType) -> bool: ... - def shutdown_request(self, request: _RequestType) -> None: ... # undocumented - def close_request(self, request: _RequestType) -> None: ... # undocumented class UDPServer(BaseServer): max_packet_size: ClassVar[int] - def __init__( - self, - server_address: tuple[str, int], - RequestHandlerClass: Callable[..., BaseRequestHandler], - bind_and_activate: bool = ..., - ) -> None: ... def get_request(self) -> tuple[tuple[bytes, _socket], Any]: ... - def finish_request(self, request: _RequestType, client_address: _AddressType) -> None: ... - def handle_error(self, request: _RequestType, client_address: _AddressType) -> None: ... - def process_request(self, request: _RequestType, client_address: _AddressType) -> None: ... - def verify_request(self, request: _RequestType, client_address: _AddressType) -> bool: ... - def shutdown_request(self, request: _RequestType) -> None: ... # undocumented - def close_request(self, request: _RequestType) -> None: ... # undocumented if sys.platform != "win32": class UnixStreamServer(BaseServer): def __init__( - self, + self: Self, server_address: str | bytes, - RequestHandlerClass: Callable[..., BaseRequestHandler], + RequestHandlerClass: Callable[[Any, Any, Self], BaseRequestHandler], bind_and_activate: bool = ..., ) -> None: ... class UnixDatagramServer(BaseServer): def __init__( - self, + self: Self, server_address: str | bytes, - RequestHandlerClass: Callable[..., BaseRequestHandler], + RequestHandlerClass: Callable[[Any, Any, Self], BaseRequestHandler], bind_and_activate: bool = ..., ) -> None: ... diff --git a/tests/stubtest_allowlists/py3_common.txt b/tests/stubtest_allowlists/py3_common.txt index 343cda1b1..eccbb4970 100644 --- a/tests/stubtest_allowlists/py3_common.txt +++ b/tests/stubtest_allowlists/py3_common.txt @@ -167,6 +167,7 @@ poplib.POP3_SSL.stls # bad declaration of inherited function. See poplib.pyi pyexpat.expat_CAPI select.poll # Depends on configuration selectors.DevpollSelector # Depends on configuration +socketserver.BaseServer.RequestHandlerClass # is defined as a property, because we need `Self` type socketserver.BaseServer.fileno # implemented in derived classes socketserver.BaseServer.get_request # implemented in derived classes socketserver.BaseServer.server_bind # implemented in derived classes