Skip to content

Commit 3d246dd

Browse files
rodainepkwarren
andauthored
Add string.host_and_port support (#132)
See bufbuild/protovalidate#164 --------- Co-authored-by: Philip K. Warren <pkwarren@users.noreply.github.com>
1 parent 677490a commit 3d246dd

File tree

10 files changed

+466
-317
lines changed

10 files changed

+466
-317
lines changed

.github/workflows/ci.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
name: Unit tests
1616
runs-on: ubuntu-latest
1717
strategy:
18+
fail-fast: false
1819
matrix:
1920
python-version: ["3.8", "3.9", "3.10", "3.11"]
2021
steps:
@@ -24,6 +25,8 @@ jobs:
2425
fetch-depth: 1
2526
- name: Install Go
2627
uses: actions/setup-go@v5
28+
with:
29+
go-version: stable
2730
- name: Install Python ${{ matrix.python-version }}
2831
id: python
2932
uses: actions/setup-python@v5

.github/workflows/conformance.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
name: Conformance Testing
1616
runs-on: ubuntu-latest
1717
strategy:
18+
fail-fast: false
1819
matrix:
1920
python-version: ["3.8", "3.9", "3.10", "3.11"]
2021
steps:
@@ -24,6 +25,8 @@ jobs:
2425
fetch-depth: 1
2526
- name: Install Go
2627
uses: actions/setup-go@v5
28+
with:
29+
go-version: stable
2730
- name: Install Python ${{ matrix.python-version }}
2831
id: python
2932
uses: actions/setup-python@v5

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.5.3
19+
PROTOVALIDATE_VERSION ?= v0.5.6
2020

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

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

Lines changed: 255 additions & 229 deletions
Large diffs are not rendered by default.

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,33 @@ class Int64Ignore(_message.Message):
361361
val: int
362362
def __init__(self, val: _Optional[int] = ...) -> None: ...
363363

364+
class Int64BigConstraints(_message.Message):
365+
__slots__ = ["lt_pos", "lt_neg", "gt_pos", "gt_neg", "lte_pos", "lte_neg", "gte_pos", "gte_neg", "constant_pos", "constant_neg", "notin"]
366+
LT_POS_FIELD_NUMBER: _ClassVar[int]
367+
LT_NEG_FIELD_NUMBER: _ClassVar[int]
368+
GT_POS_FIELD_NUMBER: _ClassVar[int]
369+
GT_NEG_FIELD_NUMBER: _ClassVar[int]
370+
LTE_POS_FIELD_NUMBER: _ClassVar[int]
371+
LTE_NEG_FIELD_NUMBER: _ClassVar[int]
372+
GTE_POS_FIELD_NUMBER: _ClassVar[int]
373+
GTE_NEG_FIELD_NUMBER: _ClassVar[int]
374+
CONSTANT_POS_FIELD_NUMBER: _ClassVar[int]
375+
CONSTANT_NEG_FIELD_NUMBER: _ClassVar[int]
376+
IN_FIELD_NUMBER: _ClassVar[int]
377+
NOTIN_FIELD_NUMBER: _ClassVar[int]
378+
lt_pos: int
379+
lt_neg: int
380+
gt_pos: int
381+
gt_neg: int
382+
lte_pos: int
383+
lte_neg: int
384+
gte_pos: int
385+
gte_neg: int
386+
constant_pos: int
387+
constant_neg: int
388+
notin: int
389+
def __init__(self, lt_pos: _Optional[int] = ..., lt_neg: _Optional[int] = ..., gt_pos: _Optional[int] = ..., gt_neg: _Optional[int] = ..., lte_pos: _Optional[int] = ..., lte_neg: _Optional[int] = ..., gte_pos: _Optional[int] = ..., gte_neg: _Optional[int] = ..., constant_pos: _Optional[int] = ..., constant_neg: _Optional[int] = ..., notin: _Optional[int] = ..., **kwargs) -> None: ...
390+
364391
class Int64IncorrectType(_message.Message):
365392
__slots__ = ["val"]
366393
VAL_FIELD_NUMBER: _ClassVar[int]

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
2929

3030

31-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,buf/validate/conformance/cases/strings.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x1b\x62uf/validate/validate.proto\"\x1e\n\nStringNone\x12\x10\n\x03val\x18\x01 \x01(\tR\x03val\"+\n\x0bStringConst\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05\n\x03\x66ooR\x03val\"-\n\x08StringIn\x12!\n\x03val\x18\x01 \x01(\tB\x0f\xbaH\x0cr\nR\x03\x62\x61rR\x03\x62\x61zR\x03val\"2\n\x0bStringNotIn\x12#\n\x03val\x18\x01 \x01(\tB\x11\xbaH\x0er\x0cZ\x04\x66izzZ\x04\x62uzzR\x03val\"\'\n\tStringLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x98\x01\x03R\x03val\")\n\x0cStringMinLen\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x03val\")\n\x0cStringMaxLen\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x18\x05R\x03val\".\n\x0fStringMinMaxLen\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04\x10\x03\x18\x05R\x03val\"3\n\x14StringEqualMinMaxLen\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04\x10\x05\x18\x05R\x03val\",\n\x0eStringLenBytes\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xa0\x01\x04R\x03val\"+\n\x0eStringMinBytes\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02 \x04R\x03val\"+\n\x0eStringMaxBytes\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02(\x08R\x03val\"0\n\x11StringMinMaxBytes\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04 \x04(\x08R\x03val\"5\n\x16StringEqualMinMaxBytes\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04 \x04(\x04R\x03val\"9\n\rStringPattern\x12(\n\x03val\x18\x01 \x01(\tB\x16\xbaH\x13r\x11\x32\x0f(?i)^[a-z0-9]+$R\x03val\"9\n\x14StringPatternEscapes\x12!\n\x03val\x18\x01 \x01(\tB\x0f\xbaH\x0cr\n2\x08\\* \\\\ \\wR\x03val\",\n\x0cStringPrefix\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05:\x03\x66ooR\x03val\".\n\x0eStringContains\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05J\x03\x62\x61rR\x03val\"2\n\x11StringNotContains\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xba\x01\x03\x62\x61rR\x03val\",\n\x0cStringSuffix\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05\x42\x03\x62\x61zR\x03val\"(\n\x0bStringEmail\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02`\x01R\x03val\"+\n\rStringAddress\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xa8\x01\x01R\x03val\"+\n\x0eStringHostname\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02h\x01R\x03val\"%\n\x08StringIP\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02p\x01R\x03val\"\'\n\nStringIPv4\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02x\x01R\x03val\"(\n\nStringIPv6\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x80\x01\x01R\x03val\"3\n\x15StringIPWithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xd0\x01\x01R\x03val\"5\n\x17StringIPv4WithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xd8\x01\x01R\x03val\"5\n\x17StringIPv6WithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xe0\x01\x01R\x03val\",\n\x0eStringIPPrefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xe8\x01\x01R\x03val\".\n\x10StringIPv4Prefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xf0\x01\x01R\x03val\".\n\x10StringIPv6Prefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xf8\x01\x01R\x03val\"\'\n\tStringURI\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03val\"*\n\x0cStringURIRef\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x90\x01\x01R\x03val\"(\n\nStringUUID\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x03val\"2\n\x14StringHttpHeaderName\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xc0\x01\x01R\x03val\"3\n\x15StringHttpHeaderValue\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xc0\x01\x02R\x03val\":\n\x19StringHttpHeaderNameLoose\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\x01\x01\xc8\x01\x00R\x03val\";\n\x1aStringHttpHeaderValueLoose\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\x01\x02\xc8\x01\x00R\x03val\"1\n\x10StringUUIDIgnore\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x03\xb0\x01\x01\xd0\x01\x01R\x03val\"7\n\rStringInOneof\x12\x1f\n\x03\x62\x61r\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06R\x01\x61R\x01\x62H\x00R\x03\x62\x61rB\x05\n\x03\x66oob\x06proto3')
31+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,buf/validate/conformance/cases/strings.proto\x12\x1e\x62uf.validate.conformance.cases\x1a\x1b\x62uf/validate/validate.proto\"\x1e\n\nStringNone\x12\x10\n\x03val\x18\x01 \x01(\tR\x03val\"+\n\x0bStringConst\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05\n\x03\x66ooR\x03val\"-\n\x08StringIn\x12!\n\x03val\x18\x01 \x01(\tB\x0f\xbaH\x0cr\nR\x03\x62\x61rR\x03\x62\x61zR\x03val\"2\n\x0bStringNotIn\x12#\n\x03val\x18\x01 \x01(\tB\x11\xbaH\x0er\x0cZ\x04\x66izzZ\x04\x62uzzR\x03val\"\'\n\tStringLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x98\x01\x03R\x03val\")\n\x0cStringMinLen\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x03val\")\n\x0cStringMaxLen\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x18\x05R\x03val\".\n\x0fStringMinMaxLen\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04\x10\x03\x18\x05R\x03val\"3\n\x14StringEqualMinMaxLen\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04\x10\x05\x18\x05R\x03val\",\n\x0eStringLenBytes\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xa0\x01\x04R\x03val\"+\n\x0eStringMinBytes\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02 \x04R\x03val\"+\n\x0eStringMaxBytes\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02(\x08R\x03val\"0\n\x11StringMinMaxBytes\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04 \x04(\x08R\x03val\"5\n\x16StringEqualMinMaxBytes\x12\x1b\n\x03val\x18\x01 \x01(\tB\t\xbaH\x06r\x04 \x04(\x04R\x03val\"9\n\rStringPattern\x12(\n\x03val\x18\x01 \x01(\tB\x16\xbaH\x13r\x11\x32\x0f(?i)^[a-z0-9]+$R\x03val\"9\n\x14StringPatternEscapes\x12!\n\x03val\x18\x01 \x01(\tB\x0f\xbaH\x0cr\n2\x08\\* \\\\ \\wR\x03val\",\n\x0cStringPrefix\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05:\x03\x66ooR\x03val\".\n\x0eStringContains\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05J\x03\x62\x61rR\x03val\"2\n\x11StringNotContains\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xba\x01\x03\x62\x61rR\x03val\",\n\x0cStringSuffix\x12\x1c\n\x03val\x18\x01 \x01(\tB\n\xbaH\x07r\x05\x42\x03\x62\x61zR\x03val\"(\n\x0bStringEmail\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02`\x01R\x03val\"+\n\rStringAddress\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xa8\x01\x01R\x03val\"+\n\x0eStringHostname\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02h\x01R\x03val\"%\n\x08StringIP\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02p\x01R\x03val\"\'\n\nStringIPv4\x12\x19\n\x03val\x18\x01 \x01(\tB\x07\xbaH\x04r\x02x\x01R\x03val\"(\n\nStringIPv6\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x80\x01\x01R\x03val\"3\n\x15StringIPWithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xd0\x01\x01R\x03val\"5\n\x17StringIPv4WithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xd8\x01\x01R\x03val\"5\n\x17StringIPv6WithPrefixLen\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xe0\x01\x01R\x03val\",\n\x0eStringIPPrefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xe8\x01\x01R\x03val\".\n\x10StringIPv4Prefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xf0\x01\x01R\x03val\".\n\x10StringIPv6Prefix\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xf8\x01\x01R\x03val\"\'\n\tStringURI\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03val\"*\n\x0cStringURIRef\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x90\x01\x01R\x03val\"(\n\nStringUUID\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x03val\"2\n\x14StringHttpHeaderName\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xc0\x01\x01R\x03val\"3\n\x15StringHttpHeaderValue\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xc0\x01\x02R\x03val\":\n\x19StringHttpHeaderNameLoose\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\x01\x01\xc8\x01\x00R\x03val\";\n\x1aStringHttpHeaderValueLoose\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\x01\x02\xc8\x01\x00R\x03val\"1\n\x10StringUUIDIgnore\x12\x1d\n\x03val\x18\x01 \x01(\tB\x0b\xbaH\x08r\x03\xb0\x01\x01\xd0\x01\x01R\x03val\"7\n\rStringInOneof\x12\x1f\n\x03\x62\x61r\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06R\x01\x61R\x01\x62H\x00R\x03\x62\x61rB\x05\n\x03\x66oo\"/\n\x11StringHostAndPort\x12\x1a\n\x03val\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x80\x02\x01R\x03val\"\xa4\x01\n\x19StringHostAndOptionalPort\x12\x86\x01\n\x03val\x18\x01 \x01(\tBt\xbaHq\xba\x01n\n\"string.host_and_port.optional_port\x12-value must be a host and (optional) port pair\x1a\x19this.isHostAndPort(false)R\x03valb\x06proto3')
3232

3333
_globals = globals()
3434
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -116,6 +116,10 @@
116116
_STRINGUUIDIGNORE.fields_by_name['val']._serialized_options = b'\272H\010r\003\260\001\001\320\001\001'
117117
_STRINGINONEOF.fields_by_name['bar']._options = None
118118
_STRINGINONEOF.fields_by_name['bar']._serialized_options = b'\272H\010r\006R\001aR\001b'
119+
_STRINGHOSTANDPORT.fields_by_name['val']._options = None
120+
_STRINGHOSTANDPORT.fields_by_name['val']._serialized_options = b'\272H\005r\003\200\002\001'
121+
_STRINGHOSTANDOPTIONALPORT.fields_by_name['val']._options = None
122+
_STRINGHOSTANDOPTIONALPORT.fields_by_name['val']._serialized_options = b'\272Hq\272\001n\n\"string.host_and_port.optional_port\022-value must be a host and (optional) port pair\032\031this.isHostAndPort(false)'
119123
_globals['_STRINGNONE']._serialized_start=109
120124
_globals['_STRINGNONE']._serialized_end=139
121125
_globals['_STRINGCONST']._serialized_start=141
@@ -198,4 +202,8 @@
198202
_globals['_STRINGUUIDIGNORE']._serialized_end=2025
199203
_globals['_STRINGINONEOF']._serialized_start=2027
200204
_globals['_STRINGINONEOF']._serialized_end=2082
205+
_globals['_STRINGHOSTANDPORT']._serialized_start=2084
206+
_globals['_STRINGHOSTANDPORT']._serialized_end=2131
207+
_globals['_STRINGHOSTANDOPTIONALPORT']._serialized_start=2134
208+
_globals['_STRINGHOSTANDOPTIONALPORT']._serialized_end=2298
201209
# @@protoc_insertion_point(module_scope)

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,3 +264,15 @@ class StringInOneof(_message.Message):
264264
BAR_FIELD_NUMBER: _ClassVar[int]
265265
bar: str
266266
def __init__(self, bar: _Optional[str] = ...) -> None: ...
267+
268+
class StringHostAndPort(_message.Message):
269+
__slots__ = ["val"]
270+
VAL_FIELD_NUMBER: _ClassVar[int]
271+
val: str
272+
def __init__(self, val: _Optional[str] = ...) -> None: ...
273+
274+
class StringHostAndOptionalPort(_message.Message):
275+
__slots__ = ["val"]
276+
VAL_FIELD_NUMBER: _ClassVar[int]
277+
val: str
278+
def __init__(self, val: _Optional[str] = ...) -> None: ...

gen/buf/validate/validate_pb2.py

Lines changed: 70 additions & 64 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)