add null check in string with regular expression (#15233)

This commit is contained in:
William Cheng 2023-04-16 23:46:17 +08:00 committed by GitHub
parent 738beb401e
commit 70a6106626
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 71 additions and 0 deletions

View File

@ -32,6 +32,18 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
@validator('{{{name}}}')
def {{{name}}}_validate_regular_expression(cls, v):
{{^required}}
if v is None:
return v
{{/required}}
{{#required}}
{{#isNullable}}
if v is None:
return v
{{/isNullable}}
{{/required}}
if not re.match(r"{{{.}}}", v{{#vendorExtensions.x-modifiers}} ,re.{{{.}}}{{/vendorExtensions.x-modifiers}}):
raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}")
return v
@ -43,6 +55,14 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
{{^required}}
if v is None:
return v
{{/required}}
{{#required}}
{{#isNullable}}
if v is None:
return v
{{/isNullable}}
{{/required}}
{{#isArray}}
for i in v:

View File

@ -42,6 +42,7 @@ class DefaultValue(BaseModel):
def array_string_enum_default_validate_enum(cls, v):
if v is None:
return v
for i in v:
if i not in ('success', 'failure', 'unclassified'):
raise ValueError("each list item must be one of ('success', 'failure', 'unclassified')")

View File

@ -41,6 +41,7 @@ class Pet(BaseModel):
def status_validate_enum(cls, v):
if v is None:
return v
if v not in ('available', 'pending', 'sold'):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
return v

View File

@ -35,6 +35,7 @@ class Query(BaseModel):
def outcomes_validate_enum(cls, v):
if v is None:
return v
for i in v:
if i not in ('SUCCESS', 'FAILURE', 'SKIPPED'):
raise ValueError("each list item must be one of ('SUCCESS', 'FAILURE', 'SKIPPED')")

View File

@ -34,6 +34,7 @@ class EnumArrays(BaseModel):
def just_symbol_validate_enum(cls, v):
if v is None:
return v
if v not in ('>=', '$'):
raise ValueError("must be one of enum values ('>=', '$')")
return v
@ -42,6 +43,7 @@ class EnumArrays(BaseModel):
def array_enum_validate_enum(cls, v):
if v is None:
return v
for i in v:
if i not in ('fish', 'crab'):
raise ValueError("each list item must be one of ('fish', 'crab')")

View File

@ -45,6 +45,7 @@ class EnumTest(BaseModel):
def enum_string_validate_enum(cls, v):
if v is None:
return v
if v not in ('UPPER', 'lower', ''):
raise ValueError("must be one of enum values ('UPPER', 'lower', '')")
return v
@ -59,6 +60,7 @@ class EnumTest(BaseModel):
def enum_integer_default_validate_enum(cls, v):
if v is None:
return v
if v not in (1, 5, 14):
raise ValueError("must be one of enum values (1, 5, 14)")
return v
@ -67,6 +69,7 @@ class EnumTest(BaseModel):
def enum_integer_validate_enum(cls, v):
if v is None:
return v
if v not in (1, -1):
raise ValueError("must be one of enum values (1, -1)")
return v
@ -75,6 +78,7 @@ class EnumTest(BaseModel):
def enum_number_validate_enum(cls, v):
if v is None:
return v
if v not in (1.1, -1.2):
raise ValueError("must be one of enum values (1.1, -1.2)")
return v

View File

@ -47,24 +47,36 @@ class FormatTest(BaseModel):
@validator('string')
def string_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"[a-z]", v ,re.IGNORECASE):
raise ValueError(r"must validate the regular expression /[a-z]/i")
return v
@validator('string_with_double_quote_pattern')
def string_with_double_quote_pattern_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"this is \"something\"", v):
raise ValueError(r"must validate the regular expression /this is \"something\"/")
return v
@validator('pattern_with_digits')
def pattern_with_digits_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"^\d{10}$", v):
raise ValueError(r"must validate the regular expression /^\d{10}$/")
return v
@validator('pattern_with_digits_and_delimiter')
def pattern_with_digits_and_delimiter_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"^image_\d{1,3}$", v ,re.IGNORECASE):
raise ValueError(r"must validate the regular expression /^image_\d{1,3}$/i")
return v

View File

@ -36,6 +36,7 @@ class MapTest(BaseModel):
def map_of_enum_string_validate_enum(cls, v):
if v is None:
return v
if v not in ('UPPER', 'lower'):
raise ValueError("must be one of enum values ('UPPER', 'lower')")
return v

View File

@ -38,6 +38,7 @@ class Order(BaseModel):
def status_validate_enum(cls, v):
if v is None:
return v
if v not in ('placed', 'approved', 'delivered'):
raise ValueError("must be one of enum values ('placed', 'approved', 'delivered')")
return v

View File

@ -40,6 +40,7 @@ class Pet(BaseModel):
def status_validate_enum(cls, v):
if v is None:
return v
if v not in ('available', 'pending', 'sold'):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
return v

View File

@ -36,6 +36,7 @@ class SpecialName(BaseModel):
def var_schema_validate_enum(cls, v):
if v is None:
return v
if v not in ('available', 'pending', 'sold'):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
return v

View File

@ -35,6 +35,7 @@ class EnumArrays(BaseModel):
def just_symbol_validate_enum(cls, v):
if v is None:
return v
if v not in ('>=', '$'):
raise ValueError("must be one of enum values ('>=', '$')")
return v
@ -43,6 +44,7 @@ class EnumArrays(BaseModel):
def array_enum_validate_enum(cls, v):
if v is None:
return v
for i in v:
if i not in ('fish', 'crab'):
raise ValueError("each list item must be one of ('fish', 'crab')")

View File

@ -46,6 +46,7 @@ class EnumTest(BaseModel):
def enum_string_validate_enum(cls, v):
if v is None:
return v
if v not in ('UPPER', 'lower', ''):
raise ValueError("must be one of enum values ('UPPER', 'lower', '')")
return v
@ -60,6 +61,7 @@ class EnumTest(BaseModel):
def enum_integer_default_validate_enum(cls, v):
if v is None:
return v
if v not in (1, 5, 14):
raise ValueError("must be one of enum values (1, 5, 14)")
return v
@ -68,6 +70,7 @@ class EnumTest(BaseModel):
def enum_integer_validate_enum(cls, v):
if v is None:
return v
if v not in (1, -1):
raise ValueError("must be one of enum values (1, -1)")
return v
@ -76,6 +79,7 @@ class EnumTest(BaseModel):
def enum_number_validate_enum(cls, v):
if v is None:
return v
if v not in (1.1, -1.2):
raise ValueError("must be one of enum values (1.1, -1.2)")
return v

View File

@ -48,24 +48,36 @@ class FormatTest(BaseModel):
@validator('string')
def string_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"[a-z]", v ,re.IGNORECASE):
raise ValueError(r"must validate the regular expression /[a-z]/i")
return v
@validator('string_with_double_quote_pattern')
def string_with_double_quote_pattern_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"this is \"something\"", v):
raise ValueError(r"must validate the regular expression /this is \"something\"/")
return v
@validator('pattern_with_digits')
def pattern_with_digits_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"^\d{10}$", v):
raise ValueError(r"must validate the regular expression /^\d{10}$/")
return v
@validator('pattern_with_digits_and_delimiter')
def pattern_with_digits_and_delimiter_validate_regular_expression(cls, v):
if v is None:
return v
if not re.match(r"^image_\d{1,3}$", v ,re.IGNORECASE):
raise ValueError(r"must validate the regular expression /^image_\d{1,3}$/i")
return v

View File

@ -37,6 +37,7 @@ class MapTest(BaseModel):
def map_of_enum_string_validate_enum(cls, v):
if v is None:
return v
if v not in ('UPPER', 'lower'):
raise ValueError("must be one of enum values ('UPPER', 'lower')")
return v

View File

@ -39,6 +39,7 @@ class Order(BaseModel):
def status_validate_enum(cls, v):
if v is None:
return v
if v not in ('placed', 'approved', 'delivered'):
raise ValueError("must be one of enum values ('placed', 'approved', 'delivered')")
return v

View File

@ -41,6 +41,7 @@ class Pet(BaseModel):
def status_validate_enum(cls, v):
if v is None:
return v
if v not in ('available', 'pending', 'sold'):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
return v

View File

@ -37,6 +37,7 @@ class SpecialName(BaseModel):
def var_schema_validate_enum(cls, v):
if v is None:
return v
if v not in ('available', 'pending', 'sold'):
raise ValueError("must be one of enum values ('available', 'pending', 'sold')")
return v

View File

@ -314,6 +314,10 @@ class ModelTests(unittest.TestCase):
except ValueError as e:
self.assertTrue(r"must validate the regular expression /^image_\d{1,3}$/i" in str(e))
# test None with optional string (with regualr expression)
a = petstore_api.FormatTest(number=123.45, byte=bytes("string", 'utf-8'), date="2013-09-17", password="testing09876")
a.string = None # shouldn't throw an exception
a.pattern_with_digits_and_delimiter = "IMAGE_123"
self.assertEqual(a.pattern_with_digits_and_delimiter, "IMAGE_123")
a.pattern_with_digits_and_delimiter = "image_123"