diff --git a/stubs/protobuf/@tests/stubtest_allowlist.txt b/stubs/protobuf/@tests/stubtest_allowlist.txt index 8b8dfb1a918e..f688f9a483ff 100644 --- a/stubs/protobuf/@tests/stubtest_allowlist.txt +++ b/stubs/protobuf/@tests/stubtest_allowlist.txt @@ -2,14 +2,24 @@ # carefully in mypy-protobuf which internally runs stubtest. Skip those here. google.protobuf\..*_pb2\..* -google.protobuf.internal.containers.BaseContainer.sort # While Message and Descriptor are both defined with a null DESCRIPTOR, # subclasses of Message and instances of EnumTypeWrapper require this value to # be set, and since these type stubs are intended for use with protoc-generated # python it's more accurate to make them non-nullable. google.protobuf.internal.enum_type_wrapper.EnumTypeWrapper.DESCRIPTOR google.protobuf.message.Message.DESCRIPTOR + +# Exists at runtime, but via a __getitem__/__setitem__ hack +# See https://github.com/protocolbuffers/protobuf/blob/3ea30d80847cd9561db570ae7f673afc15523545/python/google/protobuf/message.py#L67 +google.protobuf.message.Message.Extensions + +# These are typed as (self, **kwargs) at runtime as thin wrapper functions +# around the underlying true typing. We prefer the true typing +google.protobuf.internal.containers.BaseContainer.sort google.protobuf.message.Message.SerializePartialToString google.protobuf.message.Message.SerializeToString -google.protobuf.service.Service.GetDescriptor google.protobuf.text_format.MessageToBytes + +# Stubbed as static method, but actually exists as a property that's +# a function. Typeshed's typing is more useful +google.protobuf.service.Service.GetDescriptor diff --git a/stubs/protobuf/google/protobuf/message.pyi b/stubs/protobuf/google/protobuf/message.pyi index e292803dc486..340b3ac77518 100644 --- a/stubs/protobuf/google/protobuf/message.pyi +++ b/stubs/protobuf/google/protobuf/message.pyi @@ -2,7 +2,7 @@ from _typeshed import Self from typing import Any, Sequence, TypeVar from .descriptor import Descriptor, FieldDescriptor -from .internal.extension_dict import _ExtensionFieldDescriptor +from .internal.extension_dict import _ExtensionDict, _ExtensionFieldDescriptor class Error(Exception): ... class DecodeError(Error): ... @@ -28,6 +28,9 @@ class Message: # The TypeVar must be bound to `Message` or we get mypy errors, so we cannot use `Self` for `HasExtension` & `ClearExtension` def HasExtension(self: _M, extension_handle: _ExtensionFieldDescriptor[_M, Any]) -> bool: ... def ClearExtension(self: _M, extension_handle: _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: type[Self], s: bytes) -> Self: ...