From fac576a2bf206020c8fc17e815be0b20bacec668 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 22 Aug 2022 15:34:48 -0700 Subject: [PATCH] [python-experimental] move validations into cls (#13252) * Adds null checks to validation properties * Modifies the templates to move validations into the cls * Regnerates unit test spec * Template update to get rid of cls factory for validations * Updates samples for unit test spec * Moves SchemaValidator class * Removes SchemaValidator * Fixes 2 tests in v3 sample * Reverts version files * Reverts 2 files --- .../schema_composed_or_anytype.handlebars | 10 +- .../model_templates/schema_dict.handlebars | 6 +- .../model_templates/schema_list.handlebars | 6 +- .../model_templates/schema_simple.handlebars | 6 +- .../model_templates/validations.handlebars | 74 ++- .../python-experimental/schemas.handlebars | 532 +++++++++--------- ...tionalproperties_are_allowed_by_default.py | 2 +- ...operties_should_not_look_in_applicators.py | 4 +- .../unit_test_api/model/allof.py | 6 +- .../model/allof_combined_with_anyof_oneof.py | 20 +- .../unit_test_api/model/allof_simple_types.py | 14 +- .../model/allof_with_base_schema.py | 6 +- .../model/allof_with_one_empty_schema.py | 2 +- .../allof_with_the_first_empty_schema.py | 2 +- .../model/allof_with_the_last_empty_schema.py | 2 +- .../model/allof_with_two_empty_schemas.py | 2 +- .../unit_test_api/model/anyof.py | 8 +- .../model/anyof_complex_types.py | 6 +- .../model/anyof_with_base_schema.py | 12 +- .../model/anyof_with_one_empty_schema.py | 2 +- .../unit_test_api/model/by_int.py | 6 +- .../unit_test_api/model/by_number.py | 6 +- .../unit_test_api/model/by_small_number.py | 6 +- .../unit_test_api/model/forbidden_property.py | 4 +- ...not_raise_error_when_float_division_inf.py | 4 +- .../model/invalid_string_value_for_default.py | 6 +- .../unit_test_api/model/maximum_validation.py | 6 +- ...aximum_validation_with_unsigned_integer.py | 6 +- .../model/maxitems_validation.py | 6 +- .../model/maxlength_validation.py | 6 +- ...axproperties0_means_the_object_is_empty.py | 6 +- .../model/maxproperties_validation.py | 6 +- .../unit_test_api/model/minimum_validation.py | 6 +- .../minimum_validation_with_signed_integer.py | 6 +- .../model/minitems_validation.py | 6 +- .../model/minlength_validation.py | 6 +- .../model/minproperties_validation.py | 6 +- .../unit_test_api/model/model_not.py | 2 +- ...ted_allof_to_check_validation_semantics.py | 4 +- ...ted_anyof_to_check_validation_semantics.py | 4 +- ...ted_oneof_to_check_validation_semantics.py | 4 +- .../model/not_more_complex_schema.py | 2 +- .../model/object_properties_validation.py | 2 +- .../unit_test_api/model/oneof.py | 8 +- .../model/oneof_complex_types.py | 6 +- .../model/oneof_with_base_schema.py | 12 +- .../model/oneof_with_empty_schema.py | 2 +- .../model/oneof_with_required.py | 4 +- .../model/pattern_is_not_anchored.py | 10 +- .../unit_test_api/model/pattern_validation.py | 10 +- .../properties_with_escaped_characters.py | 2 +- ...perty_named_ref_that_is_not_a_reference.py | 2 +- .../unit_test_api/model/ref_in_allof.py | 2 +- .../unit_test_api/model/ref_in_anyof.py | 2 +- .../unit_test_api/model/ref_in_not.py | 2 +- .../unit_test_api/model/ref_in_oneof.py | 2 +- .../unit_test_api/model/ref_in_property.py | 2 +- .../model/required_default_validation.py | 2 +- .../model/required_validation.py | 2 +- .../model/required_with_empty_array.py | 2 +- .../model/required_with_escaped_characters.py | 2 +- ..._do_anything_if_the_property_is_missing.py | 4 +- .../model/uniqueitems_false_validation.py | 4 +- .../model/uniqueitems_validation.py | 6 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../post.py | 2 +- .../unit_test_api/schemas.py | 532 +++++++++--------- .../petstore_api/model/any_type_not_string.py | 2 +- .../petstore_api/model/apple.py | 22 +- .../model/array_with_validations_in_items.py | 8 +- .../petstore_api/model/cat.py | 2 +- .../petstore_api/model/child_cat.py | 2 +- .../petstore_api/model/class_model.py | 2 +- .../model/complex_quadrilateral.py | 2 +- ...d_any_of_different_types_no_validations.py | 2 +- .../model/composed_one_of_different_types.py | 22 +- .../model/date_time_with_validations.py | 8 +- .../model/date_with_validations.py | 8 +- .../petstore_api/model/dog.py | 2 +- .../model/equilateral_triangle.py | 2 +- .../petstore_api/model/format_test.py | 80 +-- .../petstore_api/model/fruit.py | 2 +- .../petstore_api/model/fruit_req.py | 2 +- .../petstore_api/model/gm_fruit.py | 2 +- .../petstore_api/model/integer_max10.py | 4 +- .../petstore_api/model/integer_min15.py | 4 +- .../petstore_api/model/isosceles_triangle.py | 2 +- .../petstore_api/model/mammal.py | 2 +- .../petstore_api/model/model200_response.py | 2 +- .../petstore_api/model/model_return.py | 2 +- .../petstore_api/model/name.py | 2 +- .../petstore_api/model/nullable_shape.py | 2 +- .../model/number_with_validations.py | 6 +- ...object_with_inline_composition_property.py | 6 +- .../model/object_with_validations.py | 4 +- .../petstore_api/model/pig.py | 2 +- .../petstore_api/model/quadrilateral.py | 2 +- .../model/quadrilateral_interface.py | 2 +- .../petstore_api/model/scalene_triangle.py | 2 +- .../petstore_api/model/shape.py | 2 +- .../petstore_api/model/shape_or_null.py | 2 +- .../model/simple_quadrilateral.py | 2 +- .../petstore_api/model/some_object.py | 2 +- .../model/string_with_validation.py | 4 +- .../petstore_api/model/triangle.py | 2 +- .../petstore_api/model/triangle_interface.py | 2 +- .../petstore_api/model/user.py | 2 +- .../petstore_api/model/uuid_string.py | 4 +- .../petstore_api/paths/fake_1/post.py | 56 +- .../paths/fake_inline_composition_/post.py | 36 +- .../paths/store_order_order_id_1/get.py | 6 +- .../petstore_api/schemas.py | 532 +++++++++--------- .../test_date_time_with_validations.py | 2 +- .../test_date_with_validations.py | 2 +- .../tests_manual/test_validate.py | 8 +- 121 files changed, 1084 insertions(+), 1268 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_composed_or_anytype.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_composed_or_anytype.handlebars index fc3c94622926..c924df0e871f 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_composed_or_anytype.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_composed_or_anytype.handlebars @@ -1,14 +1,11 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}( -{{#if hasValidation}} - {{> model_templates/validations }} -{{/if}} {{#if getIsAnyType}} {{#if composedSchemas}} - schemas.ComposedSchema + schemas.ComposedSchema, {{else}} - schemas.AnyTypeSchema + schemas.AnyTypeSchema, {{/if}} {{else}} {{#if getHasMultipleTypes}} @@ -34,6 +31,9 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}} {{/if}} """ {{/if}} +{{#if hasValidation}} + {{> model_templates/validations }} +{{/if}} {{#or isMap isAnyType}} {{> model_templates/dict_partial }} {{/or}} diff --git a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_dict.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_dict.handlebars index 9563ea5d15e0..f3b3a83ab787 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_dict.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_dict.handlebars @@ -1,9 +1,6 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}( -{{#if hasValidation}} - {{> model_templates/validations }} -{{/if}} schemas.DictSchema ): {{#if this.classname}} @@ -17,6 +14,9 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}} {{/if}} """ {{/if}} +{{#if hasValidation}} + {{> model_templates/validations }} +{{/if}} {{> model_templates/dict_partial }} diff --git a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_list.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_list.handlebars index b012c9bd2b82..c4d8cb4859c2 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_list.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_list.handlebars @@ -1,9 +1,6 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}( -{{#if hasValidation}} - {{> model_templates/validations }} -{{/if}} schemas.ListSchema ): {{#if this.classname}} @@ -17,6 +14,9 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}} {{/if}} """ {{/if}} +{{#if hasValidation}} + {{> model_templates/validations }} +{{/if}} {{#with items}} {{#if complexType}} diff --git a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_simple.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_simple.handlebars index ea12a00ff406..e73fabf3a4ac 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_simple.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/schema_simple.handlebars @@ -1,9 +1,6 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}}{{else}}{{baseName}}{{/if}}{{/if}}( -{{#if hasValidation}} - {{> model_templates/validations }} -{{/if}} {{#if isEnum}} {{> model_templates/enum_value_to_name }} {{/if}} @@ -20,6 +17,9 @@ class {{#if this.classname}}{{classname}}{{else}}{{#if nameInSnakeCase}}{{name}} {{/if}} """ {{/if}} +{{#if hasValidation}} + {{> model_templates/validations }} +{{/if}} {{#if isEnum}} {{> model_templates/enums }} {{else}} diff --git a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/validations.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/validations.handlebars index bd40b7ee6c07..47f512bfbb21 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/model_templates/validations.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/model_templates/validations.handlebars @@ -1,50 +1,48 @@ -schemas.SchemaValidatorClsFactory( {{#if getUniqueItems}} - unique_items=True, +_unique_items=True {{/if}} -{{#if maxLength}} - max_length={{maxLength}}, -{{/if}} -{{#if minLength}} - min_length={{minLength}}, -{{/if}} -{{#if maxItems}} - max_items={{maxItems}}, -{{/if}} -{{#if minItems}} - min_items={{minItems}}, -{{/if}} -{{#neq maxProperties null }} - max_properties={{maxProperties}}, +{{#neq maxLength null}} +_max_length={{maxLength}} {{/neq}} -{{#if minProperties}} - min_properties={{minProperties}}, -{{/if}} -{{#if maximum}} - {{#if exclusiveMaximum}}exclusive_maximum{{/if}}inclusive_maximum{{#unless exclusiveMaximum}}{{/unless}}={{maximum}}, -{{/if}} -{{#if minimum}} - {{#if exclusiveMinimum}}exclusive_minimum{{/if}}inclusive_minimum{{#unless exclusiveMinimum}}{{/unless}}={{minimum}}, -{{/if}} -{{#if pattern}} - regex=[{ +{{#neq minLength null}} +_min_length={{minLength}} +{{/neq}} +{{#neq maxItems null}} +_max_items={{maxItems}} +{{/neq}} +{{#neq minItems null}} +_min_items={{minItems}} +{{/neq}} +{{#neq maxProperties null }} +_max_properties={{maxProperties}} +{{/neq}} +{{#neq minProperties null}} +_min_properties={{minProperties}} +{{/neq}} +{{#neq maximum null}} +_{{#if exclusiveMaximum}}exclusive_maximum{{/if}}inclusive_maximum{{#unless exclusiveMaximum}}{{/unless}}={{maximum}} +{{/neq}} +{{#neq minimum null}} +_{{#if exclusiveMinimum}}exclusive_minimum{{/if}}inclusive_minimum{{#unless exclusiveMinimum}}{{/unless}}={{minimum}} +{{/neq}} +{{#neq pattern null}} +_regex=[{ {{#if vendorExtensions.x-regex}} - 'pattern': r'{{{vendorExtensions.x-regex}}}', # noqa: E501 + 'pattern': r'{{{vendorExtensions.x-regex}}}', # noqa: E501 {{else}} - 'pattern': r'{{{pattern}}}', # noqa: E501 + 'pattern': r'{{{pattern}}}', # noqa: E501 {{/if}} {{#each vendorExtensions.x-modifiers}} {{#if @first}} - 'flags': ( + 'flags': ( {{/if}} - {{#unless @first}}| {{/unless}}re.{{.}} + {{#unless @first}}| {{/unless}}re.{{.}} {{#if @last}} - ) + ) {{/if}} {{/each}} - }], -{{/if}} -{{#if multipleOf}} - multiple_of={{multipleOf}}, -{{/if}} -), +}] +{{/neq}} +{{#neq multipleOf null}} +_multiple_of={{multipleOf}} +{{/neq}} diff --git a/modules/openapi-generator/src/main/resources/python-experimental/schemas.handlebars b/modules/openapi-generator/src/main/resources/python-experimental/schemas.handlebars index 9116f664bc25..77ad99feb5b2 100644 --- a/modules/openapi-generator/src/main/resources/python-experimental/schemas.handlebars +++ b/modules/openapi-generator/src/main/resources/python-experimental/schemas.handlebars @@ -142,226 +142,6 @@ class ValidationMetadata(frozendict): return self.get('validated_path_to_schemas') -class ValidatorBase: - @staticmethod - def __is_json_validation_enabled(schema_keyword, configuration=None): - """Returns true if JSON schema validation is enabled for the specified - validation keyword. This can be used to skip JSON schema structural validation - as requested in the configuration. - - Args: - schema_keyword (string): the name of a JSON schema validation keyword. - configuration (Configuration): the configuration class. - """ - - return (configuration is None or - not hasattr(configuration, '_disabled_client_side_validations') or - schema_keyword not in configuration._disabled_client_side_validations) - - @staticmethod - def __raise_validation_error_message(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): - raise ApiValueError( - "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( - value=value, - constraint_msg=constraint_msg, - constraint_value=constraint_value, - additional_txt=additional_txt, - path_to_item=path_to_item, - ) - ) - - @classmethod - def __check_str_validations(cls, - validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxLength', validation_metadata.configuration) and - 'max_length' in validations and - len(input_values) > validations['max_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be less than or equal to", - constraint_value=validations['max_length'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minLength', validation_metadata.configuration) and - 'min_length' in validations and - len(input_values) < validations['min_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be greater than or equal to", - constraint_value=validations['min_length'], - path_to_item=validation_metadata.path_to_item - ) - - checked_value = input_values - if (cls.__is_json_validation_enabled('pattern', validation_metadata.configuration) and - 'regex' in validations): - for regex_dict in validations['regex']: - flags = regex_dict.get('flags', 0) - if not re.search(regex_dict['pattern'], checked_value, flags=flags): - if flags != 0: - # Don't print the regex flags if the flags are not - # specified in the OAS document. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item, - additional_txt=" with flags=`{}`".format(flags) - ) - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_tuple_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxItems', validation_metadata.configuration) and - 'max_items' in validations and - len(input_values) > validations['max_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be less than or equal to", - constraint_value=validations['max_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minItems', validation_metadata.configuration) and - 'min_items' in validations and - len(input_values) < validations['min_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be greater than or equal to", - constraint_value=validations['min_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('uniqueItems', validation_metadata.configuration) and - 'unique_items' in validations and validations['unique_items'] and input_values): - unique_items = set(input_values) - if len(input_values) > len(unique_items): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", - constraint_value='unique_items==True', - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_dict_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxProperties', validation_metadata.configuration) and - 'max_properties' in validations and - len(input_values) > validations['max_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be less than or equal to", - constraint_value=validations['max_properties'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minProperties', validation_metadata.configuration) and - 'min_properties' in validations and - len(input_values) < validations['min_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be greater than or equal to", - constraint_value=validations['min_properties'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_numeric_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if cls.__is_json_validation_enabled('multipleOf', - validation_metadata.configuration) and 'multiple_of' in validations: - multiple_of_value = validations['multiple_of'] - if (isinstance(input_values, decimal.Decimal) and - not (float(input_values) / multiple_of_value).is_integer() - ): - # Note 'multipleOf' will be as good as the floating point arithmetic. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="value must be a multiple of", - constraint_value=multiple_of_value, - path_to_item=validation_metadata.path_to_item - ) - - checking_max_or_min_values = {'exclusive_maximum', 'inclusive_maximum', 'exclusive_minimum', - 'inclusive_minimum'}.isdisjoint(validations) is False - if not checking_max_or_min_values: - return - max_val = input_values - min_val = input_values - - if (cls.__is_json_validation_enabled('exclusiveMaximum', validation_metadata.configuration) and - 'exclusive_maximum' in validations and - max_val >= validations['exclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('maximum', validation_metadata.configuration) and - 'inclusive_maximum' in validations and - max_val > validations['inclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than or equal to", - constraint_value=validations['inclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('exclusiveMinimum', validation_metadata.configuration) and - 'exclusive_minimum' in validations and - min_val <= validations['exclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minimum', validation_metadata.configuration) and - 'inclusive_minimum' in validations and - min_val < validations['inclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than or equal to", - constraint_value=validations['inclusive_minimum'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def _check_validations_for_types( - cls, - validations, - input_values, - validation_metadata: ValidationMetadata - ): - if isinstance(input_values, str): - cls.__check_str_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, tuple): - cls.__check_tuple_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, frozendict): - cls.__check_dict_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, decimal.Decimal): - cls.__check_numeric_validations(validations, input_values, validation_metadata) - - class Singleton: """ Enums and singletons are the same @@ -427,6 +207,37 @@ class BoolClass(Singleton): raise ValueError('Unable to find the boolean value of this instance') +class ValidatorBase: + @staticmethod + def is_json_validation_enabled_oapg(schema_keyword, configuration=None): + """Returns true if JSON schema validation is enabled for the specified + validation keyword. This can be used to skip JSON schema structural validation + as requested in the configuration. + Note: the suffix _oapg stands for openapi python (experimental) generator and + it has been added to prevent collisions with other methods and properties + + Args: + schema_keyword (string): the name of a JSON schema validation keyword. + configuration (Configuration): the configuration class. + """ + + return (configuration is None or + not hasattr(configuration, '_disabled_client_side_validations') or + schema_keyword not in configuration._disabled_client_side_validations) + + @staticmethod + def raise_validation_error_message_oapg(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): + raise ApiValueError( + "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( + value=value, + constraint_msg=constraint_msg, + constraint_value=constraint_value, + additional_txt=additional_txt, + path_to_item=path_to_item, + ) + ) + + class Validator(typing.Protocol): @classmethod def _validate( @@ -437,24 +248,6 @@ class Validator(typing.Protocol): pass -def SchemaValidatorClsFactory(**validations: typing.Union[str, bool, None, int, float, list[dict[str, typing.Union[str, int, float]]]]) -> Validator: - class SchemaValidator(ValidatorBase): - @classmethod - def _validate( - cls, - arg, - validation_metadata: ValidationMetadata, - ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: - """ - SchemaValidator _validate - Validates that validations pass - """ - cls._check_validations_for_types(validations, arg, validation_metadata) - return super()._validate(arg, validation_metadata) - - return SchemaValidator - - def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Validator: if typing.get_origin(union_type_cls) is typing.Union: union_classes = typing.get_args(union_type_cls) @@ -530,7 +323,7 @@ def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Val """ arg_type = type(arg) if arg_type in union_classes: - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) raise cls._get_type_error( arg, validation_metadata.path_to_item, @@ -583,7 +376,7 @@ def SchemaEnumMakerClsFactory(enum_value_to_name: typing.Dict[typing.Union[str, cls._enum_value_to_name[arg] except KeyError: raise ApiValueError("Invalid value {} passed in to {}, {}".format(arg, cls, cls._enum_value_to_name)) - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) return SchemaEnumMaker @@ -619,7 +412,7 @@ class NoneBase: return False -class StrBase: +class StrBase(ValidatorBase): @property def as_str(self) -> str: return self @@ -640,6 +433,68 @@ class StrBase: def as_uuid(self) -> uuid.UUID: raise Exception('not implemented') + @classmethod + def __check_str_validations( + cls, + arg: str, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxLength', validation_metadata.configuration) and + hasattr(cls, '_max_length') and + len(arg) > cls._max_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be less than or equal to", + constraint_value=cls._max_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minLength', validation_metadata.configuration) and + hasattr(cls, '_min_length') and + len(arg) < cls._min_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be greater than or equal to", + constraint_value=cls._min_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('pattern', validation_metadata.configuration) and + hasattr(cls, '_regex')): + for regex_dict in cls._regex: + flags = regex_dict.get('flags', 0) + if not re.search(regex_dict['pattern'], arg, flags=flags): + if flags != 0: + # Don't print the regex flags if the flags are not + # specified in the OAS document. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item, + additional_txt=" with flags=`{}`".format(flags) + ) + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + StrBase _validate + Validates that validations pass + """ + if isinstance(arg, str): + cls.__check_str_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + class UUIDBase(StrBase): @property @@ -806,7 +661,7 @@ class DecimalBase(StrBase): return super()._validate(arg, validation_metadata=validation_metadata) -class NumberBase: +class NumberBase(ValidatorBase): @property def as_int(self) -> int: try: @@ -837,8 +692,91 @@ class NumberBase: self._as_float = float(self) return self._as_float + @classmethod + def __check_numeric_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if cls.is_json_validation_enabled_oapg('multipleOf', + validation_metadata.configuration) and hasattr(cls, '_multiple_of'): + multiple_of_value = cls._multiple_of + if (not (float(arg) / multiple_of_value).is_integer()): + # Note 'multipleOf' will be as good as the floating point arithmetic. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="value must be a multiple of", + constraint_value=multiple_of_value, + path_to_item=validation_metadata.path_to_item + ) -class ListBase: + checking_max_or_min_values = any( + hasattr(cls, validation_key) for validation_key in { + '_exclusive_maximum', + '_inclusive_maximum', + '_exclusive_minimum', + '_inclusive_minimum', + } + ) + if not checking_max_or_min_values: + return + + if (cls.is_json_validation_enabled_oapg('exclusiveMaximum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_maximum') and + arg >= cls._exclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('maximum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_maximum') and + arg > cls._inclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than or equal to", + constraint_value=cls._inclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('exclusiveMinimum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_minimum') and + arg <= cls._exclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minimum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_minimum') and + arg < cls._inclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than or equal to", + constraint_value=cls._inclusive_minimum, + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + NumberBase _validate + Validates that validations pass + """ + if isinstance(arg, decimal.Decimal): + cls.__check_numeric_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + + +class ListBase(ValidatorBase): @classmethod def _validate_items(cls, list_items, validation_metadata: ValidationMetadata): """ @@ -872,6 +810,42 @@ class ListBase: update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_tuple_validations( + cls, arg, + validation_metadata: ValidationMetadata): + + if (cls.is_json_validation_enabled_oapg('maxItems', validation_metadata.configuration) and + hasattr(cls, '_max_items') and + len(arg) > cls._max_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be less than or equal to", + constraint_value=cls._max_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minItems', validation_metadata.configuration) and + hasattr(cls, '_min_items') and + len(arg) < cls._min_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be greater than or equal to", + constraint_value=cls._min_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('uniqueItems', validation_metadata.configuration) and + hasattr(cls, '_unique_items') and cls._unique_items and arg): + unique_items = set(arg) + if len(arg) > len(unique_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", + constraint_value='unique_items==True', + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -893,6 +867,8 @@ class ListBase: ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, tuple): + cls.__check_tuple_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, tuple): return _path_to_schemas @@ -987,7 +963,7 @@ class Discriminable: return None -class DictBase(Discriminable): +class DictBase(Discriminable, ValidatorBase): # subclass properties _required_property_names = set() @@ -1079,6 +1055,32 @@ class DictBase(Discriminable): update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_dict_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxProperties', validation_metadata.configuration) and + hasattr(cls, '_max_properties') and + len(arg) > cls._max_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be less than or equal to", + constraint_value=cls._max_properties, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minProperties', validation_metadata.configuration) and + hasattr(cls, '_min_properties') and + len(arg) < cls._min_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be greater than or equal to", + constraint_value=cls._min_properties, + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -1100,6 +1102,8 @@ class DictBase(Discriminable): ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, frozendict): + cls.__check_dict_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, frozendict): return _path_to_schemas @@ -1836,13 +1840,9 @@ class IntSchema(IntBase, NumberSchema): return super().__new__(cls, arg, **kwargs) -class Int32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-2147483648), - inclusive_maximum=decimal.Decimal(2147483647) - ), -): - pass +class Int32Base: + _inclusive_minimum = decimal.Decimal(-2147483648) + _inclusive_maximum = decimal.Decimal(2147483647) class Int32Schema( @@ -1852,13 +1852,9 @@ class Int32Schema( pass -class Int64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-9223372036854775808), - inclusive_maximum=decimal.Decimal(9223372036854775807) - ), -): - pass +class Int64Base: + _inclusive_minimum = decimal.Decimal(-9223372036854775808) + _inclusive_maximum = decimal.Decimal(9223372036854775807) class Int64Schema( @@ -1868,13 +1864,9 @@ class Int64Schema( pass -class Float32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-3.4028234663852886e+38), - inclusive_maximum=decimal.Decimal(3.4028234663852886e+38) - ), -): - pass +class Float32Base: + _inclusive_minimum = decimal.Decimal(-3.4028234663852886e+38) + _inclusive_maximum = decimal.Decimal(3.4028234663852886e+38) class Float32Schema( @@ -1888,13 +1880,9 @@ class Float32Schema( return super()._from_openapi_data(arg, _configuration=_configuration) -class Float64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-1.7976931348623157E+308), - inclusive_maximum=decimal.Decimal(1.7976931348623157E+308) - ), -): - pass +class Float64Base: + _inclusive_minimum = decimal.Decimal(-1.7976931348623157E+308) + _inclusive_maximum = decimal.Decimal(1.7976931348623157E+308) class Float64Schema( diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_are_allowed_by_default.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_are_allowed_by_default.py index a623cad348f6..3f46d0d0b0c1 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_are_allowed_by_default.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_are_allowed_by_default.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AdditionalpropertiesAreAllowedByDefault( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_should_not_look_in_applicators.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_should_not_look_in_applicators.py index 5f051b61741a..02aba76309a2 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_should_not_look_in_applicators.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/additionalproperties_should_not_look_in_applicators.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AdditionalpropertiesShouldNotLookInApplicators( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -47,7 +47,7 @@ class AdditionalpropertiesShouldNotLookInApplicators( class all_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): foo = schemas.AnyTypeSchema diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof.py index 97382488cd1c..45d9c059e1d1 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class Allof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class Allof( class all_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "bar", @@ -70,7 +70,7 @@ class Allof( class all_of_1( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_combined_with_anyof_oneof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_combined_with_anyof_oneof.py index ad1f3f337e16..5e4ad6b8dcd0 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_combined_with_anyof_oneof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_combined_with_anyof_oneof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofCombinedWithAnyofOneof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,11 +46,9 @@ class AllofCombinedWithAnyofOneof( class all_of_0( - schemas.SchemaValidatorClsFactory( - multiple_of=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _multiple_of=2 def __new__( cls, @@ -67,11 +65,9 @@ class AllofCombinedWithAnyofOneof( class one_of_0( - schemas.SchemaValidatorClsFactory( - multiple_of=5, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _multiple_of=5 def __new__( cls, @@ -88,11 +84,9 @@ class AllofCombinedWithAnyofOneof( class any_of_0( - schemas.SchemaValidatorClsFactory( - multiple_of=3, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _multiple_of=3 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_simple_types.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_simple_types.py index 0630a3b0f7ee..45bb201f2b7b 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_simple_types.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_simple_types.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofSimpleTypes( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,11 +46,9 @@ class AllofSimpleTypes( class all_of_0( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=30, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _inclusive_maximum=30 def __new__( cls, @@ -67,11 +65,9 @@ class AllofSimpleTypes( class all_of_1( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=20, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _inclusive_minimum=20 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_base_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_base_schema.py index 45912efcd9a3..5ea36fe0ddbb 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_base_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_base_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofWithBaseSchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -50,7 +50,7 @@ class AllofWithBaseSchema( class all_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo", @@ -74,7 +74,7 @@ class AllofWithBaseSchema( class all_of_1( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "baz", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_one_empty_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_one_empty_schema.py index 7d92e3dbd5f8..5c9a0457db69 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_one_empty_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_one_empty_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofWithOneEmptySchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_first_empty_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_first_empty_schema.py index 19eae944ebfe..5ede6b4a4d1c 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_first_empty_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_first_empty_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofWithTheFirstEmptySchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_last_empty_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_last_empty_schema.py index 66af6a567d43..82343ea3fe32 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_last_empty_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_the_last_empty_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofWithTheLastEmptySchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_two_empty_schemas.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_two_empty_schemas.py index f29590f4f311..03d980d1a28f 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_two_empty_schemas.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/allof_with_two_empty_schemas.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AllofWithTwoEmptySchemas( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof.py index 577786e449cf..2ea6e6264a0a 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class Anyof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -47,11 +47,9 @@ class Anyof( class any_of_1( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _inclusive_minimum=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_complex_types.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_complex_types.py index cf5c3467e555..f0df5ad9bbe2 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_complex_types.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_complex_types.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AnyofComplexTypes( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class AnyofComplexTypes( class any_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "bar", @@ -70,7 +70,7 @@ class AnyofComplexTypes( class any_of_1( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_base_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_base_schema.py index d4cbe1b9eef3..310ed497612d 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_base_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_base_schema.py @@ -47,11 +47,9 @@ class AnyofWithBaseSchema( class any_of_0( - schemas.SchemaValidatorClsFactory( - max_length=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _max_length=2 def __new__( cls, @@ -68,11 +66,9 @@ class AnyofWithBaseSchema( class any_of_1( - schemas.SchemaValidatorClsFactory( - min_length=4, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _min_length=4 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_one_empty_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_one_empty_schema.py index 0e7c29446bb5..36d284ab0486 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_one_empty_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/anyof_with_one_empty_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class AnyofWithOneEmptySchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_int.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_int.py index 09e968cb9c5d..734f37cdb49e 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_int.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_int.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class ByInt( - schemas.SchemaValidatorClsFactory( - multiple_of=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _multiple_of=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_number.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_number.py index 677eecaf805d..c180d65c1c21 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_number.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_number.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class ByNumber( - schemas.SchemaValidatorClsFactory( - multiple_of=1.5, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _multiple_of=1.5 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_small_number.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_small_number.py index 5743b70fbe64..d47dd941538a 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_small_number.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/by_small_number.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class BySmallNumber( - schemas.SchemaValidatorClsFactory( - multiple_of=0.00010, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _multiple_of=0.00010 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/forbidden_property.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/forbidden_property.py index 7f506d43ba9a..f8dfa4db7823 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/forbidden_property.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/forbidden_property.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class ForbiddenProperty( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -34,7 +34,7 @@ class ForbiddenProperty( class foo( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_instance_should_not_raise_error_when_float_division_inf.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_instance_should_not_raise_error_when_float_division_inf.py index dc11cd9b3168..d5774f33e230 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_instance_should_not_raise_error_when_float_division_inf.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_instance_should_not_raise_error_when_float_division_inf.py @@ -24,9 +24,6 @@ from unit_test_api import schemas # noqa: F401 class InvalidInstanceShouldNotRaiseErrorWhenFloatDivisionInf( - schemas.SchemaValidatorClsFactory( - multiple_of=0.123456789, - ), schemas.IntSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,4 +31,5 @@ class InvalidInstanceShouldNotRaiseErrorWhenFloatDivisionInf( Do not edit the class manually. """ + _multiple_of=0.123456789 pass diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_string_value_for_default.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_string_value_for_default.py index b07a0f2fa9a5..918a70a0bc92 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_string_value_for_default.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/invalid_string_value_for_default.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class InvalidStringValueForDefault( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -34,11 +34,9 @@ class InvalidStringValueForDefault( class bar( - schemas.SchemaValidatorClsFactory( - min_length=4, - ), schemas.StrSchema ): + _min_length=4 pass def __new__( diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation.py index 651d24c98e13..d804ffc26edb 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MaximumValidation( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=3.0, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _inclusive_maximum=3.0 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation_with_unsigned_integer.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation_with_unsigned_integer.py index fde99535961d..bea8bc13dfbf 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation_with_unsigned_integer.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maximum_validation_with_unsigned_integer.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MaximumValidationWithUnsignedInteger( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=300, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _inclusive_maximum=300 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxitems_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxitems_validation.py index e919b51d7da5..72aeb8176c24 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxitems_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxitems_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MaxitemsValidation( - schemas.SchemaValidatorClsFactory( - max_items=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _max_items=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxlength_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxlength_validation.py index 013a7388af7b..23247a20e629 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxlength_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxlength_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MaxlengthValidation( - schemas.SchemaValidatorClsFactory( - max_length=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _max_length=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties0_means_the_object_is_empty.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties0_means_the_object_is_empty.py index 34eaf3274039..db51db56a7f9 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties0_means_the_object_is_empty.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties0_means_the_object_is_empty.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class Maxproperties0MeansTheObjectIsEmpty( - schemas.SchemaValidatorClsFactory( - max_properties=0, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _max_properties=0 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties_validation.py index 2ad1aa8ab4b9..4a0168b54781 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/maxproperties_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MaxpropertiesValidation( - schemas.SchemaValidatorClsFactory( - max_properties=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _max_properties=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation.py index a238eee2e151..ccf7e6d62972 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MinimumValidation( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=1.1, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _inclusive_minimum=1.1 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation_with_signed_integer.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation_with_signed_integer.py index e2cf67e36277..b10b85be0d6a 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation_with_signed_integer.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minimum_validation_with_signed_integer.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MinimumValidationWithSignedInteger( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=-2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _inclusive_minimum=-2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minitems_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minitems_validation.py index 292d316a87c0..fc939dc1d93e 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minitems_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minitems_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MinitemsValidation( - schemas.SchemaValidatorClsFactory( - min_items=1, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _min_items=1 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minlength_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minlength_validation.py index d73097f0a729..e63d86e529b7 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minlength_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minlength_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MinlengthValidation( - schemas.SchemaValidatorClsFactory( - min_length=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _min_length=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minproperties_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minproperties_validation.py index dc67d8aa6e61..01953542632f 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minproperties_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/minproperties_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class MinpropertiesValidation( - schemas.SchemaValidatorClsFactory( - min_properties=1, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _min_properties=1 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/model_not.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/model_not.py index c91df0e87f6e..ba2e56c15aff 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/model_not.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/model_not.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class ModelNot( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_allof_to_check_validation_semantics.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_allof_to_check_validation_semantics.py index 333defc08b12..59480bc405be 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_allof_to_check_validation_semantics.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_allof_to_check_validation_semantics.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class NestedAllofToCheckValidationSemantics( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class NestedAllofToCheckValidationSemantics( class all_of_0( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_anyof_to_check_validation_semantics.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_anyof_to_check_validation_semantics.py index aeb640615dff..d83e45b2dc0f 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_anyof_to_check_validation_semantics.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_anyof_to_check_validation_semantics.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class NestedAnyofToCheckValidationSemantics( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class NestedAnyofToCheckValidationSemantics( class any_of_0( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_oneof_to_check_validation_semantics.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_oneof_to_check_validation_semantics.py index 40d14c5bb72c..81c9ea9ef54f 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_oneof_to_check_validation_semantics.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/nested_oneof_to_check_validation_semantics.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class NestedOneofToCheckValidationSemantics( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class NestedOneofToCheckValidationSemantics( class one_of_0( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/not_more_complex_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/not_more_complex_schema.py index 64db8b1d7997..599c856e8ab2 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/not_more_complex_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/not_more_complex_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class NotMoreComplexSchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/object_properties_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/object_properties_validation.py index 2d1376684cc8..017860519f36 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/object_properties_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/object_properties_validation.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class ObjectPropertiesValidation( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof.py index 35d564664aeb..7269a13aacca 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class Oneof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -47,11 +47,9 @@ class Oneof( class one_of_1( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _inclusive_minimum=2 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_complex_types.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_complex_types.py index dd6de9e766de..ca42cfdac5a8 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_complex_types.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_complex_types.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class OneofComplexTypes( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -46,7 +46,7 @@ class OneofComplexTypes( class one_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "bar", @@ -70,7 +70,7 @@ class OneofComplexTypes( class one_of_1( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_base_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_base_schema.py index abe35b57d108..e15b9612977a 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_base_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_base_schema.py @@ -47,11 +47,9 @@ class OneofWithBaseSchema( class one_of_0( - schemas.SchemaValidatorClsFactory( - min_length=2, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _min_length=2 def __new__( cls, @@ -68,11 +66,9 @@ class OneofWithBaseSchema( class one_of_1( - schemas.SchemaValidatorClsFactory( - max_length=4, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): + _max_length=4 def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_empty_schema.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_empty_schema.py index b2968356c1f5..d879ac4a9770 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_empty_schema.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_empty_schema.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class OneofWithEmptySchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_required.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_required.py index 36a0548d5b83..5e03daa1dd79 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_required.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/oneof_with_required.py @@ -47,7 +47,7 @@ class OneofWithRequired( class one_of_0( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "bar", @@ -69,7 +69,7 @@ class OneofWithRequired( class one_of_1( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_is_not_anchored.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_is_not_anchored.py index 2764902b555f..1c3313e932bc 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_is_not_anchored.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_is_not_anchored.py @@ -24,18 +24,16 @@ from unit_test_api import schemas # noqa: F401 class PatternIsNotAnchored( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'a+', # noqa: E501 - }], - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _regex=[{ + 'pattern': r'a+', # noqa: E501 + }] def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_validation.py index c60d56a19850..1e07d709c2af 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/pattern_validation.py @@ -24,18 +24,16 @@ from unit_test_api import schemas # noqa: F401 class PatternValidation( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^a*$', # noqa: E501 - }], - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _regex=[{ + 'pattern': r'^a*$', # noqa: E501 + }] def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/properties_with_escaped_characters.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/properties_with_escaped_characters.py index 88a52e529cf0..63eec70ca42d 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/properties_with_escaped_characters.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/properties_with_escaped_characters.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class PropertiesWithEscapedCharacters( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/property_named_ref_that_is_not_a_reference.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/property_named_ref_that_is_not_a_reference.py index 7f8368b89efb..aab052b6dd7f 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/property_named_ref_that_is_not_a_reference.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/property_named_ref_that_is_not_a_reference.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class PropertyNamedRefThatIsNotAReference( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_allof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_allof.py index b1a05ec43b1a..739867fbc786 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_allof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_allof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RefInAllof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_anyof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_anyof.py index ff2e25955b73..eb142125d12d 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_anyof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_anyof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RefInAnyof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_not.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_not.py index 2049b2cf41fc..90a624a47358 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_not.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_not.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RefInNot( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_oneof.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_oneof.py index e477c65eeca3..b1d4966a3747 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_oneof.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_oneof.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RefInOneof( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_property.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_property.py index 627798ddcfd6..b8c193b47415 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_property.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/ref_in_property.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RefInProperty( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_default_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_default_validation.py index a4f7d169d9a2..eb797cfb8e1e 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_default_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_default_validation.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RequiredDefaultValidation( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_validation.py index f5b3b3ef8924..14a28088bf08 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_validation.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RequiredValidation( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_empty_array.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_empty_array.py index 787355e0288a..0857dbd6b048 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_empty_array.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_empty_array.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RequiredWithEmptyArray( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_escaped_characters.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_escaped_characters.py index ab6c4cb0e410..08ae82ee15e0 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_escaped_characters.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/required_with_escaped_characters.py @@ -24,7 +24,7 @@ from unit_test_api import schemas # noqa: F401 class RequiredWithEscapedCharacters( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/the_default_keyword_does_not_do_anything_if_the_property_is_missing.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/the_default_keyword_does_not_do_anything_if_the_property_is_missing.py index 404c3ce8fc47..5ac200665207 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/the_default_keyword_does_not_do_anything_if_the_property_is_missing.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/the_default_keyword_does_not_do_anything_if_the_property_is_missing.py @@ -34,11 +34,9 @@ class TheDefaultKeywordDoesNotDoAnythingIfThePropertyIsMissing( class alpha( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=3, - ), schemas.NumberSchema ): + _inclusive_maximum=3 pass diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_false_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_false_validation.py index a4e8c8448794..c01119d903c7 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_false_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_false_validation.py @@ -24,9 +24,7 @@ from unit_test_api import schemas # noqa: F401 class UniqueitemsFalseValidation( - schemas.SchemaValidatorClsFactory( - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_validation.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_validation.py index 1aaecb681f10..8dfec72f9515 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_validation.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/model/uniqueitems_validation.py @@ -24,16 +24,14 @@ from unit_test_api import schemas # noqa: F401 class UniqueitemsValidation( - schemas.SchemaValidatorClsFactory( - unique_items=True, - ), - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech Do not edit the class manually. """ + _unique_items=True def __new__( cls, diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_more_complex_schema_request_body/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_more_complex_schema_request_body/post.py index eb67ce684868..c08681c14c00 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_more_complex_schema_request_body/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_more_complex_schema_request_body/post.py @@ -27,7 +27,7 @@ from . import path class SchemaForRequestBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_request_body/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_request_body/post.py index b975a9e5d5f6..b8f612b6aff3 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_request_body/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_not_request_body/post.py @@ -27,7 +27,7 @@ from . import path class SchemaForRequestBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_ref_in_not_request_body/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_ref_in_not_request_body/post.py index e3dae39f53ba..3662ac59479a 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_ref_in_not_request_body/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_ref_in_not_request_body/post.py @@ -29,7 +29,7 @@ from . import path class SchemaForRequestBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_required_with_escaped_characters_request_body/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_required_with_escaped_characters_request_body/post.py index eed26f08cfda..886b4eec3d0d 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_required_with_escaped_characters_request_body/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/request_body_post_required_with_escaped_characters_request_body/post.py @@ -27,7 +27,7 @@ from . import path class SchemaForRequestBodyApplicationJson( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo\"bar", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_more_complex_schema_response_body_for_content_types/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_more_complex_schema_response_body_for_content_types/post.py index 4248fff5e995..44e355bbc3e0 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_more_complex_schema_response_body_for_content_types/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_more_complex_schema_response_body_for_content_types/post.py @@ -26,7 +26,7 @@ from . import path class SchemaFor200ResponseBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_response_body_for_content_types/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_response_body_for_content_types/post.py index 34e393a94df0..fe38c01f4593 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_response_body_for_content_types/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_not_response_body_for_content_types/post.py @@ -26,7 +26,7 @@ from . import path class SchemaFor200ResponseBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_ref_in_not_response_body_for_content_types/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_ref_in_not_response_body_for_content_types/post.py index 9fc253d09967..e7b64f04ca2d 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_ref_in_not_response_body_for_content_types/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_ref_in_not_response_body_for_content_types/post.py @@ -28,7 +28,7 @@ from . import path class SchemaFor200ResponseBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_required_with_escaped_characters_response_body_for_content_types/post.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_required_with_escaped_characters_response_body_for_content_types/post.py index 12feab523f98..03bc35c146e0 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_required_with_escaped_characters_response_body_for_content_types/post.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/paths/response_body_post_required_with_escaped_characters_response_body_for_content_types/post.py @@ -26,7 +26,7 @@ from . import path class SchemaFor200ResponseBodyApplicationJson( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): _required_property_names = { "foo\"bar", diff --git a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/schemas.py b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/schemas.py index 70bf81ac7229..8caee961ae2e 100644 --- a/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/schemas.py +++ b/samples/openapi3/client/3_0_3_unit_test/python-experimental/unit_test_api/schemas.py @@ -149,226 +149,6 @@ class ValidationMetadata(frozendict): return self.get('validated_path_to_schemas') -class ValidatorBase: - @staticmethod - def __is_json_validation_enabled(schema_keyword, configuration=None): - """Returns true if JSON schema validation is enabled for the specified - validation keyword. This can be used to skip JSON schema structural validation - as requested in the configuration. - - Args: - schema_keyword (string): the name of a JSON schema validation keyword. - configuration (Configuration): the configuration class. - """ - - return (configuration is None or - not hasattr(configuration, '_disabled_client_side_validations') or - schema_keyword not in configuration._disabled_client_side_validations) - - @staticmethod - def __raise_validation_error_message(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): - raise ApiValueError( - "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( - value=value, - constraint_msg=constraint_msg, - constraint_value=constraint_value, - additional_txt=additional_txt, - path_to_item=path_to_item, - ) - ) - - @classmethod - def __check_str_validations(cls, - validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxLength', validation_metadata.configuration) and - 'max_length' in validations and - len(input_values) > validations['max_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be less than or equal to", - constraint_value=validations['max_length'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minLength', validation_metadata.configuration) and - 'min_length' in validations and - len(input_values) < validations['min_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be greater than or equal to", - constraint_value=validations['min_length'], - path_to_item=validation_metadata.path_to_item - ) - - checked_value = input_values - if (cls.__is_json_validation_enabled('pattern', validation_metadata.configuration) and - 'regex' in validations): - for regex_dict in validations['regex']: - flags = regex_dict.get('flags', 0) - if not re.search(regex_dict['pattern'], checked_value, flags=flags): - if flags != 0: - # Don't print the regex flags if the flags are not - # specified in the OAS document. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item, - additional_txt=" with flags=`{}`".format(flags) - ) - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_tuple_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxItems', validation_metadata.configuration) and - 'max_items' in validations and - len(input_values) > validations['max_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be less than or equal to", - constraint_value=validations['max_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minItems', validation_metadata.configuration) and - 'min_items' in validations and - len(input_values) < validations['min_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be greater than or equal to", - constraint_value=validations['min_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('uniqueItems', validation_metadata.configuration) and - 'unique_items' in validations and validations['unique_items'] and input_values): - unique_items = set(input_values) - if len(input_values) > len(unique_items): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", - constraint_value='unique_items==True', - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_dict_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxProperties', validation_metadata.configuration) and - 'max_properties' in validations and - len(input_values) > validations['max_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be less than or equal to", - constraint_value=validations['max_properties'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minProperties', validation_metadata.configuration) and - 'min_properties' in validations and - len(input_values) < validations['min_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be greater than or equal to", - constraint_value=validations['min_properties'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_numeric_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if cls.__is_json_validation_enabled('multipleOf', - validation_metadata.configuration) and 'multiple_of' in validations: - multiple_of_value = validations['multiple_of'] - if (isinstance(input_values, decimal.Decimal) and - not (float(input_values) / multiple_of_value).is_integer() - ): - # Note 'multipleOf' will be as good as the floating point arithmetic. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="value must be a multiple of", - constraint_value=multiple_of_value, - path_to_item=validation_metadata.path_to_item - ) - - checking_max_or_min_values = {'exclusive_maximum', 'inclusive_maximum', 'exclusive_minimum', - 'inclusive_minimum'}.isdisjoint(validations) is False - if not checking_max_or_min_values: - return - max_val = input_values - min_val = input_values - - if (cls.__is_json_validation_enabled('exclusiveMaximum', validation_metadata.configuration) and - 'exclusive_maximum' in validations and - max_val >= validations['exclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('maximum', validation_metadata.configuration) and - 'inclusive_maximum' in validations and - max_val > validations['inclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than or equal to", - constraint_value=validations['inclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('exclusiveMinimum', validation_metadata.configuration) and - 'exclusive_minimum' in validations and - min_val <= validations['exclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minimum', validation_metadata.configuration) and - 'inclusive_minimum' in validations and - min_val < validations['inclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than or equal to", - constraint_value=validations['inclusive_minimum'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def _check_validations_for_types( - cls, - validations, - input_values, - validation_metadata: ValidationMetadata - ): - if isinstance(input_values, str): - cls.__check_str_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, tuple): - cls.__check_tuple_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, frozendict): - cls.__check_dict_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, decimal.Decimal): - cls.__check_numeric_validations(validations, input_values, validation_metadata) - - class Singleton: """ Enums and singletons are the same @@ -434,6 +214,37 @@ class BoolClass(Singleton): raise ValueError('Unable to find the boolean value of this instance') +class ValidatorBase: + @staticmethod + def is_json_validation_enabled_oapg(schema_keyword, configuration=None): + """Returns true if JSON schema validation is enabled for the specified + validation keyword. This can be used to skip JSON schema structural validation + as requested in the configuration. + Note: the suffix _oapg stands for openapi python (experimental) generator and + it has been added to prevent collisions with other methods and properties + + Args: + schema_keyword (string): the name of a JSON schema validation keyword. + configuration (Configuration): the configuration class. + """ + + return (configuration is None or + not hasattr(configuration, '_disabled_client_side_validations') or + schema_keyword not in configuration._disabled_client_side_validations) + + @staticmethod + def raise_validation_error_message_oapg(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): + raise ApiValueError( + "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( + value=value, + constraint_msg=constraint_msg, + constraint_value=constraint_value, + additional_txt=additional_txt, + path_to_item=path_to_item, + ) + ) + + class Validator(typing.Protocol): @classmethod def _validate( @@ -444,24 +255,6 @@ class Validator(typing.Protocol): pass -def SchemaValidatorClsFactory(**validations: typing.Union[str, bool, None, int, float, list[dict[str, typing.Union[str, int, float]]]]) -> Validator: - class SchemaValidator(ValidatorBase): - @classmethod - def _validate( - cls, - arg, - validation_metadata: ValidationMetadata, - ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: - """ - SchemaValidator _validate - Validates that validations pass - """ - cls._check_validations_for_types(validations, arg, validation_metadata) - return super()._validate(arg, validation_metadata) - - return SchemaValidator - - def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Validator: if typing.get_origin(union_type_cls) is typing.Union: union_classes = typing.get_args(union_type_cls) @@ -537,7 +330,7 @@ def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Val """ arg_type = type(arg) if arg_type in union_classes: - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) raise cls._get_type_error( arg, validation_metadata.path_to_item, @@ -590,7 +383,7 @@ def SchemaEnumMakerClsFactory(enum_value_to_name: typing.Dict[typing.Union[str, cls._enum_value_to_name[arg] except KeyError: raise ApiValueError("Invalid value {} passed in to {}, {}".format(arg, cls, cls._enum_value_to_name)) - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) return SchemaEnumMaker @@ -626,7 +419,7 @@ class NoneBase: return False -class StrBase: +class StrBase(ValidatorBase): @property def as_str(self) -> str: return self @@ -647,6 +440,68 @@ class StrBase: def as_uuid(self) -> uuid.UUID: raise Exception('not implemented') + @classmethod + def __check_str_validations( + cls, + arg: str, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxLength', validation_metadata.configuration) and + hasattr(cls, '_max_length') and + len(arg) > cls._max_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be less than or equal to", + constraint_value=cls._max_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minLength', validation_metadata.configuration) and + hasattr(cls, '_min_length') and + len(arg) < cls._min_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be greater than or equal to", + constraint_value=cls._min_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('pattern', validation_metadata.configuration) and + hasattr(cls, '_regex')): + for regex_dict in cls._regex: + flags = regex_dict.get('flags', 0) + if not re.search(regex_dict['pattern'], arg, flags=flags): + if flags != 0: + # Don't print the regex flags if the flags are not + # specified in the OAS document. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item, + additional_txt=" with flags=`{}`".format(flags) + ) + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + StrBase _validate + Validates that validations pass + """ + if isinstance(arg, str): + cls.__check_str_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + class UUIDBase(StrBase): @property @@ -813,7 +668,7 @@ class DecimalBase(StrBase): return super()._validate(arg, validation_metadata=validation_metadata) -class NumberBase: +class NumberBase(ValidatorBase): @property def as_int(self) -> int: try: @@ -844,8 +699,91 @@ class NumberBase: self._as_float = float(self) return self._as_float + @classmethod + def __check_numeric_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if cls.is_json_validation_enabled_oapg('multipleOf', + validation_metadata.configuration) and hasattr(cls, '_multiple_of'): + multiple_of_value = cls._multiple_of + if (not (float(arg) / multiple_of_value).is_integer()): + # Note 'multipleOf' will be as good as the floating point arithmetic. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="value must be a multiple of", + constraint_value=multiple_of_value, + path_to_item=validation_metadata.path_to_item + ) -class ListBase: + checking_max_or_min_values = any( + hasattr(cls, validation_key) for validation_key in { + '_exclusive_maximum', + '_inclusive_maximum', + '_exclusive_minimum', + '_inclusive_minimum', + } + ) + if not checking_max_or_min_values: + return + + if (cls.is_json_validation_enabled_oapg('exclusiveMaximum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_maximum') and + arg >= cls._exclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('maximum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_maximum') and + arg > cls._inclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than or equal to", + constraint_value=cls._inclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('exclusiveMinimum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_minimum') and + arg <= cls._exclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minimum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_minimum') and + arg < cls._inclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than or equal to", + constraint_value=cls._inclusive_minimum, + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + NumberBase _validate + Validates that validations pass + """ + if isinstance(arg, decimal.Decimal): + cls.__check_numeric_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + + +class ListBase(ValidatorBase): @classmethod def _validate_items(cls, list_items, validation_metadata: ValidationMetadata): """ @@ -879,6 +817,42 @@ class ListBase: update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_tuple_validations( + cls, arg, + validation_metadata: ValidationMetadata): + + if (cls.is_json_validation_enabled_oapg('maxItems', validation_metadata.configuration) and + hasattr(cls, '_max_items') and + len(arg) > cls._max_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be less than or equal to", + constraint_value=cls._max_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minItems', validation_metadata.configuration) and + hasattr(cls, '_min_items') and + len(arg) < cls._min_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be greater than or equal to", + constraint_value=cls._min_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('uniqueItems', validation_metadata.configuration) and + hasattr(cls, '_unique_items') and cls._unique_items and arg): + unique_items = set(arg) + if len(arg) > len(unique_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", + constraint_value='unique_items==True', + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -900,6 +874,8 @@ class ListBase: ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, tuple): + cls.__check_tuple_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, tuple): return _path_to_schemas @@ -994,7 +970,7 @@ class Discriminable: return None -class DictBase(Discriminable): +class DictBase(Discriminable, ValidatorBase): # subclass properties _required_property_names = set() @@ -1086,6 +1062,32 @@ class DictBase(Discriminable): update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_dict_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxProperties', validation_metadata.configuration) and + hasattr(cls, '_max_properties') and + len(arg) > cls._max_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be less than or equal to", + constraint_value=cls._max_properties, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minProperties', validation_metadata.configuration) and + hasattr(cls, '_min_properties') and + len(arg) < cls._min_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be greater than or equal to", + constraint_value=cls._min_properties, + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -1107,6 +1109,8 @@ class DictBase(Discriminable): ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, frozendict): + cls.__check_dict_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, frozendict): return _path_to_schemas @@ -1843,13 +1847,9 @@ class IntSchema(IntBase, NumberSchema): return super().__new__(cls, arg, **kwargs) -class Int32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-2147483648), - inclusive_maximum=decimal.Decimal(2147483647) - ), -): - pass +class Int32Base: + _inclusive_minimum = decimal.Decimal(-2147483648) + _inclusive_maximum = decimal.Decimal(2147483647) class Int32Schema( @@ -1859,13 +1859,9 @@ class Int32Schema( pass -class Int64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-9223372036854775808), - inclusive_maximum=decimal.Decimal(9223372036854775807) - ), -): - pass +class Int64Base: + _inclusive_minimum = decimal.Decimal(-9223372036854775808) + _inclusive_maximum = decimal.Decimal(9223372036854775807) class Int64Schema( @@ -1875,13 +1871,9 @@ class Int64Schema( pass -class Float32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-3.4028234663852886e+38), - inclusive_maximum=decimal.Decimal(3.4028234663852886e+38) - ), -): - pass +class Float32Base: + _inclusive_minimum = decimal.Decimal(-3.4028234663852886e+38) + _inclusive_maximum = decimal.Decimal(3.4028234663852886e+38) class Float32Schema( @@ -1895,13 +1887,9 @@ class Float32Schema( return super()._from_openapi_data(arg, _configuration=_configuration) -class Float64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-1.7976931348623157E+308), - inclusive_maximum=decimal.Decimal(1.7976931348623157E+308) - ), -): - pass +class Float64Base: + _inclusive_minimum = decimal.Decimal(-1.7976931348623157E+308) + _inclusive_maximum = decimal.Decimal(1.7976931348623157E+308) class Float64Schema( diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/any_type_not_string.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/any_type_not_string.py index 2c811031a426..167ff8909d44 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/any_type_not_string.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/any_type_not_string.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class AnyTypeNotString( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/apple.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/apple.py index 5a984056d671..acc732980d35 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/apple.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/apple.py @@ -40,27 +40,23 @@ class Apple( class cultivar( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^[a-zA-Z\s]*$', # noqa: E501 - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'^[a-zA-Z\s]*$', # noqa: E501 + }] pass class origin( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^[A-Z\s]*$', # noqa: E501 - 'flags': ( - re.IGNORECASE - ) - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'^[A-Z\s]*$', # noqa: E501 + 'flags': ( + re.IGNORECASE + ) + }] pass def __new__( diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/array_with_validations_in_items.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/array_with_validations_in_items.py index 54334d1b2cd0..c4ded6816e68 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/array_with_validations_in_items.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/array_with_validations_in_items.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class ArrayWithValidationsInItems( - schemas.SchemaValidatorClsFactory( - max_items=2, - ), schemas.ListSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,12 +31,11 @@ class ArrayWithValidationsInItems( Do not edit the class manually. """ + _max_items=2 class _items( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=7, - ), schemas.Int64Schema ): + _inclusive_maximum=7 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/cat.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/cat.py index fe20d7a5dcc7..d1d3cc1a4e93 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/cat.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/cat.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Cat( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/child_cat.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/child_cat.py index 49778c3f6dd9..83f64e645e9d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/child_cat.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/child_cat.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ChildCat( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/class_model.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/class_model.py index e6be19f19bff..eaff0fc323f1 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/class_model.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/class_model.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ClassModel( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/complex_quadrilateral.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/complex_quadrilateral.py index adcc3f522596..502dbfaa738d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/complex_quadrilateral.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/complex_quadrilateral.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ComplexQuadrilateral( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_any_of_different_types_no_validations.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_any_of_different_types_no_validations.py index 1442ffb6405d..eb295eb4ba2d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_any_of_different_types_no_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_any_of_different_types_no_validations.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ComposedAnyOfDifferentTypesNoValidations( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_one_of_different_types.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_one_of_different_types.py index 8f6552b9b173..4644477893a0 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_one_of_different_types.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/composed_one_of_different_types.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ComposedOneOfDifferentTypes( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech @@ -50,12 +50,10 @@ class ComposedOneOfDifferentTypes( class one_of_4( - schemas.SchemaValidatorClsFactory( - max_properties=4, - min_properties=4, - ), schemas.DictSchema ): + _max_properties=4 + _min_properties=4 def __new__( @@ -73,23 +71,19 @@ class ComposedOneOfDifferentTypes( class one_of_5( - schemas.SchemaValidatorClsFactory( - max_items=4, - min_items=4, - ), schemas.ListSchema ): + _max_items=4 + _min_items=4 _items = schemas.AnyTypeSchema class one_of_6( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^2020.*', # noqa: E501 - }], - ), schemas.DateTimeSchema ): + _regex=[{ + 'pattern': r'^2020.*', # noqa: E501 + }] pass return { 'allOf': [ diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_time_with_validations.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_time_with_validations.py index 8a316ec82d2c..2ad8ae931b03 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_time_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_time_with_validations.py @@ -24,11 +24,6 @@ from petstore_api import schemas # noqa: F401 class DateTimeWithValidations( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^2020.*', # noqa: E501 - }], - ), schemas.DateTimeSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -36,4 +31,7 @@ class DateTimeWithValidations( Do not edit the class manually. """ + _regex=[{ + 'pattern': r'^2020.*', # noqa: E501 + }] pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_with_validations.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_with_validations.py index 74aed262e351..7be09ef46017 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/date_with_validations.py @@ -24,11 +24,6 @@ from petstore_api import schemas # noqa: F401 class DateWithValidations( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^2020.*', # noqa: E501 - }], - ), schemas.DateSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -36,4 +31,7 @@ class DateWithValidations( Do not edit the class manually. """ + _regex=[{ + 'pattern': r'^2020.*', # noqa: E501 + }] pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/dog.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/dog.py index 248ed5ba55ad..4236b0b421e7 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/dog.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/dog.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Dog( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/equilateral_triangle.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/equilateral_triangle.py index b796849f4fe7..f5b95d54a9ef 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/equilateral_triangle.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/equilateral_triangle.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class EquilateralTriangle( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/format_test.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/format_test.py index d590de8cdbc7..e81740778b6b 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/format_test.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/format_test.py @@ -40,46 +40,38 @@ class FormatTest( class integer( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=100, - inclusive_minimum=10, - multiple_of=2, - ), schemas.IntSchema ): + _inclusive_maximum=100 + _inclusive_minimum=10 + _multiple_of=2 pass int32 = schemas.Int32Schema class int32withValidations( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=200, - inclusive_minimum=20, - ), schemas.Int32Schema ): + _inclusive_maximum=200 + _inclusive_minimum=20 pass int64 = schemas.Int64Schema class number( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=543.2, - inclusive_minimum=32.1, - multiple_of=32.5, - ), schemas.NumberSchema ): + _inclusive_maximum=543.2 + _inclusive_minimum=32.1 + _multiple_of=32.5 pass class _float( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=987.6, - inclusive_minimum=54.3, - ), schemas.Float32Schema ): + _inclusive_maximum=987.6 + _inclusive_minimum=54.3 pass locals()["float"] = _float del locals()['_float'] @@ -97,36 +89,30 @@ class FormatTest( class double( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=123.4, - inclusive_minimum=67.8, - ), schemas.Float64Schema ): + _inclusive_maximum=123.4 + _inclusive_minimum=67.8 pass float64 = schemas.Float64Schema class arrayWithUniqueItems( - schemas.SchemaValidatorClsFactory( - unique_items=True, - ), schemas.ListSchema ): + _unique_items=True _items = schemas.NumberSchema class string( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'[a-z]', # noqa: E501 - 'flags': ( - re.IGNORECASE - ) - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'[a-z]', # noqa: E501 + 'flags': ( + re.IGNORECASE + ) + }] pass byte = schemas.StrSchema binary = schemas.BinarySchema @@ -137,37 +123,31 @@ class FormatTest( class password( - schemas.SchemaValidatorClsFactory( - max_length=64, - min_length=10, - ), schemas.StrSchema ): + _max_length=64 + _min_length=10 pass class pattern_with_digits( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^\d{10}$', # noqa: E501 - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'^\d{10}$', # noqa: E501 + }] pass class pattern_with_digits_and_delimiter( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^image_\d{1,3}$', # noqa: E501 - 'flags': ( - re.IGNORECASE - ) - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'^image_\d{1,3}$', # noqa: E501 + 'flags': ( + re.IGNORECASE + ) + }] pass noneProp = schemas.NoneSchema diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit.py index 9607f9ea3f7a..85acb2221905 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Fruit( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit_req.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit_req.py index 089319357f93..ddedc72ec117 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit_req.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/fruit_req.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class FruitReq( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/gm_fruit.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/gm_fruit.py index a6428fee12a5..5181226951db 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/gm_fruit.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/gm_fruit.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class GmFruit( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_max10.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_max10.py index ebc4f29c9441..5958ddc489f7 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_max10.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_max10.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class IntegerMax10( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=10, - ), schemas.Int64Schema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,4 +31,5 @@ class IntegerMax10( Do not edit the class manually. """ + _inclusive_maximum=10 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_min15.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_min15.py index 0ec5463ddc23..66b4657b5bbb 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_min15.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/integer_min15.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class IntegerMin15( - schemas.SchemaValidatorClsFactory( - inclusive_minimum=15, - ), schemas.Int64Schema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,4 +31,5 @@ class IntegerMin15( Do not edit the class manually. """ + _inclusive_minimum=15 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/isosceles_triangle.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/isosceles_triangle.py index 1f9d682e5ad4..d0ac43b2ca43 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/isosceles_triangle.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/isosceles_triangle.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class IsoscelesTriangle( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/mammal.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/mammal.py index 948340043356..ae55d7eddbfb 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/mammal.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/mammal.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Mammal( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model200_response.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model200_response.py index 0247071bcb54..ff21a4a08ce2 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model200_response.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model200_response.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Model200Response( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model_return.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model_return.py index b00ba744e218..8dc62800306d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model_return.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/model_return.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ModelReturn( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/name.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/name.py index 01474ce7c762..b3cf5fd88757 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/name.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/name.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Name( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/nullable_shape.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/nullable_shape.py index ebda08ad66c4..6152516490b4 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/nullable_shape.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/nullable_shape.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class NullableShape( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/number_with_validations.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/number_with_validations.py index 05644bc96fcd..8972837ff35e 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/number_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/number_with_validations.py @@ -24,10 +24,6 @@ from petstore_api import schemas # noqa: F401 class NumberWithValidations( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=20, - inclusive_minimum=10, - ), schemas.NumberSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -35,4 +31,6 @@ class NumberWithValidations( Do not edit the class manually. """ + _inclusive_maximum=20 + _inclusive_minimum=10 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_inline_composition_property.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_inline_composition_property.py index 546855545b42..260ba244170e 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_inline_composition_property.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_inline_composition_property.py @@ -34,7 +34,7 @@ class ObjectWithInlineCompositionProperty( class someProp( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -51,11 +51,9 @@ class ObjectWithInlineCompositionProperty( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_validations.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_validations.py index 802952b133b1..00956ab04e95 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/object_with_validations.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class ObjectWithValidations( - schemas.SchemaValidatorClsFactory( - min_properties=2, - ), schemas.DictSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,6 +31,7 @@ class ObjectWithValidations( Do not edit the class manually. """ + _min_properties=2 def __new__( diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/pig.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/pig.py index 140b00d61e7e..49443a4e0b37 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/pig.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/pig.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Pig( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral.py index b7ec65c5dda0..4fffc6aab2f0 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Quadrilateral( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral_interface.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral_interface.py index 42db3ffe2efd..61b0f1b04790 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral_interface.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/quadrilateral_interface.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class QuadrilateralInterface( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/scalene_triangle.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/scalene_triangle.py index 9e8869e1c6d4..c5a0c15bbf92 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/scalene_triangle.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/scalene_triangle.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ScaleneTriangle( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape.py index 41777e512d80..0bffee108f8d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Shape( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape_or_null.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape_or_null.py index 544c5812bad9..a94ab964073d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape_or_null.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/shape_or_null.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class ShapeOrNull( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/simple_quadrilateral.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/simple_quadrilateral.py index 98d0fe79d3e2..644de175c5b7 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/simple_quadrilateral.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/simple_quadrilateral.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class SimpleQuadrilateral( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/some_object.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/some_object.py index 69156fed5731..1f2bb69f5e5a 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/some_object.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/some_object.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class SomeObject( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/string_with_validation.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/string_with_validation.py index 9e9be83150a8..d2f173ca988b 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/string_with_validation.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/string_with_validation.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class StringWithValidation( - schemas.SchemaValidatorClsFactory( - min_length=7, - ), schemas.StrSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,4 +31,5 @@ class StringWithValidation( Do not edit the class manually. """ + _min_length=7 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle.py index 305d4dce0111..c7b57f4a8df5 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class Triangle( - schemas.ComposedSchema + schemas.ComposedSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle_interface.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle_interface.py index 10c84a835e95..b2e43e276cb7 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle_interface.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/triangle_interface.py @@ -24,7 +24,7 @@ from petstore_api import schemas # noqa: F401 class TriangleInterface( - schemas.AnyTypeSchema + schemas.AnyTypeSchema, ): """NOTE: This class is auto generated by OpenAPI Generator. Ref: https://openapi-generator.tech diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/user.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/user.py index f68e27b3a87c..66002dcbbac5 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/user.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/user.py @@ -65,7 +65,7 @@ class User( class anyTypeExceptNullProp( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/uuid_string.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/uuid_string.py index df6fef491eb4..4539340dafb3 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/model/uuid_string.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/model/uuid_string.py @@ -24,9 +24,6 @@ from petstore_api import schemas # noqa: F401 class UUIDString( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.UUIDSchema ): """NOTE: This class is auto generated by OpenAPI Generator. @@ -34,4 +31,5 @@ class UUIDString( Do not edit the class manually. """ + _min_length=1 pass diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_1/post.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_1/post.py index a7416cce36df..19f89c815df5 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_1/post.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_1/post.py @@ -38,42 +38,34 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( class integer( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=100, - inclusive_minimum=10, - ), schemas.IntSchema ): + _inclusive_maximum=100 + _inclusive_minimum=10 pass class int32( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=200, - inclusive_minimum=20, - ), schemas.Int32Schema ): + _inclusive_maximum=200 + _inclusive_minimum=20 pass int64 = schemas.Int64Schema class number( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=543.2, - inclusive_minimum=32.1, - ), schemas.NumberSchema ): + _inclusive_maximum=543.2 + _inclusive_minimum=32.1 pass class _float( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=987.6, - ), schemas.Float32Schema ): + _inclusive_maximum=987.6 pass locals()["float"] = _float del locals()['_float'] @@ -90,37 +82,31 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( class double( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=123.4, - inclusive_minimum=67.8, - ), schemas.Float64Schema ): + _inclusive_maximum=123.4 + _inclusive_minimum=67.8 pass class string( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'[a-z]', # noqa: E501 - 'flags': ( - re.IGNORECASE - ) - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'[a-z]', # noqa: E501 + 'flags': ( + re.IGNORECASE + ) + }] pass class pattern_without_delimiter( - schemas.SchemaValidatorClsFactory( - regex=[{ - 'pattern': r'^[A-Z].*', # noqa: E501 - }], - ), schemas.StrSchema ): + _regex=[{ + 'pattern': r'^[A-Z].*', # noqa: E501 + }] pass byte = schemas.StrSchema binary = schemas.BinarySchema @@ -129,12 +115,10 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( class password( - schemas.SchemaValidatorClsFactory( - max_length=64, - min_length=10, - ), schemas.StrSchema ): + _max_length=64 + _min_length=10 pass callback = schemas.StrSchema diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_inline_composition_/post.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_inline_composition_/post.py index c9bea3bbddd1..efc95b47aafb 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_inline_composition_/post.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/fake_inline_composition_/post.py @@ -27,7 +27,7 @@ from . import path class CompositionAtRootSchema( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -44,11 +44,9 @@ class CompositionAtRootSchema( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ @@ -82,7 +80,7 @@ class CompositionInPropertySchema( class someProp( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -99,11 +97,9 @@ class CompositionInPropertySchema( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ @@ -180,7 +176,7 @@ request_query_composition_in_property = api_client.QueryParameter( class SchemaForRequestBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -197,11 +193,9 @@ class SchemaForRequestBodyApplicationJson( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ @@ -235,7 +229,7 @@ class SchemaForRequestBodyMultipartFormData( class someProp( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -252,11 +246,9 @@ class SchemaForRequestBodyMultipartFormData( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ @@ -311,7 +303,7 @@ request_body_any_type = api_client.RequestBody( class SchemaFor200ResponseBodyApplicationJson( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -328,11 +320,9 @@ class SchemaFor200ResponseBodyApplicationJson( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ @@ -366,7 +356,7 @@ class SchemaFor200ResponseBodyMultipartFormData( class someProp( - schemas.ComposedSchema + schemas.ComposedSchema, ): @classmethod @@ -383,11 +373,9 @@ class SchemaFor200ResponseBodyMultipartFormData( class all_of_0( - schemas.SchemaValidatorClsFactory( - min_length=1, - ), schemas.StrSchema ): + _min_length=1 pass return { 'allOf': [ diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/store_order_order_id_1/get.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/store_order_order_id_1/get.py index 241bc82f92ae..a9c38713ced9 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/store_order_order_id_1/get.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/paths/store_order_order_id_1/get.py @@ -29,12 +29,10 @@ from . import path class OrderIdSchema( - schemas.SchemaValidatorClsFactory( - inclusive_maximum=5, - inclusive_minimum=1, - ), schemas.Int64Schema ): + _inclusive_maximum=5 + _inclusive_minimum=1 pass RequestRequiredPathParams = typing.TypedDict( 'RequestRequiredPathParams', diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/schemas.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/schemas.py index 984bbf50aaf9..852d957f2e8d 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/schemas.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/schemas.py @@ -149,226 +149,6 @@ class ValidationMetadata(frozendict): return self.get('validated_path_to_schemas') -class ValidatorBase: - @staticmethod - def __is_json_validation_enabled(schema_keyword, configuration=None): - """Returns true if JSON schema validation is enabled for the specified - validation keyword. This can be used to skip JSON schema structural validation - as requested in the configuration. - - Args: - schema_keyword (string): the name of a JSON schema validation keyword. - configuration (Configuration): the configuration class. - """ - - return (configuration is None or - not hasattr(configuration, '_disabled_client_side_validations') or - schema_keyword not in configuration._disabled_client_side_validations) - - @staticmethod - def __raise_validation_error_message(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): - raise ApiValueError( - "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( - value=value, - constraint_msg=constraint_msg, - constraint_value=constraint_value, - additional_txt=additional_txt, - path_to_item=path_to_item, - ) - ) - - @classmethod - def __check_str_validations(cls, - validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxLength', validation_metadata.configuration) and - 'max_length' in validations and - len(input_values) > validations['max_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be less than or equal to", - constraint_value=validations['max_length'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minLength', validation_metadata.configuration) and - 'min_length' in validations and - len(input_values) < validations['min_length']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="length must be greater than or equal to", - constraint_value=validations['min_length'], - path_to_item=validation_metadata.path_to_item - ) - - checked_value = input_values - if (cls.__is_json_validation_enabled('pattern', validation_metadata.configuration) and - 'regex' in validations): - for regex_dict in validations['regex']: - flags = regex_dict.get('flags', 0) - if not re.search(regex_dict['pattern'], checked_value, flags=flags): - if flags != 0: - # Don't print the regex flags if the flags are not - # specified in the OAS document. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item, - additional_txt=" with flags=`{}`".format(flags) - ) - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must match regular expression", - constraint_value=regex_dict['pattern'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_tuple_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxItems', validation_metadata.configuration) and - 'max_items' in validations and - len(input_values) > validations['max_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be less than or equal to", - constraint_value=validations['max_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minItems', validation_metadata.configuration) and - 'min_items' in validations and - len(input_values) < validations['min_items']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of items must be greater than or equal to", - constraint_value=validations['min_items'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('uniqueItems', validation_metadata.configuration) and - 'unique_items' in validations and validations['unique_items'] and input_values): - unique_items = set(input_values) - if len(input_values) > len(unique_items): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", - constraint_value='unique_items==True', - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_dict_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if (cls.__is_json_validation_enabled('maxProperties', validation_metadata.configuration) and - 'max_properties' in validations and - len(input_values) > validations['max_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be less than or equal to", - constraint_value=validations['max_properties'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minProperties', validation_metadata.configuration) and - 'min_properties' in validations and - len(input_values) < validations['min_properties']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="number of properties must be greater than or equal to", - constraint_value=validations['min_properties'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def __check_numeric_validations( - cls, validations, input_values, - validation_metadata: ValidationMetadata): - - if cls.__is_json_validation_enabled('multipleOf', - validation_metadata.configuration) and 'multiple_of' in validations: - multiple_of_value = validations['multiple_of'] - if (isinstance(input_values, decimal.Decimal) and - not (float(input_values) / multiple_of_value).is_integer() - ): - # Note 'multipleOf' will be as good as the floating point arithmetic. - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="value must be a multiple of", - constraint_value=multiple_of_value, - path_to_item=validation_metadata.path_to_item - ) - - checking_max_or_min_values = {'exclusive_maximum', 'inclusive_maximum', 'exclusive_minimum', - 'inclusive_minimum'}.isdisjoint(validations) is False - if not checking_max_or_min_values: - return - max_val = input_values - min_val = input_values - - if (cls.__is_json_validation_enabled('exclusiveMaximum', validation_metadata.configuration) and - 'exclusive_maximum' in validations and - max_val >= validations['exclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('maximum', validation_metadata.configuration) and - 'inclusive_maximum' in validations and - max_val > validations['inclusive_maximum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value less than or equal to", - constraint_value=validations['inclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('exclusiveMinimum', validation_metadata.configuration) and - 'exclusive_minimum' in validations and - min_val <= validations['exclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than", - constraint_value=validations['exclusive_maximum'], - path_to_item=validation_metadata.path_to_item - ) - - if (cls.__is_json_validation_enabled('minimum', validation_metadata.configuration) and - 'inclusive_minimum' in validations and - min_val < validations['inclusive_minimum']): - cls.__raise_validation_error_message( - value=input_values, - constraint_msg="must be a value greater than or equal to", - constraint_value=validations['inclusive_minimum'], - path_to_item=validation_metadata.path_to_item - ) - - @classmethod - def _check_validations_for_types( - cls, - validations, - input_values, - validation_metadata: ValidationMetadata - ): - if isinstance(input_values, str): - cls.__check_str_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, tuple): - cls.__check_tuple_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, frozendict): - cls.__check_dict_validations(validations, input_values, validation_metadata) - elif isinstance(input_values, decimal.Decimal): - cls.__check_numeric_validations(validations, input_values, validation_metadata) - - class Singleton: """ Enums and singletons are the same @@ -434,6 +214,37 @@ class BoolClass(Singleton): raise ValueError('Unable to find the boolean value of this instance') +class ValidatorBase: + @staticmethod + def is_json_validation_enabled_oapg(schema_keyword, configuration=None): + """Returns true if JSON schema validation is enabled for the specified + validation keyword. This can be used to skip JSON schema structural validation + as requested in the configuration. + Note: the suffix _oapg stands for openapi python (experimental) generator and + it has been added to prevent collisions with other methods and properties + + Args: + schema_keyword (string): the name of a JSON schema validation keyword. + configuration (Configuration): the configuration class. + """ + + return (configuration is None or + not hasattr(configuration, '_disabled_client_side_validations') or + schema_keyword not in configuration._disabled_client_side_validations) + + @staticmethod + def raise_validation_error_message_oapg(value, constraint_msg, constraint_value, path_to_item, additional_txt=""): + raise ApiValueError( + "Invalid value `{value}`, {constraint_msg} `{constraint_value}`{additional_txt} at {path_to_item}".format( + value=value, + constraint_msg=constraint_msg, + constraint_value=constraint_value, + additional_txt=additional_txt, + path_to_item=path_to_item, + ) + ) + + class Validator(typing.Protocol): @classmethod def _validate( @@ -444,24 +255,6 @@ class Validator(typing.Protocol): pass -def SchemaValidatorClsFactory(**validations: typing.Union[str, bool, None, int, float, list[dict[str, typing.Union[str, int, float]]]]) -> Validator: - class SchemaValidator(ValidatorBase): - @classmethod - def _validate( - cls, - arg, - validation_metadata: ValidationMetadata, - ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: - """ - SchemaValidator _validate - Validates that validations pass - """ - cls._check_validations_for_types(validations, arg, validation_metadata) - return super()._validate(arg, validation_metadata) - - return SchemaValidator - - def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Validator: if typing.get_origin(union_type_cls) is typing.Union: union_classes = typing.get_args(union_type_cls) @@ -537,7 +330,7 @@ def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Val """ arg_type = type(arg) if arg_type in union_classes: - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) raise cls._get_type_error( arg, validation_metadata.path_to_item, @@ -590,7 +383,7 @@ def SchemaEnumMakerClsFactory(enum_value_to_name: typing.Dict[typing.Union[str, cls._enum_value_to_name[arg] except KeyError: raise ApiValueError("Invalid value {} passed in to {}, {}".format(arg, cls, cls._enum_value_to_name)) - return super()._validate(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) return SchemaEnumMaker @@ -626,7 +419,7 @@ class NoneBase: return False -class StrBase: +class StrBase(ValidatorBase): @property def as_str(self) -> str: return self @@ -647,6 +440,68 @@ class StrBase: def as_uuid(self) -> uuid.UUID: raise Exception('not implemented') + @classmethod + def __check_str_validations( + cls, + arg: str, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxLength', validation_metadata.configuration) and + hasattr(cls, '_max_length') and + len(arg) > cls._max_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be less than or equal to", + constraint_value=cls._max_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minLength', validation_metadata.configuration) and + hasattr(cls, '_min_length') and + len(arg) < cls._min_length): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="length must be greater than or equal to", + constraint_value=cls._min_length, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('pattern', validation_metadata.configuration) and + hasattr(cls, '_regex')): + for regex_dict in cls._regex: + flags = regex_dict.get('flags', 0) + if not re.search(regex_dict['pattern'], arg, flags=flags): + if flags != 0: + # Don't print the regex flags if the flags are not + # specified in the OAS document. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item, + additional_txt=" with flags=`{}`".format(flags) + ) + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must match regular expression", + constraint_value=regex_dict['pattern'], + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + StrBase _validate + Validates that validations pass + """ + if isinstance(arg, str): + cls.__check_str_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + class UUIDBase(StrBase): @property @@ -813,7 +668,7 @@ class DecimalBase(StrBase): return super()._validate(arg, validation_metadata=validation_metadata) -class NumberBase: +class NumberBase(ValidatorBase): @property def as_int(self) -> int: try: @@ -844,8 +699,91 @@ class NumberBase: self._as_float = float(self) return self._as_float + @classmethod + def __check_numeric_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if cls.is_json_validation_enabled_oapg('multipleOf', + validation_metadata.configuration) and hasattr(cls, '_multiple_of'): + multiple_of_value = cls._multiple_of + if (not (float(arg) / multiple_of_value).is_integer()): + # Note 'multipleOf' will be as good as the floating point arithmetic. + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="value must be a multiple of", + constraint_value=multiple_of_value, + path_to_item=validation_metadata.path_to_item + ) -class ListBase: + checking_max_or_min_values = any( + hasattr(cls, validation_key) for validation_key in { + '_exclusive_maximum', + '_inclusive_maximum', + '_exclusive_minimum', + '_inclusive_minimum', + } + ) + if not checking_max_or_min_values: + return + + if (cls.is_json_validation_enabled_oapg('exclusiveMaximum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_maximum') and + arg >= cls._exclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('maximum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_maximum') and + arg > cls._inclusive_maximum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value less than or equal to", + constraint_value=cls._inclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('exclusiveMinimum', validation_metadata.configuration) and + hasattr(cls, '_exclusive_minimum') and + arg <= cls._exclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than", + constraint_value=cls._exclusive_maximum, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minimum', validation_metadata.configuration) and + hasattr(cls, '_inclusive_minimum') and + arg < cls._inclusive_minimum): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="must be a value greater than or equal to", + constraint_value=cls._inclusive_minimum, + path_to_item=validation_metadata.path_to_item + ) + + @classmethod + def _validate( + cls, + arg, + validation_metadata: ValidationMetadata, + ) -> typing.Dict[typing.Tuple[typing.Union[str, int], ...], typing.Set[typing.Union['Schema', str, decimal.Decimal, BoolClass, NoneClass, frozendict, tuple]]]: + """ + NumberBase _validate + Validates that validations pass + """ + if isinstance(arg, decimal.Decimal): + cls.__check_numeric_validations(arg, validation_metadata) + return super()._validate(arg, validation_metadata=validation_metadata) + + +class ListBase(ValidatorBase): @classmethod def _validate_items(cls, list_items, validation_metadata: ValidationMetadata): """ @@ -879,6 +817,42 @@ class ListBase: update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_tuple_validations( + cls, arg, + validation_metadata: ValidationMetadata): + + if (cls.is_json_validation_enabled_oapg('maxItems', validation_metadata.configuration) and + hasattr(cls, '_max_items') and + len(arg) > cls._max_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be less than or equal to", + constraint_value=cls._max_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minItems', validation_metadata.configuration) and + hasattr(cls, '_min_items') and + len(arg) < cls._min_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of items must be greater than or equal to", + constraint_value=cls._min_items, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('uniqueItems', validation_metadata.configuration) and + hasattr(cls, '_unique_items') and cls._unique_items and arg): + unique_items = set(arg) + if len(arg) > len(unique_items): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="duplicate items were found, and the tuple must not contain duplicates because", + constraint_value='unique_items==True', + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -900,6 +874,8 @@ class ListBase: ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, tuple): + cls.__check_tuple_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, tuple): return _path_to_schemas @@ -994,7 +970,7 @@ class Discriminable: return None -class DictBase(Discriminable): +class DictBase(Discriminable, ValidatorBase): # subclass properties _required_property_names = set() @@ -1086,6 +1062,32 @@ class DictBase(Discriminable): update(path_to_schemas, other_path_to_schemas) return path_to_schemas + @classmethod + def __check_dict_validations( + cls, + arg, + validation_metadata: ValidationMetadata + ): + if (cls.is_json_validation_enabled_oapg('maxProperties', validation_metadata.configuration) and + hasattr(cls, '_max_properties') and + len(arg) > cls._max_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be less than or equal to", + constraint_value=cls._max_properties, + path_to_item=validation_metadata.path_to_item + ) + + if (cls.is_json_validation_enabled_oapg('minProperties', validation_metadata.configuration) and + hasattr(cls, '_min_properties') and + len(arg) < cls._min_properties): + cls.raise_validation_error_message_oapg( + value=arg, + constraint_msg="number of properties must be greater than or equal to", + constraint_value=cls._min_properties, + path_to_item=validation_metadata.path_to_item + ) + @classmethod def _validate( cls, @@ -1107,6 +1109,8 @@ class DictBase(Discriminable): ApiValueError: when a string can't be converted into a date or datetime and it must be one of those classes ApiTypeError: when the input type is not in the list of allowed spec types """ + if isinstance(arg, frozendict): + cls.__check_dict_validations(arg, validation_metadata) _path_to_schemas = super()._validate(arg, validation_metadata=validation_metadata) if not isinstance(arg, frozendict): return _path_to_schemas @@ -1843,13 +1847,9 @@ class IntSchema(IntBase, NumberSchema): return super().__new__(cls, arg, **kwargs) -class Int32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-2147483648), - inclusive_maximum=decimal.Decimal(2147483647) - ), -): - pass +class Int32Base: + _inclusive_minimum = decimal.Decimal(-2147483648) + _inclusive_maximum = decimal.Decimal(2147483647) class Int32Schema( @@ -1859,13 +1859,9 @@ class Int32Schema( pass -class Int64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-9223372036854775808), - inclusive_maximum=decimal.Decimal(9223372036854775807) - ), -): - pass +class Int64Base: + _inclusive_minimum = decimal.Decimal(-9223372036854775808) + _inclusive_maximum = decimal.Decimal(9223372036854775807) class Int64Schema( @@ -1875,13 +1871,9 @@ class Int64Schema( pass -class Float32Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-3.4028234663852886e+38), - inclusive_maximum=decimal.Decimal(3.4028234663852886e+38) - ), -): - pass +class Float32Base: + _inclusive_minimum = decimal.Decimal(-3.4028234663852886e+38) + _inclusive_maximum = decimal.Decimal(3.4028234663852886e+38) class Float32Schema( @@ -1895,13 +1887,9 @@ class Float32Schema( return super()._from_openapi_data(arg, _configuration=_configuration) -class Float64Base( - SchemaValidatorClsFactory( - inclusive_minimum=decimal.Decimal(-1.7976931348623157E+308), - inclusive_maximum=decimal.Decimal(1.7976931348623157E+308) - ), -): - pass +class Float64Base: + _inclusive_minimum = decimal.Decimal(-1.7976931348623157E+308) + _inclusive_maximum = decimal.Decimal(1.7976931348623157E+308) class Float64Schema( diff --git a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_time_with_validations.py b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_time_with_validations.py index 0703a36da14f..3d26e42bc1d9 100644 --- a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_time_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_time_with_validations.py @@ -56,7 +56,7 @@ class TestDateTimeWithValidations(unittest.TestCase): # value error is raised if an invalid string is passed in with self.assertRaisesRegex( petstore_api.ApiValueError, - r"Invalid value `abcd`, must match regular expression `.+?` at \('args\[0\]',\)" + r"Value does not conform to the required ISO-8601 datetime format. Invalid value 'abcd' for type datetime at \('args\[0\]',\)" ): DateTimeWithValidations._from_openapi_data("abcd") diff --git a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_with_validations.py b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_with_validations.py index e2fcae60f461..e9b743a48f99 100644 --- a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_with_validations.py +++ b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_date_with_validations.py @@ -67,7 +67,7 @@ class TestDateWithValidations(unittest.TestCase): # value error is raised if an invalid string is passed in with self.assertRaisesRegex( petstore_api.ApiValueError, - r"Invalid value `abcd`, must match regular expression `.+?` at \('args\[0\]',\)" + r"Value does not conform to the required ISO-8601 date format. Invalid value 'abcd' for type date at \('args\[0\]',\)" ): DateWithValidations._from_openapi_data("abcd") diff --git a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_validate.py b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_validate.py index 19592fe3842c..f4034bfb6f1b 100644 --- a/samples/openapi3/client/petstore/python-experimental/tests_manual/test_validate.py +++ b/samples/openapi3/client/petstore/python-experimental/tests_manual/test_validate.py @@ -176,7 +176,7 @@ class TestValidateCalls(unittest.TestCase): ), call( Decimal("7"), - ValidationMetadata(path_to_item=("args[0]", 0)) + validation_metadata=ValidationMetadata(path_to_item=("args[0]", 0)) ) ] mock_validate.assert_has_calls( @@ -211,7 +211,7 @@ class TestValidateCalls(unittest.TestCase): ), call( Decimal("7"), - ValidationMetadata(path_to_item=("args[0]", 0), from_server=True) + validation_metadata=ValidationMetadata(path_to_item=("args[0]", 0), from_server=True) ) ] mock_validate.assert_has_calls( @@ -232,7 +232,7 @@ class TestValidateCalls(unittest.TestCase): ), call( "a", - ValidationMetadata(path_to_item=("args[0]", "bar")), + validation_metadata=ValidationMetadata(path_to_item=("args[0]", "bar")), ), ] mock_validate.assert_has_calls( @@ -269,7 +269,7 @@ class TestValidateCalls(unittest.TestCase): ), call( "a", - ValidationMetadata(path_to_item=("args[0]", "bar"), from_server=True), + validation_metadata=ValidationMetadata(path_to_item=("args[0]", "bar"), from_server=True), ), ] mock_validate.assert_has_calls(