From 02a81c7dd0206eb751a0c19cdaf31153e4a65be6 Mon Sep 17 00:00:00 2001 From: Nipunn Koorapati Date: Mon, 24 Jan 2022 00:29:26 -0800 Subject: [PATCH 1/4] Add/fix types to a bunch of non-generated protobuf files --- stubs/protobuf/@tests/stubtest_allowlist.txt | 26 ------ stubs/protobuf/google/protobuf/__init__.pyi | 2 +- stubs/protobuf/google/protobuf/descriptor.pyi | 31 +++---- .../google/protobuf/internal/containers.pyi | 27 +++++- .../google/protobuf/internal/decoder.pyi | 83 +++++++++++++------ .../google/protobuf/internal/encoder.pyi | 66 ++++++++------- .../protobuf/internal/enum_type_wrapper.pyi | 4 +- .../protobuf/internal/python_message.pyi | 4 +- .../protobuf/internal/type_checkers.pyi | 7 ++ .../protobuf/internal/well_known_types.pyi | 5 +- stubs/protobuf/google/protobuf/message.pyi | 11 +-- tests/pytype_exclude_list.txt | 2 + 12 files changed, 154 insertions(+), 114 deletions(-) create mode 100644 stubs/protobuf/google/protobuf/internal/type_checkers.pyi diff --git a/stubs/protobuf/@tests/stubtest_allowlist.txt b/stubs/protobuf/@tests/stubtest_allowlist.txt index 210b2975684c..f8083071d9fa 100644 --- a/stubs/protobuf/@tests/stubtest_allowlist.txt +++ b/stubs/protobuf/@tests/stubtest_allowlist.txt @@ -2,34 +2,8 @@ # carefully in mypy-protobuf which internally runs stubtest. Skip those here. google.protobuf\..*_pb2\..* -google.protobuf.__version__ -google.protobuf.descriptor.Descriptor.__new__ -google.protobuf.descriptor.FieldDescriptor.__init__ -google.protobuf.descriptor.FieldDescriptor.__new__ -google.protobuf.descriptor.ServiceDescriptor.__new__ -google.protobuf.descriptor._NestedDescriptorBase.GetTopLevelContainingType google.protobuf.internal.containers.BaseContainer.sort -google.protobuf.internal.containers.MessageMap.__init__ -google.protobuf.internal.containers.MessageMap.get -google.protobuf.internal.containers.RepeatedCompositeFieldContainer.__init__ -google.protobuf.internal.containers.RepeatedScalarFieldContainer.__init__ -google.protobuf.internal.containers.ScalarMap.__init__ -google.protobuf.internal.containers.ScalarMap.get -google.protobuf.internal.decoder.BytesDecoder -google.protobuf.internal.decoder.EnumDecoder -google.protobuf.internal.decoder.MessageSetItemDecoder -google.protobuf.internal.decoder.StringDecoder -google.protobuf.internal.encoder.MapSizer -google.protobuf.internal.enum_type_wrapper.EnumTypeWrapper.DESCRIPTOR -google.protobuf.internal.python_message.GeneratedProtocolMessageType.__init__ -google.protobuf.internal.python_message.GeneratedProtocolMessageType.__new__ -google.protobuf.internal.well_known_types.Any.Pack -google.protobuf.internal.well_known_types.Error -google.protobuf.internal.well_known_types.ParseError -google.protobuf.message.Message.DESCRIPTOR -google.protobuf.message.Message.Extensions google.protobuf.message.Message.SerializePartialToString google.protobuf.message.Message.SerializeToString -google.protobuf.message.Message.__init__ google.protobuf.service.Service.GetDescriptor google.protobuf.text_format.MessageToBytes diff --git a/stubs/protobuf/google/protobuf/__init__.pyi b/stubs/protobuf/google/protobuf/__init__.pyi index aae1f9314354..bda5b5a7f4cc 100644 --- a/stubs/protobuf/google/protobuf/__init__.pyi +++ b/stubs/protobuf/google/protobuf/__init__.pyi @@ -1 +1 @@ -__version__: bytes +__version__: str diff --git a/stubs/protobuf/google/protobuf/descriptor.pyi b/stubs/protobuf/google/protobuf/descriptor.pyi index f79fa775b252..690c312b8868 100644 --- a/stubs/protobuf/google/protobuf/descriptor.pyi +++ b/stubs/protobuf/google/protobuf/descriptor.pyi @@ -42,20 +42,19 @@ class _NestedDescriptorBase(DescriptorBase): serialized_end=..., serialized_options=..., ) -> None: ... - def GetTopLevelContainingType(self): ... def CopyToProto(self, proto): ... class Descriptor(_NestedDescriptorBase): def __new__( cls, - name, - full_name, - filename, - containing_type, - fields, - nested_types, - enum_types, - extensions, + name=..., + full_name=..., + filename=..., + containing_type=..., + fields=..., + nested_types=..., + enum_types=..., + extensions=..., options=..., serialized_options=..., is_extendable=..., @@ -162,9 +161,10 @@ class FieldDescriptor(DescriptorBase): extension_scope, options=..., serialized_options=..., - file=..., has_default_value=..., containing_oneof=..., + json_name=..., + file=..., create_key=..., ): ... name: Any @@ -199,9 +199,10 @@ class FieldDescriptor(DescriptorBase): extension_scope, options=..., serialized_options=..., - file=..., has_default_value=..., containing_oneof=..., + json_name=..., + file=..., create_key=..., ) -> None: ... @staticmethod @@ -267,10 +268,10 @@ class OneofDescriptor: class ServiceDescriptor(_NestedDescriptorBase): def __new__( cls, - name, - full_name, - index, - methods, + name=..., + full_name=..., + index=..., + methods=..., options=..., serialized_options=..., file=..., diff --git a/stubs/protobuf/google/protobuf/internal/containers.pyi b/stubs/protobuf/google/protobuf/internal/containers.pyi index d87885b6994f..58b5abc4b721 100644 --- a/stubs/protobuf/google/protobuf/internal/containers.pyi +++ b/stubs/protobuf/google/protobuf/internal/containers.pyi @@ -5,6 +5,7 @@ from typing_extensions import SupportsIndex from google.protobuf.descriptor import Descriptor from google.protobuf.internal.message_listener import MessageListener from google.protobuf.internal.python_message import GeneratedProtocolMessageType +from google.protobuf.internal.type_checkers import TypeChecker from google.protobuf.message import Message _T = TypeVar("_T") @@ -25,7 +26,7 @@ class BaseContainer(Sequence[_T]): def __getitem__(self, key: slice) -> list[_T]: ... class RepeatedScalarFieldContainer(BaseContainer[_ScalarV]): - def __init__(self, message_listener: MessageListener, message_descriptor: Descriptor) -> None: ... + def __init__(self, message_listener: MessageListener, type_checker: TypeChecker) -> None: ... def append(self, value: _ScalarV) -> None: ... def insert(self, key: int, value: _ScalarV) -> None: ... def extend(self, elem_seq: Optional[Iterable[_ScalarV]]) -> None: ... @@ -43,7 +44,7 @@ class RepeatedScalarFieldContainer(BaseContainer[_ScalarV]): def __eq__(self, other: object) -> bool: ... class RepeatedCompositeFieldContainer(BaseContainer[_MessageV]): - def __init__(self, message_listener: MessageListener, type_checker: Any) -> None: ... + def __init__(self, message_listener: MessageListener, message_descriptor: Descriptor) -> None: ... def add(self, **kwargs: Any) -> _MessageV: ... def append(self, value: _MessageV) -> None: ... def insert(self, key: int, value: _MessageV) -> None: ... @@ -57,23 +58,45 @@ class RepeatedCompositeFieldContainer(BaseContainer[_MessageV]): def __eq__(self, other: object) -> bool: ... class ScalarMap(MutableMapping[_K, _ScalarV]): + def __init__( + self, + message_listener: MessageListener, + key_checker: TypeChecker, + value_checker: TypeChecker, + entry_descriptor: Descriptor, + ) -> None: ... def __setitem__(self, k: _K, v: _ScalarV) -> None: ... def __delitem__(self, v: _K) -> None: ... def __getitem__(self, k: _K) -> _ScalarV: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[_K]: ... def __eq__(self, other: object) -> bool: ... + @overload + def get(self, key: _K, default: None = ...) -> _ScalarV: ... + @overload + def get(self, key: _K, default: Union[_ScalarV, _T]) -> Union[_ScalarV, _T]: ... def MergeFrom(self: _M, other: _M): ... def InvalidateIterators(self) -> None: ... def GetEntryClass(self) -> GeneratedProtocolMessageType: ... class MessageMap(MutableMapping[_K, _MessageV]): + def __init__( + self, + message_listener: MessageListener, + message_descriptor: Descriptor, + key_checker: TypeChecker, + entry_descriptor: Descriptor, + ) -> None: ... def __setitem__(self, k: _K, v: _MessageV) -> None: ... def __delitem__(self, v: _K) -> None: ... def __getitem__(self, k: _K) -> _MessageV: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[_K]: ... def __eq__(self, other: object) -> bool: ... + @overload + def get(self, key: _K, default: None = ...) -> _MessageV: ... + @overload + def get(self, key: _K, default: Union[_MessageV, _T]) -> Union[_MessageV, _T]: ... def get_or_create(self, key: _K) -> _MessageV: ... def MergeFrom(self: _M, other: _M): ... def InvalidateIterators(self) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/decoder.pyi b/stubs/protobuf/google/protobuf/internal/decoder.pyi index 24774ee286eb..db08f0a46654 100644 --- a/stubs/protobuf/google/protobuf/internal/decoder.pyi +++ b/stubs/protobuf/google/protobuf/internal/decoder.pyi @@ -1,30 +1,61 @@ -from typing import Any +from typing import Any, Callable + +from google.protobuf.descriptor import Descriptor, FieldDescriptor +from google.protobuf.message import Message + +_Decoder = Callable[[str, int, int, Message, dict[FieldDescriptor, Any]], int] +_NewDefault = Callable[[Message], Message] def ReadTag(buffer, pos): ... -def EnumDecoder(field_number, is_repeated, is_packed, key, new_default): ... - -Int32Decoder: Any -Int64Decoder: Any -UInt32Decoder: Any -UInt64Decoder: Any -SInt32Decoder: Any -SInt64Decoder: Any -Fixed32Decoder: Any -Fixed64Decoder: Any -SFixed32Decoder: Any -SFixed64Decoder: Any -FloatDecoder: Any -DoubleDecoder: Any -BoolDecoder: Any - -def StringDecoder(field_number, is_repeated, is_packed, key, new_default): ... -def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): ... -def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): ... -def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): ... - -MESSAGE_SET_ITEM_TAG: Any - -def MessageSetItemDecoder(extensions_by_number): ... -def MapDecoder(field_descriptor, new_default, is_message_map): ... + +Int32Decoder: _Decoder +Int64Decoder: _Decoder +UInt32Decoder: _Decoder +UInt64Decoder: _Decoder +SInt32Decoder: _Decoder +SInt64Decoder: _Decoder +Fixed32Decoder: _Decoder +Fixed64Decoder: _Decoder +SFixed32Decoder: _Decoder +SFixed64Decoder: _Decoder +FloatDecoder: _Decoder +DoubleDecoder: _Decoder +BoolDecoder: _Decoder + +def EnumDecoder( + field_number: int, + is_repeated: bool, + is_packed: bool, + key: FieldDescriptor, + new_default: _NewDefault, + clear_if_default: bool = ..., +) -> _Decoder: ... +def StringDecoder( + field_number: int, + is_repeated: bool, + is_packed: bool, + key: FieldDescriptor, + new_default: _NewDefault, + clear_if_default: bool = ..., +) -> _Decoder: ... +def BytesDecoder( + field_number: int, + is_repeated: bool, + is_packed: bool, + key: FieldDescriptor, + new_default: _NewDefault, + clear_if_default: bool = ..., +) -> _Decoder: ... +def GroupDecoder( + field_number: int, is_repeated: bool, is_packed: bool, key: FieldDescriptor, new_default: _NewDefault +) -> _Decoder: ... +def MessageDecoder( + field_number: int, is_repeated: bool, is_packed: bool, key: FieldDescriptor, new_default: _NewDefault +) -> _Decoder: ... + +MESSAGE_SET_ITEM_TAG: bytes + +def MessageSetItemDecoder(descriptor: Descriptor) -> _Decoder: ... +def MapDecoder(field_descriptor, new_default, is_message_map) -> _Decoder: ... SkipField: Any diff --git a/stubs/protobuf/google/protobuf/internal/encoder.pyi b/stubs/protobuf/google/protobuf/internal/encoder.pyi index 7a7923fe5d4b..058d2ff9fa35 100644 --- a/stubs/protobuf/google/protobuf/internal/encoder.pyi +++ b/stubs/protobuf/google/protobuf/internal/encoder.pyi @@ -1,34 +1,40 @@ -from typing import Any +from typing import Callable -Int32Sizer: Any -UInt32Sizer: Any -SInt32Sizer: Any -Fixed32Sizer: Any -Fixed64Sizer: Any -BoolSizer: Any +from google.protobuf.descriptor import FieldDescriptor -def StringSizer(field_number, is_repeated, is_packed): ... -def BytesSizer(field_number, is_repeated, is_packed): ... -def GroupSizer(field_number, is_repeated, is_packed): ... -def MessageSizer(field_number, is_repeated, is_packed): ... -def MessageSetItemSizer(field_number): ... -def MapSizer(field_descriptor): ... -def TagBytes(field_number, wire_type): ... +_Sizer = Callable[[int, bool, bool], int] -Int32Encoder: Any -UInt32Encoder: Any -SInt32Encoder: Any -Fixed32Encoder: Any -Fixed64Encoder: Any -SFixed32Encoder: Any -SFixed64Encoder: Any -FloatEncoder: Any -DoubleEncoder: Any +Int32Sizer: _Sizer +UInt32Sizer: _Sizer +SInt32Sizer: _Sizer +Fixed32Sizer: _Sizer +Fixed64Sizer: _Sizer +BoolSizer: _Sizer -def BoolEncoder(field_number, is_repeated, is_packed): ... -def StringEncoder(field_number, is_repeated, is_packed): ... -def BytesEncoder(field_number, is_repeated, is_packed): ... -def GroupEncoder(field_number, is_repeated, is_packed): ... -def MessageEncoder(field_number, is_repeated, is_packed): ... -def MessageSetItemEncoder(field_number): ... -def MapEncoder(field_descriptor): ... +def StringSizer(field_number: int, is_repeated: bool, is_packed: bool) -> _Sizer: ... +def BytesSizer(field_number: int, is_repeated: bool, is_packed: bool) -> _Sizer: ... +def GroupSizer(field_number: int, is_repeated: bool, is_packed: bool) -> _Sizer: ... +def MessageSizer(field_number: int, is_repeated: bool, is_packed: bool) -> _Sizer: ... +def MessageSetItemSizer(field_number: int) -> _Sizer: ... +def MapSizer(field_descriptor: FieldDescriptor, is_message_map: bool) -> _Sizer: ... +def TagBytes(field_number: int, wire_type: int) -> bytes: ... + +_Encoder = Callable[[Callable[[bytes], int], bytes, bool], int] + +Int32Encoder: _Encoder +UInt32Encoder: _Encoder +SInt32Encoder: _Encoder +Fixed32Encoder: _Encoder +Fixed64Encoder: _Encoder +SFixed32Encoder: _Encoder +SFixed64Encoder: _Encoder +FloatEncoder: _Encoder +DoubleEncoder: _Encoder + +def BoolEncoder(field_number: int, is_repeated: bool, is_packed: bool) -> _Encoder: ... +def StringEncoder(field_number: int, is_repeated: bool, is_packed: bool) -> _Encoder: ... +def BytesEncoder(field_number: int, is_repeated: bool, is_packed: bool) -> _Encoder: ... +def GroupEncoder(field_number: int, is_repeated: bool, is_packed: bool) -> _Encoder: ... +def MessageEncoder(field_number: int, is_repeated: bool, is_packed: bool) -> _Encoder: ... +def MessageSetItemEncoder(field_number: int) -> _Encoder: ... +def MapEncoder(field_descriptor: FieldDescriptor) -> _Encoder: ... diff --git a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi index 47f40a972dff..70f45ea67275 100644 --- a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi +++ b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi @@ -1,4 +1,4 @@ -from typing import Generic, Text, TypeVar +from typing import Generic, Optional, Text, TypeVar from google.protobuf.descriptor import EnumDescriptor @@ -7,7 +7,7 @@ _V = TypeVar("_V", bound=int) # Expose a generic version so that those using mypy-protobuf # can get autogenerated NewType wrapper around the int values class _EnumTypeWrapper(Generic[_V]): - DESCRIPTOR: EnumDescriptor + DESCRIPTOR: Optional[EnumDescriptor] def __init__(self, enum_type: EnumDescriptor) -> None: ... def Name(self, number: _V) -> str: ... def Value(self, name: Text | bytes) -> _V: ... diff --git a/stubs/protobuf/google/protobuf/internal/python_message.pyi b/stubs/protobuf/google/protobuf/internal/python_message.pyi index 538d70b447ef..0395ff64707c 100644 --- a/stubs/protobuf/google/protobuf/internal/python_message.pyi +++ b/stubs/protobuf/google/protobuf/internal/python_message.pyi @@ -1 +1,3 @@ -class GeneratedProtocolMessageType(type): ... +class GeneratedProtocolMessageType(type): + def __new__(cls, name, bases, dictionary): ... + def __init__(cls, name, bases, dictionary): ... diff --git a/stubs/protobuf/google/protobuf/internal/type_checkers.pyi b/stubs/protobuf/google/protobuf/internal/type_checkers.pyi new file mode 100644 index 000000000000..537f5c853639 --- /dev/null +++ b/stubs/protobuf/google/protobuf/internal/type_checkers.pyi @@ -0,0 +1,7 @@ +from typing import Any, TypeVar + +_T = TypeVar("_T") + +class TypeChecker: + def __init__(self, *acceptable_types: Any): ... + def CheckValue(self, proposed_value: _T) -> _T: ... diff --git a/stubs/protobuf/google/protobuf/internal/well_known_types.pyi b/stubs/protobuf/google/protobuf/internal/well_known_types.pyi index ce4d188cfb0a..146907ce31bc 100644 --- a/stubs/protobuf/google/protobuf/internal/well_known_types.pyi +++ b/stubs/protobuf/google/protobuf/internal/well_known_types.pyi @@ -1,13 +1,10 @@ from datetime import datetime, timedelta from typing import Any as tAny, Optional -class Error(Exception): ... -class ParseError(Error): ... - class Any: type_url: tAny = ... value: tAny = ... - def Pack(self, msg: tAny, type_url_prefix: bytes = ..., deterministic: Optional[tAny] = ...) -> None: ... + def Pack(self, msg: tAny, type_url_prefix: str = ..., deterministic: Optional[tAny] = ...) -> None: ... def Unpack(self, msg: tAny): ... def TypeName(self): ... def Is(self, descriptor: tAny): ... diff --git a/stubs/protobuf/google/protobuf/message.pyi b/stubs/protobuf/google/protobuf/message.pyi index 209c4a189099..70350d22aeb8 100644 --- a/stubs/protobuf/google/protobuf/message.pyi +++ b/stubs/protobuf/google/protobuf/message.pyi @@ -1,8 +1,8 @@ from _typeshed import Self -from typing import Any, Sequence, TypeVar +from typing import Any, Optional, Sequence, TypeVar from .descriptor import Descriptor, FieldDescriptor -from .internal.extension_dict import _ExtensionDict, _ExtensionFieldDescriptor +from .internal.extension_dict import _ExtensionFieldDescriptor class Error(Exception): ... class DecodeError(Error): ... @@ -11,7 +11,7 @@ class EncodeError(Error): ... _M = TypeVar("_M", bound=Message) # message type (of self) class Message: - DESCRIPTOR: Descriptor + DESCRIPTOR: Optional[Descriptor] def __deepcopy__(self, memo=...): ... def __eq__(self, other_msg): ... def __ne__(self, other_msg): ... @@ -31,9 +31,6 @@ class Message: def ByteSize(self) -> int: ... @classmethod def FromString(cls: type[Self], s: bytes) -> Self: ... - # The TypeVar must be bound to `Message` or we get mypy errors, so we cannot use `Self` for `Extensions` - @property - def Extensions(self: _M) -> _ExtensionDict[_M]: ... # Intentionally left out typing on these three methods, because they are # stringly typed and it is not useful to call them on a Message directly. # We prefer more specific typing on individual subclasses of Message @@ -42,4 +39,4 @@ class Message: def ClearField(self, field_name: Any) -> None: ... def WhichOneof(self, oneof_group: Any) -> Any: ... # TODO: check kwargs - def __init__(self, **kwargs) -> None: ... + def __init__(self, *args, **kwargs) -> None: ... diff --git a/tests/pytype_exclude_list.txt b/tests/pytype_exclude_list.txt index 6d303bbc5063..b6bbba728b75 100644 --- a/tests/pytype_exclude_list.txt +++ b/tests/pytype_exclude_list.txt @@ -30,6 +30,8 @@ stubs/protobuf/google/protobuf/duration_pb2.pyi stubs/protobuf/google/protobuf/empty_pb2.pyi stubs/protobuf/google/protobuf/field_mask_pb2.pyi stubs/protobuf/google/protobuf/internal/containers.pyi +stubs/protobuf/google/protobuf/internal/decoder.pyi +stubs/protobuf/google/protobuf/internal/encoder.pyi stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi stubs/protobuf/google/protobuf/internal/extension_dict.pyi stubs/protobuf/google/protobuf/json_format.pyi From 5278d37fc5558dbf1091d055a2ebcb19bee772db Mon Sep 17 00:00:00 2001 From: Nipunn Koorapati Date: Tue, 25 Jan 2022 09:54:11 -0800 Subject: [PATCH 2/4] Use union syntax Co-authored-by: Sebastian Rittau --- stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi | 2 +- stubs/protobuf/google/protobuf/message.pyi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi index 70f45ea67275..8c0ca3e95842 100644 --- a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi +++ b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi @@ -7,7 +7,7 @@ _V = TypeVar("_V", bound=int) # Expose a generic version so that those using mypy-protobuf # can get autogenerated NewType wrapper around the int values class _EnumTypeWrapper(Generic[_V]): - DESCRIPTOR: Optional[EnumDescriptor] + DESCRIPTOR: EnumDescriptor | None def __init__(self, enum_type: EnumDescriptor) -> None: ... def Name(self, number: _V) -> str: ... def Value(self, name: Text | bytes) -> _V: ... diff --git a/stubs/protobuf/google/protobuf/message.pyi b/stubs/protobuf/google/protobuf/message.pyi index 70350d22aeb8..9ba635a3f773 100644 --- a/stubs/protobuf/google/protobuf/message.pyi +++ b/stubs/protobuf/google/protobuf/message.pyi @@ -11,7 +11,7 @@ class EncodeError(Error): ... _M = TypeVar("_M", bound=Message) # message type (of self) class Message: - DESCRIPTOR: Optional[Descriptor] + DESCRIPTOR: Descriptor | None def __deepcopy__(self, memo=...): ... def __eq__(self, other_msg): ... def __ne__(self, other_msg): ... From b5cbdb4c02e32c84e162a582d179c50c22dc6592 Mon Sep 17 00:00:00 2001 From: Nipunn Koorapati Date: Tue, 25 Jan 2022 10:11:02 -0800 Subject: [PATCH 3/4] Use _ValueChecker protocol --- .../google/protobuf/internal/containers.pyi | 10 +++++----- .../google/protobuf/internal/type_checkers.pyi | 14 +++++++++++--- stubs/protobuf/google/protobuf/message.pyi | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/stubs/protobuf/google/protobuf/internal/containers.pyi b/stubs/protobuf/google/protobuf/internal/containers.pyi index 58b5abc4b721..1a86d45a1393 100644 --- a/stubs/protobuf/google/protobuf/internal/containers.pyi +++ b/stubs/protobuf/google/protobuf/internal/containers.pyi @@ -5,7 +5,7 @@ from typing_extensions import SupportsIndex from google.protobuf.descriptor import Descriptor from google.protobuf.internal.message_listener import MessageListener from google.protobuf.internal.python_message import GeneratedProtocolMessageType -from google.protobuf.internal.type_checkers import TypeChecker +from google.protobuf.internal.type_checkers import _ValueChecker from google.protobuf.message import Message _T = TypeVar("_T") @@ -26,7 +26,7 @@ class BaseContainer(Sequence[_T]): def __getitem__(self, key: slice) -> list[_T]: ... class RepeatedScalarFieldContainer(BaseContainer[_ScalarV]): - def __init__(self, message_listener: MessageListener, type_checker: TypeChecker) -> None: ... + def __init__(self, message_listener: MessageListener, type_checker: _ValueChecker[_ScalarV]) -> None: ... def append(self, value: _ScalarV) -> None: ... def insert(self, key: int, value: _ScalarV) -> None: ... def extend(self, elem_seq: Optional[Iterable[_ScalarV]]) -> None: ... @@ -61,8 +61,8 @@ class ScalarMap(MutableMapping[_K, _ScalarV]): def __init__( self, message_listener: MessageListener, - key_checker: TypeChecker, - value_checker: TypeChecker, + key_checker: _ValueChecker[_K], + value_checker: _ValueChecker[_ScalarV], entry_descriptor: Descriptor, ) -> None: ... def __setitem__(self, k: _K, v: _ScalarV) -> None: ... @@ -84,7 +84,7 @@ class MessageMap(MutableMapping[_K, _MessageV]): self, message_listener: MessageListener, message_descriptor: Descriptor, - key_checker: TypeChecker, + key_checker: _ValueChecker[_K], entry_descriptor: Descriptor, ) -> None: ... def __setitem__(self, k: _K, v: _MessageV) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/type_checkers.pyi b/stubs/protobuf/google/protobuf/internal/type_checkers.pyi index 537f5c853639..fbcc35ebf8b0 100644 --- a/stubs/protobuf/google/protobuf/internal/type_checkers.pyi +++ b/stubs/protobuf/google/protobuf/internal/type_checkers.pyi @@ -1,7 +1,15 @@ -from typing import Any, TypeVar +from typing import Generic, Protocol, TypeVar _T = TypeVar("_T") -class TypeChecker: - def __init__(self, *acceptable_types: Any): ... +class _ValueChecker(Protocol[_T]): def CheckValue(self, proposed_value: _T) -> _T: ... + def DefaultValue(self) -> _T: ... + +class TypeChecker(Generic[_T]): + def __init__(self, *acceptable_types: _T): ... + def CheckValue(self, proposed_value: _T) -> _T: ... + +class TypeCheckerWithDefault(TypeChecker[_T]): + def __init__(self, default_value: _T, *acceptable_types: _T): ... + def DefaultValue(self) -> _T: ... diff --git a/stubs/protobuf/google/protobuf/message.pyi b/stubs/protobuf/google/protobuf/message.pyi index 9ba635a3f773..665941f0827a 100644 --- a/stubs/protobuf/google/protobuf/message.pyi +++ b/stubs/protobuf/google/protobuf/message.pyi @@ -1,5 +1,5 @@ from _typeshed import Self -from typing import Any, Optional, Sequence, TypeVar +from typing import Any, Sequence, TypeVar from .descriptor import Descriptor, FieldDescriptor from .internal.extension_dict import _ExtensionFieldDescriptor From 45a2256f397f9810944e8fccff53dc36471cb3ce Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Wed, 2 Feb 2022 12:22:39 +0100 Subject: [PATCH 4/4] Remove unused import Co-authored-by: Alex Waygood --- stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi index 8c0ca3e95842..3abc44b26b8f 100644 --- a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi +++ b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi @@ -1,4 +1,4 @@ -from typing import Generic, Optional, Text, TypeVar +from typing import Generic, Text, TypeVar from google.protobuf.descriptor import EnumDescriptor