Skip to content

Commit

Permalink
Fix behavior of required + ignore_empty constraints (#97)
Browse files Browse the repository at this point in the history
Brings the python library in conformance with the revised spec around
`required` and `ignore_empty` constraints. See
bufbuild/protovalidate#115

The two `# type: ignore` comments are required as typeshed does not
currently recognize the `has_presence` property on FieldDescriptor
class. I may open an upstream patch to add it in (and audit the rest of
the protobuf type definitions).
  • Loading branch information
rodaine authored Nov 7, 2023
1 parent 3f87f79 commit 219c91b
Show file tree
Hide file tree
Showing 16 changed files with 639 additions and 102 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ ADD_LICENSE_HEADER := $(BIN)/license-header \
--license-type apache \
--copyright-holder "Buf Technologies, Inc." \
--year-range "2023"
PROTOVALIDATE_VERSION ?= v0.5.1
PROTOVALIDATE_VERSION ?= v0.5.3

.PHONY: help
help: ## Describe useful make targets
Expand Down
73 changes: 73 additions & 0 deletions gen/buf/validate/conformance/cases/ignore_empty_proto2_pb2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Copyright 2023 Buf Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: buf/validate/conformance/cases/ignore_empty_proto2.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n8buf/validate/conformance/cases/ignore_empty_proto2.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x1b\x62uf/validate/validate.proto\"?\n\x1fIgnoreEmptyProto2ScalarOptional\x12\x1c\n\x03val\x18\x01 \x01(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\"N\n*IgnoreEmptyProto2ScalarOptionalWithDefault\x12 \n\x03val\x18\x01 \x01(\x05:\x02\x34\x32\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\"?\n\x1fIgnoreEmptyProto2ScalarRequired\x12\x1c\n\x03val\x18\x01 \x02(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\"\xc7\x01\n\x18IgnoreEmptyProto2Message\x12\x91\x01\n\x03val\x18\x01 \x01(\x0b\x32<.buf.validate.conformance.cases.IgnoreEmptyProto2Message.MsgBA\xbaH>\xba\x01\x38\n\x1bignore_empty.proto2.message\x12\x06\x66oobar\x1a\x11this.val == \'foo\'\xd0\x01\x01R\x03val\x1a\x17\n\x03Msg\x12\x10\n\x03val\x18\x01 \x01(\tR\x03val\"=\n\x16IgnoreEmptyProto2Oneof\x12\x1e\n\x03val\x18\x01 \x01(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01H\x00R\x03valB\x03\n\x01o\":\n\x19IgnoreEmptyProto2Repeated\x12\x1d\n\x03val\x18\x01 \x03(\x05\x42\x0b\xbaH\x08\x92\x01\x02\x08\x03\xd0\x01\x01R\x03val\"\xac\x01\n\x14IgnoreEmptyProto2Map\x12\\\n\x03val\x18\x01 \x03(\x0b\x32=.buf.validate.conformance.cases.IgnoreEmptyProto2Map.ValEntryB\x0b\xbaH\x08\x9a\x01\x02\x08\x03\xd0\x01\x01R\x03val\x1a\x36\n\x08ValEntry\x12\x10\n\x03key\x18\x01 \x01(\x05R\x03key\x12\x14\n\x05value\x18\x02 \x01(\x05R\x05value:\x02\x38\x01')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'buf.validate.conformance.cases.ignore_empty_proto2_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:

DESCRIPTOR._options = None
_IGNOREEMPTYPROTO2SCALAROPTIONAL.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2SCALAROPTIONAL.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO2SCALAROPTIONALWITHDEFAULT.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2SCALAROPTIONALWITHDEFAULT.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO2SCALARREQUIRED.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2SCALARREQUIRED.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO2MESSAGE.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2MESSAGE.fields_by_name['val']._serialized_options = b'\272H>\272\0018\n\033ignore_empty.proto2.message\022\006foobar\032\021this.val == \'foo\'\320\001\001'
_IGNOREEMPTYPROTO2ONEOF.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2ONEOF.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO2REPEATED.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2REPEATED.fields_by_name['val']._serialized_options = b'\272H\010\222\001\002\010\003\320\001\001'
_IGNOREEMPTYPROTO2MAP_VALENTRY._options = None
_IGNOREEMPTYPROTO2MAP_VALENTRY._serialized_options = b'8\001'
_IGNOREEMPTYPROTO2MAP.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO2MAP.fields_by_name['val']._serialized_options = b'\272H\010\232\001\002\010\003\320\001\001'
_globals['_IGNOREEMPTYPROTO2SCALAROPTIONAL']._serialized_start=121
_globals['_IGNOREEMPTYPROTO2SCALAROPTIONAL']._serialized_end=184
_globals['_IGNOREEMPTYPROTO2SCALAROPTIONALWITHDEFAULT']._serialized_start=186
_globals['_IGNOREEMPTYPROTO2SCALAROPTIONALWITHDEFAULT']._serialized_end=264
_globals['_IGNOREEMPTYPROTO2SCALARREQUIRED']._serialized_start=266
_globals['_IGNOREEMPTYPROTO2SCALARREQUIRED']._serialized_end=329
_globals['_IGNOREEMPTYPROTO2MESSAGE']._serialized_start=332
_globals['_IGNOREEMPTYPROTO2MESSAGE']._serialized_end=531
_globals['_IGNOREEMPTYPROTO2MESSAGE_MSG']._serialized_start=508
_globals['_IGNOREEMPTYPROTO2MESSAGE_MSG']._serialized_end=531
_globals['_IGNOREEMPTYPROTO2ONEOF']._serialized_start=533
_globals['_IGNOREEMPTYPROTO2ONEOF']._serialized_end=594
_globals['_IGNOREEMPTYPROTO2REPEATED']._serialized_start=596
_globals['_IGNOREEMPTYPROTO2REPEATED']._serialized_end=654
_globals['_IGNOREEMPTYPROTO2MAP']._serialized_start=657
_globals['_IGNOREEMPTYPROTO2MAP']._serialized_end=829
_globals['_IGNOREEMPTYPROTO2MAP_VALENTRY']._serialized_start=775
_globals['_IGNOREEMPTYPROTO2MAP_VALENTRY']._serialized_end=829
# @@protoc_insertion_point(module_scope)
75 changes: 75 additions & 0 deletions gen/buf/validate/conformance/cases/ignore_empty_proto2_pb2.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Copyright 2023 Buf Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from buf.validate import validate_pb2 as _validate_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

class IgnoreEmptyProto2ScalarOptional(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto2ScalarOptionalWithDefault(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto2ScalarRequired(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto2Message(_message.Message):
__slots__ = ["val"]
class Msg(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: str
def __init__(self, val: _Optional[str] = ...) -> None: ...
VAL_FIELD_NUMBER: _ClassVar[int]
val: IgnoreEmptyProto2Message.Msg
def __init__(self, val: _Optional[_Union[IgnoreEmptyProto2Message.Msg, _Mapping]] = ...) -> None: ...

class IgnoreEmptyProto2Oneof(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto2Repeated(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, val: _Optional[_Iterable[int]] = ...) -> None: ...

class IgnoreEmptyProto2Map(_message.Message):
__slots__ = ["val"]
class ValEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: int
value: int
def __init__(self, key: _Optional[int] = ..., value: _Optional[int] = ...) -> None: ...
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.ScalarMap[int, int]
def __init__(self, val: _Optional[_Mapping[int, int]] = ...) -> None: ...
81 changes: 81 additions & 0 deletions gen/buf/validate/conformance/cases/ignore_empty_proto3_pb2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Copyright 2023 Buf Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: buf/validate/conformance/cases/ignore_empty_proto3.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n8buf/validate/conformance/cases/ignore_empty_proto3.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x1b\x62uf/validate/validate.proto\"7\n\x17IgnoreEmptyProto3Scalar\x12\x1c\n\x03val\x18\x01 \x01(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\"L\n\x1fIgnoreEmptyProto3OptionalScalar\x12!\n\x03val\x18\x01 \x01(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01H\x00R\x03val\x88\x01\x01\x42\x06\n\x04_val\"\xd4\x01\n\x18IgnoreEmptyProto3Message\x12\x96\x01\n\x03val\x18\x01 \x01(\x0b\x32<.buf.validate.conformance.cases.IgnoreEmptyProto3Message.MsgBA\xbaH>\xba\x01\x38\n\x1bignore_empty.proto3.message\x12\x06\x66oobar\x1a\x11this.val == \'foo\'\xd0\x01\x01H\x00R\x03val\x88\x01\x01\x1a\x17\n\x03Msg\x12\x10\n\x03val\x18\x01 \x01(\tR\x03valB\x06\n\x04_val\"=\n\x16IgnoreEmptyProto3Oneof\x12\x1e\n\x03val\x18\x01 \x01(\x05\x42\n\xbaH\x07\x1a\x02 \x00\xd0\x01\x01H\x00R\x03valB\x03\n\x01o\":\n\x19IgnoreEmptyProto3Repeated\x12\x1d\n\x03val\x18\x01 \x03(\x05\x42\x0b\xbaH\x08\x92\x01\x02\x08\x03\xd0\x01\x01R\x03val\"\xac\x01\n\x14IgnoreEmptyProto3Map\x12\\\n\x03val\x18\x01 \x03(\x0b\x32=.buf.validate.conformance.cases.IgnoreEmptyProto3Map.ValEntryB\x0b\xbaH\x08\x9a\x01\x02\x08\x03\xd0\x01\x01R\x03val\x1a\x36\n\x08ValEntry\x12\x10\n\x03key\x18\x01 \x01(\x05R\x03key\x12\x14\n\x05value\x18\x02 \x01(\x05R\x05value:\x02\x38\x01\"=\n\x18IgnoreEmptyRepeatedItems\x12!\n\x03val\x18\x01 \x03(\x05\x42\x0f\xbaH\x0c\x92\x01\t\"\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\"\xb7\x01\n\x13IgnoreEmptyMapPairs\x12h\n\x03val\x18\x01 \x03(\x0b\x32<.buf.validate.conformance.cases.IgnoreEmptyMapPairs.ValEntryB\x18\xbaH\x15\x9a\x01\x12\"\x07r\x02\x10\x03\xd0\x01\x01*\x07\x1a\x02 \x00\xd0\x01\x01R\x03val\x1a\x36\n\x08ValEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\x05R\x05value:\x02\x38\x01\x62\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'buf.validate.conformance.cases.ignore_empty_proto3_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:

DESCRIPTOR._options = None
_IGNOREEMPTYPROTO3SCALAR.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3SCALAR.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO3OPTIONALSCALAR.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3OPTIONALSCALAR.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO3MESSAGE.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3MESSAGE.fields_by_name['val']._serialized_options = b'\272H>\272\0018\n\033ignore_empty.proto3.message\022\006foobar\032\021this.val == \'foo\'\320\001\001'
_IGNOREEMPTYPROTO3ONEOF.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3ONEOF.fields_by_name['val']._serialized_options = b'\272H\007\032\002 \000\320\001\001'
_IGNOREEMPTYPROTO3REPEATED.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3REPEATED.fields_by_name['val']._serialized_options = b'\272H\010\222\001\002\010\003\320\001\001'
_IGNOREEMPTYPROTO3MAP_VALENTRY._options = None
_IGNOREEMPTYPROTO3MAP_VALENTRY._serialized_options = b'8\001'
_IGNOREEMPTYPROTO3MAP.fields_by_name['val']._options = None
_IGNOREEMPTYPROTO3MAP.fields_by_name['val']._serialized_options = b'\272H\010\232\001\002\010\003\320\001\001'
_IGNOREEMPTYREPEATEDITEMS.fields_by_name['val']._options = None
_IGNOREEMPTYREPEATEDITEMS.fields_by_name['val']._serialized_options = b'\272H\014\222\001\t\"\007\032\002 \000\320\001\001'
_IGNOREEMPTYMAPPAIRS_VALENTRY._options = None
_IGNOREEMPTYMAPPAIRS_VALENTRY._serialized_options = b'8\001'
_IGNOREEMPTYMAPPAIRS.fields_by_name['val']._options = None
_IGNOREEMPTYMAPPAIRS.fields_by_name['val']._serialized_options = b'\272H\025\232\001\022\"\007r\002\020\003\320\001\001*\007\032\002 \000\320\001\001'
_globals['_IGNOREEMPTYPROTO3SCALAR']._serialized_start=121
_globals['_IGNOREEMPTYPROTO3SCALAR']._serialized_end=176
_globals['_IGNOREEMPTYPROTO3OPTIONALSCALAR']._serialized_start=178
_globals['_IGNOREEMPTYPROTO3OPTIONALSCALAR']._serialized_end=254
_globals['_IGNOREEMPTYPROTO3MESSAGE']._serialized_start=257
_globals['_IGNOREEMPTYPROTO3MESSAGE']._serialized_end=469
_globals['_IGNOREEMPTYPROTO3MESSAGE_MSG']._serialized_start=438
_globals['_IGNOREEMPTYPROTO3MESSAGE_MSG']._serialized_end=461
_globals['_IGNOREEMPTYPROTO3ONEOF']._serialized_start=471
_globals['_IGNOREEMPTYPROTO3ONEOF']._serialized_end=532
_globals['_IGNOREEMPTYPROTO3REPEATED']._serialized_start=534
_globals['_IGNOREEMPTYPROTO3REPEATED']._serialized_end=592
_globals['_IGNOREEMPTYPROTO3MAP']._serialized_start=595
_globals['_IGNOREEMPTYPROTO3MAP']._serialized_end=767
_globals['_IGNOREEMPTYPROTO3MAP_VALENTRY']._serialized_start=713
_globals['_IGNOREEMPTYPROTO3MAP_VALENTRY']._serialized_end=767
_globals['_IGNOREEMPTYREPEATEDITEMS']._serialized_start=769
_globals['_IGNOREEMPTYREPEATEDITEMS']._serialized_end=830
_globals['_IGNOREEMPTYMAPPAIRS']._serialized_start=833
_globals['_IGNOREEMPTYMAPPAIRS']._serialized_end=1016
_globals['_IGNOREEMPTYMAPPAIRS_VALENTRY']._serialized_start=962
_globals['_IGNOREEMPTYMAPPAIRS_VALENTRY']._serialized_end=1016
# @@protoc_insertion_point(module_scope)
88 changes: 88 additions & 0 deletions gen/buf/validate/conformance/cases/ignore_empty_proto3_pb2.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Copyright 2023 Buf Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from buf.validate import validate_pb2 as _validate_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

class IgnoreEmptyProto3Scalar(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto3OptionalScalar(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto3Message(_message.Message):
__slots__ = ["val"]
class Msg(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: str
def __init__(self, val: _Optional[str] = ...) -> None: ...
VAL_FIELD_NUMBER: _ClassVar[int]
val: IgnoreEmptyProto3Message.Msg
def __init__(self, val: _Optional[_Union[IgnoreEmptyProto3Message.Msg, _Mapping]] = ...) -> None: ...

class IgnoreEmptyProto3Oneof(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: int
def __init__(self, val: _Optional[int] = ...) -> None: ...

class IgnoreEmptyProto3Repeated(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, val: _Optional[_Iterable[int]] = ...) -> None: ...

class IgnoreEmptyProto3Map(_message.Message):
__slots__ = ["val"]
class ValEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: int
value: int
def __init__(self, key: _Optional[int] = ..., value: _Optional[int] = ...) -> None: ...
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.ScalarMap[int, int]
def __init__(self, val: _Optional[_Mapping[int, int]] = ...) -> None: ...

class IgnoreEmptyRepeatedItems(_message.Message):
__slots__ = ["val"]
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, val: _Optional[_Iterable[int]] = ...) -> None: ...

class IgnoreEmptyMapPairs(_message.Message):
__slots__ = ["val"]
class ValEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: str
value: int
def __init__(self, key: _Optional[str] = ..., value: _Optional[int] = ...) -> None: ...
VAL_FIELD_NUMBER: _ClassVar[int]
val: _containers.ScalarMap[str, int]
def __init__(self, val: _Optional[_Mapping[str, int]] = ...) -> None: ...
Loading

0 comments on commit 219c91b

Please sign in to comment.