Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✗|OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains|✗|OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
2 changes: 2 additions & 0 deletions docs/generators/jaxrs-jersey.md
Original file line number Diff line number Diff line change
Expand Up @@ -307,10 +307,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✗|OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains|✗|OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
2 changes: 2 additions & 0 deletions docs/generators/jmeter.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✗|OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains|✗|OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
2 changes: 2 additions & 0 deletions docs/generators/kotlin.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✗|OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains|✗|OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
2 changes: 2 additions & 0 deletions docs/generators/python.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,10 +235,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✓|OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains|✓|OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
'inclusive_maximum': 'maximum',
'inclusive_minimum': 'minimum',
'items': 'items',
'max_contains': 'maxContains',
'max_items': 'maxItems',
'max_length': 'maxLength',
'max_properties': 'maxProperties',
'min_contains': 'minContains',
'min_items': 'minItems',
'min_length': 'minLength',
'min_properties': 'minProperties',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,22 @@ def _validate(
and k
not in validation_metadata.configuration.disabled_json_schema_python_keywords
}
contains_qty = 0
path_to_schemas: PathToSchemasType = {}
if 'contains' in vars(cls_schema):
contains_qty = _get_contains_qty(
arg,
json_schema_data['contains'],
validation_metadata,
path_to_schemas
)
for keyword, val in json_schema_data.items():
used_val = (val, contains_qty) if keyword in {'contains', 'min_contains', 'max_contains'} else val
validator = json_schema_keyword_to_validator[keyword]

