diff options
author | Harald Nezbeda <hn@nezhar.com> | 2021-06-30 14:05:46 +0200 |
---|---|---|
committer | Harald Nezbeda <hn@nezhar.com> | 2021-07-20 17:08:48 +0200 |
commit | 769478dc39395e16bce1943c691abf5719cf5bb7 (patch) | |
tree | 2c69032e7933b53f0d3b5e9d7e99a1d28a278637 | |
parent | 95742b4573b81d0b1e3a4f4be8c1f4238689eb6c (diff) | |
download | jsonschema-769478dc39395e16bce1943c691abf5719cf5bb7.tar.gz |
Julian/jsonschema#782: Update validation message for unevaluatedProperties and unevaluatedItems
-rw-r--r-- | jsonschema/_validators.py | 14 | ||||
-rw-r--r-- | jsonschema/tests/test_validators.py | 34 |
2 files changed, 46 insertions, 2 deletions
diff --git a/jsonschema/_validators.py b/jsonschema/_validators.py index 3d4f4b8..c2c136f 100644 --- a/jsonschema/_validators.py +++ b/jsonschema/_validators.py @@ -512,12 +512,17 @@ def unevaluatedItems(validator, unevaluatedItems, instance, schema): evaluated_item_indexes = find_evaluated_item_indexes_by_schema( validator, instance, schema ) + unevaluated_items = [] 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 + unevaluated_items.append(v) + + if len(unevaluated_items): + error = "Unevaluated items are not allowed (%s %s unexpected)" + yield ValidationError(error % extras_msg(unevaluated_items)) def unevaluatedProperties(validator, unevaluatedProperties, instance, schema): @@ -527,6 +532,7 @@ def unevaluatedProperties(validator, unevaluatedProperties, instance, schema): evaluated_property_keys = find_evaluated_property_keys_by_schema( validator, instance, schema ) + unevaluated_property_keys = [] for property, subschema in instance.items(): if property not in evaluated_property_keys: for error in validator.descend( @@ -535,7 +541,11 @@ def unevaluatedProperties(validator, unevaluatedProperties, instance, schema): path=property, schema_path=property, ): - yield error + unevaluated_property_keys.append(property) + + if len(unevaluated_property_keys): + error = "Unevaluated properties are not allowed (%s %s unexpected)" + yield ValidationError(error % extras_msg(unevaluated_property_keys)) def prefixItems(validator, prefixItems, instance, schema): diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index fc6a239..bb3fefb 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -383,6 +383,40 @@ class TestValidationErrorMessages(TestCase): ) self.assertIn("False schema does not allow 'something'", message) + def test_unevaluated_properties(self): + schema = { + "type": "object", + "unevaluatedProperties": False + } + message = self.message_for( + instance={ + "foo": "foo", + "bar": "bar", + }, + schema=schema, + cls=validators.Draft202012Validator, + ) + self.assertIn( + "Unevaluated properties are not allowed " + "('foo', 'bar' were unexpected)", + message, + ) + + def test_unevaluated_items(self): + schema = { + "type": "array", + "unevaluatedItems": False + } + message = self.message_for( + instance=["foo", "bar"], + schema=schema, + cls=validators.Draft202012Validator, + ) + self.assertIn( + "Unevaluated items are not allowed ('foo', 'bar' were unexpected)", + message, + ) + class TestValidationErrorDetails(TestCase): # TODO: These really need unit tests for each individual validator, rather |