From 2626c88ecc34d4441cdc1b33e9a7954f69d24b5c Mon Sep 17 00:00:00 2001 From: XiaXia009 Date: Tue, 10 Mar 2026 00:51:13 +0800 Subject: [PATCH 1/7] Fix grpc aio handler typing --- .../test_cases/check_server_interceptor.py | 26 ++++++++++++++++--- stubs/grpcio/grpc/aio/__init__.pyi | 17 +++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py index d5ef592a61ad..695ccd505927 100644 --- a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py +++ b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py @@ -1,8 +1,8 @@ from __future__ import annotations -from collections.abc import Callable +from collections.abc import AsyncIterator, Callable from concurrent.futures.thread import ThreadPoolExecutor -from typing import Awaitable, TypeVar +from typing import Awaitable, TypeVar, cast import grpc import grpc.aio @@ -26,10 +26,28 @@ def intercept_service( class NoopAioInterceptor(grpc.aio.ServerInterceptor): async def intercept_service( self, - continuation: Callable[[grpc.HandlerCallDetails], Awaitable[grpc.RpcMethodHandler[RequestT, ResponseT]]], + continuation: Callable[[grpc.HandlerCallDetails], Awaitable[grpc.aio.RpcMethodHandler[RequestT, ResponseT]]], handler_call_details: grpc.HandlerCallDetails, - ) -> grpc.RpcMethodHandler[RequestT, ResponseT]: + ) -> grpc.aio.RpcMethodHandler[RequestT, ResponseT]: return await continuation(handler_call_details) grpc.aio.server(interceptors=[NoopAioInterceptor()]) + +aio_handler = grpc.aio.RpcMethodHandler[RequestT, ResponseT]() +aio_handler.unary_unary = cast( + Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], + None, +) +aio_handler.unary_stream = cast( + Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], + None, +) +aio_handler.stream_unary = cast( + Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], + None, +) +aio_handler.stream_stream = cast( + Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], + None, +) diff --git a/stubs/grpcio/grpc/aio/__init__.pyi b/stubs/grpcio/grpc/aio/__init__.pyi index 4c8ef012fb29..0064b87b50e0 100644 --- a/stubs/grpcio/grpc/aio/__init__.pyi +++ b/stubs/grpcio/grpc/aio/__init__.pyi @@ -15,7 +15,6 @@ from grpc import ( GenericRpcHandler, HandlerCallDetails, RpcError, - RpcMethodHandler, ServerCredentials, StatusCode, _Options, @@ -369,6 +368,22 @@ class StreamStreamClientInterceptor(ClientInterceptor, metaclass=abc.ABCMeta): request_iterator: AsyncIterable[_TRequest] | Iterable[_TRequest], ) -> AsyncIterator[_TResponse] | StreamStreamCall[_TRequest, _TResponse]: ... +# Service-Side Handler: + +class RpcMethodHandler(Generic[_TRequest, _TResponse], metaclass=abc.ABCMeta): + request_streaming: bool + response_streaming: bool + + request_deserializer: _Deserializer[_TRequest] | None + response_serializer: _Serializer[_TResponse] | None + + unary_unary: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None + unary_stream: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None + stream_unary: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None + stream_stream: Callable[ + [AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse] + ] | None + # Server-Side Interceptor: class ServerInterceptor(metaclass=abc.ABCMeta): From ef1a1a1f3bdec78ac0f7fc82e09aeff772257f02 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:05:09 +0000 Subject: [PATCH 2/7] [pre-commit.ci] auto fixes from pre-commit.com hooks --- .../@tests/test_cases/check_server_interceptor.py | 14 ++++---------- stubs/grpcio/grpc/aio/__init__.pyi | 4 +--- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py index 695ccd505927..2d279c8eb743 100644 --- a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py +++ b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py @@ -35,19 +35,13 @@ async def intercept_service( grpc.aio.server(interceptors=[NoopAioInterceptor()]) aio_handler = grpc.aio.RpcMethodHandler[RequestT, ResponseT]() -aio_handler.unary_unary = cast( - Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], - None, -) +aio_handler.unary_unary = cast(Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], None) aio_handler.unary_stream = cast( - Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], - None, + Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], None ) aio_handler.stream_unary = cast( - Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], - None, + Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], None ) aio_handler.stream_stream = cast( - Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], - None, + Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], None ) diff --git a/stubs/grpcio/grpc/aio/__init__.pyi b/stubs/grpcio/grpc/aio/__init__.pyi index 0064b87b50e0..6b324994cd96 100644 --- a/stubs/grpcio/grpc/aio/__init__.pyi +++ b/stubs/grpcio/grpc/aio/__init__.pyi @@ -380,9 +380,7 @@ class RpcMethodHandler(Generic[_TRequest, _TResponse], metaclass=abc.ABCMeta): unary_unary: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None unary_stream: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None stream_unary: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None - stream_stream: Callable[ - [AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse] - ] | None + stream_stream: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None # Server-Side Interceptor: From 4577db60f84fa01a8af1b690fa7f07e86fe30df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=96=87=E5=92=8C?= <107758517+XiaXia009@users.noreply.github.com> Date: Tue, 10 Mar 2026 01:27:34 +0800 Subject: [PATCH 3/7] Fix grpc aio handler typing --- .../test_cases/check_server_interceptor.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py index 2d279c8eb743..cbbc472860e9 100644 --- a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py +++ b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py @@ -34,14 +34,20 @@ async def intercept_service( grpc.aio.server(interceptors=[NoopAioInterceptor()]) -aio_handler = grpc.aio.RpcMethodHandler[RequestT, ResponseT]() -aio_handler.unary_unary = cast(Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], None) +aio_handler: grpc.aio.RpcMethodHandler[bytes, bytes] = grpc.aio.RpcMethodHandler() +aio_handler.unary_unary = cast( + Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], + None, +) aio_handler.unary_stream = cast( - Callable[[RequestT, grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], None + Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], + None, ) aio_handler.stream_unary = cast( - Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], Awaitable[ResponseT]], None + Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], + None, ) aio_handler.stream_stream = cast( - Callable[[AsyncIterator[RequestT], grpc.aio.ServicerContext[RequestT, ResponseT]], AsyncIterator[ResponseT]], None + Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], + None, ) From 357a7fb11d7acfb1e1be64d0a31127a46c31ab62 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:29:42 +0000 Subject: [PATCH 4/7] [pre-commit.ci] auto fixes from pre-commit.com hooks --- .../test_cases/check_server_interceptor.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py index cbbc472860e9..f6a4ae6c914a 100644 --- a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py +++ b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py @@ -35,19 +35,9 @@ async def intercept_service( grpc.aio.server(interceptors=[NoopAioInterceptor()]) aio_handler: grpc.aio.RpcMethodHandler[bytes, bytes] = grpc.aio.RpcMethodHandler() -aio_handler.unary_unary = cast( - Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], - None, -) -aio_handler.unary_stream = cast( - Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], - None, -) -aio_handler.stream_unary = cast( - Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], - None, -) +aio_handler.unary_unary = cast(Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], None) +aio_handler.unary_stream = cast(Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], None) +aio_handler.stream_unary = cast(Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], None) aio_handler.stream_stream = cast( - Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], - None, + Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], None ) From 394c422f842c0dc407677d4de026f4dec1ab7084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=96=87=E5=92=8C?= <107758517+XiaXia009@users.noreply.github.com> Date: Tue, 10 Mar 2026 01:48:34 +0800 Subject: [PATCH 5/7] fix-grpc-aio-handler --- stubs/grpcio/grpc/aio/__init__.pyi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/stubs/grpcio/grpc/aio/__init__.pyi b/stubs/grpcio/grpc/aio/__init__.pyi index 6b324994cd96..1cb18c4baaf0 100644 --- a/stubs/grpcio/grpc/aio/__init__.pyi +++ b/stubs/grpcio/grpc/aio/__init__.pyi @@ -370,7 +370,8 @@ class StreamStreamClientInterceptor(ClientInterceptor, metaclass=abc.ABCMeta): # Service-Side Handler: -class RpcMethodHandler(Generic[_TRequest, _TResponse], metaclass=abc.ABCMeta): +@type_check_only +class RpcMethodHandler(Generic[_TRequest, _TResponse]): request_streaming: bool response_streaming: bool @@ -380,7 +381,9 @@ class RpcMethodHandler(Generic[_TRequest, _TResponse], metaclass=abc.ABCMeta): unary_unary: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None unary_stream: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None stream_unary: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None - stream_stream: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None + stream_stream: Callable[ + [AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse] + ] | None # Server-Side Interceptor: From 855e1a3702ad63f21842c579c01a0587f1ceb627 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:50:45 +0000 Subject: [PATCH 6/7] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/grpcio/grpc/aio/__init__.pyi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stubs/grpcio/grpc/aio/__init__.pyi b/stubs/grpcio/grpc/aio/__init__.pyi index 1cb18c4baaf0..a2f42a9e631b 100644 --- a/stubs/grpcio/grpc/aio/__init__.pyi +++ b/stubs/grpcio/grpc/aio/__init__.pyi @@ -381,9 +381,7 @@ class RpcMethodHandler(Generic[_TRequest, _TResponse]): unary_unary: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None unary_stream: Callable[[_TRequest, ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None stream_unary: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], Awaitable[_TResponse]] | None - stream_stream: Callable[ - [AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse] - ] | None + stream_stream: Callable[[AsyncIterator[_TRequest], ServicerContext[_TRequest, _TResponse]], AsyncIterator[_TResponse]] | None # Server-Side Interceptor: From d81eaf795078e7b372cfe93fcfe37c06728691cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=96=87=E5=92=8C?= <107758517+XiaXia009@users.noreply.github.com> Date: Tue, 10 Mar 2026 02:15:56 +0800 Subject: [PATCH 7/7] fix @type_check_only check --- stubs/grpcio/@tests/test_cases/check_server_interceptor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py index f6a4ae6c914a..07d4e89e9d1c 100644 --- a/stubs/grpcio/@tests/test_cases/check_server_interceptor.py +++ b/stubs/grpcio/@tests/test_cases/check_server_interceptor.py @@ -34,7 +34,7 @@ async def intercept_service( grpc.aio.server(interceptors=[NoopAioInterceptor()]) -aio_handler: grpc.aio.RpcMethodHandler[bytes, bytes] = grpc.aio.RpcMethodHandler() +aio_handler = cast(grpc.aio.RpcMethodHandler[bytes, bytes], object()) aio_handler.unary_unary = cast(Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], None) aio_handler.unary_stream = cast(Callable[[bytes, grpc.aio.ServicerContext[bytes, bytes]], AsyncIterator[bytes]], None) aio_handler.stream_unary = cast(Callable[[AsyncIterator[bytes], grpc.aio.ServicerContext[bytes, bytes]], Awaitable[bytes]], None)