Skip to content

Commit 8abe329

Browse files
committed
Add errors_with_property_name
1 parent da5d6ca commit 8abe329

File tree

3 files changed

+20
-29
lines changed

3 files changed

+20
-29
lines changed

jsonschema/_utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,3 +338,9 @@ def find_evaluated_property_keys_by_schema(validator, instance, schema):
338338
)
339339

340340
return evaluated_keys
341+
342+
343+
def errors_with_property_name(errors, property_name):
344+
for error in errors:
345+
error.extra_info = {"property": property_name}
346+
yield error

jsonschema/_validators.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from jsonschema._utils import (
66
ensure_list,
7+
errors_with_property_name,
78
equal,
89
extras_msg,
910
find_additional_properties,
@@ -32,7 +33,7 @@ def propertyNames(validator, propertyNames, instance, schema):
3233
return
3334

3435
for property in instance:
35-
yield from add_extra_info_property(validator.descend(instance=property, schema=propertyNames), property)
36+
yield from errors_with_property_name(validator.descend(instance=property, schema=propertyNames), property)
3637

3738
def additionalProperties(validator, aP, instance, schema):
3839
if not validator.is_type(instance, "object"):
@@ -42,7 +43,7 @@ def additionalProperties(validator, aP, instance, schema):
4243

4344
if validator.is_type(aP, "object"):
4445
for extra in extras:
45-
yield from add_extra_info_property(validator.descend(instance[extra], aP, path=extra), extra)
46+
yield from errors_with_property_name(validator.descend(instance[extra], aP, path=extra), extra)
4647
elif not aP and extras:
4748
extra_info_properties = [extra for extra in sorted(extras)]
4849
if "patternProperties" in schema:
@@ -64,11 +65,6 @@ def additionalProperties(validator, aP, instance, schema):
6465
extra_info={"properties": extra_info_properties}
6566
)
6667

67-
def add_extra_info_property(errors, property_name):
68-
for error in errors:
69-
error.extra_info = {"property": property_name}
70-
yield error
71-
7268
def items(validator, items, instance, schema):
7369
if not validator.is_type(instance, "array"):
7470
return
@@ -102,7 +98,6 @@ def additionalItems(validator, aI, instance, schema):
10298
error = "Additional items are not allowed (%s %s unexpected)"
10399
yield ValidationError(
104100
error % extras_msg(instance[len(schema.get("items", [])):]),
105-
extra_info={"additionalItems": instance[len(schema.get("items", [])):]}
106101
)
107102

108103

jsonschema/tests/test_validators.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -608,49 +608,39 @@ def test_unevaluated_properties(self):
608608
class TestValidationErrorDetails(TestCase):
609609
# TODO: These really need unit tests for each individual validator, rather
610610
# than just these higher level tests.
611-
def test_required(self):
612-
instance = {'a': 1}
611+
def test_extra_info_required(self):
612+
instance = {"a": 1}
613613
schema = {
614-
'required': ['b', 'c'],
614+
"required": ["b", "c"],
615615
}
616616

617617
validator = validators.Draft4Validator(schema)
618618
e1, e2 = validator.iter_errors(instance)
619-
self.assertEqual(e1.extra_info, {'property': 'b'})
620-
self.assertEqual(e2.extra_info, {'property': 'c'})
619+
self.assertEqual(e1.extra_info, {"property": "b"})
620+
self.assertEqual(e2.extra_info, {"property": "c"})
621621

622622
def test_extra_info_additionalProperties_single(self):
623-
instance = {'a': 1}
623+
instance = {"a": 1}
624624
schema = {"additionalProperties": False}
625625

626626
validator = validators.Draft4Validator(schema)
627627
e1, = validator.iter_errors(instance)
628-
self.assertEqual(e1.extra_info, {'properties': ['a']})
628+
self.assertEqual(e1.extra_info, {"properties": ["a"]})
629629

630630
def test_extra_info_additionalProperties_multiple(self):
631-
instance = {'a': 1,'b': 2}
631+
instance = {"a": 1,"b": 2}
632632
schema = {"additionalProperties": False}
633633

634634
validator = validators.Draft4Validator(schema)
635635
e1, = validator.iter_errors(instance)
636-
self.assertEqual(e1.extra_info, {'properties': ['a', 'b']})
636+
self.assertEqual(e1.extra_info, {"properties": ["a", "b"]})
637637

638638
def test_extra_info_dependentRequired(self):
639639
instance = {"a": {}}
640640
schema = {"dependentRequired": {"a": ["bar"]}}
641641
validator = validators.Draft202012Validator(schema)
642642
e1, = validator.iter_errors(instance)
643-
self.assertEqual(e1.extra_info, {'property': 'a'})
644-
645-
def test_extra_info_additionalItems(self):
646-
instance = ["a", "b"]
647-
schema = {
648-
"items": [],
649-
"additionalItems": False,
650-
}
651-
validator = validators.Draft7Validator(schema)
652-
e1, = validator.iter_errors(instance)
653-
self.assertEqual(e1.extra_info, {"additionalItems": ["a", "b"]})
643+
self.assertEqual(e1.extra_info, {"property": "a"})
654644

655645
def test_anyOf(self):
656646
instance = 5
@@ -1094,7 +1084,7 @@ def test_propertyNames(self):
10941084
self.assertEqual(error.json_path, "$")
10951085
self.assertEqual(error.schema_path, deque(["propertyNames", "not"]))
10961086

1097-
self.assertEqual(error.extra_info, {'property': 'foo'})
1087+
self.assertEqual(error.extra_info, {"property": "foo"})
10981088

10991089
def test_if_then(self):
11001090
schema = {

0 commit comments

Comments
 (0)