Skip to content

Commit 3f87f79

Browse files
higeburodaine
andauthored
Add isIpPrefix (#78)
Related to: bufbuild/protovalidate#99 --------- Co-authored-by: Chris Roche <github@rodaine.com>
1 parent 202158f commit 3f87f79

10 files changed

Lines changed: 397 additions & 268 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ ADD_LICENSE_HEADER := $(BIN)/license-header \
1616
--license-type apache \
1717
--copyright-holder "Buf Technologies, Inc." \
1818
--year-range "2023"
19-
PROTOVALIDATE_VERSION ?= v0.4.2
19+
PROTOVALIDATE_VERSION ?= v0.5.1
2020

2121
.PHONY: help
2222
help: ## Describe useful make targets

Pipfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ verify_ssl = true
44
name = "pypi"
55

66
[packages]
7-
cel-python = "*"
8-
protobuf = "*"
7+
cel-python = "==0.1.*"
8+
protobuf = "==4.*"
99

1010
[dev-packages]
1111
pytest = "*"

Pipfile.lock

Lines changed: 184 additions & 188 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/buf/validate/conformance/cases/repeated_pb2.py

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
3232

3333

34-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-buf/validate/conformance/cases/repeated.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x38\x62uf/validate/conformance/cases/other_package/embed.proto\x1a\x1b\x62uf/validate/validate.proto\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\"\"\n\x05\x45mbed\x12\x19\n\x03val\x18\x01 \x01(\x03\x42\x07\xbaH\x04\"\x02 \x00R\x03val\" \n\x0cRepeatedNone\x12\x10\n\x03val\x18\x01 \x03(\x03R\x03val\"L\n\x11RepeatedEmbedNone\x12\x37\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedR\x03val\"f\n\x1dRepeatedEmbedCrossPackageNone\x12\x45\n\x03val\x18\x01 \x03(\x0b\x32\x33.buf.validate.conformance.cases.other_package.EmbedR\x03val\"P\n\x0bRepeatedMin\x12\x41\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedB\x08\xbaH\x05\x92\x01\x02\x08\x02R\x03val\")\n\x0bRepeatedMax\x12\x1a\n\x03val\x18\x01 \x03(\x01\x42\x08\xbaH\x05\x92\x01\x02\x10\x03R\x03val\".\n\x0eRepeatedMinMax\x12\x1c\n\x03val\x18\x01 \x03(\x0f\x42\n\xbaH\x07\x92\x01\x04\x08\x02\x10\x04R\x03val\"-\n\rRepeatedExact\x12\x1c\n\x03val\x18\x01 \x03(\rB\n\xbaH\x07\x92\x01\x04\x08\x03\x10\x03R\x03val\",\n\x0eRepeatedUnique\x12\x1a\n\x03val\x18\x01 \x03(\tB\x08\xbaH\x05\x92\x01\x02\x18\x01R\x03val\"5\n\x10RepeatedItemRule\x12!\n\x03val\x18\x01 \x03(\x02\x42\x0f\xbaH\x0c\x92\x01\t\"\x07\n\x05%\x00\x00\x00\x00R\x03val\"D\n\x13RepeatedItemPattern\x12-\n\x03val\x18\x01 \x03(\tB\x1b\xbaH\x18\x92\x01\x15\"\x13r\x11\x32\x0f(?i)^[a-z0-9]+$R\x03val\"Y\n\x11RepeatedEmbedSkip\x12\x44\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedB\x0b\xbaH\x08\x92\x01\x05\"\x03\xc0\x01\x01R\x03val\"8\n\x0eRepeatedItemIn\x12&\n\x03val\x18\x01 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\"\x0cr\nR\x03\x66ooR\x03\x62\x61rR\x03val\";\n\x11RepeatedItemNotIn\x12&\n\x03val\x18\x01 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\"\x0cr\nZ\x03\x66ooZ\x03\x62\x61rR\x03val\"Z\n\x0eRepeatedEnumIn\x12H\n\x03val\x18\x01 \x03(\x0e\x32&.buf.validate.conformance.cases.AnEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\x1a\x01\x00R\x03val\"]\n\x11RepeatedEnumNotIn\x12H\n\x03val\x18\x01 \x03(\x0e\x32&.buf.validate.conformance.cases.AnEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\"\x01\x00R\x03val\"\xe0\x01\n\x16RepeatedEmbeddedEnumIn\x12\x66\n\x03val\x18\x01 \x03(\x0e\x32\x44.buf.validate.conformance.cases.RepeatedEmbeddedEnumIn.AnotherInEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\x1a\x01\x00R\x03val\"^\n\rAnotherInEnum\x12\x1f\n\x1b\x41NOTHER_IN_ENUM_UNSPECIFIED\x10\x00\x12\x15\n\x11\x41NOTHER_IN_ENUM_A\x10\x01\x12\x15\n\x11\x41NOTHER_IN_ENUM_B\x10\x02\"\xf8\x01\n\x19RepeatedEmbeddedEnumNotIn\x12l\n\x03val\x18\x01 \x03(\x0e\x32J.buf.validate.conformance.cases.RepeatedEmbeddedEnumNotIn.AnotherNotInEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\"\x01\x00R\x03val\"m\n\x10\x41notherNotInEnum\x12#\n\x1f\x41NOTHER_NOT_IN_ENUM_UNSPECIFIED\x10\x00\x12\x19\n\x15\x41NOTHER_NOT_IN_ENUM_A\x10\x01\x12\x19\n\x15\x41NOTHER_NOT_IN_ENUM_B\x10\x02\"r\n\rRepeatedAnyIn\x12\x61\n\x03val\x18\x01 \x03(\x0b\x32\x14.google.protobuf.AnyB9\xbaH6\x92\x01\x33\"1\xa2\x01.\x12,type.googleapis.com/google.protobuf.DurationR\x03val\"v\n\x10RepeatedAnyNotIn\x12\x62\n\x03val\x18\x01 \x03(\x0b\x32\x14.google.protobuf.AnyB:\xbaH7\x92\x01\x34\"2\xa2\x01/\x1a-type.googleapis.com/google.protobuf.TimestampR\x03val\":\n\x15RepeatedMinAndItemLen\x12!\n\x03val\x18\x01 \x03(\tB\x0f\xbaH\x0c\x92\x01\t\x08\x01\"\x05r\x03\x98\x01\x03R\x03val\"8\n\x18RepeatedMinAndMaxItemLen\x12\x1c\n\x03val\x18\x01 \x03(\tB\n\xbaH\x07\x92\x01\x04\x08\x01\x10\x03R\x03val\"R\n\x10RepeatedDuration\x12>\n\x03val\x18\x01 \x03(\x0b\x32\x19.google.protobuf.DurationB\x11\xbaH\x0e\x92\x01\x0b\"\t\xaa\x01\x06\x32\x04\x10\xc0\x84=R\x03val\"6\n\x13RepeatedExactIgnore\x12\x1f\n\x03val\x18\x01 \x03(\rB\r\xbaH\n\x92\x01\x04\x08\x03\x10\x03\xd0\x01\x01R\x03val*?\n\x06\x41nEnum\x12\x17\n\x13\x41N_ENUM_UNSPECIFIED\x10\x00\x12\r\n\tAN_ENUM_X\x10\x01\x12\r\n\tAN_ENUM_Y\x10\x02\x62\x06proto3')
34+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-buf/validate/conformance/cases/repeated.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x38\x62uf/validate/conformance/cases/other_package/embed.proto\x1a\x1b\x62uf/validate/validate.proto\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\"\"\n\x05\x45mbed\x12\x19\n\x03val\x18\x01 \x01(\x03\x42\x07\xbaH\x04\"\x02 \x00R\x03val\" \n\x0cRepeatedNone\x12\x10\n\x03val\x18\x01 \x03(\x03R\x03val\"L\n\x11RepeatedEmbedNone\x12\x37\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedR\x03val\"f\n\x1dRepeatedEmbedCrossPackageNone\x12\x45\n\x03val\x18\x01 \x03(\x0b\x32\x33.buf.validate.conformance.cases.other_package.EmbedR\x03val\"P\n\x0bRepeatedMin\x12\x41\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedB\x08\xbaH\x05\x92\x01\x02\x08\x02R\x03val\")\n\x0bRepeatedMax\x12\x1a\n\x03val\x18\x01 \x03(\x01\x42\x08\xbaH\x05\x92\x01\x02\x10\x03R\x03val\".\n\x0eRepeatedMinMax\x12\x1c\n\x03val\x18\x01 \x03(\x0f\x42\n\xbaH\x07\x92\x01\x04\x08\x02\x10\x04R\x03val\"-\n\rRepeatedExact\x12\x1c\n\x03val\x18\x01 \x03(\rB\n\xbaH\x07\x92\x01\x04\x08\x03\x10\x03R\x03val\",\n\x0eRepeatedUnique\x12\x1a\n\x03val\x18\x01 \x03(\tB\x08\xbaH\x05\x92\x01\x02\x18\x01R\x03val\"H\n\x16RepeatedMultipleUnique\x12\x16\n\x01\x61\x18\x01 \x03(\tB\x08\xbaH\x05\x92\x01\x02\x18\x01R\x01\x61\x12\x16\n\x01\x62\x18\x02 \x03(\x05\x42\x08\xbaH\x05\x92\x01\x02\x18\x01R\x01\x62\"5\n\x10RepeatedItemRule\x12!\n\x03val\x18\x01 \x03(\x02\x42\x0f\xbaH\x0c\x92\x01\t\"\x07\n\x05%\x00\x00\x00\x00R\x03val\"D\n\x13RepeatedItemPattern\x12-\n\x03val\x18\x01 \x03(\tB\x1b\xbaH\x18\x92\x01\x15\"\x13r\x11\x32\x0f(?i)^[a-z0-9]+$R\x03val\"Y\n\x11RepeatedEmbedSkip\x12\x44\n\x03val\x18\x01 \x03(\x0b\x32%.buf.validate.conformance.cases.EmbedB\x0b\xbaH\x08\x92\x01\x05\"\x03\xc0\x01\x01R\x03val\"8\n\x0eRepeatedItemIn\x12&\n\x03val\x18\x01 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\"\x0cr\nR\x03\x66ooR\x03\x62\x61rR\x03val\";\n\x11RepeatedItemNotIn\x12&\n\x03val\x18\x01 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\"\x0cr\nZ\x03\x66ooZ\x03\x62\x61rR\x03val\"Z\n\x0eRepeatedEnumIn\x12H\n\x03val\x18\x01 \x03(\x0e\x32&.buf.validate.conformance.cases.AnEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\x1a\x01\x00R\x03val\"]\n\x11RepeatedEnumNotIn\x12H\n\x03val\x18\x01 \x03(\x0e\x32&.buf.validate.conformance.cases.AnEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\"\x01\x00R\x03val\"\xe0\x01\n\x16RepeatedEmbeddedEnumIn\x12\x66\n\x03val\x18\x01 \x03(\x0e\x32\x44.buf.validate.conformance.cases.RepeatedEmbeddedEnumIn.AnotherInEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\x1a\x01\x00R\x03val\"^\n\rAnotherInEnum\x12\x1f\n\x1b\x41NOTHER_IN_ENUM_UNSPECIFIED\x10\x00\x12\x15\n\x11\x41NOTHER_IN_ENUM_A\x10\x01\x12\x15\n\x11\x41NOTHER_IN_ENUM_B\x10\x02\"\xf8\x01\n\x19RepeatedEmbeddedEnumNotIn\x12l\n\x03val\x18\x01 \x03(\x0e\x32J.buf.validate.conformance.cases.RepeatedEmbeddedEnumNotIn.AnotherNotInEnumB\x0e\xbaH\x0b\x92\x01\x08\"\x06\x82\x01\x03\"\x01\x00R\x03val\"m\n\x10\x41notherNotInEnum\x12#\n\x1f\x41NOTHER_NOT_IN_ENUM_UNSPECIFIED\x10\x00\x12\x19\n\x15\x41NOTHER_NOT_IN_ENUM_A\x10\x01\x12\x19\n\x15\x41NOTHER_NOT_IN_ENUM_B\x10\x02\"r\n\rRepeatedAnyIn\x12\x61\n\x03val\x18\x01 \x03(\x0b\x32\x14.google.protobuf.AnyB9\xbaH6\x92\x01\x33\"1\xa2\x01.\x12,type.googleapis.com/google.protobuf.DurationR\x03val\"v\n\x10RepeatedAnyNotIn\x12\x62\n\x03val\x18\x01 \x03(\x0b\x32\x14.google.protobuf.AnyB:\xbaH7\x92\x01\x34\"2\xa2\x01/\x1a-type.googleapis.com/google.protobuf.TimestampR\x03val\":\n\x15RepeatedMinAndItemLen\x12!\n\x03val\x18\x01 \x03(\tB\x0f\xbaH\x0c\x92\x01\t\x08\x01\"\x05r\x03\x98\x01\x03R\x03val\"8\n\x18RepeatedMinAndMaxItemLen\x12\x1c\n\x03val\x18\x01 \x03(\tB\n\xbaH\x07\x92\x01\x04\x08\x01\x10\x03R\x03val\"R\n\x10RepeatedDuration\x12>\n\x03val\x18\x01 \x03(\x0b\x32\x19.google.protobuf.DurationB\x11\xbaH\x0e\x92\x01\x0b\"\t\xaa\x01\x06\x32\x04\x10\xc0\x84=R\x03val\"6\n\x13RepeatedExactIgnore\x12\x1f\n\x03val\x18\x01 \x03(\rB\r\xbaH\n\x92\x01\x04\x08\x03\x10\x03\xd0\x01\x01R\x03val*?\n\x06\x41nEnum\x12\x17\n\x13\x41N_ENUM_UNSPECIFIED\x10\x00\x12\r\n\tAN_ENUM_X\x10\x01\x12\r\n\tAN_ENUM_Y\x10\x02\x62\x06proto3')
3535

3636
_globals = globals()
3737
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -51,6 +51,10 @@
5151
_REPEATEDEXACT.fields_by_name['val']._serialized_options = b'\272H\007\222\001\004\010\003\020\003'
5252
_REPEATEDUNIQUE.fields_by_name['val']._options = None
5353
_REPEATEDUNIQUE.fields_by_name['val']._serialized_options = b'\272H\005\222\001\002\030\001'
54+
_REPEATEDMULTIPLEUNIQUE.fields_by_name['a']._options = None
55+
_REPEATEDMULTIPLEUNIQUE.fields_by_name['a']._serialized_options = b'\272H\005\222\001\002\030\001'
56+
_REPEATEDMULTIPLEUNIQUE.fields_by_name['b']._options = None
57+
_REPEATEDMULTIPLEUNIQUE.fields_by_name['b']._serialized_options = b'\272H\005\222\001\002\030\001'
5458
_REPEATEDITEMRULE.fields_by_name['val']._options = None
5559
_REPEATEDITEMRULE.fields_by_name['val']._serialized_options = b'\272H\014\222\001\t\"\007\n\005%\000\000\000\000'
5660
_REPEATEDITEMPATTERN.fields_by_name['val']._options = None
@@ -81,8 +85,8 @@
8185
_REPEATEDDURATION.fields_by_name['val']._serialized_options = b'\272H\016\222\001\013\"\t\252\001\0062\004\020\300\204='
8286
_REPEATEDEXACTIGNORE.fields_by_name['val']._options = None
8387
_REPEATEDEXACTIGNORE.fields_by_name['val']._serialized_options = b'\272H\n\222\001\004\010\003\020\003\320\001\001'
84-
_globals['_ANENUM']._serialized_start=2239
85-
_globals['_ANENUM']._serialized_end=2302
88+
_globals['_ANENUM']._serialized_start=2313
89+
_globals['_ANENUM']._serialized_end=2376
8690
_globals['_EMBED']._serialized_start=227
8791
_globals['_EMBED']._serialized_end=261
8892
_globals['_REPEATEDNONE']._serialized_start=263
@@ -101,38 +105,40 @@
101105
_globals['_REPEATEDEXACT']._serialized_end=697
102106
_globals['_REPEATEDUNIQUE']._serialized_start=699
103107
_globals['_REPEATEDUNIQUE']._serialized_end=743
104-
_globals['_REPEATEDITEMRULE']._serialized_start=745
105-
_globals['_REPEATEDITEMRULE']._serialized_end=798
106-
_globals['_REPEATEDITEMPATTERN']._serialized_start=800
107-
_globals['_REPEATEDITEMPATTERN']._serialized_end=868
108-
_globals['_REPEATEDEMBEDSKIP']._serialized_start=870
109-
_globals['_REPEATEDEMBEDSKIP']._serialized_end=959
110-
_globals['_REPEATEDITEMIN']._serialized_start=961
111-
_globals['_REPEATEDITEMIN']._serialized_end=1017
112-
_globals['_REPEATEDITEMNOTIN']._serialized_start=1019
113-
_globals['_REPEATEDITEMNOTIN']._serialized_end=1078
114-
_globals['_REPEATEDENUMIN']._serialized_start=1080
115-
_globals['_REPEATEDENUMIN']._serialized_end=1170
116-
_globals['_REPEATEDENUMNOTIN']._serialized_start=1172
117-
_globals['_REPEATEDENUMNOTIN']._serialized_end=1265
118-
_globals['_REPEATEDEMBEDDEDENUMIN']._serialized_start=1268
119-
_globals['_REPEATEDEMBEDDEDENUMIN']._serialized_end=1492
120-
_globals['_REPEATEDEMBEDDEDENUMIN_ANOTHERINENUM']._serialized_start=1398
121-
_globals['_REPEATEDEMBEDDEDENUMIN_ANOTHERINENUM']._serialized_end=1492
122-
_globals['_REPEATEDEMBEDDEDENUMNOTIN']._serialized_start=1495
123-
_globals['_REPEATEDEMBEDDEDENUMNOTIN']._serialized_end=1743
124-
_globals['_REPEATEDEMBEDDEDENUMNOTIN_ANOTHERNOTINENUM']._serialized_start=1634
125-
_globals['_REPEATEDEMBEDDEDENUMNOTIN_ANOTHERNOTINENUM']._serialized_end=1743
126-
_globals['_REPEATEDANYIN']._serialized_start=1745
127-
_globals['_REPEATEDANYIN']._serialized_end=1859
128-
_globals['_REPEATEDANYNOTIN']._serialized_start=1861
129-
_globals['_REPEATEDANYNOTIN']._serialized_end=1979
130-
_globals['_REPEATEDMINANDITEMLEN']._serialized_start=1981
131-
_globals['_REPEATEDMINANDITEMLEN']._serialized_end=2039
132-
_globals['_REPEATEDMINANDMAXITEMLEN']._serialized_start=2041
133-
_globals['_REPEATEDMINANDMAXITEMLEN']._serialized_end=2097
134-
_globals['_REPEATEDDURATION']._serialized_start=2099
135-
_globals['_REPEATEDDURATION']._serialized_end=2181
136-
_globals['_REPEATEDEXACTIGNORE']._serialized_start=2183
137-
_globals['_REPEATEDEXACTIGNORE']._serialized_end=2237
108+
_globals['_REPEATEDMULTIPLEUNIQUE']._serialized_start=745
109+
_globals['_REPEATEDMULTIPLEUNIQUE']._serialized_end=817
110+
_globals['_REPEATEDITEMRULE']._serialized_start=819
111+
_globals['_REPEATEDITEMRULE']._serialized_end=872
112+
_globals['_REPEATEDITEMPATTERN']._serialized_start=874
113+
_globals['_REPEATEDITEMPATTERN']._serialized_end=942
114+
_globals['_REPEATEDEMBEDSKIP']._serialized_start=944
115+
_globals['_REPEATEDEMBEDSKIP']._serialized_end=1033
116+
_globals['_REPEATEDITEMIN']._serialized_start=1035
117+
_globals['_REPEATEDITEMIN']._serialized_end=1091
118+
_globals['_REPEATEDITEMNOTIN']._serialized_start=1093
119+
_globals['_REPEATEDITEMNOTIN']._serialized_end=1152
120+
_globals['_REPEATEDENUMIN']._serialized_start=1154
121+
_globals['_REPEATEDENUMIN']._serialized_end=1244
122+
_globals['_REPEATEDENUMNOTIN']._serialized_start=1246
123+
_globals['_REPEATEDENUMNOTIN']._serialized_end=1339
124+
_globals['_REPEATEDEMBEDDEDENUMIN']._serialized_start=1342
125+
_globals['_REPEATEDEMBEDDEDENUMIN']._serialized_end=1566
126+
_globals['_REPEATEDEMBEDDEDENUMIN_ANOTHERINENUM']._serialized_start=1472
127+
_globals['_REPEATEDEMBEDDEDENUMIN_ANOTHERINENUM']._serialized_end=1566
128+
_globals['_REPEATEDEMBEDDEDENUMNOTIN']._serialized_start=1569
129+
_globals['_REPEATEDEMBEDDEDENUMNOTIN']._serialized_end=1817
130+
_globals['_REPEATEDEMBEDDEDENUMNOTIN_ANOTHERNOTINENUM']._serialized_start=1708
131+
_globals['_REPEATEDEMBEDDEDENUMNOTIN_ANOTHERNOTINENUM']._serialized_end=1817
132+
_globals['_REPEATEDANYIN']._serialized_start=1819
133+
_globals['_REPEATEDANYIN']._serialized_end=1933
134+
_globals['_REPEATEDANYNOTIN']._serialized_start=1935
135+
_globals['_REPEATEDANYNOTIN']._serialized_end=2053
136+
_globals['_REPEATEDMINANDITEMLEN']._serialized_start=2055
137+
_globals['_REPEATEDMINANDITEMLEN']._serialized_end=2113
138+
_globals['_REPEATEDMINANDMAXITEMLEN']._serialized_start=2115
139+
_globals['_REPEATEDMINANDMAXITEMLEN']._serialized_end=2171
140+
_globals['_REPEATEDDURATION']._serialized_start=2173
141+
_globals['_REPEATEDDURATION']._serialized_end=2255
142+
_globals['_REPEATEDEXACTIGNORE']._serialized_start=2257
143+
_globals['_REPEATEDEXACTIGNORE']._serialized_end=2311
138144
# @@protoc_insertion_point(module_scope)

gen/buf/validate/conformance/cases/repeated_pb2.pyi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ class RepeatedUnique(_message.Message):
8787
val: _containers.RepeatedScalarFieldContainer[str]
8888
def __init__(self, val: _Optional[_Iterable[str]] = ...) -> None: ...
8989

90+
class RepeatedMultipleUnique(_message.Message):
91+
__slots__ = ["a", "b"]
92+
A_FIELD_NUMBER: _ClassVar[int]
93+
B_FIELD_NUMBER: _ClassVar[int]
94+
a: _containers.RepeatedScalarFieldContainer[str]
95+
b: _containers.RepeatedScalarFieldContainer[int]
96+
def __init__(self, a: _Optional[_Iterable[str]] = ..., b: _Optional[_Iterable[int]] = ...) -> None: ...
97+
9098
class RepeatedItemRule(_message.Message):
9199
__slots__ = ["val"]
92100
VAL_FIELD_NUMBER: _ClassVar[int]

0 commit comments

Comments
 (0)