Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit e50ffc7

Browse files
authored
Adds json schema test cases for 11 added keywords (#241)
* Adds const components and examples * Excludes components that throw errors in swagger-parser * Excludes more test cases * Excludes 2 more test cases * Samples regen * removes error files * Removes failing test cases * Samples regen * Adds contains samples in test spec * Adds contains test cases * Samples regen * Adds dependentRequired python tests * Removes test that does not pass * Adds test for dependentSchemas * Adds maxContains tests * Adds minContains test cases * Turns on patternProperties tests * Moves additionalProperties evaluation to the end so keywords can be validated first * patternProperties tests added, turns off broken addProps test * Adds prefixItems tests * Adds propertyNames tests * Adds unevaluatedItems test cases to test spec * Excludes some of the unevaluatedItems tests begause of swagger parser bugs * Adds unevaluatedItems tests * Skips 6 test cases * Disables 6 more test schemas * Disables 5 more test cases * Disables 4 test cases * Disables 5 more tests * Disables 5 more broken tests * Adds unevaluatedProperties tests * All tests passing * Turns on tests that were turned off because of 303 not supporting type arrays * Samples regen
1 parent 8e20f76 commit e50ffc7

File tree

1,011 files changed

+36546
-971
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,011 files changed

+36546
-971
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ mvn -Pstatic-analysis clean install
132132

133133
#### OpenAPI JSON Schema Generator CLI Docker Image
134134

135-
The OpenAPI JSON Schema Generator image acts as a standalone executable. It can be used as an alternative to installing via homebrew, or for developers who are unable to install Java or upgrade the installed version.
135+
The docker image acts as a standalone executable. It can be used as an alternative to installing via homebrew, or for developers who are unable to install Java or upgrade the installed version.
136136

137137
To generate code with this image, you'll need to mount a local location as a volume.
138138

samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/additionalproperties_should_not_look_in_applicators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ class AdditionalpropertiesShouldNotLookInApplicators(
145145
Do not edit the class manually.
146146
"""
147147
# any type
148-
additional_properties: typing.Type[AdditionalProperties] = dataclasses.field(default_factory=lambda: AdditionalProperties) # type: ignore
149148
all_of: AllOf = dataclasses.field(default_factory=lambda: schemas.tuple_to_instance(AllOf)) # type: ignore
149+
additional_properties: typing.Type[AdditionalProperties] = dataclasses.field(default_factory=lambda: AdditionalProperties) # type: ignore
150150
type_to_output_cls: typing.Mapping[
151151
typing.Type,
152152
typing.Type

samples/client/3_0_3_unit_test/python/src/unit_test_api/schemas/validation.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ def _validate(
9999
validation_metadata,
100100
path_to_schemas
101101
)
102+
validated_pattern_properties: typing.Optional[PathToSchemasType] = None
103+
if 'pattern_properties' in vars(cls_schema):
104+
validated_pattern_properties = _get_validated_pattern_properties(
105+
arg,
106+
vars(cls_schema)['pattern_properties'],
107+
cls,
108+
validation_metadata
109+
)
102110
prefix_items_length = 0
103111
if 'prefix_items' in vars(cls_schema):
104112
prefix_items_length = len(vars(cls_schema)['prefix_items'])
@@ -113,6 +121,8 @@ def _validate(
113121
elif keyword in {'types'}:
114122
format: typing.Optional[str] = vars(cls_schema).get('format', None)
115123
used_val = (val, format)
124+
elif keyword in {'pattern_properties', 'additional_properties'}:
125+
used_val = (val, validated_pattern_properties)
116126
else:
117127
used_val = val
118128
validator = json_schema_keyword_to_validator[keyword]
@@ -737,19 +747,25 @@ def validate_properties(
737747

738748
def validate_additional_properties(
739749
arg: typing.Any,
740-
additional_properties_cls: typing.Type[SchemaValidator],
750+
additional_properties_cls_val_pprops: typing.Tuple[
751+
typing.Type[SchemaValidator],
752+
typing.Optional[PathToSchemasType]
753+
],
741754
cls: typing.Type,
742755
validation_metadata: ValidationMetadata,
743756
) -> typing.Optional[PathToSchemasType]:
744757
if not isinstance(arg, immutabledict):
745758
return None
746-
schema = _get_class(additional_properties_cls)
759+
schema = _get_class(additional_properties_cls_val_pprops[0])
747760
path_to_schemas: PathToSchemasType = {}
748761
cls_schema = cls()
749762
properties = cls_schema.properties if hasattr(cls_schema, 'properties') else {}
750763
present_additional_properties = {k: v for k, v, in arg.items() if k not in properties}
764+
validated_pattern_properties = additional_properties_cls_val_pprops[1]
751765
for property_name, value in present_additional_properties.items():
752766
path_to_item = validation_metadata.path_to_item + (property_name,)
767+
if validated_pattern_properties and path_to_item in validated_pattern_properties:
768+
continue
753769
arg_validation_metadata = ValidationMetadata(
754770
path_to_item=path_to_item,
755771
configuration=validation_metadata.configuration,
@@ -1148,7 +1164,7 @@ def validate_property_names(
11481164
return None
11491165

11501166

1151-
def validate_pattern_properties(
1167+
def _get_validated_pattern_properties(
11521168
arg: typing.Any,
11531169
pattern_properties: typing.Mapping[PatternInfo, typing.Type[SchemaValidator]],
11541170
cls: typing.Type,
@@ -1178,6 +1194,21 @@ def validate_pattern_properties(
11781194
return path_to_schemas
11791195

11801196

1197+
def validate_pattern_properties(
1198+
arg: typing.Any,
1199+
pattern_properties_validation_results: typing.Tuple[
1200+
typing.Mapping[PatternInfo, typing.Type[SchemaValidator]],
1201+
typing.Optional[PathToSchemasType]
1202+
],
1203+
cls: typing.Type,
1204+
validation_metadata: ValidationMetadata,
1205+
) -> typing.Optional[PathToSchemasType]:
1206+
if not isinstance(arg, immutabledict):
1207+
return None
1208+
validation_results = pattern_properties_validation_results[1]
1209+
return validation_results
1210+
1211+
11811212
def validate_prefix_items(
11821213
arg: typing.Any,
11831214
prefix_items: typing.Tuple[typing.Type[SchemaValidator], ...],

samples/client/3_1_0_json_schema/python/src/json_schema_api/schemas/validation.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ def _validate(
9999
validation_metadata,
100100
path_to_schemas
101101
)
102+
validated_pattern_properties: typing.Optional[PathToSchemasType] = None
103+
if 'pattern_properties' in vars(cls_schema):
104+
validated_pattern_properties = _get_validated_pattern_properties(
105+
arg,
106+
vars(cls_schema)['pattern_properties'],
107+
cls,
108+
validation_metadata
109+
)
102110
prefix_items_length = 0
103111
if 'prefix_items' in vars(cls_schema):
104112
prefix_items_length = len(vars(cls_schema)['prefix_items'])
@@ -113,6 +121,8 @@ def _validate(
113121
elif keyword in {'types'}:
114122
format: typing.Optional[str] = vars(cls_schema).get('format', None)
115123
used_val = (val, format)
124+
elif keyword in {'pattern_properties', 'additional_properties'}:
125+
used_val = (val, validated_pattern_properties)
116126
else:
117127
used_val = val
118128
validator = json_schema_keyword_to_validator[keyword]
@@ -737,19 +747,25 @@ def validate_properties(
737747

738748
def validate_additional_properties(
739749
arg: typing.Any,
740-
additional_properties_cls: typing.Type[SchemaValidator],
750+
additional_properties_cls_val_pprops: typing.Tuple[
751+
typing.Type[SchemaValidator],
752+
typing.Optional[PathToSchemasType]
753+
],
741754
cls: typing.Type,
742755
validation_metadata: ValidationMetadata,
743756
) -> typing.Optional[PathToSchemasType]:
744757
if not isinstance(arg, immutabledict):
745758
return None
746-
schema = _get_class(additional_properties_cls)
759+
schema = _get_class(additional_properties_cls_val_pprops[0])
747760
path_to_schemas: PathToSchemasType = {}
748761
cls_schema = cls()
749762
properties = cls_schema.properties if hasattr(cls_schema, 'properties') else {}
750763
present_additional_properties = {k: v for k, v, in arg.items() if k not in properties}
764+
validated_pattern_properties = additional_properties_cls_val_pprops[1]
751765
for property_name, value in present_additional_properties.items():
752766
path_to_item = validation_metadata.path_to_item + (property_name,)
767+
if validated_pattern_properties and path_to_item in validated_pattern_properties:
768+
continue
753769
arg_validation_metadata = ValidationMetadata(
754770
path_to_item=path_to_item,
755771
configuration=validation_metadata.configuration,
@@ -1148,7 +1164,7 @@ def validate_property_names(
11481164
return None
11491165

11501166

1151-
def validate_pattern_properties(
1167+
def _get_validated_pattern_properties(
11521168
arg: typing.Any,
11531169
pattern_properties: typing.Mapping[PatternInfo, typing.Type[SchemaValidator]],
11541170
cls: typing.Type,
@@ -1178,6 +1194,21 @@ def validate_pattern_properties(
11781194
return path_to_schemas
11791195

11801196

1197+
def validate_pattern_properties(
1198+
arg: typing.Any,
1199+
pattern_properties_validation_results: typing.Tuple[
1200+
typing.Mapping[PatternInfo, typing.Type[SchemaValidator]],
1201+
typing.Optional[PathToSchemasType]
1202+
],
1203+
cls: typing.Type,
1204+
validation_metadata: ValidationMetadata,
1205+
) -> typing.Optional[PathToSchemasType]:
1206+
if not isinstance(arg, immutabledict):
1207+
return None
1208+
validation_results = pattern_properties_validation_results[1]
1209+
return validation_results
1210+
1211+
11811212
def validate_prefix_items(
11821213
arg: typing.Any,
11831214
prefix_items: typing.Tuple[typing.Type[SchemaValidator], ...],

0 commit comments

Comments
 (0)