diff options
author | Harald Nezbeda <hn@nezhar.com> | 2021-06-18 16:10:21 +0200 |
---|---|---|
committer | Harald Nezbeda <hn@nezhar.com> | 2021-07-19 18:14:31 +0200 |
commit | bb8b7eee22e986b5f8c682e30c38a05e474e53d8 (patch) | |
tree | 5a5ebb196e29833eb87f3192ed26cd674d55ee8d /jsonschema/_validators.py | |
parent | 96b7fe8a2e0827d19637d6a854c5161738e284a4 (diff) | |
download | jsonschema-bb8b7eee22e986b5f8c682e30c38a05e474e53d8.tar.gz |
Julian/jsonschema#782: Implements unevaluatedItems validations
Diffstat (limited to 'jsonschema/_validators.py')
-rw-r--r-- | jsonschema/_validators.py | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/jsonschema/_validators.py b/jsonschema/_validators.py index 0ca215a..b0a4f88 100644 --- a/jsonschema/_validators.py +++ b/jsonschema/_validators.py @@ -6,6 +6,7 @@ from jsonschema._utils import ( equal, extras_msg, find_additional_properties, + find_evaluated_item_indexes_by_schema, types_msg, unbool, uniq, @@ -70,21 +71,13 @@ def items(validator, items, instance, schema): if not validator.is_type(instance, "array"): return - if validator.is_type(items, "array"): - """ - Used in in Draft 7 an bellow, probably also useful for legacy schema format - """ - for (index, item), subschema in zip(enumerate(instance), items): - for error in validator.descend( - item, subschema, path=index, schema_path=index, - ): - yield error - elif validator.is_type(items, "boolean") and 'prefixItems' in schema: - if len(instance) > len(schema['prefixItems']): - yield ValidationError("%r has more items than defined in prefixItems" % instance) - else: - for error in validator.descend(instance, {'prefixItems': schema['prefixItems']}, path='items__prefixItems'): - yield error + if validator.is_type(items, "boolean") and 'prefixItems' in schema: + if not items: + if len(instance) > len(schema['prefixItems']): + yield ValidationError("%r has more items than defined in prefixItems" % instance) + else: + for error in validator.descend(instance, {'prefixItems': schema['prefixItems']}, path='items__prefixItems'): + yield error else: if 'prefixItems' in schema: for error in validator.descend(instance, {'prefixItems': schema['prefixItems']}, path='items__prefixItems'): @@ -497,17 +490,18 @@ def unevaluatedItems(validator, unevaluatedItems, instance, schema): if not validator.is_type(instance, "array"): return - if unevaluatedItems: - return + if validator.is_type(unevaluatedItems, "boolean"): + if unevaluatedItems: + return - # ToDo: Implement additional checks for "prefixItems", "items", "contains", "if", "then", "else", "allOf", "anyOf", - # "oneOf" and "not" keywords + evaluated_item_indexes = find_evaluated_item_indexes_by_schema(validator, instance, schema) + for k, v in enumerate(instance): + if k not in evaluated_item_indexes: + for error in validator.descend(v, unevaluatedItems, schema_path="unevaluatedItems"): + yield error def prefixItems(validator, prefixItems, instance, schema): - if "unevaluatedItems" in schema: - return - if not validator.is_type(instance, "array"): return |