aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/types-protobuf/google-stubs
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-03-04 21:16:16 +0300
committershadchin <shadchin@yandex-team.com>2024-03-04 21:43:39 +0300
commit74819c4157bd388a7d429c870ea4b343a282dafa (patch)
tree4bff355b03dfb24b14d33581357cc8e624d170fd /contrib/python/types-protobuf/google-stubs
parentf64c28a5443395e3a8f27e6f1b15a3507812d2de (diff)
downloadydb-74819c4157bd388a7d429c870ea4b343a282dafa.tar.gz
Extend support pyi files
Сейчас pyi файлы в макросе PY_SRCS используются исключительно в Arcadia плагине для продуктов JB, при сборке эти файлы просто игнорируются. В этом PR добавил шаг, который будет содержимое этих файлов складывать в ресурсы, секция PY_SRCS удобна тем, что позволяет раскладывать pyi файлы с учетом TOP_LEVEL/NAMESPACE, а это необходимо для правильной работы mypy. 3924b0556bc99947e6893cd79e5ce62ec72a18a9
Diffstat (limited to 'contrib/python/types-protobuf/google-stubs')
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/__init__.pyi1
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/compiler/__init__.pyi0
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/descriptor.pyi352
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/descriptor_pool.pyi26
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/__init__.pyi0
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/api_implementation.pyi3
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/builder.pyi5
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/containers.pyi100
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/decoder.pyi63
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/encoder.pyi41
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/enum_type_wrapper.pyi21
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/extension_dict.pyi27
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/message_listener.pyi5
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/python_message.pyi3
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/type_checkers.pyi11
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/well_known_types.pyi103
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/internal/wire_format.pyi50
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/json_format.pyi44
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/message.pyi46
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/message_factory.pyi17
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/reflection.pyi6
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/service.pyi39
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/symbol_database.pyi16
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/text_format.pyi216
-rw-r--r--contrib/python/types-protobuf/google-stubs/protobuf/util/__init__.pyi0
25 files changed, 1195 insertions, 0 deletions
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/__init__.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/__init__.pyi
new file mode 100644
index 0000000000..bda5b5a7f4
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/__init__.pyi
@@ -0,0 +1 @@
+__version__: str
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/compiler/__init__.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/compiler/__init__.pyi
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/compiler/__init__.pyi
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/descriptor.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/descriptor.pyi
new file mode 100644
index 0000000000..d8a1ad676a
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/descriptor.pyi
@@ -0,0 +1,352 @@
+from _typeshed import Incomplete
+from typing import Any
+
+from .descriptor_pb2 import (
+ EnumOptions,
+ EnumValueOptions,
+ FieldOptions,
+ FileOptions,
+ MessageOptions,
+ MethodOptions,
+ OneofOptions,
+ ServiceOptions,
+)
+from .message import Message
+
+class Error(Exception): ...
+class TypeTransformationError(Error): ...
+
+class DescriptorMetaclass(type):
+ def __instancecheck__(self, obj: Any) -> bool: ...
+
+_internal_create_key: object
+_USE_C_DESCRIPTORS: bool
+
+class DescriptorBase(metaclass=DescriptorMetaclass):
+ has_options: Any
+ def __init__(self, options, serialized_options, options_class_name) -> None: ...
+ def GetOptions(self): ...
+
+class _NestedDescriptorBase(DescriptorBase):
+ name: Any
+ full_name: Any
+ file: Any
+ containing_type: Any
+ def __init__(
+ self,
+ options,
+ options_class_name,
+ name,
+ full_name,
+ file,
+ containing_type,
+ serialized_start=...,
+ serialized_end=...,
+ serialized_options=...,
+ ) -> None: ...
+ def CopyToProto(self, proto): ...
+
+class Descriptor(_NestedDescriptorBase):
+ fields: Any
+ fields_by_number: Any
+ fields_by_name: Any
+ nested_types: Any
+ nested_types_by_name: Any
+ enum_types: Any
+ enum_types_by_name: Any
+ enum_values_by_name: Any
+ extensions: Any
+ extensions_by_name: Any
+ is_extendable: Any
+ extension_ranges: Any
+ oneofs: Any
+ oneofs_by_name: Any
+ syntax: Any
+ def __init__(
+ self,
+ name: str,
+ full_name: str,
+ filename: Any,
+ containing_type: Descriptor | None,
+ fields: list[FieldDescriptor],
+ nested_types: list[FieldDescriptor],
+ enum_types: list[EnumDescriptor],
+ extensions: list[FieldDescriptor],
+ options: Incomplete | None = ...,
+ serialized_options: Incomplete | None = ...,
+ is_extendable: bool | None = ...,
+ extension_ranges: Incomplete | None = ...,
+ oneofs: list[OneofDescriptor] | None = ...,
+ file: FileDescriptor | None = ...,
+ serialized_start: Incomplete | None = ...,
+ serialized_end: Incomplete | None = ...,
+ syntax: str | None = ...,
+ create_key: Incomplete | None = ...,
+ ): ...
+ def EnumValueName(self, enum, value): ...
+ def CopyToProto(self, proto): ...
+ 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
+ def __new__(
+ cls,
+ name,
+ full_name,
+ index,
+ number,
+ type,
+ cpp_type,
+ label,
+ default_value,
+ message_type,
+ enum_type,
+ containing_type,
+ is_extension,
+ extension_scope,
+ options=...,
+ serialized_options=...,
+ has_default_value=...,
+ containing_oneof=...,
+ json_name=...,
+ file=...,
+ create_key=...,
+ ): ...
+ name: Any
+ full_name: Any
+ index: Any
+ number: Any
+ type: Any
+ cpp_type: Any
+ label: Any
+ has_default_value: Any
+ default_value: Any
+ containing_type: Any
+ message_type: Any
+ enum_type: Any
+ is_extension: Any
+ extension_scope: Any
+ containing_oneof: Any
+ def __init__(
+ self,
+ name,
+ full_name,
+ index,
+ number,
+ type,
+ cpp_type,
+ label,
+ default_value,
+ message_type,
+ enum_type,
+ containing_type,
+ is_extension,
+ extension_scope,
+ options=...,
+ serialized_options=...,
+ has_default_value=...,
+ containing_oneof=...,
+ json_name=...,
+ file=...,
+ create_key=...,
+ ) -> None: ...
+ @staticmethod
+ def ProtoTypeToCppProtoType(proto_type): ...
+ def GetOptions(self) -> FieldOptions: ...
+
+class EnumDescriptor(_NestedDescriptorBase):
+ def __new__(
+ cls,
+ name,
+ full_name,
+ filename,
+ values,
+ containing_type=...,
+ options=...,
+ serialized_options=...,
+ file=...,
+ serialized_start=...,
+ serialized_end=...,
+ create_key=...,
+ ): ...
+ values: Any
+ values_by_name: Any
+ values_by_number: Any
+ def __init__(
+ self,
+ name,
+ full_name,
+ filename,
+ values,
+ containing_type=...,
+ options=...,
+ serialized_options=...,
+ file=...,
+ serialized_start=...,
+ serialized_end=...,
+ create_key=...,
+ ) -> None: ...
+ def CopyToProto(self, proto): ...
+ def GetOptions(self) -> EnumOptions: ...
+
+class EnumValueDescriptor(DescriptorBase):
+ def __new__(cls, name, index, number, type=..., options=..., serialized_options=..., create_key=...): ...
+ name: Any
+ index: Any
+ number: Any
+ type: Any
+ def __init__(self, name, index, number, type=..., options=..., serialized_options=..., create_key=...) -> None: ...
+ def GetOptions(self) -> EnumValueOptions: ...
+
+class OneofDescriptor:
+ def __new__(cls, name, full_name, index, containing_type, fields, options=..., serialized_options=..., create_key=...): ...
+ name: Any
+ full_name: Any
+ index: Any
+ containing_type: Any
+ fields: Any
+ def __init__(
+ self, name, full_name, index, containing_type, fields, options=..., serialized_options=..., create_key=...
+ ) -> None: ...
+ def GetOptions(self) -> OneofOptions: ...
+
+class ServiceDescriptor(_NestedDescriptorBase):
+ index: Any
+ methods: Any
+ methods_by_name: Any
+ def __init__(
+ self,
+ name: str,
+ full_name: str,
+ index: int,
+ methods: list[MethodDescriptor],
+ options: ServiceOptions | None = ...,
+ serialized_options: Incomplete | None = ...,
+ file: FileDescriptor | None = ...,
+ serialized_start: Incomplete | None = ...,
+ serialized_end: Incomplete | None = ...,
+ create_key: Incomplete | None = ...,
+ ): ...
+ def FindMethodByName(self, name): ...
+ def CopyToProto(self, proto): ...
+ def GetOptions(self) -> ServiceOptions: ...
+
+class MethodDescriptor(DescriptorBase):
+ def __new__(
+ cls,
+ name,
+ full_name,
+ index,
+ containing_service,
+ input_type,
+ output_type,
+ client_streaming=...,
+ server_streaming=...,
+ options=...,
+ serialized_options=...,
+ create_key=...,
+ ): ...
+ name: Any
+ full_name: Any
+ index: Any
+ containing_service: Any
+ input_type: Any
+ output_type: Any
+ client_streaming: bool
+ server_streaming: bool
+ def __init__(
+ self,
+ name,
+ full_name,
+ index,
+ containing_service,
+ input_type,
+ output_type,
+ client_streaming=...,
+ server_streaming=...,
+ options=...,
+ serialized_options=...,
+ create_key=...,
+ ) -> None: ...
+ def GetOptions(self) -> MethodOptions: ...
+
+class FileDescriptor(DescriptorBase):
+ def __new__(
+ cls,
+ name,
+ package,
+ options=...,
+ serialized_options=...,
+ serialized_pb=...,
+ dependencies=...,
+ public_dependencies=...,
+ syntax=...,
+ pool=...,
+ create_key=...,
+ ): ...
+ _options: Any
+ pool: Any
+ message_types_by_name: Any
+ name: Any
+ package: Any
+ syntax: Any
+ serialized_pb: Any
+ enum_types_by_name: Any
+ extensions_by_name: Any
+ services_by_name: Any
+ dependencies: Any
+ public_dependencies: Any
+ def __init__(
+ self,
+ name,
+ package,
+ options=...,
+ serialized_options=...,
+ serialized_pb=...,
+ dependencies=...,
+ public_dependencies=...,
+ syntax=...,
+ pool=...,
+ create_key=...,
+ ) -> None: ...
+ def CopyToProto(self, proto): ...
+ def GetOptions(self) -> FileOptions: ...
+
+def MakeDescriptor(desc_proto, package=..., build_file_if_cpp=..., syntax=...): ...
+def _ParseOptions(message: Message, string: bytes) -> Message: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/descriptor_pool.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/descriptor_pool.pyi
new file mode 100644
index 0000000000..00be66656d
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/descriptor_pool.pyi
@@ -0,0 +1,26 @@
+from _typeshed import Incomplete
+
+class DescriptorPool:
+ def __new__(cls, descriptor_db: Incomplete | None = ...): ...
+ def __init__( # pyright: ignore[reportInconsistentConstructor]
+ self, descriptor_db: Incomplete | None = ..., use_deprecated_legacy_json_field_conflicts: bool = ...
+ ) -> None: ...
+ def Add(self, file_desc_proto): ...
+ def AddSerializedFile(self, serialized_file_desc_proto): ...
+ def AddDescriptor(self, desc): ...
+ def AddServiceDescriptor(self, service_desc): ...
+ def AddExtensionDescriptor(self, extension): ...
+ def AddFileDescriptor(self, file_desc): ...
+ 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 Default(): ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/__init__.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/__init__.pyi
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/__init__.pyi
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/api_implementation.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/api_implementation.pyi
new file mode 100644
index 0000000000..4940124ff9
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/api_implementation.pyi
@@ -0,0 +1,3 @@
+def Type() -> str: ...
+def Version() -> int: ...
+def IsPythonDefaultSerializationDeterministic() -> bool: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/builder.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/builder.pyi
new file mode 100644
index 0000000000..a0a72dec58
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/builder.pyi
@@ -0,0 +1,5 @@
+from _typeshed import Incomplete
+from typing import Any
+
+def BuildMessageAndEnumDescriptors(file_des: Incomplete, module: dict[str, Any]) -> None: ...
+def BuildTopDescriptorsAndMessages(file_des: Incomplete, module_name: str, module: dict[str, Any]) -> None: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/containers.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/containers.pyi
new file mode 100644
index 0000000000..235ab25d61
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/containers.pyi
@@ -0,0 +1,100 @@
+from collections.abc import Callable, Iterable, Iterator, MutableMapping, Sequence
+from typing import Any, Protocol, SupportsIndex, TypeVar, overload
+
+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.message import Message
+
+_T = TypeVar("_T")
+_K = TypeVar("_K", bound=bool | int | str)
+_ScalarV = TypeVar("_ScalarV", bound=bool | int | float | str | bytes)
+_MessageV = TypeVar("_MessageV", bound=Message)
+_M = TypeVar("_M")
+
+class _ValueChecker(Protocol[_T]):
+ def CheckValue(self, proposed_value: _T) -> _T: ...
+ def DefaultValue(self) -> _T: ...
+
+class BaseContainer(Sequence[_T]):
+ def __init__(self, message_listener: MessageListener) -> None: ...
+ def __len__(self) -> int: ...
+ def __ne__(self, other: object) -> bool: ...
+ def __hash__(self) -> int: ...
+ def sort(self, *, key: Callable[[_T], Any] | None = ..., reverse: bool = ...) -> None: ...
+ @overload
+ def __getitem__(self, key: SupportsIndex) -> _T: ...
+ @overload
+ def __getitem__(self, key: slice) -> list[_T]: ...
+
+class RepeatedScalarFieldContainer(BaseContainer[_ScalarV]):
+ 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: Iterable[_ScalarV] | None) -> None: ...
+ def MergeFrom(self: _M, other: _M) -> None: ...
+ def remove(self, elem: _ScalarV) -> None: ...
+ def pop(self, key: int = ...) -> _ScalarV: ...
+ @overload
+ def __setitem__(self, key: int, value: _ScalarV) -> None: ...
+ @overload
+ def __setitem__(self, key: slice, value: Iterable[_ScalarV]) -> None: ...
+ def __delitem__(self, key: int | slice) -> None: ...
+ def __eq__(self, other: object) -> bool: ...
+
+class RepeatedCompositeFieldContainer(BaseContainer[_MessageV]):
+ 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: ...
+ def extend(self, elem_seq: Iterable[_MessageV]) -> None: ...
+ def MergeFrom(self: _M, other: _M) -> None: ...
+ def remove(self, elem: _MessageV) -> None: ...
+ def pop(self, key: int = ...) -> _MessageV: ...
+ def __delitem__(self, key: int | slice) -> None: ...
+ def __eq__(self, other: object) -> bool: ...
+
+class ScalarMap(MutableMapping[_K, _ScalarV]):
+ def __init__(
+ self,
+ message_listener: MessageListener,
+ key_checker: _ValueChecker[_K],
+ 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: ...
+ @overload
+ def get(self, key: _K, default: None = ...) -> _ScalarV | None: ...
+ @overload
+ def get(self, key: _K, default: _ScalarV | _T) -> _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: _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: ...
+ @overload
+ def get(self, key: _K, default: None = ...) -> _MessageV | None: ...
+ @overload
+ def get(self, key: _K, default: _MessageV | _T) -> _MessageV | _T: ...
+ def get_or_create(self, key: _K) -> _MessageV: ...
+ def MergeFrom(self: _M, other: _M): ...
+ def InvalidateIterators(self) -> None: ...
+ def GetEntryClass(self) -> GeneratedProtocolMessageType: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/decoder.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/decoder.pyi
new file mode 100644
index 0000000000..41a50035b5
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/decoder.pyi
@@ -0,0 +1,63 @@
+from collections.abc import Callable
+from typing import Any
+from typing_extensions import TypeAlias
+
+from google.protobuf.descriptor import Descriptor, FieldDescriptor
+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): ...
+
+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/contrib/python/types-protobuf/google-stubs/protobuf/internal/encoder.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/encoder.pyi
new file mode 100644
index 0000000000..278478edb3
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/encoder.pyi
@@ -0,0 +1,41 @@
+from collections.abc import Callable
+from typing_extensions import TypeAlias
+
+from google.protobuf.descriptor import FieldDescriptor
+
+_Sizer: TypeAlias = Callable[[int, bool, bool], int]
+
+Int32Sizer: _Sizer
+UInt32Sizer: _Sizer
+SInt32Sizer: _Sizer
+Fixed32Sizer: _Sizer
+Fixed64Sizer: _Sizer
+BoolSizer: _Sizer
+
+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: TypeAlias = 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/contrib/python/types-protobuf/google-stubs/protobuf/internal/enum_type_wrapper.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/enum_type_wrapper.pyi
new file mode 100644
index 0000000000..95b5b4bb25
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/enum_type_wrapper.pyi
@@ -0,0 +1,21 @@
+from typing import Generic, TypeVar
+
+from google.protobuf.descriptor import EnumDescriptor
+
+_V = TypeVar("_V", bound=int)
+
+# Expose a generic version so that those using mypy-protobuf
+# can get autogenerated NewType wrapper around the int values
+# NOTE: this doesn't actually inherit from type,
+# but mypy doesn't support metaclasses that don't inherit from type,
+# so we pretend it does in the stubs...
+class _EnumTypeWrapper(type, Generic[_V]):
+ DESCRIPTOR: EnumDescriptor
+ def __init__(self, enum_type: EnumDescriptor) -> None: ...
+ def Name(self, number: _V) -> str: ...
+ def Value(self, name: str | bytes) -> _V: ...
+ def keys(self) -> list[str]: ...
+ def values(self) -> list[_V]: ...
+ def items(self) -> list[tuple[str, _V]]: ...
+
+class EnumTypeWrapper(_EnumTypeWrapper[int]): ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/extension_dict.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/extension_dict.pyi
new file mode 100644
index 0000000000..ecf56a360d
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/extension_dict.pyi
@@ -0,0 +1,27 @@
+from collections.abc import Iterator
+from typing import Any, Generic, TypeVar
+
+from google.protobuf.descriptor import FieldDescriptor
+from google.protobuf.internal.containers import RepeatedCompositeFieldContainer, RepeatedScalarFieldContainer
+from google.protobuf.message import Message
+
+_ContainerMessageT = TypeVar("_ContainerMessageT", bound=Message)
+_ExtenderMessageT = TypeVar(
+ "_ExtenderMessageT",
+ bound=Message | RepeatedScalarFieldContainer[Any] | RepeatedCompositeFieldContainer[Any] | bool | float | str | bytes,
+)
+
+class _ExtensionFieldDescriptor(FieldDescriptor, Generic[_ContainerMessageT, _ExtenderMessageT]): ...
+
+class _ExtensionDict(Generic[_ContainerMessageT]):
+ def __init__(self, extended_message: _ContainerMessageT) -> None: ...
+ def __getitem__(
+ self, extension_handle: _ExtensionFieldDescriptor[_ContainerMessageT, _ExtenderMessageT]
+ ) -> _ExtenderMessageT: ...
+ 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: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/message_listener.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/message_listener.pyi
new file mode 100644
index 0000000000..01c3be010c
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/message_listener.pyi
@@ -0,0 +1,5 @@
+class MessageListener:
+ def Modified(self) -> None: ...
+
+class NullMessageListener(MessageListener):
+ def Modified(self) -> None: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/python_message.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/python_message.pyi
new file mode 100644
index 0000000000..0395ff6470
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/python_message.pyi
@@ -0,0 +1,3 @@
+class GeneratedProtocolMessageType(type):
+ def __new__(cls, name, bases, dictionary): ...
+ def __init__(cls, name, bases, dictionary): ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/type_checkers.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/type_checkers.pyi
new file mode 100644
index 0000000000..e050e95587
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/type_checkers.pyi
@@ -0,0 +1,11 @@
+from typing import Generic, TypeVar
+
+_T = TypeVar("_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/contrib/python/types-protobuf/google-stubs/protobuf/internal/well_known_types.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/well_known_types.pyi
new file mode 100644
index 0000000000..e257cf0529
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/well_known_types.pyi
@@ -0,0 +1,103 @@
+from _typeshed import Incomplete, 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
+
+class Any:
+ type_url: str
+ value: Incomplete
+ def Pack(
+ self, msg: Incomplete, type_url_prefix: str = "type.googleapis.com/", deterministic: Incomplete | None = None
+ ) -> None: ...
+ def Unpack(self, msg: Incomplete) -> bool: ...
+ def TypeName(self) -> str: ...
+ def Is(self, descriptor: Incomplete) -> bool: ...
+
+class Timestamp:
+ def ToJsonString(self) -> str: ...
+ seconds: int
+ nanos: int
+ def FromJsonString(self, value: str) -> None: ...
+ def GetCurrentTime(self) -> None: ...
+ def ToNanoseconds(self) -> int: ...
+ def ToMicroseconds(self) -> int: ...
+ def ToMilliseconds(self) -> int: ...
+ def ToSeconds(self) -> int: ...
+ def FromNanoseconds(self, nanos: int) -> None: ...
+ def FromMicroseconds(self, micros: int) -> None: ...
+ def FromMilliseconds(self, millis: int) -> None: ...
+ def FromSeconds(self, seconds: int) -> None: ...
+ def ToDatetime(self, tzinfo: tzinfo | None = ...) -> datetime: ...
+ def FromDatetime(self, dt: datetime) -> None: ...
+
+class Duration:
+ def ToJsonString(self) -> str: ...
+ seconds: int
+ nanos: int
+ def FromJsonString(self, value: tAny) -> None: ...
+ def ToNanoseconds(self) -> int: ...
+ def ToMicroseconds(self) -> int: ...
+ def ToMilliseconds(self) -> int: ...
+ def ToSeconds(self) -> int: ...
+ def FromNanoseconds(self, nanos: int) -> None: ...
+ def FromMicroseconds(self, micros: int) -> None: ...
+ def FromMilliseconds(self, millis: int) -> None: ...
+ def FromSeconds(self, seconds: int) -> None: ...
+ def ToTimedelta(self) -> timedelta: ...
+ def FromTimedelta(self, td: timedelta) -> None: ...
+
+class FieldMask:
+ def ToJsonString(self) -> str: ...
+ def FromJsonString(self, value: tAny) -> None: ...
+ def IsValidForDescriptor(self, message_descriptor: tAny): ...
+ def AllFieldsFromDescriptor(self, message_descriptor: tAny) -> None: ...
+ def CanonicalFormFromMask(self, mask: tAny) -> None: ...
+ def Union(self, mask1: tAny, mask2: tAny) -> None: ...
+ def Intersect(self, mask1: tAny, mask2: tAny) -> None: ...
+ def MergeMessage(
+ self, source: tAny, destination: tAny, replace_message_field: bool = ..., replace_repeated_field: bool = ...
+ ) -> None: ...
+
+class _FieldMaskTree:
+ def __init__(self, field_mask: Incomplete | None = ...) -> None: ...
+ def MergeFromFieldMask(self, field_mask: tAny) -> None: ...
+ def AddPath(self, path: tAny): ...
+ def ToFieldMask(self, field_mask: tAny) -> None: ...
+ def IntersectPath(self, path: tAny, intersection: tAny): ...
+ def AddLeafNodes(self, prefix: tAny, node: tAny) -> None: ...
+ def MergeMessage(self, source: tAny, destination: tAny, replace_message: tAny, replace_repeated: tAny) -> None: ...
+
+_StructValue: TypeAlias = struct_pb2.Struct | struct_pb2.ListValue | str | float | bool | None
+_StructValueArg: TypeAlias = _StructValue | Mapping[str, _StructValueArg] | Sequence[_StructValueArg]
+
+class Struct:
+ def __getitem__(self, key: str) -> _StructValue: ...
+ def __contains__(self, item: object) -> bool: ...
+ def __setitem__(self, key: str, value: _StructValueArg) -> None: ...
+ def __delitem__(self, key: str) -> None: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def keys(self) -> KeysView[str]: ...
+ def values(self) -> list[_StructValue]: ...
+ def items(self) -> list[tuple[str, _StructValue]]: ...
+ def get_or_create_list(self, key: str) -> struct_pb2.ListValue: ...
+ def get_or_create_struct(self, key: str) -> struct_pb2.Struct: ...
+ def update(self, dictionary: SupportsItems[str, _StructValueArg]) -> None: ...
+
+class ListValue:
+ def __len__(self) -> int: ...
+ def append(self, value: _StructValue) -> None: ...
+ def extend(self, elem_seq: Iterable[_StructValue]) -> None: ...
+ def __getitem__(self, index: int) -> _StructValue: ...
+ def __setitem__(self, index: int, value: _StructValueArg) -> None: ...
+ def __delitem__(self, key: int) -> None: ...
+ # Doesn't actually exist at runtime; needed so type checkers understand the class is iterable
+ def __iter__(self) -> Iterator[_StructValue]: ...
+ def items(self) -> Iterator[_StructValue]: ...
+ def add_struct(self) -> struct_pb2.Struct: ...
+ def add_list(self) -> struct_pb2.ListValue: ...
+
+WKTBASES: dict[str, type[tAny]]
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/internal/wire_format.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/internal/wire_format.pyi
new file mode 100644
index 0000000000..3dcbd04324
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/internal/wire_format.pyi
@@ -0,0 +1,50 @@
+from typing import Any
+
+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
+
+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): ...
+
+NON_PACKABLE_TYPES: Any
+
+def IsTypePackable(field_type): ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/json_format.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/json_format.pyi
new file mode 100644
index 0000000000..62ad1bad2e
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/json_format.pyi
@@ -0,0 +1,44 @@
+from typing import Any, TypeVar
+
+from google.protobuf.descriptor_pool import DescriptorPool
+from google.protobuf.message import Message
+
+_MessageT = TypeVar("_MessageT", bound=Message)
+
+class Error(Exception): ...
+class ParseError(Error): ...
+class SerializeToJsonError(Error): ...
+
+def MessageToJson(
+ message: Message,
+ including_default_value_fields: bool = ...,
+ preserving_proto_field_name: bool = ...,
+ indent: int | None = ...,
+ sort_keys: bool = ...,
+ use_integers_for_enums: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ float_precision: int | None = ...,
+ ensure_ascii: bool = ...,
+) -> str: ...
+def MessageToDict(
+ message: Message,
+ including_default_value_fields: bool = ...,
+ preserving_proto_field_name: bool = ...,
+ use_integers_for_enums: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ float_precision: int | None = ...,
+) -> dict[str, Any]: ...
+def Parse(
+ text: bytes | str,
+ message: _MessageT,
+ ignore_unknown_fields: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ max_recursion_depth: int = ...,
+) -> _MessageT: ...
+def ParseDict(
+ js_dict: Any,
+ message: _MessageT,
+ ignore_unknown_fields: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ max_recursion_depth: int = ...,
+) -> _MessageT: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/message.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/message.pyi
new file mode 100644
index 0000000000..64448454fc
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/message.pyi
@@ -0,0 +1,46 @@
+from collections.abc import Sequence
+from typing import Any, TypeVar
+from typing_extensions import Self
+
+from .descriptor import Descriptor, FieldDescriptor
+from .internal.extension_dict import _ExtensionDict, _ExtensionFieldDescriptor
+
+class Error(Exception): ...
+class DecodeError(Error): ...
+class EncodeError(Error): ...
+
+_M = TypeVar("_M", bound=Message) # message type (of self)
+
+class Message:
+ DESCRIPTOR: Descriptor
+ def __deepcopy__(self, memo: Any = ...) -> Self: ...
+ def __eq__(self, other_msg): ...
+ def __ne__(self, other_msg): ...
+ def MergeFrom(self, other_msg: Self) -> None: ...
+ def CopyFrom(self, other_msg: Self) -> None: ...
+ def Clear(self) -> None: ...
+ def SetInParent(self) -> None: ...
+ def IsInitialized(self) -> 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) -> Sequence[tuple[FieldDescriptor, Any]]: ...
+ # The TypeVar must be bound to `Message` or we get mypy errors, so we cannot use `Self` for `HasExtension` & `ClearExtension`
+ def HasExtension(self: _M, field_descriptor: _ExtensionFieldDescriptor[_M, Any]) -> bool: ...
+ def ClearExtension(self: _M, field_descriptor: _ExtensionFieldDescriptor[_M, 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: _M) -> _ExtensionDict[_M]: ...
+ 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 __init__(self, *args, **kwargs) -> None: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/message_factory.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/message_factory.pyi
new file mode 100644
index 0000000000..e9009393aa
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/message_factory.pyi
@@ -0,0 +1,17 @@
+from collections.abc import Iterable
+from typing import Any
+
+from google.protobuf.descriptor import Descriptor
+from google.protobuf.descriptor_pb2 import FileDescriptorProto
+from google.protobuf.descriptor_pool import DescriptorPool
+from google.protobuf.message import Message
+
+class MessageFactory:
+ pool: Any
+ def __init__(self, pool: DescriptorPool | None = ...) -> None: ...
+ def GetPrototype(self, descriptor: Descriptor) -> type[Message]: ...
+ def GetMessages(self, files: Iterable[str]) -> dict[str, type[Message]]: ...
+
+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 = ...) -> dict[str, type[Message]]: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/reflection.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/reflection.pyi
new file mode 100644
index 0000000000..4bfbd2f4ce
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/reflection.pyi
@@ -0,0 +1,6 @@
+class GeneratedProtocolMessageType(type):
+ def __new__(cls, name, bases, dictionary): ...
+ def __init__(__self, name, bases, dictionary) -> None: ...
+
+def ParseMessage(descriptor, byte_str): ...
+def MakeClass(descriptor): ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/service.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/service.pyi
new file mode 100644
index 0000000000..1123b6134d
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/service.pyi
@@ -0,0 +1,39 @@
+from collections.abc import Callable
+from concurrent.futures import Future
+
+from google.protobuf.descriptor import MethodDescriptor, ServiceDescriptor
+from google.protobuf.message import Message
+
+class RpcException(Exception): ...
+
+class Service:
+ @staticmethod
+ def GetDescriptor() -> ServiceDescriptor: ...
+ def CallMethod(
+ self,
+ method_descriptor: MethodDescriptor,
+ rpc_controller: RpcController,
+ request: Message,
+ done: Callable[[Message], None] | None,
+ ) -> Future[Message] | None: ...
+ def GetRequestClass(self, method_descriptor: MethodDescriptor) -> type[Message]: ...
+ def GetResponseClass(self, method_descriptor: MethodDescriptor) -> type[Message]: ...
+
+class RpcController:
+ def Reset(self) -> None: ...
+ def Failed(self) -> bool: ...
+ def ErrorText(self) -> str | None: ...
+ def StartCancel(self) -> None: ...
+ def SetFailed(self, reason: str) -> None: ...
+ def IsCanceled(self) -> bool: ...
+ def NotifyOnCancel(self, callback: Callable[[], None]) -> None: ...
+
+class RpcChannel:
+ def CallMethod(
+ self,
+ method_descriptor: MethodDescriptor,
+ rpc_controller: RpcController,
+ request: Message,
+ response_class: type[Message],
+ done: Callable[[Message], None] | None,
+ ) -> Future[Message] | None: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/symbol_database.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/symbol_database.pyi
new file mode 100644
index 0000000000..c595d9c525
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/symbol_database.pyi
@@ -0,0 +1,16 @@
+from collections.abc import Iterable
+
+from google.protobuf.descriptor import Descriptor, EnumDescriptor, FileDescriptor, ServiceDescriptor
+from google.protobuf.message import Message
+from google.protobuf.message_factory import MessageFactory
+
+class SymbolDatabase(MessageFactory):
+ def RegisterMessage(self, message: type[Message] | Message) -> type[Message] | Message: ...
+ def RegisterMessageDescriptor(self, message_descriptor: Descriptor) -> None: ...
+ def RegisterEnumDescriptor(self, enum_descriptor: EnumDescriptor) -> EnumDescriptor: ...
+ def RegisterServiceDescriptor(self, service_descriptor: ServiceDescriptor) -> None: ...
+ def RegisterFileDescriptor(self, file_descriptor: FileDescriptor) -> None: ...
+ def GetSymbol(self, symbol: str) -> type[Message]: ...
+ def GetMessages(self, files: Iterable[str]) -> dict[str, type[Message]]: ...
+
+def Default() -> SymbolDatabase: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/text_format.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/text_format.pyi
new file mode 100644
index 0000000000..593739c94f
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/text_format.pyi
@@ -0,0 +1,216 @@
+from _typeshed import SupportsWrite
+from collections.abc import Callable, Iterable
+from typing import Any, TypeVar
+from typing_extensions import TypeAlias
+
+from .descriptor import FieldDescriptor
+from .descriptor_pool import DescriptorPool
+from .message import Message
+
+_M = TypeVar("_M", bound=Message) # message type (of self)
+
+class Error(Exception): ...
+
+class ParseError(Error):
+ def __init__(self, message: str | None = ..., line: int | None = ..., column: int | None = ...) -> None: ...
+ def GetLine(self) -> int | None: ...
+ def GetColumn(self) -> int | None: ...
+
+class TextWriter:
+ def __init__(self, as_utf8: bool) -> None: ...
+ def write(self, val: str) -> int: ...
+ def getvalue(self) -> str: ...
+ def close(self) -> None: ...
+
+_MessageFormatter: TypeAlias = Callable[[Message, int, bool], str | None]
+
+def MessageToString(
+ message: Message,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ 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 = ...,
+ indent: int = ...,
+ message_formatter: _MessageFormatter | None = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+) -> str: ...
+def MessageToBytes(
+ message: Message,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ 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 = ...,
+ indent: int = ...,
+ message_formatter: _MessageFormatter = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+) -> bytes: ...
+def PrintMessage(
+ message: Message,
+ out: SupportsWrite[str],
+ indent: int = ...,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ 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 = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+) -> None: ...
+def PrintField(
+ field: FieldDescriptor,
+ value: Any,
+ out: SupportsWrite[str],
+ indent: int = ...,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ use_short_repeated_primitives: bool = ...,
+ pointy_brackets: bool = ...,
+ use_index_order: bool = ...,
+ float_format: str | None = ...,
+ double_format: str | None = ...,
+ message_formatter: _MessageFormatter | None = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+) -> None: ...
+def PrintFieldValue(
+ field: FieldDescriptor,
+ value: Any,
+ out: SupportsWrite[str],
+ indent: int = ...,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ use_short_repeated_primitives: bool = ...,
+ pointy_brackets: bool = ...,
+ use_index_order: bool = ...,
+ float_format: str | None = ...,
+ double_format: str | None = ...,
+ message_formatter: _MessageFormatter | None = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+) -> None: ...
+
+class _Printer:
+ out: SupportsWrite[str]
+ indent: int
+ as_utf8: bool
+ as_one_line: bool
+ 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
+ print_unknown_fields: bool
+ force_colon: bool
+ def __init__(
+ self,
+ out: SupportsWrite[str],
+ indent: int = ...,
+ as_utf8: bool = ...,
+ as_one_line: bool = ...,
+ 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 = ...,
+ print_unknown_fields: bool = ...,
+ force_colon: bool = ...,
+ ) -> None: ...
+ def PrintMessage(self, message: Message) -> None: ...
+ def PrintField(self, field: FieldDescriptor, value: Any) -> None: ...
+ def PrintFieldValue(self, field: FieldDescriptor, value: Any) -> None: ...
+
+def Parse(
+ text: str | bytes,
+ message: _M,
+ allow_unknown_extension: bool = ...,
+ allow_field_number: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ allow_unknown_field: bool = ...,
+) -> _M: ...
+def Merge(
+ text: str | bytes,
+ message: _M,
+ allow_unknown_extension: bool = ...,
+ allow_field_number: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ allow_unknown_field: bool = ...,
+) -> _M: ...
+def MergeLines(
+ lines: Iterable[str | bytes],
+ message: _M,
+ allow_unknown_extension: bool = ...,
+ allow_field_number: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ allow_unknown_field: bool = ...,
+) -> _M: ...
+
+class _Parser:
+ allow_unknown_extension: bool
+ allow_field_number: bool
+ descriptor_pool: DescriptorPool | None
+ allow_unknown_field: bool
+ def __init__(
+ self,
+ allow_unknown_extension: bool = ...,
+ allow_field_number: bool = ...,
+ descriptor_pool: DescriptorPool | None = ...,
+ allow_unknown_field: bool = ...,
+ ) -> None: ...
+ def ParseLines(self, lines: Iterable[str | bytes], message: _M) -> _M: ...
+ def MergeLines(self, lines: Iterable[str | bytes], message: _M) -> _M: ...
+
+_ParseError: TypeAlias = ParseError
+
+class Tokenizer:
+ token: str
+ def __init__(self, lines: Iterable[str], skip_comments: bool = True) -> None: ...
+ def LookingAt(self, token: str) -> bool: ...
+ def AtEnd(self) -> bool: ...
+ def TryConsume(self, token: str) -> bool: ...
+ def Consume(self, token: str) -> None: ...
+ def ConsumeComment(self) -> str: ...
+ def ConsumeCommentOrTrailingComment(self) -> tuple[bool, str]: ...
+ def TryConsumeIdentifier(self) -> bool: ...
+ def ConsumeIdentifier(self) -> str: ...
+ def TryConsumeIdentifierOrNumber(self) -> bool: ...
+ def ConsumeIdentifierOrNumber(self) -> str: ...
+ def TryConsumeInteger(self) -> bool: ...
+ def ConsumeInteger(self) -> int: ...
+ def TryConsumeFloat(self) -> bool: ...
+ def ConsumeFloat(self) -> float: ...
+ def ConsumeBool(self) -> bool: ...
+ def TryConsumeByteString(self) -> bool: ...
+ def ConsumeString(self) -> str: ...
+ def ConsumeByteString(self) -> bytes: ...
+ def ConsumeEnum(self, field: FieldDescriptor) -> int: ...
+ def ParseErrorPreviousToken(self, message: Message) -> _ParseError: ...
+ def ParseError(self, message: Message) -> _ParseError: ...
+ def NextToken(self) -> None: ...
+
+def ParseInteger(text: str, is_signed: bool = ..., is_long: bool = ...) -> int: ...
+def ParseFloat(text: str) -> float: ...
+def ParseBool(text: str) -> bool: ...
+def ParseEnum(field: FieldDescriptor, value: str) -> int: ...
diff --git a/contrib/python/types-protobuf/google-stubs/protobuf/util/__init__.pyi b/contrib/python/types-protobuf/google-stubs/protobuf/util/__init__.pyi
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/contrib/python/types-protobuf/google-stubs/protobuf/util/__init__.pyi