From 719f4cfce30254b2a5ac482b4301ecde66dd09c7 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Sat, 28 Mar 2026 03:52:09 +0300 Subject: [PATCH 1/2] [protobuf] Bump to 7.34.1 and improve type coverage Signed-off-by: Emmanuel Ferdman --- stubs/protobuf/@tests/stubtest_allowlist.txt | 11 +- stubs/protobuf/METADATA.toml | 4 +- stubs/protobuf/google/_upb/_message.pyi | 406 +++++++++--------- stubs/protobuf/google/protobuf/any.pyi | 13 + stubs/protobuf/google/protobuf/descriptor.pyi | 230 +++++----- .../google/protobuf/descriptor_database.pyi | 10 +- .../google/protobuf/descriptor_pool.pyi | 46 +- stubs/protobuf/google/protobuf/duration.pyi | 16 + .../google/protobuf/internal/builder.pyi | 9 +- .../google/protobuf/internal/containers.pyi | 69 +-- .../google/protobuf/internal/decoder.pyi | 27 +- .../protobuf/internal/enum_type_wrapper.pyi | 3 +- .../protobuf/internal/extension_dict.pyi | 4 +- .../google/protobuf/internal/field_mask.pyi | 15 + .../protobuf/internal/message_listener.pyi | 2 +- .../internal/python_edition_defaults.pyi | 0 .../protobuf/internal/python_message.pyi | 6 +- .../protobuf/internal/testing_refleaks.pyi | 20 + .../protobuf/internal/type_checkers.pyi | 45 +- .../protobuf/internal/well_known_types.pyi | 22 +- .../google/protobuf/internal/wire_format.pyi | 92 ++-- .../protobuf/google/protobuf/json_format.pyi | 5 +- stubs/protobuf/google/protobuf/message.pyi | 21 +- .../google/protobuf/message_factory.pyi | 5 +- stubs/protobuf/google/protobuf/proto.pyi | 14 + .../google/protobuf/proto_builder.pyi | 8 + stubs/protobuf/google/protobuf/proto_json.pyi | 21 + stubs/protobuf/google/protobuf/proto_text.pyi | 32 ++ stubs/protobuf/google/protobuf/reflection.pyi | 12 +- .../google/protobuf/service_reflection.pyi | 7 + .../google/protobuf/symbol_database.pyi | 5 +- .../google/protobuf/text_encoding.pyi | 2 + .../protobuf/google/protobuf/text_format.pyi | 20 +- stubs/protobuf/google/protobuf/timestamp.pyi | 16 + .../google/protobuf/unknown_fields.pyi | 9 + 35 files changed, 769 insertions(+), 458 deletions(-) create mode 100644 stubs/protobuf/google/protobuf/any.pyi create mode 100644 stubs/protobuf/google/protobuf/duration.pyi create mode 100644 stubs/protobuf/google/protobuf/internal/field_mask.pyi create mode 100644 stubs/protobuf/google/protobuf/internal/python_edition_defaults.pyi create mode 100644 stubs/protobuf/google/protobuf/internal/testing_refleaks.pyi create mode 100644 stubs/protobuf/google/protobuf/proto.pyi create mode 100644 stubs/protobuf/google/protobuf/proto_builder.pyi create mode 100644 stubs/protobuf/google/protobuf/proto_json.pyi create mode 100644 stubs/protobuf/google/protobuf/proto_text.pyi create mode 100644 stubs/protobuf/google/protobuf/service_reflection.pyi create mode 100644 stubs/protobuf/google/protobuf/text_encoding.pyi create mode 100644 stubs/protobuf/google/protobuf/timestamp.pyi create mode 100644 stubs/protobuf/google/protobuf/unknown_fields.pyi diff --git a/stubs/protobuf/@tests/stubtest_allowlist.txt b/stubs/protobuf/@tests/stubtest_allowlist.txt index 08d9389d4263..449ab19c9e8e 100644 --- a/stubs/protobuf/@tests/stubtest_allowlist.txt +++ b/stubs/protobuf/@tests/stubtest_allowlist.txt @@ -26,12 +26,17 @@ google.protobuf.descriptor.ServiceDescriptor.__new__ # It's a hack - just allow it. google.protobuf.internal.containers.BaseContainer.__hash__ -# Metaclass differs: -google.protobuf.descriptor.OneofDescriptor - # Runtime does not have __iter__ (yet...): hack in spirit of https://github.com/python/typeshed/issues/7813 google.protobuf.internal.well_known_types.ListValue.__iter__ # It's a list at runtime, but if we do that pyright complains about incompatible overrides # in subclasses that use a tuple for __slots__. google.protobuf.message.Message.__slots__ + +# Thin wrapper around the C extension metaclass; users should use +# google.protobuf.reflection.GeneratedProtocolMessageType instead +google.protobuf.pyext +google.protobuf.pyext.cpp_message + +# Package with only __init__.py, no public API +google.protobuf.testdata diff --git a/stubs/protobuf/METADATA.toml b/stubs/protobuf/METADATA.toml index fc8dfe341705..a7ab66eace44 100644 --- a/stubs/protobuf/METADATA.toml +++ b/stubs/protobuf/METADATA.toml @@ -1,8 +1,8 @@ # Using an exact number in the specifier for scripts/sync_protobuf/google_protobuf.py # When updating, also re-run the script -version = "~=6.32.1" +version = "~=7.34.1" upstream_repository = "https://github.com/protocolbuffers/protobuf" -extra_description = "Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 31.1 on [protobuf v32.1](https://github.com/protocolbuffers/protobuf/releases/tag/v32.1) (python `protobuf==6.32.1`)." +extra_description = "Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 34.1 on [protobuf v34.1](https://github.com/protocolbuffers/protobuf/releases/tag/v34.1) (python `protobuf==7.34.1`)." partial_stub = true [tool.stubtest] diff --git a/stubs/protobuf/google/_upb/_message.pyi b/stubs/protobuf/google/_upb/_message.pyi index 3ebfc2808dd8..a6e1d1e727fd 100644 --- a/stubs/protobuf/google/_upb/_message.pyi +++ b/stubs/protobuf/google/_upb/_message.pyi @@ -1,6 +1,16 @@ -from _typeshed import Incomplete -from typing import ClassVar, final -from typing_extensions import Self +from typing import Any, ClassVar, final +from typing_extensions import Self, disjoint_base + +from google.protobuf.descriptor_pb2 import ( + EnumOptions, + EnumValueOptions, + FieldOptions, + FileOptions, + MessageOptions, + MethodOptions, + OneofOptions, + ServiceOptions, +) default_pool: DescriptorPool @@ -9,93 +19,93 @@ class Arena: ... @final class Descriptor: - containing_type: Incomplete - enum_types: Incomplete - enum_types_by_name: Incomplete - enum_values_by_name: Incomplete - extension_ranges: Incomplete - extensions: Incomplete - extensions_by_name: Incomplete - fields: Incomplete - fields_by_camelcase_name: Incomplete - fields_by_name: Incomplete - fields_by_number: Incomplete - file: Incomplete - full_name: Incomplete - has_options: Incomplete - is_extendable: Incomplete - name: Incomplete - nested_types: Incomplete - nested_types_by_name: Incomplete - oneofs: Incomplete - oneofs_by_name: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def CopyToProto(self, object, /): ... - def EnumValueName(self, *args, **kwargs): ... # incomplete - def GetOptions(self): ... + containing_type: Descriptor | None + enum_types: Any + enum_types_by_name: Any + enum_values_by_name: Any + extension_ranges: Any + extensions: Any + extensions_by_name: Any + fields: Any + fields_by_camelcase_name: Any + fields_by_name: Any + fields_by_number: Any + file: FileDescriptor + full_name: str + has_options: bool + is_extendable: bool + name: str + nested_types: Any + nested_types_by_name: Any + oneofs: Any + oneofs_by_name: Any + def __new__(cls, *args, **kwargs) -> Self: ... + def CopyToProto(self, proto: Any, /) -> None: ... + def EnumValueName(self, enum: Any, value: Any) -> str: ... + def GetOptions(self) -> MessageOptions: ... @final class DescriptorPool: - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def Add(self, object, /): ... - def AddSerializedFile(self, object, /): ... - def FindAllExtensions(self, object, /): ... - def FindEnumTypeByName(self, object, /): ... - def FindExtensionByName(self, object, /): ... - def FindExtensionByNumber(self, *args, **kwargs): ... # incomplete - def FindFieldByName(self, object, /): ... - def FindFileByName(self, object, /): ... - def FindFileContainingSymbol(self, object, /): ... - def FindMessageTypeByName(self, object, /): ... - def FindMethodByName(self, object, /): ... - def FindOneofByName(self, object, /): ... - def FindServiceByName(self, object, /): ... - def SetFeatureSetDefaults(self, object, /): ... + def __new__(cls, *args, **kwargs) -> Self: ... + def Add(self, file_desc_proto: Any, /) -> None: ... + def AddSerializedFile(self, serialized_file_desc_proto: bytes, /) -> FileDescriptor: ... + def FindAllExtensions(self, message_descriptor: Descriptor, /) -> list[FieldDescriptor]: ... + def FindEnumTypeByName(self, full_name: str, /) -> EnumDescriptor: ... + def FindExtensionByName(self, full_name: str, /) -> FieldDescriptor: ... + def FindExtensionByNumber(self, message_descriptor: Descriptor, number: int, /) -> FieldDescriptor: ... + def FindFieldByName(self, full_name: str, /) -> FieldDescriptor: ... + def FindFileByName(self, file_name: str, /) -> FileDescriptor: ... + def FindFileContainingSymbol(self, symbol: str, /) -> FileDescriptor: ... + def FindMessageTypeByName(self, full_name: str, /) -> Descriptor: ... + def FindMethodByName(self, full_name: str, /) -> MethodDescriptor: ... + def FindOneofByName(self, full_name: str, /) -> OneofDescriptor: ... + def FindServiceByName(self, full_name: str, /) -> ServiceDescriptor: ... + def SetFeatureSetDefaults(self, defaults: Any, /) -> None: ... @final class EnumDescriptor: - containing_type: Incomplete - file: Incomplete - full_name: Incomplete - has_options: Incomplete - is_closed: Incomplete - name: Incomplete - values: Incomplete - values_by_name: Incomplete - values_by_number: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def CopyToProto(self, object, /): ... - def GetOptions(self): ... + containing_type: Descriptor | None + file: FileDescriptor + full_name: str + has_options: bool + is_closed: bool + name: str + values: Any + values_by_name: Any + values_by_number: Any + def __new__(cls, *args, **kwargs) -> Self: ... + def CopyToProto(self, proto: Any, /) -> None: ... + def GetOptions(self) -> EnumOptions: ... @final class EnumValueDescriptor: - has_options: Incomplete - index: Incomplete - name: Incomplete - number: Incomplete - type: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def GetOptions(self): ... + has_options: bool + index: int + name: str + number: int + type: EnumDescriptor + def __new__(cls, *args, **kwargs) -> Self: ... + def GetOptions(self) -> EnumValueOptions: ... @final class ExtensionDict: - def __contains__(self, other, /) -> bool: ... - def __delitem__(self, other, /) -> None: ... + def __contains__(self, extension_handle: Any, /) -> bool: ... + def __delitem__(self, extension_handle: Any, /) -> None: ... def __eq__(self, other: object, /) -> bool: ... def __ge__(self, other: object, /) -> bool: ... - def __getitem__(self, index, /): ... + def __getitem__(self, extension_handle: Any, /) -> Any: ... def __gt__(self, other: object, /) -> bool: ... - def __iter__(self): ... + def __iter__(self) -> ExtensionIterator: ... def __le__(self, other: object, /) -> bool: ... def __len__(self) -> int: ... def __lt__(self, other: object, /) -> bool: ... def __ne__(self, other: object, /) -> bool: ... - def __setitem__(self, index, object, /) -> None: ... + def __setitem__(self, extension_handle: Any, value: Any, /) -> None: ... @final class ExtensionIterator: - def __iter__(self): ... - def __next__(self): ... + def __iter__(self) -> Self: ... + def __next__(self) -> Any: ... @final class FieldDescriptor: @@ -131,181 +141,187 @@ class FieldDescriptor: TYPE_STRING: ClassVar[int] = ... TYPE_UINT32: ClassVar[int] = ... TYPE_UINT64: ClassVar[int] = ... - camelcase_name: Incomplete - containing_oneof: Incomplete - containing_type: Incomplete - cpp_type: Incomplete - default_value: Incomplete - enum_type: Incomplete - extension_scope: Incomplete - file: Incomplete - full_name: Incomplete - has_default_value: Incomplete - has_options: Incomplete - has_presence: Incomplete - index: Incomplete - is_extension: Incomplete - is_packed: Incomplete - json_name: Incomplete - label: Incomplete - message_type: Incomplete - name: Incomplete - number: Incomplete - type: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def GetOptions(self): ... + camelcase_name: str + containing_oneof: OneofDescriptor | None + containing_type: Descriptor | None + cpp_type: int + default_value: Any + enum_type: EnumDescriptor | None + extension_scope: Descriptor | None + file: FileDescriptor + full_name: str + has_default_value: bool + has_options: bool + has_presence: bool + index: int + is_extension: bool + is_packed: bool + is_repeated: bool + is_required: bool + json_name: str + message_type: Descriptor | None + name: str + number: int + type: int + def __new__(cls, *args, **kwargs) -> Self: ... + def GetOptions(self) -> FieldOptions: ... @final class FileDescriptor: - dependencies: Incomplete - enum_types_by_name: Incomplete - extensions_by_name: Incomplete - has_options: Incomplete - message_types_by_name: Incomplete - name: Incomplete - package: Incomplete - pool: Incomplete - public_dependencies: Incomplete - serialized_pb: Incomplete - services_by_name: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def CopyToProto(self, object, /): ... - def GetOptions(self): ... + dependencies: list[FileDescriptor] + enum_types_by_name: dict[str, EnumDescriptor] + extensions_by_name: dict[str, FieldDescriptor] + has_options: bool + message_types_by_name: dict[str, Descriptor] + name: str + package: str + pool: DescriptorPool + public_dependencies: list[FileDescriptor] + serialized_pb: bytes + services_by_name: dict[str, ServiceDescriptor] + def __new__(cls, *args, **kwargs) -> Self: ... + def CopyToProto(self, proto: Any, /) -> None: ... + def GetOptions(self) -> FileOptions: ... @final class MapIterator: - def __iter__(self): ... - def __next__(self): ... + def __iter__(self) -> Self: ... + def __next__(self) -> Any: ... @final class Message: - Extensions: Incomplete - def __init__(self, *args, **kwargs) -> None: ... # incomplete - def ByteSize(self): ... - def Clear(self): ... - def ClearExtension(self, object, /): ... - def ClearField(self, object, /): ... - def CopyFrom(self, object, /): ... - def DiscardUnknownFields(self): ... - def FindInitializationErrors(self): ... - @classmethod - def FromString(cls, object, /): ... - def HasExtension(self, object, /): ... - def HasField(self, object, /): ... - def IsInitialized(self, *args, **kwargs): ... # incomplete - def ListFields(self): ... - def MergeFrom(self, object, /): ... - def MergeFromString(self, object, /): ... - def ParseFromString(self, object, /): ... - def SerializePartialToString(self, *args, **kwargs): ... # incomplete - def SerializeToString(self, *args, **kwargs): ... # incomplete - def SetInParent(self): ... - def UnknownFields(self): ... - def WhichOneof(self, object, /): ... - def __contains__(self, other, /) -> bool: ... - def __deepcopy__(self, memo=None): ... - def __delattr__(self, name, /): ... + Extensions: Any + def __init__(self, *args, **kwargs) -> None: ... + def __contains__(self, field_name_or_key: Any, /) -> bool: ... + def __deepcopy__(self, memo: Any = None) -> Self: ... + def __delattr__(self, name: str, /) -> None: ... def __eq__(self, other: object, /) -> bool: ... def __ge__(self, other: object, /) -> bool: ... def __gt__(self, other: object, /) -> bool: ... def __le__(self, other: object, /) -> bool: ... def __lt__(self, other: object, /) -> bool: ... def __ne__(self, other: object, /) -> bool: ... - def __setattr__(self, name, value, /): ... + def __setattr__(self, name: str, value: Any, /) -> None: ... + def MergeFrom(self, other_msg: Message, /) -> None: ... + def CopyFrom(self, other_msg: Message, /) -> None: ... + def Clear(self) -> None: ... + def SetInParent(self) -> None: ... + def IsInitialized(self, errors: list[str] | None = None) -> bool: ... + def MergeFromString(self, serialized: bytes, /) -> int: ... + def ParseFromString(self, serialized: bytes, /) -> int: ... + def SerializeToString(self, *, deterministic: bool = ...) -> bytes: ... + def SerializePartialToString(self, *, deterministic: bool = ...) -> bytes: ... + def ListFields(self) -> list[tuple[FieldDescriptor, Any]]: ... + def HasField(self, field_name: str, /) -> bool: ... + def ClearField(self, field_name: str, /) -> None: ... + def WhichOneof(self, oneof_group: str, /) -> str | None: ... + def HasExtension(self, field_descriptor: Any, /) -> bool: ... + def ClearExtension(self, field_descriptor: Any, /) -> None: ... + def UnknownFields(self) -> Any: ... + def DiscardUnknownFields(self) -> None: ... + def ByteSize(self) -> int: ... + @classmethod + def FromString(cls, s: bytes, /) -> Self: ... + def FindInitializationErrors(self) -> list[str]: ... -@final +@disjoint_base class MessageMeta(type): ... @final class MethodDescriptor: - client_streaming: Incomplete - containing_service: Incomplete - full_name: Incomplete - index: Incomplete - input_type: Incomplete - name: Incomplete - output_type: Incomplete - server_streaming: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def CopyToProto(self, object, /): ... - def GetOptions(self): ... + client_streaming: bool + containing_service: ServiceDescriptor + full_name: str + has_options: bool + index: int + input_type: Descriptor + name: str + output_type: Descriptor + server_streaming: bool + def __new__(cls, *args, **kwargs) -> Self: ... + def CopyToProto(self, proto: Any, /) -> None: ... + def GetOptions(self) -> MethodOptions: ... @final class OneofDescriptor: - containing_type: Incomplete - fields: Incomplete - full_name: Incomplete - has_options: Incomplete - index: Incomplete - name: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def GetOptions(self): ... + containing_type: Descriptor + fields: list[FieldDescriptor] + full_name: str + has_options: bool + index: int + name: str + def __new__(cls, *args, **kwargs) -> Self: ... + def GetOptions(self) -> OneofOptions: ... @final class RepeatedCompositeContainer: - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def MergeFrom(self, object, /): ... - def add(self, *args, **kwargs): ... # incomplete - def append(self, object, /): ... - def extend(self, object, /): ... - def insert(self, *args, **kwargs): ... # incomplete - def pop(self, *args, **kwargs): ... # incomplete - def remove(self, object, /): ... - def reverse(self): ... - def sort(self, *args, **kwargs): ... # incomplete - def __deepcopy__(self, memo=None): ... - def __delitem__(self, other, /) -> None: ... + def __new__(cls, *args, **kwargs) -> Self: ... + def MergeFrom(self, other: Any, /) -> None: ... + def add(self, **kwargs: Any) -> Message: ... + def append(self, value: Any, /) -> None: ... + def extend(self, values: Any, /) -> None: ... + def insert(self, key: int, value: Any, /) -> None: ... + def pop(self, key: int = -1, /) -> Message: ... + def remove(self, value: Any, /) -> None: ... + def reverse(self) -> None: ... + def sort(self, *, key: Any = None, reverse: bool = False) -> None: ... + def clear(self) -> None: ... + def __deepcopy__(self, memo: Any = None) -> RepeatedCompositeContainer: ... + def __delitem__(self, key: int | slice, /) -> None: ... def __eq__(self, other: object, /) -> bool: ... def __ge__(self, other: object, /) -> bool: ... - def __getitem__(self, index, /): ... + def __getitem__(self, index: int | slice, /) -> Any: ... def __gt__(self, other: object, /) -> bool: ... def __le__(self, other: object, /) -> bool: ... def __len__(self) -> int: ... def __lt__(self, other: object, /) -> bool: ... def __ne__(self, other: object, /) -> bool: ... - def __setitem__(self, index, object, /) -> None: ... + def __setitem__(self, index: int | slice, value: Any, /) -> None: ... @final class RepeatedScalarContainer: - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def MergeFrom(self, object, /): ... - def append(self, object, /): ... - def extend(self, object, /): ... - def insert(self, *args, **kwargs): ... # incomplete - def pop(self, *args, **kwargs): ... # incomplete - def remove(self, object, /): ... - def reverse(self): ... - def sort(self, *args, **kwargs): ... # incomplete - def __deepcopy__(self, memo=None): ... - def __delitem__(self, other, /) -> None: ... + def __new__(cls, *args, **kwargs) -> Self: ... + def MergeFrom(self, other: Any, /) -> None: ... + def append(self, value: Any, /) -> None: ... + def extend(self, values: Any, /) -> None: ... + def insert(self, key: int, value: Any, /) -> None: ... + def pop(self, key: int = -1, /) -> Any: ... + def remove(self, value: Any, /) -> None: ... + def reverse(self) -> None: ... + def sort(self, *, key: Any = None, reverse: bool = False) -> None: ... + def clear(self) -> None: ... + def __array__(self, dtype: Any = None, copy: bool | None = None) -> Any: ... + def __deepcopy__(self, memo: Any = None) -> RepeatedScalarContainer: ... + def __delitem__(self, key: int | slice, /) -> None: ... def __eq__(self, other: object, /) -> bool: ... def __ge__(self, other: object, /) -> bool: ... - def __getitem__(self, index, /): ... + def __getitem__(self, index: int | slice, /) -> Any: ... def __gt__(self, other: object, /) -> bool: ... def __le__(self, other: object, /) -> bool: ... def __len__(self) -> int: ... def __lt__(self, other: object, /) -> bool: ... def __ne__(self, other: object, /) -> bool: ... - def __reduce__(self): ... - def __setitem__(self, index, object, /) -> None: ... + def __reduce__(self) -> Any: ... + def __setitem__(self, index: int | slice, value: Any, /) -> None: ... @final class ServiceDescriptor: - file: Incomplete - full_name: Incomplete - index: Incomplete - methods: Incomplete - methods_by_name: Incomplete - name: Incomplete - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def CopyToProto(self, object, /): ... - def FindMethodByName(self, object, /): ... - def GetOptions(self): ... + file: FileDescriptor + full_name: str + has_options: bool + index: int + methods: list[MethodDescriptor] + methods_by_name: dict[str, MethodDescriptor] + name: str + def __new__(cls, *args, **kwargs) -> Self: ... + def CopyToProto(self, proto: Any, /) -> None: ... + def FindMethodByName(self, name: str, /) -> MethodDescriptor: ... + def GetOptions(self) -> ServiceOptions: ... @final class UnknownFieldSet: - def __new__(cls, *args, **kwargs) -> Self: ... # incomplete - def __getitem__(self, index, /): ... + def __new__(cls, *args, **kwargs) -> Self: ... + def __getitem__(self, index: int, /) -> Any: ... def __len__(self) -> int: ... -def SetAllowOversizeProtos(object, /): ... # incomplete +def SetAllowOversizeProtos(allow: bool, /) -> None: ... diff --git a/stubs/protobuf/google/protobuf/any.pyi b/stubs/protobuf/google/protobuf/any.pyi new file mode 100644 index 000000000000..72be6e49e191 --- /dev/null +++ b/stubs/protobuf/google/protobuf/any.pyi @@ -0,0 +1,13 @@ +from typing import TypeVar + +from google.protobuf.any_pb2 import Any +from google.protobuf.descriptor import Descriptor +from google.protobuf.message import Message + +_MessageT = TypeVar("_MessageT", bound=Message) + +def pack(msg: Message, type_url_prefix: str | None = "type.googleapis.com/", deterministic: bool | None = None) -> Any: ... +def unpack(any_msg: Any, msg: Message) -> bool: ... +def unpack_as(any_msg: Any, message_type: type[_MessageT]) -> _MessageT: ... +def type_name(any_msg: Any) -> str: ... +def is_type(any_msg: Any, des: Descriptor) -> bool: ... diff --git a/stubs/protobuf/google/protobuf/descriptor.pyi b/stubs/protobuf/google/protobuf/descriptor.pyi index 10fc7ef906f5..90a13cd2f4d6 100644 --- a/stubs/protobuf/google/protobuf/descriptor.pyi +++ b/stubs/protobuf/google/protobuf/descriptor.pyi @@ -10,27 +10,28 @@ from .descriptor_pb2 import ( OneofOptions, ServiceOptions, ) +from .descriptor_pool import DescriptorPool from .message import Message class Error(Exception): ... class TypeTransformationError(Error): ... class DescriptorMetaclass(type): - def __instancecheck__(self, obj: Any) -> bool: ... + def __instancecheck__(cls, obj: Any) -> bool: ... _internal_create_key: object _USE_C_DESCRIPTORS: bool class DescriptorBase(metaclass=DescriptorMetaclass): - has_options: Any + has_options: bool def __init__(self, file, options, serialized_options, options_class_name) -> None: ... - def GetOptions(self): ... + def GetOptions(self) -> Any: ... class _NestedDescriptorBase(DescriptorBase): - name: Any - full_name: Any - file: Any - containing_type: Any + name: str + full_name: str + file: FileDescriptor + containing_type: Descriptor | None def __init__( self, options, @@ -43,12 +44,14 @@ class _NestedDescriptorBase(DescriptorBase): serialized_end=None, serialized_options=None, ) -> None: ... - def CopyToProto(self, proto): ... + def CopyToProto(self, proto: Any) -> None: ... class Descriptor(_NestedDescriptorBase): fields: Any fields_by_number: Any fields_by_name: Any + @property + def fields_by_camelcase_name(self) -> Any: ... nested_types: Any nested_types_by_name: Any enum_types: Any @@ -56,7 +59,7 @@ class Descriptor(_NestedDescriptorBase): enum_values_by_name: Any extensions: Any extensions_by_name: Any - is_extendable: Any + is_extendable: bool extension_ranges: Any oneofs: Any oneofs_by_name: Any @@ -70,60 +73,60 @@ class Descriptor(_NestedDescriptorBase): nested_types: list[FieldDescriptor], enum_types: list[EnumDescriptor], extensions: list[FieldDescriptor], - options=None, - serialized_options=None, + options: Any = None, + serialized_options: Any = None, is_extendable: bool | None = True, - extension_ranges=None, + extension_ranges: Any = None, oneofs: list[OneofDescriptor] | None = None, file: FileDescriptor | None = None, - serialized_start=None, - serialized_end=None, + serialized_start: Any = None, + serialized_end: Any = None, syntax: str | None = None, - is_map_entry=False, - create_key=None, + is_map_entry: bool = False, + create_key: Any = None, ): ... - def EnumValueName(self, enum, value): ... - def CopyToProto(self, proto): ... + def EnumValueName(self, enum: str, value: int) -> str: ... + def CopyToProto(self, proto: Any) -> None: ... def GetOptions(self) -> MessageOptions: ... class FieldDescriptor(DescriptorBase): - TYPE_DOUBLE: Any - TYPE_FLOAT: Any - TYPE_INT64: Any - TYPE_UINT64: Any - TYPE_INT32: Any - TYPE_FIXED64: Any - TYPE_FIXED32: Any - TYPE_BOOL: Any - TYPE_STRING: Any - TYPE_GROUP: Any - TYPE_MESSAGE: Any - TYPE_BYTES: Any - TYPE_UINT32: Any - TYPE_ENUM: Any - TYPE_SFIXED32: Any - TYPE_SFIXED64: Any - TYPE_SINT32: Any - TYPE_SINT64: Any - MAX_TYPE: Any - CPPTYPE_INT32: Any - CPPTYPE_INT64: Any - CPPTYPE_UINT32: Any - CPPTYPE_UINT64: Any - CPPTYPE_DOUBLE: Any - CPPTYPE_FLOAT: Any - CPPTYPE_BOOL: Any - CPPTYPE_ENUM: Any - CPPTYPE_STRING: Any - CPPTYPE_MESSAGE: Any - MAX_CPPTYPE: Any - LABEL_OPTIONAL: Any - LABEL_REQUIRED: Any - LABEL_REPEATED: Any - MAX_LABEL: Any - MAX_FIELD_NUMBER: Any - FIRST_RESERVED_FIELD_NUMBER: Any - LAST_RESERVED_FIELD_NUMBER: Any + TYPE_DOUBLE: int + TYPE_FLOAT: int + TYPE_INT64: int + TYPE_UINT64: int + TYPE_INT32: int + TYPE_FIXED64: int + TYPE_FIXED32: int + TYPE_BOOL: int + TYPE_STRING: int + TYPE_GROUP: int + TYPE_MESSAGE: int + TYPE_BYTES: int + TYPE_UINT32: int + TYPE_ENUM: int + TYPE_SFIXED32: int + TYPE_SFIXED64: int + TYPE_SINT32: int + TYPE_SINT64: int + MAX_TYPE: int + CPPTYPE_INT32: int + CPPTYPE_INT64: int + CPPTYPE_UINT32: int + CPPTYPE_UINT64: int + CPPTYPE_DOUBLE: int + CPPTYPE_FLOAT: int + CPPTYPE_BOOL: int + CPPTYPE_ENUM: int + CPPTYPE_STRING: int + CPPTYPE_MESSAGE: int + MAX_CPPTYPE: int + LABEL_OPTIONAL: int + LABEL_REQUIRED: int + LABEL_REPEATED: int + MAX_LABEL: int + MAX_FIELD_NUMBER: int + FIRST_RESERVED_FIELD_NUMBER: int + LAST_RESERVED_FIELD_NUMBER: int def __new__( cls, name, @@ -147,14 +150,12 @@ class FieldDescriptor(DescriptorBase): file=None, create_key=None, ): ... - name: Any - full_name: Any - index: Any - number: Any - type: Any - cpp_type: Any - @property - def label(self): ... + name: str + full_name: str + index: int + number: int + type: int + cpp_type: int @property def is_required(self) -> bool: ... @property @@ -165,14 +166,15 @@ class FieldDescriptor(DescriptorBase): def has_presence(self) -> bool: ... @property def is_packed(self) -> bool: ... - has_default_value: Any + has_default_value: bool default_value: Any - containing_type: Any - message_type: Any - enum_type: Any - is_extension: Any - extension_scope: Any - containing_oneof: Any + containing_type: Descriptor | None + message_type: Descriptor | None + enum_type: EnumDescriptor | None + is_extension: bool + extension_scope: Descriptor | None + containing_oneof: OneofDescriptor | None + json_name: str def __init__( self, name, @@ -197,7 +199,7 @@ class FieldDescriptor(DescriptorBase): create_key=None, ) -> None: ... @staticmethod - def ProtoTypeToCppProtoType(proto_type): ... + def ProtoTypeToCppProtoType(proto_type: int) -> int: ... def GetOptions(self) -> FieldOptions: ... class EnumDescriptor(_NestedDescriptorBase): @@ -232,34 +234,36 @@ class EnumDescriptor(_NestedDescriptorBase): serialized_end=None, create_key=None, ) -> None: ... - def CopyToProto(self, proto): ... + @property + def is_closed(self) -> bool: ... + def CopyToProto(self, proto: Any) -> None: ... def GetOptions(self) -> EnumOptions: ... class EnumValueDescriptor(DescriptorBase): def __new__(cls, name, index, number, type=None, options=None, serialized_options=None, create_key=None): ... - name: Any - index: Any - number: Any - type: Any + name: str + index: int + number: int + type: EnumDescriptor def __init__(self, name, index, number, type=None, options=None, serialized_options=None, create_key=None) -> None: ... def GetOptions(self) -> EnumValueOptions: ... -class OneofDescriptor: +class OneofDescriptor(DescriptorBase): def __new__(cls, name, full_name, index, containing_type, fields, options=None, serialized_options=None, create_key=None): ... - name: Any - full_name: Any - index: Any - containing_type: Any - fields: Any + name: str + full_name: str + index: int + containing_type: Descriptor + fields: list[FieldDescriptor] def __init__( self, name, full_name, index, containing_type, fields, options=None, serialized_options=None, create_key=None ) -> None: ... def GetOptions(self) -> OneofOptions: ... class ServiceDescriptor(_NestedDescriptorBase): - index: Any - methods: Any - methods_by_name: Any + index: int + methods: list[MethodDescriptor] + methods_by_name: dict[str, MethodDescriptor] def __init__( self, name: str, @@ -267,14 +271,14 @@ class ServiceDescriptor(_NestedDescriptorBase): index: int, methods: list[MethodDescriptor], options: ServiceOptions | None = None, - serialized_options=None, + serialized_options: Any = None, file: FileDescriptor | None = None, - serialized_start=None, - serialized_end=None, - create_key=None, + serialized_start: Any = None, + serialized_end: Any = None, + create_key: Any = None, ): ... - def FindMethodByName(self, name): ... - def CopyToProto(self, proto): ... + def FindMethodByName(self, name: str) -> MethodDescriptor: ... + def CopyToProto(self, proto: Any) -> None: ... def GetOptions(self) -> ServiceOptions: ... class MethodDescriptor(DescriptorBase): @@ -292,12 +296,12 @@ class MethodDescriptor(DescriptorBase): serialized_options=None, create_key=None, ): ... - name: Any - full_name: Any - index: Any - containing_service: Any - input_type: Any - output_type: Any + name: str + full_name: str + index: int + containing_service: ServiceDescriptor + input_type: Descriptor + output_type: Descriptor client_streaming: bool server_streaming: bool def __init__( @@ -314,6 +318,7 @@ class MethodDescriptor(DescriptorBase): serialized_options=None, create_key=None, ) -> None: ... + def CopyToProto(self, proto: Any) -> None: ... def GetOptions(self) -> MethodOptions: ... class FileDescriptor(DescriptorBase): @@ -332,16 +337,16 @@ class FileDescriptor(DescriptorBase): create_key=None, ): ... _options: Any - pool: Any - message_types_by_name: Any - name: Any - package: Any - serialized_pb: Any - enum_types_by_name: Any - extensions_by_name: Any - services_by_name: Any - dependencies: Any - public_dependencies: Any + pool: DescriptorPool + message_types_by_name: dict[str, Descriptor] + name: str + package: str + serialized_pb: bytes + enum_types_by_name: dict[str, EnumDescriptor] + extensions_by_name: dict[str, FieldDescriptor] + services_by_name: dict[str, ServiceDescriptor] + dependencies: list[FileDescriptor] + public_dependencies: list[FileDescriptor] def __init__( self, name, @@ -356,8 +361,15 @@ class FileDescriptor(DescriptorBase): pool=None, create_key=None, ) -> None: ... - def CopyToProto(self, proto): ... + def CopyToProto(self, proto: Any) -> None: ... def GetOptions(self) -> FileOptions: ... -def MakeDescriptor(desc_proto, package="", build_file_if_cpp=True, syntax=None, edition=None, file_desc=None): ... def _ParseOptions(message: Message, string: bytes) -> Message: ... +def MakeDescriptor( + desc_proto: Any, + package: str = "", + build_file_if_cpp: bool = True, + syntax: str | None = None, + edition: str | None = None, + file_desc: FileDescriptor | None = None, +) -> Descriptor: ... diff --git a/stubs/protobuf/google/protobuf/descriptor_database.pyi b/stubs/protobuf/google/protobuf/descriptor_database.pyi index 6568fc2159cc..8f0b1927b502 100644 --- a/stubs/protobuf/google/protobuf/descriptor_database.pyi +++ b/stubs/protobuf/google/protobuf/descriptor_database.pyi @@ -9,8 +9,8 @@ class DescriptorDatabaseConflictingDefinitionError(Error): ... class DescriptorDatabase: def __init__(self) -> None: ... - def Add(self, file_desc_proto) -> None: ... - def FindFileByName(self, name): ... - def FindFileContainingSymbol(self, symbol): ... - def FindFileContainingExtension(self, extendee_name, extension_number) -> FileDescriptorProto | None: ... - def FindAllExtensionNumbers(self, extendee_name) -> list[int]: ... + def Add(self, file_desc_proto: FileDescriptorProto) -> None: ... + def FindFileByName(self, name: str) -> FileDescriptorProto: ... + def FindFileContainingSymbol(self, symbol: str) -> FileDescriptorProto: ... + def FindFileContainingExtension(self, extendee_name: str, extension_number: int) -> FileDescriptorProto | None: ... + def FindAllExtensionNumbers(self, extendee_name: str) -> list[int]: ... diff --git a/stubs/protobuf/google/protobuf/descriptor_pool.pyi b/stubs/protobuf/google/protobuf/descriptor_pool.pyi index bb1d19004e84..59767efd7817 100644 --- a/stubs/protobuf/google/protobuf/descriptor_pool.pyi +++ b/stubs/protobuf/google/protobuf/descriptor_pool.pyi @@ -1,22 +1,36 @@ from _typeshed import Unused +from typing import Any +from typing_extensions import Self + +from .descriptor import ( + Descriptor, + EnumDescriptor, + FieldDescriptor, + FileDescriptor, + MethodDescriptor, + OneofDescriptor, + ServiceDescriptor, +) +from .descriptor_pb2 import FeatureSetDefaults, FileDescriptorProto class DescriptorPool: - def __new__(cls, descriptor_db=None): ... + def __new__(cls, descriptor_db: Any = None) -> Self: ... def __init__( # pyright: ignore[reportInconsistentConstructor] - self, descriptor_db=None, use_deprecated_legacy_json_field_conflicts: Unused = False + self, descriptor_db: Any = None, use_deprecated_legacy_json_field_conflicts: Unused = False ) -> None: ... - def Add(self, file_desc_proto): ... - def AddSerializedFile(self, serialized_file_desc_proto): ... - def FindFileByName(self, file_name): ... - def FindFileContainingSymbol(self, symbol): ... - def FindMessageTypeByName(self, full_name): ... - def FindEnumTypeByName(self, full_name): ... - def FindFieldByName(self, full_name): ... - def FindOneofByName(self, full_name): ... - def FindExtensionByName(self, full_name): ... - def FindExtensionByNumber(self, message_descriptor, number): ... - def FindAllExtensions(self, message_descriptor): ... - def FindServiceByName(self, full_name): ... - def FindMethodByName(self, full_name): ... + def Add(self, file_desc_proto: FileDescriptorProto) -> None: ... + def AddSerializedFile(self, serialized_file_desc_proto: bytes) -> FileDescriptor: ... + def FindFileByName(self, file_name: str) -> FileDescriptor: ... + def FindFileContainingSymbol(self, symbol: str) -> FileDescriptor: ... + def FindMessageTypeByName(self, full_name: str) -> Descriptor: ... + def FindEnumTypeByName(self, full_name: str) -> EnumDescriptor: ... + def FindFieldByName(self, full_name: str) -> FieldDescriptor: ... + def FindOneofByName(self, full_name: str) -> OneofDescriptor: ... + def FindExtensionByName(self, full_name: str) -> FieldDescriptor: ... + def FindExtensionByNumber(self, message_descriptor: Descriptor, number: int) -> FieldDescriptor: ... + def FindAllExtensions(self, message_descriptor: Descriptor) -> list[FieldDescriptor]: ... + def FindServiceByName(self, full_name: str) -> ServiceDescriptor: ... + def FindMethodByName(self, full_name: str) -> MethodDescriptor: ... + def SetFeatureSetDefaults(self, defaults: FeatureSetDefaults) -> None: ... -def Default(): ... +def Default() -> DescriptorPool: ... diff --git a/stubs/protobuf/google/protobuf/duration.pyi b/stubs/protobuf/google/protobuf/duration.pyi new file mode 100644 index 000000000000..c7e858fedbf3 --- /dev/null +++ b/stubs/protobuf/google/protobuf/duration.pyi @@ -0,0 +1,16 @@ +from datetime import timedelta + +from google.protobuf.duration_pb2 import Duration + +def from_json_string(value: str) -> Duration: ... +def from_microseconds(micros: float) -> Duration: ... +def from_milliseconds(millis: float) -> Duration: ... +def from_nanoseconds(nanos: float) -> Duration: ... +def from_seconds(seconds: float) -> Duration: ... +def from_timedelta(td: timedelta) -> Duration: ... +def to_json_string(duration: Duration) -> str: ... +def to_microseconds(duration: Duration) -> int: ... +def to_milliseconds(duration: Duration) -> int: ... +def to_nanoseconds(duration: Duration) -> int: ... +def to_seconds(duration: Duration) -> int: ... +def to_timedelta(duration: Duration) -> timedelta: ... diff --git a/stubs/protobuf/google/protobuf/internal/builder.pyi b/stubs/protobuf/google/protobuf/internal/builder.pyi index 0491b8e54357..a183f4c16d13 100644 --- a/stubs/protobuf/google/protobuf/internal/builder.pyi +++ b/stubs/protobuf/google/protobuf/internal/builder.pyi @@ -1,4 +1,9 @@ +from types import ModuleType from typing import Any -def BuildMessageAndEnumDescriptors(file_des, module: dict[str, Any]) -> None: ... -def BuildTopDescriptorsAndMessages(file_des, module_name: str, module: dict[str, Any]) -> None: ... +from google.protobuf.descriptor import FileDescriptor + +def BuildMessageAndEnumDescriptors(file_des: FileDescriptor, module: dict[str, Any]) -> None: ... +def BuildTopDescriptorsAndMessages(file_des: FileDescriptor, module_name: str, module: dict[str, Any]) -> None: ... +def AddHelpersToExtensions(file_des: FileDescriptor) -> None: ... +def BuildServices(file_des: FileDescriptor, module_name: str, module: ModuleType) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/containers.pyi b/stubs/protobuf/google/protobuf/internal/containers.pyi index 6fa55546e9ae..02a367c8b3b2 100644 --- a/stubs/protobuf/google/protobuf/internal/containers.pyi +++ b/stubs/protobuf/google/protobuf/internal/containers.pyi @@ -1,8 +1,7 @@ from collections.abc import Callable, Iterable, Iterator, MutableMapping, MutableSequence, Sequence from typing import Any, Protocol, SupportsIndex, TypeVar, overload, type_check_only -from typing_extensions import Self -from google.protobuf.descriptor import Descriptor +from google.protobuf.descriptor import Descriptor, FieldDescriptor from google.protobuf.internal.message_listener import MessageListener from google.protobuf.internal.python_message import GeneratedProtocolMessageType from google.protobuf.message import Message @@ -20,24 +19,26 @@ class _ValueChecker(Protocol[_T]): class BaseContainer(Sequence[_T]): __slots__ = ["_message_listener", "_values"] def __init__(self, message_listener: MessageListener) -> None: ... + @overload + def __getitem__(self, key: SupportsIndex) -> _T: ... + @overload + def __getitem__(self, key: slice) -> list[_T]: ... def __len__(self) -> int: ... def __ne__(self, other: object) -> bool: ... def __hash__(self) -> int: ... # Same as list.sort, the extra sort_function kwarg errors in Python 3 def sort(self, *, key: Callable[[_T], Any] | None = None, reverse: bool = False) -> None: ... def reverse(self) -> None: ... - @overload - def __getitem__(self, key: SupportsIndex) -> _T: ... - @overload - def __getitem__(self, key: slice) -> list[_T]: ... class RepeatedScalarFieldContainer(BaseContainer[_ScalarV], MutableSequence[_ScalarV]): __slots__ = ["_type_checker"] - def __init__(self, message_listener: MessageListener, type_checker: _ValueChecker[_ScalarV]) -> None: ... + def __init__( + self, message_listener: MessageListener, type_checker: _ValueChecker[_ScalarV], field: FieldDescriptor | None = None + ) -> None: ... def append(self, value: _ScalarV) -> None: ... def insert(self, key: int, value: _ScalarV) -> None: ... def extend(self, elem_seq: Iterable[_ScalarV] | None) -> None: ... - def MergeFrom(self, other: Self | Iterable[_ScalarV]) -> None: ... + def MergeFrom(self, other: RepeatedScalarFieldContainer[_ScalarV] | Iterable[_ScalarV]) -> None: ... def remove(self, elem: _ScalarV) -> None: ... def pop(self, key: int = -1) -> _ScalarV: ... @overload @@ -46,6 +47,8 @@ class RepeatedScalarFieldContainer(BaseContainer[_ScalarV], MutableSequence[_Sca def __setitem__(self, key: slice, value: Iterable[_ScalarV]) -> None: ... def __delitem__(self, key: int | slice) -> None: ... def __eq__(self, other: object) -> bool: ... + def __deepcopy__(self, unused_memo: Any = None) -> RepeatedScalarFieldContainer[_ScalarV]: ... + def __array__(self, dtype: Any = None, copy: bool | None = None) -> Any: ... class RepeatedCompositeFieldContainer(BaseContainer[_MessageV], MutableSequence[_MessageV]): __slots__ = ["_message_descriptor"] @@ -54,7 +57,7 @@ class RepeatedCompositeFieldContainer(BaseContainer[_MessageV], MutableSequence[ def append(self, value: _MessageV) -> None: ... def insert(self, key: int, value: _MessageV) -> None: ... def extend(self, elem_seq: Iterable[_MessageV]) -> None: ... - def MergeFrom(self, other: Self | Iterable[_MessageV]) -> None: ... + def MergeFrom(self, other: RepeatedCompositeFieldContainer[_MessageV] | Iterable[_MessageV]) -> None: ... def remove(self, elem: _MessageV) -> None: ... def pop(self, key: int = -1) -> _MessageV: ... @overload @@ -73,21 +76,22 @@ class ScalarMap(MutableMapping[_K, _ScalarV]): value_checker: _ValueChecker[_ScalarV], 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: ... + def __getitem__(self, key: _K) -> _ScalarV: ... @overload def get(self, key: _K, default: None = None) -> _ScalarV | None: ... @overload def get(self, key: _K, default: _ScalarV) -> _ScalarV: ... @overload def get(self, key: _K, default: _T) -> _ScalarV | _T: ... + def __setitem__(self, key: _K, value: _ScalarV) -> None: ... + def __delitem__(self, key: _K) -> None: ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[_K]: ... + def __eq__(self, other: object) -> bool: ... def setdefault(self, key: _K, value: _ScalarV | None = None) -> _ScalarV: ... - def MergeFrom(self, other: Self): ... + def MergeFrom(self, other: ScalarMap[_K, _ScalarV]) -> None: ... def InvalidateIterators(self) -> None: ... + def clear(self) -> None: ... def GetEntryClass(self) -> GeneratedProtocolMessageType: ... class MessageMap(MutableMapping[_K, _MessageV]): @@ -99,20 +103,37 @@ class MessageMap(MutableMapping[_K, _MessageV]): key_checker: _ValueChecker[_K], 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: ... + def __getitem__(self, key: _K) -> _MessageV: ... + def get_or_create(self, key: _K) -> _MessageV: ... @overload def get(self, key: _K, default: None = None) -> _MessageV | None: ... @overload def get(self, key: _K, default: _MessageV) -> _MessageV: ... @overload def get(self, key: _K, default: _T) -> _MessageV | _T: ... - def get_or_create(self, key: _K) -> _MessageV: ... + def __setitem__(self, key: _K, value: _MessageV) -> None: ... + def __delitem__(self, key: _K) -> None: ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[_K]: ... + def __eq__(self, other: object) -> bool: ... def setdefault(self, key: _K, value: _MessageV | None = None) -> _MessageV: ... - def MergeFrom(self, other: Self): ... + def MergeFrom(self, other: MessageMap[_K, _MessageV]) -> None: ... def InvalidateIterators(self) -> None: ... + def clear(self) -> None: ... def GetEntryClass(self) -> GeneratedProtocolMessageType: ... + +class UnknownFieldRef: + def __init__(self, parent: UnknownFieldSet, index: int) -> None: ... + @property + def field_number(self) -> int: ... + @property + def wire_type(self) -> int: ... + @property + def data(self) -> Any: ... + +class UnknownFieldSet: + __slots__ = ["_values"] + def __init__(self) -> None: ... + def __getitem__(self, index: int) -> UnknownFieldRef: ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[UnknownFieldRef]: ... diff --git a/stubs/protobuf/google/protobuf/internal/decoder.pyi b/stubs/protobuf/google/protobuf/internal/decoder.pyi index 94ed7f615360..3c052bad665a 100644 --- a/stubs/protobuf/google/protobuf/internal/decoder.pyi +++ b/stubs/protobuf/google/protobuf/internal/decoder.pyi @@ -8,7 +8,17 @@ from google.protobuf.message import Message _Decoder: TypeAlias = Callable[[str, int, int, Message, dict[FieldDescriptor, Any]], int] _NewDefault: TypeAlias = Callable[[Message], Message] -def ReadTag(buffer, pos): ... +def IsDefaultScalarValue(value: Any) -> bool: ... +def ReadTag(buffer: bytes, pos: int) -> tuple[bytes, int]: ... +def DecodeTag(tag_bytes: bytes) -> tuple[int, int]: ... +def EnumDecoder( + field_number: int, + is_repeated: bool, + is_packed: bool, + key: FieldDescriptor, + new_default: _NewDefault, + clear_if_default: bool = False, +) -> _Decoder: ... Int32Decoder: _Decoder Int64Decoder: _Decoder @@ -24,14 +34,6 @@ 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 = False, -) -> _Decoder: ... def StringDecoder( field_number: int, is_repeated: bool, @@ -58,4 +60,9 @@ def MessageDecoder( MESSAGE_SET_ITEM_TAG: bytes def MessageSetItemDecoder(descriptor: Descriptor) -> _Decoder: ... -def MapDecoder(field_descriptor, new_default, is_message_map) -> _Decoder: ... +def UnknownMessageSetItemDecoder() -> _Decoder: ... +def MapDecoder(field_descriptor: FieldDescriptor, new_default: _NewDefault, is_message_map: bool) -> _Decoder: ... + +DEFAULT_RECURSION_LIMIT: int + +def SetRecursionLimit(new_limit: int) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi index ca207f214950..6573a8262a81 100644 --- a/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi +++ b/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi @@ -19,4 +19,5 @@ class _EnumTypeWrapper(type, Generic[_V]): def values(self) -> list[_V]: ... def items(self) -> list[tuple[str, _V]]: ... -class EnumTypeWrapper(_EnumTypeWrapper[int]): ... +class EnumTypeWrapper(_EnumTypeWrapper[int]): + ValueType = int diff --git a/stubs/protobuf/google/protobuf/internal/extension_dict.pyi b/stubs/protobuf/google/protobuf/internal/extension_dict.pyi index 3071e4aa2ade..f2a4c1290a8e 100644 --- a/stubs/protobuf/google/protobuf/internal/extension_dict.pyi +++ b/stubs/protobuf/google/protobuf/internal/extension_dict.pyi @@ -19,10 +19,10 @@ class _ExtensionDict(Generic[_ContainerMessageT]): def __getitem__( self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT] ) -> _ExtenderMessageT: ... + def __len__(self) -> int: ... def __setitem__( self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT], value: _ExtenderMessageT ) -> None: ... def __delitem__(self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT]) -> None: ... - def __contains__(self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT]) -> bool: ... def __iter__(self) -> Iterator[_ExtensionFieldDescriptor[_ContainerMessageT, Any]]: ... - def __len__(self) -> int: ... + def __contains__(self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT]) -> bool: ... diff --git a/stubs/protobuf/google/protobuf/internal/field_mask.pyi b/stubs/protobuf/google/protobuf/internal/field_mask.pyi new file mode 100644 index 000000000000..290c0bfd5c60 --- /dev/null +++ b/stubs/protobuf/google/protobuf/internal/field_mask.pyi @@ -0,0 +1,15 @@ +from typing import Any + +from google.protobuf.descriptor import FieldDescriptor as FieldDescriptor + +class FieldMask: + def ToJsonString(self) -> str: ... + def FromJsonString(self, value: Any) -> None: ... + def IsValidForDescriptor(self, message_descriptor: Any) -> bool: ... + def AllFieldsFromDescriptor(self, message_descriptor: Any) -> None: ... + def CanonicalFormFromMask(self, mask: Any) -> None: ... + def Union(self, mask1: Any, mask2: Any) -> None: ... + def Intersect(self, mask1: Any, mask2: Any) -> None: ... + def MergeMessage( + self, source: Any, destination: Any, replace_message_field: bool = False, replace_repeated_field: bool = False + ) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/message_listener.pyi b/stubs/protobuf/google/protobuf/internal/message_listener.pyi index 01c3be010c38..c1c9d3632b4f 100644 --- a/stubs/protobuf/google/protobuf/internal/message_listener.pyi +++ b/stubs/protobuf/google/protobuf/internal/message_listener.pyi @@ -1,5 +1,5 @@ class MessageListener: def Modified(self) -> None: ... -class NullMessageListener(MessageListener): +class NullMessageListener: def Modified(self) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/python_edition_defaults.pyi b/stubs/protobuf/google/protobuf/internal/python_edition_defaults.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/protobuf/google/protobuf/internal/python_message.pyi b/stubs/protobuf/google/protobuf/internal/python_message.pyi index 0395ff64707c..2b37dda98989 100644 --- a/stubs/protobuf/google/protobuf/internal/python_message.pyi +++ b/stubs/protobuf/google/protobuf/internal/python_message.pyi @@ -1,3 +1,5 @@ +from typing import Any + class GeneratedProtocolMessageType(type): - def __new__(cls, name, bases, dictionary): ... - def __init__(cls, name, bases, dictionary): ... + def __new__(cls, name: str, bases: tuple[type, ...], dictionary: dict[str, Any]) -> GeneratedProtocolMessageType: ... + def __init__(cls, name: str, bases: tuple[type, ...], dictionary: dict[str, Any]) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/testing_refleaks.pyi b/stubs/protobuf/google/protobuf/internal/testing_refleaks.pyi new file mode 100644 index 000000000000..75f37f63dd32 --- /dev/null +++ b/stubs/protobuf/google/protobuf/internal/testing_refleaks.pyi @@ -0,0 +1,20 @@ +from collections.abc import Callable +from typing import Any, TypeVar +from unittest import TestResult + +_T = TypeVar("_T") + +class LocalTestResult(TestResult): + parent_result: TestResult + def __init__(self, parent_result: TestResult) -> None: ... + def addError(self, test: Any, error: Any) -> None: ... + def addFailure(self, test: Any, error: Any) -> None: ... + def addSkip(self, test: Any, reason: str) -> None: ... + def addDuration(self, test: Any, duration: float) -> None: ... + +class ReferenceLeakCheckerMixin: + NB_RUNS: int + def run(self, result: TestResult | None = None) -> TestResult: ... + +def SkipReferenceLeakChecker(reason: str) -> Callable[[_T], _T]: ... +def TestCase(test_class: _T) -> _T: ... diff --git a/stubs/protobuf/google/protobuf/internal/type_checkers.pyi b/stubs/protobuf/google/protobuf/internal/type_checkers.pyi index e050e9558738..41e21f1ff6e2 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 Generic, TypeVar +from typing import Any, Generic, TypeVar + +from google.protobuf.descriptor import EnumDescriptor, FieldDescriptor _T = TypeVar("_T") +def TruncateToFourByteFloat(original: float) -> float: ... +def ToShortestFloat(original: float) -> float: ... +def GetTypeChecker( + field: FieldDescriptor, +) -> TypeChecker[Any] | IntValueChecker | EnumValueChecker | UnicodeValueChecker | DoubleValueChecker | BoolValueChecker: ... + class TypeChecker(Generic[_T]): def __init__(self, *acceptable_types: _T): ... def CheckValue(self, proposed_value: _T) -> _T: ... @@ -9,3 +17,38 @@ class TypeChecker(Generic[_T]): class TypeCheckerWithDefault(TypeChecker[_T]): def __init__(self, default_value: _T, *acceptable_types: _T): ... def DefaultValue(self) -> _T: ... + +class BoolValueChecker: + def CheckValue(self, proposed_value: bool) -> bool: ... + def DefaultValue(self) -> bool: ... + +class IntValueChecker: + def CheckValue(self, proposed_value: int) -> int: ... + def DefaultValue(self) -> int: ... + +class EnumValueChecker: + def __init__(self, enum_type: EnumDescriptor) -> None: ... + def CheckValue(self, proposed_value: int) -> int: ... + def DefaultValue(self) -> int: ... + +class UnicodeValueChecker: + def CheckValue(self, proposed_value: str) -> str: ... + def DefaultValue(self) -> str: ... + +class Int32ValueChecker(IntValueChecker): ... +class Uint32ValueChecker(IntValueChecker): ... +class Int64ValueChecker(IntValueChecker): ... +class Uint64ValueChecker(IntValueChecker): ... + +class DoubleValueChecker: + def CheckValue(self, proposed_value: float) -> float: ... + def DefaultValue(self) -> float: ... + +class FloatValueChecker(DoubleValueChecker): + def CheckValue(self, proposed_value: float) -> float: ... + +TYPE_TO_BYTE_SIZE_FN: dict[int, Any] +TYPE_TO_ENCODER: dict[int, Any] +TYPE_TO_SIZER: dict[int, Any] +TYPE_TO_DECODER: dict[int, Any] +FIELD_TYPE_TO_WIRE_TYPE: dict[int, int] diff --git a/stubs/protobuf/google/protobuf/internal/well_known_types.pyi b/stubs/protobuf/google/protobuf/internal/well_known_types.pyi index 6527d3f6978e..4954320799be 100644 --- a/stubs/protobuf/google/protobuf/internal/well_known_types.pyi +++ b/stubs/protobuf/google/protobuf/internal/well_known_types.pyi @@ -1,19 +1,21 @@ -from _typeshed import Incomplete, SupportsItems +from _typeshed import SupportsItems from collections.abc import Iterable, Iterator, KeysView, Mapping, Sequence from datetime import datetime, timedelta, tzinfo from typing import Any as tAny from typing_extensions import TypeAlias from google.protobuf import struct_pb2 +from google.protobuf.descriptor import Descriptor +from google.protobuf.message import Message as _Message class Any: __slots__ = () type_url: str - value: Incomplete - def Pack(self, msg, type_url_prefix: str = "type.googleapis.com/", deterministic=None) -> None: ... - def Unpack(self, msg) -> bool: ... + value: bytes + def Pack(self, msg: _Message, type_url_prefix: str = "type.googleapis.com/", deterministic: bool | None = None) -> None: ... + def Unpack(self, msg: _Message) -> bool: ... def TypeName(self) -> str: ... - def Is(self, descriptor) -> bool: ... + def Is(self, descriptor: Descriptor) -> bool: ... class Timestamp: __slots__ = () @@ -32,6 +34,10 @@ class Timestamp: def FromSeconds(self, seconds: int) -> None: ... def ToDatetime(self, tzinfo: tzinfo | None = None) -> datetime: ... def FromDatetime(self, dt: datetime) -> None: ... + def __add__(self, value: tAny) -> datetime: ... + def __radd__(self, value: tAny) -> datetime: ... + def __sub__(self, value: tAny) -> datetime | timedelta: ... + def __rsub__(self, dt: tAny) -> timedelta: ... class Duration: __slots__ = () @@ -49,12 +55,16 @@ class Duration: def FromSeconds(self, seconds: int) -> None: ... def ToTimedelta(self) -> timedelta: ... def FromTimedelta(self, td: timedelta) -> None: ... + def __add__(self, value: tAny) -> datetime | timedelta: ... + def __radd__(self, value: tAny) -> datetime | timedelta: ... + def __sub__(self, value: tAny) -> timedelta: ... + def __rsub__(self, value: tAny) -> datetime | timedelta: ... class FieldMask: __slots__ = () def ToJsonString(self) -> str: ... def FromJsonString(self, value: tAny) -> None: ... - def IsValidForDescriptor(self, message_descriptor: tAny): ... + def IsValidForDescriptor(self, message_descriptor: tAny) -> bool: ... def AllFieldsFromDescriptor(self, message_descriptor: tAny) -> None: ... def CanonicalFormFromMask(self, mask: tAny) -> None: ... def Union(self, mask1: tAny, mask2: tAny) -> None: ... diff --git a/stubs/protobuf/google/protobuf/internal/wire_format.pyi b/stubs/protobuf/google/protobuf/internal/wire_format.pyi index 3dcbd04324ed..0d4aa04031ec 100644 --- a/stubs/protobuf/google/protobuf/internal/wire_format.pyi +++ b/stubs/protobuf/google/protobuf/internal/wire_format.pyi @@ -1,50 +1,50 @@ -from typing import Any +from google.protobuf.message import Message -TAG_TYPE_BITS: Any -TAG_TYPE_MASK: Any -WIRETYPE_VARINT: Any -WIRETYPE_FIXED64: Any -WIRETYPE_LENGTH_DELIMITED: Any -WIRETYPE_START_GROUP: Any -WIRETYPE_END_GROUP: Any -WIRETYPE_FIXED32: Any -INT32_MAX: Any -INT32_MIN: Any -UINT32_MAX: Any -INT64_MAX: Any -INT64_MIN: Any -UINT64_MAX: Any -FORMAT_UINT32_LITTLE_ENDIAN: Any -FORMAT_UINT64_LITTLE_ENDIAN: Any -FORMAT_FLOAT_LITTLE_ENDIAN: Any -FORMAT_DOUBLE_LITTLE_ENDIAN: Any +TAG_TYPE_BITS: int +TAG_TYPE_MASK: int +WIRETYPE_VARINT: int +WIRETYPE_FIXED64: int +WIRETYPE_LENGTH_DELIMITED: int +WIRETYPE_START_GROUP: int +WIRETYPE_END_GROUP: int +WIRETYPE_FIXED32: int +INT32_MAX: int +INT32_MIN: int +UINT32_MAX: int +INT64_MAX: int +INT64_MIN: int +UINT64_MAX: int +FORMAT_UINT32_LITTLE_ENDIAN: str +FORMAT_UINT64_LITTLE_ENDIAN: str +FORMAT_FLOAT_LITTLE_ENDIAN: str +FORMAT_DOUBLE_LITTLE_ENDIAN: str -def PackTag(field_number, wire_type): ... -def UnpackTag(tag): ... -def ZigZagEncode(value): ... -def ZigZagDecode(value): ... -def Int32ByteSize(field_number, int32): ... -def Int32ByteSizeNoTag(int32): ... -def Int64ByteSize(field_number, int64): ... -def UInt32ByteSize(field_number, uint32): ... -def UInt64ByteSize(field_number, uint64): ... -def SInt32ByteSize(field_number, int32): ... -def SInt64ByteSize(field_number, int64): ... -def Fixed32ByteSize(field_number, fixed32): ... -def Fixed64ByteSize(field_number, fixed64): ... -def SFixed32ByteSize(field_number, sfixed32): ... -def SFixed64ByteSize(field_number, sfixed64): ... -def FloatByteSize(field_number, flt): ... -def DoubleByteSize(field_number, double): ... -def BoolByteSize(field_number, b): ... -def EnumByteSize(field_number, enum): ... -def StringByteSize(field_number, string): ... -def BytesByteSize(field_number, b): ... -def GroupByteSize(field_number, message): ... -def MessageByteSize(field_number, message): ... -def MessageSetItemByteSize(field_number, msg): ... -def TagByteSize(field_number): ... +def PackTag(field_number: int, wire_type: int) -> int: ... +def UnpackTag(tag: int) -> tuple[int, int]: ... +def ZigZagEncode(value: int) -> int: ... +def ZigZagDecode(value: int) -> int: ... +def Int32ByteSize(field_number: int, int32: int) -> int: ... +def Int32ByteSizeNoTag(int32: int) -> int: ... +def Int64ByteSize(field_number: int, int64: int) -> int: ... +def UInt32ByteSize(field_number: int, uint32: int) -> int: ... +def UInt64ByteSize(field_number: int, uint64: int) -> int: ... +def SInt32ByteSize(field_number: int, int32: int) -> int: ... +def SInt64ByteSize(field_number: int, int64: int) -> int: ... +def Fixed32ByteSize(field_number: int, fixed32: int) -> int: ... +def Fixed64ByteSize(field_number: int, fixed64: int) -> int: ... +def SFixed32ByteSize(field_number: int, sfixed32: int) -> int: ... +def SFixed64ByteSize(field_number: int, sfixed64: int) -> int: ... +def FloatByteSize(field_number: int, flt: float) -> int: ... +def DoubleByteSize(field_number: int, double: float) -> int: ... +def BoolByteSize(field_number: int, b: bool) -> int: ... +def EnumByteSize(field_number: int, enum: int) -> int: ... +def StringByteSize(field_number: int, string: str) -> int: ... +def BytesByteSize(field_number: int, b: bytes) -> int: ... +def GroupByteSize(field_number: int, message: Message) -> int: ... +def MessageByteSize(field_number: int, message: Message) -> int: ... +def MessageSetItemByteSize(field_number: int, msg: Message) -> int: ... +def TagByteSize(field_number: int) -> int: ... -NON_PACKABLE_TYPES: Any +NON_PACKABLE_TYPES: tuple[int, ...] -def IsTypePackable(field_type): ... +def IsTypePackable(field_type: int) -> bool: ... diff --git a/stubs/protobuf/google/protobuf/json_format.pyi b/stubs/protobuf/google/protobuf/json_format.pyi index 89eba0c4eabe..3d9c81a60995 100644 --- a/stubs/protobuf/google/protobuf/json_format.pyi +++ b/stubs/protobuf/google/protobuf/json_format.pyi @@ -6,8 +6,9 @@ from google.protobuf.message import Message _MessageT = TypeVar("_MessageT", bound=Message) class Error(Exception): ... -class ParseError(Error): ... class SerializeToJsonError(Error): ... +class ParseError(Error): ... +class EnumStringValueParseError(ParseError): ... def MessageToJson( message: Message, @@ -16,7 +17,6 @@ def MessageToJson( sort_keys: bool = False, use_integers_for_enums: bool = False, descriptor_pool: DescriptorPool | None = None, - float_precision: int | None = None, ensure_ascii: bool = True, always_print_fields_with_no_presence: bool = False, ) -> str: ... @@ -26,7 +26,6 @@ def MessageToDict( preserving_proto_field_name: bool = False, use_integers_for_enums: bool = False, descriptor_pool: DescriptorPool | None = None, - float_precision: int | None = None, ) -> dict[str, Any]: ... def Parse( text: bytes | str, diff --git a/stubs/protobuf/google/protobuf/message.pyi b/stubs/protobuf/google/protobuf/message.pyi index bd2aff9b7676..95af75099563 100644 --- a/stubs/protobuf/google/protobuf/message.pyi +++ b/stubs/protobuf/google/protobuf/message.pyi @@ -15,8 +15,9 @@ class Message: __slots__: tuple[str, ...] = () DESCRIPTOR: Descriptor | _upb_Descriptor def __deepcopy__(self, memo: Any = None) -> Self: ... - def __eq__(self, other_msg): ... - def __ne__(self, other_msg): ... + def __eq__(self, other_msg: object) -> bool: ... + def __ne__(self, other_msg: object) -> bool: ... + def __contains__(self, field_name_or_key: Any) -> bool: ... def MergeFrom(self, other_msg: Self) -> None: ... def CopyFrom(self, other_msg: Self) -> None: ... def Clear(self) -> None: ... @@ -27,20 +28,22 @@ class Message: def SerializeToString(self, *, deterministic: bool = ...) -> bytes: ... def SerializePartialToString(self, *, deterministic: bool = ...) -> bytes: ... def ListFields(self) -> Sequence[tuple[FieldDescriptor, Any]]: ... + # 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 + # See https://github.com/dropbox/mypy-protobuf/issues/62 for details + def HasField(self, field_name: Any) -> bool: ... + def ClearField(self, field_name: Any) -> None: ... + def WhichOneof(self, oneof_group: Any) -> Any: ... def HasExtension(self, field_descriptor: _ExtensionFieldDescriptor[Self, Any]) -> bool: ... def ClearExtension(self, field_descriptor: _ExtensionFieldDescriptor[Self, Any]) -> None: ... # The TypeVar must be bound to `Message` or we get mypy errors, so we cannot use `Self` for `Extensions` @property def Extensions(self) -> _ExtensionDict[Self]: ... + def UnknownFields(self) -> Any: ... + def DiscardUnknownFields(self) -> None: ... def ByteSize(self) -> int: ... @classmethod def FromString(cls, s: bytes) -> Self: ... - # 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 - # See https://github.com/dropbox/mypy-protobuf/issues/62 for details - def HasField(self, field_name: Any) -> bool: ... - def ClearField(self, field_name: Any) -> None: ... - def WhichOneof(self, oneof_group: Any) -> Any: ... # TODO: check kwargs def __new__(cls, *args, **kwargs) -> Self: ... diff --git a/stubs/protobuf/google/protobuf/message_factory.pyi b/stubs/protobuf/google/protobuf/message_factory.pyi index 6422284aaad3..75f22548901b 100644 --- a/stubs/protobuf/google/protobuf/message_factory.pyi +++ b/stubs/protobuf/google/protobuf/message_factory.pyi @@ -6,10 +6,11 @@ from google.protobuf.descriptor_pb2 import FileDescriptorProto from google.protobuf.descriptor_pool import DescriptorPool from google.protobuf.message import Message +def GetMessageClass(descriptor: Descriptor) -> type[Message]: ... +def GetMessageClassesForFiles(files: Iterable[str], pool: DescriptorPool) -> dict[str, type[Message]]: ... + class MessageFactory: pool: Any def __init__(self, pool: DescriptorPool | None = None) -> None: ... -def GetMessageClass(descriptor: Descriptor) -> type[Message]: ... -def GetMessageClassesForFiles(files: Iterable[str], pool: DescriptorPool) -> dict[str, type[Message]]: ... def GetMessages(file_protos: Iterable[FileDescriptorProto], pool: DescriptorPool | None = None) -> dict[str, type[Message]]: ... diff --git a/stubs/protobuf/google/protobuf/proto.pyi b/stubs/protobuf/google/protobuf/proto.pyi new file mode 100644 index 000000000000..1f1cb47037cc --- /dev/null +++ b/stubs/protobuf/google/protobuf/proto.pyi @@ -0,0 +1,14 @@ +from io import BytesIO +from typing import TypeVar + +from google.protobuf.message import Message + +_MessageT = TypeVar("_MessageT", bound=Message) + +def serialize(message: Message, deterministic: bool | None = None) -> bytes: ... +def parse(message_class: type[_MessageT], payload: bytes) -> _MessageT: ... +def serialize_length_prefixed(message: Message, output: BytesIO) -> None: ... +def parse_length_prefixed(message_class: type[_MessageT], input_bytes: BytesIO) -> _MessageT: ... +def byte_size(message: Message) -> int: ... +def clear_message(message: Message) -> None: ... +def clear_field(message: Message, field_name: str) -> None: ... diff --git a/stubs/protobuf/google/protobuf/proto_builder.pyi b/stubs/protobuf/google/protobuf/proto_builder.pyi new file mode 100644 index 000000000000..b204ba32eb69 --- /dev/null +++ b/stubs/protobuf/google/protobuf/proto_builder.pyi @@ -0,0 +1,8 @@ +from collections import OrderedDict + +from google.protobuf.descriptor_pool import DescriptorPool +from google.protobuf.message import Message + +def MakeSimpleProtoClass( + fields: dict[str, int] | OrderedDict[str, int], full_name: str | None = None, pool: DescriptorPool | None = None +) -> type[Message]: ... diff --git a/stubs/protobuf/google/protobuf/proto_json.pyi b/stubs/protobuf/google/protobuf/proto_json.pyi new file mode 100644 index 000000000000..9a63de676bb1 --- /dev/null +++ b/stubs/protobuf/google/protobuf/proto_json.pyi @@ -0,0 +1,21 @@ +from typing import Any, TypeVar + +from google.protobuf.descriptor_pool import DescriptorPool +from google.protobuf.message import Message + +_MessageT = TypeVar("_MessageT", bound=Message) + +def serialize( + message: Message, + always_print_fields_with_no_presence: bool = False, + preserving_proto_field_name: bool = False, + use_integers_for_enums: bool = False, + descriptor_pool: DescriptorPool | None = None, +) -> dict[str, Any]: ... +def parse( + message_class: type[_MessageT], + js_dict: dict[str, Any], + ignore_unknown_fields: bool = False, + descriptor_pool: DescriptorPool | None = None, + max_recursion_depth: int = 100, +) -> _MessageT: ... diff --git a/stubs/protobuf/google/protobuf/proto_text.pyi b/stubs/protobuf/google/protobuf/proto_text.pyi new file mode 100644 index 000000000000..ca45131c7141 --- /dev/null +++ b/stubs/protobuf/google/protobuf/proto_text.pyi @@ -0,0 +1,32 @@ +from collections.abc import Callable +from typing import TypeVar +from typing_extensions import TypeAlias + +from google.protobuf.descriptor_pool import DescriptorPool +from google.protobuf.message import Message + +_MessageT = TypeVar("_MessageT", bound=Message) +_MsgFormatter: TypeAlias = Callable[[Message, int, bool], str | None] + +def serialize( + message: Message, + as_utf8: bool = True, + as_one_line: bool = False, + use_short_repeated_primitives: bool = False, + pointy_brackets: bool = False, + use_index_order: bool = False, + use_field_number: bool = False, + descriptor_pool: DescriptorPool | None = None, + indent: int = 0, + message_formatter: _MsgFormatter | None = None, + print_unknown_fields: bool = False, + force_colon: bool = False, +) -> str: ... +def parse( + message_class: type[_MessageT], + text: str | bytes, + allow_unknown_extension: bool = False, + allow_field_number: bool = False, + descriptor_pool: DescriptorPool | None = None, + allow_unknown_field: bool = False, +) -> _MessageT: ... diff --git a/stubs/protobuf/google/protobuf/reflection.pyi b/stubs/protobuf/google/protobuf/reflection.pyi index 2836b3fcf11f..0c700523e712 100644 --- a/stubs/protobuf/google/protobuf/reflection.pyi +++ b/stubs/protobuf/google/protobuf/reflection.pyi @@ -1,2 +1,10 @@ -class GeneratedProtocolMessageType(type): - def __new__(cls, name, bases, dictionary): ... +from typing import Any + +from google._upb._message import MessageMeta + +MESSAGE_CLASS_CACHE: dict[str, Any] + +class GeneratedProtocolMessageType(MessageMeta): + def __new__( # noqa: Y034 + cls, name: str, bases: tuple[type, ...], dictionary: dict[str, Any] + ) -> GeneratedProtocolMessageType: ... diff --git a/stubs/protobuf/google/protobuf/service_reflection.pyi b/stubs/protobuf/google/protobuf/service_reflection.pyi new file mode 100644 index 000000000000..c9949d13baca --- /dev/null +++ b/stubs/protobuf/google/protobuf/service_reflection.pyi @@ -0,0 +1,7 @@ +from typing import Any + +class GeneratedServiceType(type): + def __init__(cls, name: str, bases: tuple[type, ...], dictionary: dict[str, Any]) -> None: ... + +class GeneratedServiceStubType(GeneratedServiceType): + def __init__(cls, name: str, bases: tuple[type, ...], dictionary: dict[str, Any]) -> None: ... diff --git a/stubs/protobuf/google/protobuf/symbol_database.pyi b/stubs/protobuf/google/protobuf/symbol_database.pyi index c595d9c525b9..6fda0df00fd4 100644 --- a/stubs/protobuf/google/protobuf/symbol_database.pyi +++ b/stubs/protobuf/google/protobuf/symbol_database.pyi @@ -1,10 +1,11 @@ from collections.abc import Iterable from google.protobuf.descriptor import Descriptor, EnumDescriptor, FileDescriptor, ServiceDescriptor +from google.protobuf.descriptor_pool import DescriptorPool from google.protobuf.message import Message -from google.protobuf.message_factory import MessageFactory -class SymbolDatabase(MessageFactory): +class SymbolDatabase: + def __init__(self, pool: DescriptorPool | None = None) -> None: ... def RegisterMessage(self, message: type[Message] | Message) -> type[Message] | Message: ... def RegisterMessageDescriptor(self, message_descriptor: Descriptor) -> None: ... def RegisterEnumDescriptor(self, enum_descriptor: EnumDescriptor) -> EnumDescriptor: ... diff --git a/stubs/protobuf/google/protobuf/text_encoding.pyi b/stubs/protobuf/google/protobuf/text_encoding.pyi new file mode 100644 index 000000000000..69a69bf0e9e6 --- /dev/null +++ b/stubs/protobuf/google/protobuf/text_encoding.pyi @@ -0,0 +1,2 @@ +def CEscape(text: bytes, as_utf8: bool) -> str: ... +def CUnescape(text: str) -> bytes: ... diff --git a/stubs/protobuf/google/protobuf/text_format.pyi b/stubs/protobuf/google/protobuf/text_format.pyi index c9a9da29a125..ef1fcf8cef19 100644 --- a/stubs/protobuf/google/protobuf/text_format.pyi +++ b/stubs/protobuf/google/protobuf/text_format.pyi @@ -9,6 +9,8 @@ from .message import Message _M = TypeVar("_M", bound=Message) # message type (of self) +__all__ = ["MessageToString", "Parse", "PrintMessage", "PrintField", "PrintFieldValue", "Merge", "MessageToBytes"] + class Error(Exception): ... class ParseError(Error): @@ -19,8 +21,8 @@ class ParseError(Error): class TextWriter: def __init__(self, as_utf8: bool) -> None: ... def write(self, val: str) -> int: ... - def getvalue(self) -> str: ... def close(self) -> None: ... + def getvalue(self) -> str: ... _MessageFormatter: TypeAlias = Callable[[Message, int, bool], str | None] @@ -31,8 +33,6 @@ def MessageToString( use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, use_field_number: bool = False, descriptor_pool: DescriptorPool | None = None, indent: int = 0, @@ -49,8 +49,6 @@ def MessageToBytes( use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, use_field_number: bool = False, descriptor_pool: DescriptorPool | None = None, indent: int = 0, @@ -67,8 +65,6 @@ def PrintMessage( use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, use_field_number: bool = False, descriptor_pool: DescriptorPool | None = None, message_formatter: _MessageFormatter | None = None, @@ -85,8 +81,6 @@ def PrintField( use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, message_formatter: _MessageFormatter | None = None, print_unknown_fields: bool = False, force_colon: bool = False, @@ -101,8 +95,6 @@ def PrintFieldValue( use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, message_formatter: _MessageFormatter | None = None, print_unknown_fields: bool = False, force_colon: bool = False, @@ -116,8 +108,6 @@ class _Printer: use_short_repeated_primitives: bool pointy_brackets: bool use_index_order: bool - float_format: str | None - double_format: str | None use_field_number: bool descriptor_pool: DescriptorPool | None message_formatter: _MessageFormatter | None @@ -132,8 +122,6 @@ class _Printer: use_short_repeated_primitives: bool = False, pointy_brackets: bool = False, use_index_order: bool = False, - float_format: str | None = None, - double_format: str | None = None, use_field_number: bool = False, descriptor_pool: DescriptorPool | None = None, message_formatter: _MessageFormatter | None = None, @@ -208,6 +196,8 @@ class Tokenizer: def ConsumeString(self) -> str: ... def ConsumeByteString(self) -> bytes: ... def ConsumeEnum(self, field: FieldDescriptor) -> int: ... + def ConsumeUrlChars(self) -> str: ... + def TryConsumeUrlChars(self) -> bool: ... def ParseErrorPreviousToken(self, message: Message) -> _ParseError: ... def ParseError(self, message: Message) -> _ParseError: ... def NextToken(self) -> None: ... diff --git a/stubs/protobuf/google/protobuf/timestamp.pyi b/stubs/protobuf/google/protobuf/timestamp.pyi new file mode 100644 index 000000000000..b6687a744e45 --- /dev/null +++ b/stubs/protobuf/google/protobuf/timestamp.pyi @@ -0,0 +1,16 @@ +from datetime import datetime, tzinfo + +from google.protobuf.timestamp_pb2 import Timestamp + +def from_json_string(value: str) -> Timestamp: ... +def from_microseconds(micros: float) -> Timestamp: ... +def from_milliseconds(millis: float) -> Timestamp: ... +def from_nanoseconds(nanos: float) -> Timestamp: ... +def from_seconds(seconds: float) -> Timestamp: ... +def from_current_time() -> Timestamp: ... +def to_json_string(ts: Timestamp) -> str: ... +def to_microseconds(ts: Timestamp) -> int: ... +def to_milliseconds(ts: Timestamp) -> int: ... +def to_nanoseconds(ts: Timestamp) -> int: ... +def to_seconds(ts: Timestamp) -> int: ... +def to_datetime(ts: Timestamp, tz: tzinfo | None = None) -> datetime: ... diff --git a/stubs/protobuf/google/protobuf/unknown_fields.pyi b/stubs/protobuf/google/protobuf/unknown_fields.pyi new file mode 100644 index 000000000000..ab84671fb02e --- /dev/null +++ b/stubs/protobuf/google/protobuf/unknown_fields.pyi @@ -0,0 +1,9 @@ +from typing import Any, final + +from google.protobuf.message import Message + +@final +class UnknownFieldSet: + def __new__(cls, msg: Message) -> UnknownFieldSet: ... # noqa: Y034 + def __getitem__(self, index: int) -> Any: ... + def __len__(self) -> int: ... From 5396bf556d07ff602a7a4b0506c1d731e8f0da5c Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Sat, 28 Mar 2026 03:55:50 +0300 Subject: [PATCH 2/2] [protobuf] Bump to 7.34.1 and improve type coverage Signed-off-by: Emmanuel Ferdman --- stubs/protobuf/@tests/stubtest_allowlist.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/stubs/protobuf/@tests/stubtest_allowlist.txt b/stubs/protobuf/@tests/stubtest_allowlist.txt index 449ab19c9e8e..38356350e0ca 100644 --- a/stubs/protobuf/@tests/stubtest_allowlist.txt +++ b/stubs/protobuf/@tests/stubtest_allowlist.txt @@ -32,11 +32,3 @@ google.protobuf.internal.well_known_types.ListValue.__iter__ # It's a list at runtime, but if we do that pyright complains about incompatible overrides # in subclasses that use a tuple for __slots__. google.protobuf.message.Message.__slots__ - -# Thin wrapper around the C extension metaclass; users should use -# google.protobuf.reflection.GeneratedProtocolMessageType instead -google.protobuf.pyext -google.protobuf.pyext.cpp_message - -# Package with only __init__.py, no public API -google.protobuf.testdata