other_path_to_schemas = validator(
arg,
val,
used_val,
cls,
validation_metadata,
)
Expand Down Expand Up @@ -956,17 +965,17 @@ def validate_discriminator(
return discriminated_cls._validate(arg, validation_metadata=updated_vm)


def validate_contains(
def _get_contains_qty(
arg: typing.Any,
contains_cls: typing.Type[SchemaValidator],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
path_to_schemas: PathToSchemasType
) -> int:
if not isinstance(arg, tuple):
return None
return 0
contains_cls = _get_class(contains_cls)
path_to_schemas: PathToSchemasType = {}
array_contains_item = False
these_path_to_schemas: PathToSchemasType = {}
contains_qty = 0
for i, value in enumerate(arg):
item_validation_metadata = ValidationMetadata(
path_to_item=validation_metadata.path_to_item+(i,),
Expand All @@ -975,20 +984,70 @@ def validate_contains(
)
if item_validation_metadata.validation_ran_earlier(contains_cls):
add_deeper_validated_schemas(item_validation_metadata, path_to_schemas)
return path_to_schemas
contains_qty += 1
continue
try:
other_path_to_schemas = contains_cls._validate(
value, validation_metadata=item_validation_metadata)
update(path_to_schemas, other_path_to_schemas)
return path_to_schemas
update(these_path_to_schemas, other_path_to_schemas)
contains_qty += 1
except exceptions.OpenApiException:
pass
if not array_contains_item:
if contains_qty:
update(path_to_schemas, these_path_to_schemas)
return contains_qty


def validate_contains(
arg: typing.Any,
contains_qty: typing.Tuple[typing.Type[SchemaValidator], int],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
if not contains_qty[1]:
raise exceptions.ApiValueError(
"Validation failed for contains keyword in class={} at path_to_item={}. No "
"items validated to the contains schema.".format(cls, validation_metadata.path_to_item)
)
return path_to_schemas
return None


def validate_min_contains(
arg: typing.Any,
min_contains_and_qty: typing.Tuple[int, int],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
min_contains = min_contains_and_qty[0]
contains_qty = min_contains_and_qty[1]
if not contains_qty or contains_qty < min_contains:
raise exceptions.ApiValueError(
"Validation failed for minContains keyword in class={} at path_to_item={}. No "
"items validated to the contains schema.".format(cls, validation_metadata.path_to_item)
)
return None


def validate_max_contains(
arg: typing.Any,
max_contains_and_qty: typing.Tuple[int, int],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
max_contains = max_contains_and_qty[0]
contains_qty = max_contains_and_qty[1]
if not contains_qty or contains_qty > max_contains:
raise exceptions.ApiValueError(
"Validation failed for maxContains keyword in class={} at path_to_item={}. Too "
"many items validated to the contains schema.".format(cls, validation_metadata.path_to_item)
)
return None


validator_type = typing.Callable[[typing.Any, typing.Any, type, ValidationMetadata], typing.Optional[PathToSchemasType]]
Expand Down Expand Up @@ -1018,5 +1077,7 @@ def validate_contains(
'all_of': validate_all_of,
'not_': validate_not,
'discriminator': validate_discriminator,
'contains': validate_contains
'contains': validate_contains,
'min_contains': validate_min_contains,
'max_contains': validate_max_contains
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
README.md
docs/apis/tags/default_api.md
docs/components/schema/any_type_contains_value.md
docs/components/schema/any_type_max_contains_value.md
docs/components/schema/any_type_min_contains_value.md
docs/components/schema/array_contains_value.md
docs/components/schema/array_max_contains_value.md
docs/components/schema/array_min_contains_value.md
docs/paths/some_path/get.md
docs/paths/some_path/get/responses/response_200/content/application_json/schema.md
docs/servers/server_0.md
Expand All @@ -26,7 +30,11 @@ src/json_schema_api/apis/tags/default_api.py
src/json_schema_api/components/__init__.py
src/json_schema_api/components/schema/__init__.py
src/json_schema_api/components/schema/any_type_contains_value.py
src/json_schema_api/components/schema/any_type_max_contains_value.py
src/json_schema_api/components/schema/any_type_min_contains_value.py
src/json_schema_api/components/schema/array_contains_value.py
src/json_schema_api/components/schema/array_max_contains_value.py
src/json_schema_api/components/schema/array_min_contains_value.py
src/json_schema_api/components/schemas/__init__.py
src/json_schema_api/configurations/__init__.py
src/json_schema_api/configurations/api_configuration.py
Expand Down
4 changes: 4 additions & 0 deletions samples/client/3_1_0_json_schema/python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,11 @@ HTTP request | Method | Description
Class | Description
----- | ------------
[AnyTypeContainsValue](docs/components/schema/any_type_contains_value.md) |
[AnyTypeMaxContainsValue](docs/components/schema/any_type_max_contains_value.md) |
[AnyTypeMinContainsValue](docs/components/schema/any_type_min_contains_value.md) |
[ArrayContainsValue](docs/components/schema/array_contains_value.md) |
[ArrayMaxContainsValue](docs/components/schema/array_max_contains_value.md) |
[ArrayMinContainsValue](docs/components/schema/array_min_contains_value.md) |

## Notes for Large OpenAPI documents
If the OpenAPI document is large, imports in json_schema_api.apis.tags.tag_to_api and json_schema_api.components.schemas may fail with a
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# AnyTypeMaxContainsValue
json_schema_api.components.schema.any_type_max_contains_value
```
type: schemas.Schema
```

## validate method
Input Type | Return Type | Notes
------------ | ------------- | -------------
dict, schemas.immutabledict, str, datetime.date, datetime.datetime, uuid.UUID, int, float, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader | schemas.immutabledict, str, float, int, bool, None, tuple, bytes, io.FileIO |

[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# AnyTypeMinContainsValue
json_schema_api.components.schema.any_type_min_contains_value
```
type: schemas.Schema
```

## validate method
Input Type | Return Type | Notes
------------ | ------------- | -------------
dict, schemas.immutabledict, str, datetime.date, datetime.datetime, uuid.UUID, int, float, bool, None, list, tuple, bytes, io.FileIO, io.BufferedReader | schemas.immutabledict, str, float, int, bool, None, tuple, bytes, io.FileIO |

[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# ArrayMaxContainsValue
json_schema_api.components.schema.array_max_contains_value
```
type: schemas.Schema
```

## validate method
Input Type | Return Type | Notes
------------ | ------------- | -------------
list, tuple | tuple |

[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# ArrayMinContainsValue
json_schema_api.components.schema.array_min_contains_value
```
type: schemas.Schema
```

## validate method
Input Type | Return Type | Notes
------------ | ------------- | -------------
list, tuple | tuple |

[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# coding: utf-8

"""
Example
No description provided (generated by Openapi JSON Schema Generator https://github.com/openapi-json-schema-tools/openapi-json-schema-generator) # noqa: E501
The version of the OpenAPI document: 1.0.0
Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator
"""

from __future__ import annotations
from json_schema_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary]



class ContainsEnums:

@schemas.classproperty
def POSITIVE_1(cls) -> typing.Literal[1]:
return Contains.validate(1)


@dataclasses.dataclass(frozen=True)
class Contains(
schemas.Schema
):
types: typing.FrozenSet[typing.Type] = frozenset({
float,
int,
})
enum_value_to_name: typing.Mapping[typing.Union[int, float, str, schemas.Bool, None], str] = dataclasses.field(
default_factory=lambda: {
1: "POSITIVE_1",
}
)
enums = ContainsEnums

@typing.overload
@classmethod
def validate(
cls,
arg: typing.Literal[1],
configuration: typing.Optional[schema_configuration.SchemaConfiguration] = None
) -> typing.Literal[1]: ...
@typing.overload
@classmethod
def validate(
cls,
arg: int,
configuration: typing.Optional[schema_configuration.SchemaConfiguration] = None
) -> typing.Literal[1,]: ...
@classmethod
def validate(
cls,
arg: typing.Union[int, float],
configuration: typing.Optional[schema_configuration.SchemaConfiguration] = None
) -> typing.Union[int, float]:
validated_arg = super().validate_base(
arg,
configuration=configuration,
)
return validated_arg


@dataclasses.dataclass(frozen=True)
class AnyTypeMaxContainsValue(
schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]],
):
"""NOTE: This class is auto generated by OpenAPI JSON Schema Generator.
Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator

Do not edit the class manually.
"""
# any type
contains: typing.Type[Contains] = dataclasses.field(default_factory=lambda: Contains) # type: ignore
max_contains: typing.Literal[2] = 2

Loading