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

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✗|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✗|OAS3
|PrefixItems|✗|OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✗|OAS3
|Required|✓|OAS2,OAS3
Expand Down
1 change: 1 addition & 0 deletions docs/generators/jaxrs-jersey.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✗|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✗|OAS3
|PrefixItems|✗|OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✗|OAS3
|Required|✓|OAS2,OAS3
Expand Down
1 change: 1 addition & 0 deletions docs/generators/jmeter.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✗|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✗|OAS3
|PrefixItems|✗|OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✗|OAS3
|Required|✓|OAS2,OAS3
Expand Down
1 change: 1 addition & 0 deletions docs/generators/kotlin.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✗|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✗|OAS3
|PrefixItems|✗|OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✗|OAS3
|Required|✓|OAS2,OAS3
Expand Down
1 change: 1 addition & 0 deletions docs/generators/python.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✓|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✓|OAS3
|PrefixItems|✓|OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✓|OAS3
|Required|✓|OAS2,OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
'not_': 'not',
'one_of': 'oneOf',
'pattern': 'pattern',
'pattern_properties': 'patternProperties',
'prefix_items': 'prefixItems',
'properties': 'properties',
'property_names': 'propertyNames',
'required': 'required',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,20 @@ def _validate(
if 'contains' in vars(cls_schema):
contains_qty = _get_contains_qty(
arg,
json_schema_data['contains'],
vars(cls_schema)['contains'],
validation_metadata,
path_to_schemas
)
prefix_items_length = 0
if 'prefix_items' in vars(cls_schema):
prefix_items_length = len(vars(cls_schema)['prefix_items'])
for keyword, val in json_schema_data.items():
used_val = (val, contains_qty) if keyword in {'contains', 'min_contains', 'max_contains'} else val
if keyword in {'contains', 'min_contains', 'max_contains'}:
used_val = (val, contains_qty)
elif keyword == 'items':
used_val = (val, prefix_items_length)
else:
used_val = val
validator = json_schema_keyword_to_validator[keyword]

other_path_to_schemas = validator(
Expand Down Expand Up @@ -660,15 +668,17 @@ def validate_required(

def validate_items(
arg: typing.Any,
item_cls: typing.Type[SchemaValidator],
item_cls_prefix_items_length: typing.Tuple[typing.Type[SchemaValidator], int],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
item_cls = _get_class(item_cls)
item_cls = _get_class(item_cls_prefix_items_length[0])
prefix_items_length = item_cls_prefix_items_length[1]
path_to_schemas: PathToSchemasType = {}
for i, value in enumerate(arg):
for i in range(prefix_items_length, len(arg)):
value = arg[i]
item_validation_metadata = ValidationMetadata(
path_to_item=validation_metadata.path_to_item+(i,),
configuration=validation_metadata.configuration,
Expand Down Expand Up @@ -1154,6 +1164,34 @@ def validate_pattern_properties(
return path_to_schemas


def validate_prefix_items(
arg: typing.Any,
prefix_items: typing.Tuple[typing.Type[SchemaValidator], ...],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
path_to_schemas: PathToSchemasType = {}
module_namespace = vars(sys.modules[cls.__module__])
for i, val in enumerate(arg):
if i >= len(prefix_items):
break
schema = _get_class(prefix_items[i], module_namespace)
path_to_item = validation_metadata.path_to_item + (i,)
item_validation_metadata = ValidationMetadata(
path_to_item=path_to_item,
configuration=validation_metadata.configuration,
validated_path_to_schemas=validation_metadata.validated_path_to_schemas
)
if item_validation_metadata.validation_ran_earlier(schema):
add_deeper_validated_schemas(validation_metadata, path_to_schemas)
continue
other_path_to_schemas = schema._validate(val, validation_metadata=item_validation_metadata)
update(path_to_schemas, other_path_to_schemas)
return path_to_schemas


validator_type = typing.Callable[[typing.Any, typing.Any, type, ValidationMetadata], typing.Optional[PathToSchemasType]]
json_schema_keyword_to_validator: typing.Mapping[str, validator_type] = {
'types': validate_types,
Expand Down Expand Up @@ -1188,5 +1226,6 @@ def validate_pattern_properties(
'dependent_required': validate_dependent_required,
'dependent_schemas': validate_dependent_schemas,
'property_names': validate_property_names,
'pattern_properties': validate_pattern_properties
'pattern_properties': validate_pattern_properties,
'prefix_items': validate_prefix_items
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ docs/components/schema/any_type_dependent_schemas.md
docs/components/schema/any_type_max_contains_value.md
docs/components/schema/any_type_min_contains_value.md
docs/components/schema/any_type_pattern_properties.md
docs/components/schema/any_type_prefix_items.md
docs/components/schema/any_type_property_names.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/components/schema/array_prefix_items.md
docs/components/schema/object_dependent_required.md
docs/components/schema/object_dependent_schemas.md
docs/components/schema/object_pattern_properties.md
Expand Down Expand Up @@ -46,10 +48,12 @@ src/json_schema_api/components/schema/any_type_dependent_schemas.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/any_type_pattern_properties.py
src/json_schema_api/components/schema/any_type_prefix_items.py
src/json_schema_api/components/schema/any_type_property_names.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/schema/array_prefix_items.py
src/json_schema_api/components/schema/object_dependent_required.py
src/json_schema_api/components/schema/object_dependent_schemas.py
src/json_schema_api/components/schema/object_pattern_properties.py
Expand Down
2 changes: 2 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 @@ -180,10 +180,12 @@ Class | Description
[AnyTypeMaxContainsValue](docs/components/schema/any_type_max_contains_value.md) |
[AnyTypeMinContainsValue](docs/components/schema/any_type_min_contains_value.md) |
[AnyTypePatternProperties](docs/components/schema/any_type_pattern_properties.md) |
[AnyTypePrefixItems](docs/components/schema/any_type_prefix_items.md) |
[AnyTypePropertyNames](docs/components/schema/any_type_property_names.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) |
[ArrayPrefixItems](docs/components/schema/array_prefix_items.md) |
[ObjectDependentRequired](docs/components/schema/object_dependent_required.md) |
[ObjectDependentSchemas](docs/components/schema/object_dependent_schemas.md) |
[ObjectPatternProperties](docs/components/schema/object_pattern_properties.md) |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# AnyTypePrefixItems
json_schema_api.components.schema.any_type_prefix_items
```
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 @@
# ArrayPrefixItems
json_schema_api.components.schema.array_prefix_items
```
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,34 @@
# 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]

_0: typing_extensions.TypeAlias = schemas.NumberSchema
_1: typing_extensions.TypeAlias = schemas.StrSchema


@dataclasses.dataclass(frozen=True)
class AnyTypePrefixItems(
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
prefix_items: typing.Tuple[
typing.Type[_0],
typing.Type[_1],
] = (
_0,
_1,
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# 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]

_0: typing_extensions.TypeAlias = schemas.NumberSchema
_1: typing_extensions.TypeAlias = schemas.StrSchema


@dataclasses.dataclass(frozen=True)
class ArrayPrefixItems(
schemas.Schema[schemas.immutabledict, 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.
"""
types: typing.FrozenSet[typing.Type] = frozenset({tuple})
prefix_items: typing.Tuple[
typing.Type[_0],
typing.Type[_1],
] = (
_0,
_1,
)

@classmethod
def validate(
cls,
arg: typing.Union[
typing.List[schemas.INPUT_TYPES_ALL],
typing.Tuple[schemas.INPUT_TYPES_ALL, ...],
],
configuration: typing.Optional[schema_configuration.SchemaConfiguration] = None
) -> typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]:
return super().validate_base(
arg,
configuration=configuration,
)
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
from json_schema_api.components.schema.any_type_max_contains_value import AnyTypeMaxContainsValue
from json_schema_api.components.schema.any_type_min_contains_value import AnyTypeMinContainsValue
from json_schema_api.components.schema.any_type_pattern_properties import AnyTypePatternProperties
from json_schema_api.components.schema.any_type_prefix_items import AnyTypePrefixItems
from json_schema_api.components.schema.any_type_property_names import AnyTypePropertyNames
from json_schema_api.components.schema.array_contains_value import ArrayContainsValue
from json_schema_api.components.schema.array_max_contains_value import ArrayMaxContainsValue
from json_schema_api.components.schema.array_min_contains_value import ArrayMinContainsValue
from json_schema_api.components.schema.array_prefix_items import ArrayPrefixItems
from json_schema_api.components.schema.object_dependent_required import ObjectDependentRequired
from json_schema_api.components.schema.object_dependent_schemas import ObjectDependentSchemas
from json_schema_api.components.schema.object_pattern_properties import ObjectPatternProperties
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
'not_': 'not',
'one_of': 'oneOf',
'pattern': 'pattern',
'pattern_properties': 'patternProperties',
'prefix_items': 'prefixItems',
'properties': 'properties',
'property_names': 'propertyNames',
'required': 'required',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,20 @@ def _validate(
if 'contains' in vars(cls_schema):
contains_qty = _get_contains_qty(
arg,
json_schema_data['contains'],
vars(cls_schema)['contains'],
validation_metadata,
path_to_schemas
)
prefix_items_length = 0
if 'prefix_items' in vars(cls_schema):
prefix_items_length = len(vars(cls_schema)['prefix_items'])
for keyword, val in json_schema_data.items():
used_val = (val, contains_qty) if keyword in {'contains', 'min_contains', 'max_contains'} else val
if keyword in {'contains', 'min_contains', 'max_contains'}:
used_val = (val, contains_qty)
elif keyword == 'items':
used_val = (val, prefix_items_length)
else:
used_val = val
validator = json_schema_keyword_to_validator[keyword]

other_path_to_schemas = validator(
Expand Down Expand Up @@ -660,15 +668,17 @@ def validate_required(

def validate_items(
arg: typing.Any,
item_cls: typing.Type[SchemaValidator],
item_cls_prefix_items_length: typing.Tuple[typing.Type[SchemaValidator], int],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
item_cls = _get_class(item_cls)
item_cls = _get_class(item_cls_prefix_items_length[0])
prefix_items_length = item_cls_prefix_items_length[1]
path_to_schemas: PathToSchemasType = {}
for i, value in enumerate(arg):
for i in range(prefix_items_length, len(arg)):
value = arg[i]
item_validation_metadata = ValidationMetadata(
path_to_item=validation_metadata.path_to_item+(i,),
configuration=validation_metadata.configuration,
Expand Down Expand Up @@ -1154,6 +1164,34 @@ def validate_pattern_properties(
return path_to_schemas


def validate_prefix_items(
arg: typing.Any,
prefix_items: typing.Tuple[typing.Type[SchemaValidator], ...],
cls: typing.Type,
validation_metadata: ValidationMetadata,
) -> typing.Optional[PathToSchemasType]:
if not isinstance(arg, tuple):
return None
path_to_schemas: PathToSchemasType = {}
module_namespace = vars(sys.modules[cls.__module__])
for i, val in enumerate(arg):
if i >= len(prefix_items):
break
schema = _get_class(prefix_items[i], module_namespace)
path_to_item = validation_metadata.path_to_item + (i,)
item_validation_metadata = ValidationMetadata(
path_to_item=path_to_item,
configuration=validation_metadata.configuration,
validated_path_to_schemas=validation_metadata.validated_path_to_schemas
)
if item_validation_metadata.validation_ran_earlier(schema):
add_deeper_validated_schemas(validation_metadata, path_to_schemas)
continue
other_path_to_schemas = schema._validate(val, validation_metadata=item_validation_metadata)
update(path_to_schemas, other_path_to_schemas)
return path_to_schemas


validator_type = typing.Callable[[typing.Any, typing.Any, type, ValidationMetadata], typing.Optional[PathToSchemasType]]
json_schema_keyword_to_validator: typing.Mapping[str, validator_type] = {
'types': validate_types,
Expand Down Expand Up @@ -1188,5 +1226,6 @@ def validate_pattern_properties(
'dependent_required': validate_dependent_required,
'dependent_schemas': validate_dependent_schemas,
'property_names': validate_property_names,
'pattern_properties': validate_pattern_properties
'pattern_properties': validate_pattern_properties,
'prefix_items': validate_prefix_items
}
Loading