From 08faba11d22e13141bc3be0ac7c27c00f7b54962 Mon Sep 17 00:00:00 2001 From: Richard Mahlberg Date: Thu, 25 May 2023 15:30:40 +0200 Subject: [PATCH 1/4] Fix return type from intercept_service ServerInterceptor.intercept_service returns an RpcMethodHandler instance if the RPC is considered serviced, or None otherwise. --- grpc-stubs/__init__.pyi | 2 +- typesafety/test_grpc.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/grpc-stubs/__init__.pyi b/grpc-stubs/__init__.pyi index 63f847e..7a8fc9d 100644 --- a/grpc-stubs/__init__.pyi +++ b/grpc-stubs/__init__.pyi @@ -616,7 +616,7 @@ class ServerInterceptor(typing.Generic[TRequest, TResponse]): typing.Optional[RpcMethodHandler[TRequest, TResponse]] ], handler_call_details: HandlerCallDetails, - ) -> RpcMethodHandler[TRequest, TResponse]: + ) -> typing.Optional[RpcMethodHandler[TRequest, TResponse]]: ... diff --git a/typesafety/test_grpc.yml b/typesafety/test_grpc.yml index b10ce2a..bfa1266 100644 --- a/typesafety/test_grpc.yml +++ b/typesafety/test_grpc.yml @@ -222,3 +222,15 @@ server = typing.cast(aio.Server, None) enable_server_reflection(["foo"], server, None) +- case: server_interceptor + main: | + import typing + import grpc + + class NoopInterceptor(grpc.ServerInterceptor): + def intercept_service( + self, + continuation: typing.Callable[[grpc.HandlerCallDetails], typing.Optional[grpc.RpcMethodHandler]], + handler_call_details: grpc.HandlerCallDetails, + ) -> typing.Optional[grpc.RpcMethodHandler]: + return continuation(handler_call_details) From 7d81c7de7f6b37760875f83286c8471efb8cccc4 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Wed, 7 Jun 2023 17:55:16 +0100 Subject: [PATCH 2/4] Update timeout to float --- grpc-stubs/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grpc-stubs/__init__.pyi b/grpc-stubs/__init__.pyi index 63f847e..f31ee1e 100644 --- a/grpc-stubs/__init__.pyi +++ b/grpc-stubs/__init__.pyi @@ -626,7 +626,7 @@ class UnaryUnaryMultiCallable(typing.Generic[TRequest, TResponse]): def __call__( self, request: TRequest, - timeout: typing.Optional[int] = None, + timeout: typing.Optional[float] = None, metadata: typing.Optional[Metadata] = None, credentials: typing.Optional[CallCredentials] = None, From 58631b87596a66d74751124a3785ae851989e1f8 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Wed, 7 Jun 2023 17:58:14 +0100 Subject: [PATCH 3/4] Update __init__.pyi --- grpc-stubs/aio/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grpc-stubs/aio/__init__.pyi b/grpc-stubs/aio/__init__.pyi index 4edc6d1..9ac28ef 100644 --- a/grpc-stubs/aio/__init__.pyi +++ b/grpc-stubs/aio/__init__.pyi @@ -380,7 +380,7 @@ class UnaryUnaryMultiCallable(typing.Generic[TRequest, TResponse]): def __call__( self, request: TRequest, - timeout: typing.Optional[int] = None, + timeout: typing.Optional[float] = None, metadata: typing.Optional[MetadataType] = None, credentials: typing.Optional[CallCredentials] = None, # FIXME: optional bool seems weird, but that's what the docs suggest From 70be9ccd3f264f9548fc5ec70841b560d64a483b Mon Sep 17 00:00:00 2001 From: Michael Diamond Date: Thu, 21 Sep 2023 13:54:31 -0700 Subject: [PATCH 4/4] Accept any Iterable for service_names Passing a set works for me locally, but then Mypy gets mad because of this type hint. --- grpc_reflection-stubs/v1alpha/reflection.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grpc_reflection-stubs/v1alpha/reflection.pyi b/grpc_reflection-stubs/v1alpha/reflection.pyi index 90adb94..3ac378c 100644 --- a/grpc_reflection-stubs/v1alpha/reflection.pyi +++ b/grpc_reflection-stubs/v1alpha/reflection.pyi @@ -20,7 +20,7 @@ class ReflectionServicer(BaseReflectionServicer): ... def enable_server_reflection( - service_names: typing.List[str], + service_names: typing.Iterable[str], server: AnyServer, pool: typing.Optional[descriptor_pool.DescriptorPool] = ..., ) -> None: