Skip to content

Commit 4129584

Browse files
committed
Merge pull request #75 from gazpachoking/fix_error_paths
error paths for additionalItems, additionalProperties and patternProperties
2 parents 741dced + 4a7ffc1 commit 4129584

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

jsonschema.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ def validate_patternProperties(self, patternProperties, instance, schema):
179179
for k, v in iteritems(instance):
180180
if re.search(pattern, k):
181181
for error in self.iter_errors(v, subschema):
182+
error.path.appendleft(k)
182183
yield error
183184

184185
def validate_additionalProperties(self, aP, instance, schema):
@@ -190,6 +191,7 @@ def validate_additionalProperties(self, aP, instance, schema):
190191
if self.is_type(aP, "object"):
191192
for extra in extras:
192193
for error in self.iter_errors(instance[extra], aP):
194+
error.path.appendleft(extra)
193195
yield error
194196
elif not aP and extras:
195197
error = "Additional properties are not allowed (%s %s unexpected)"
@@ -218,8 +220,10 @@ def validate_additionalItems(self, aI, instance, schema):
218220
return
219221

220222
if self.is_type(aI, "object"):
221-
for item in instance[len(schema):]:
223+
for index, item in enumerate(
224+
instance[len(schema.get("items", [])):]):
222225
for error in self.iter_errors(item, aI):
226+
error.path.appendleft(index)
223227
yield error
224228
elif not aI and len(instance) > len(schema.get("items", [])):
225229
error = "Additional items are not allowed (%s %s unexpected)"

tests.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,55 @@ def test_multiple_nesting(self):
415415
self.assertEqual(e5.validator, "minItems")
416416
self.assertEqual(e6.validator, "enum")
417417

418+
def test_additionalProperties(self):
419+
instance = {"bar": "bar", "foo": 2}
420+
schema = {
421+
"additionalProperties" : {"type": "integer", "minimum": 5}
422+
}
423+
424+
errors = self.validator.iter_errors(instance, schema)
425+
e1, e2 = sorted_errors(errors)
426+
427+
self.assertEqual(list(e1.path), ["bar"])
428+
self.assertEqual(list(e2.path), ["foo"])
429+
430+
self.assertEqual(e1.validator, "type")
431+
self.assertEqual(e2.validator, "minimum")
432+
433+
def test_patternProperties(self):
434+
instance = {"bar": 1, "foo": 2}
435+
schema = {
436+
"patternProperties" : {
437+
"bar": {"type": "string"},
438+
"foo": {"minimum": 5}
439+
}
440+
}
441+
442+
errors = self.validator.iter_errors(instance, schema)
443+
e1, e2 = sorted_errors(errors)
444+
445+
self.assertEqual(list(e1.path), ["bar"])
446+
self.assertEqual(list(e2.path), ["foo"])
447+
448+
self.assertEqual(e1.validator, "type")
449+
self.assertEqual(e2.validator, "minimum")
450+
451+
def test_additionalItems(self):
452+
instance = ["foo", 1]
453+
schema = {
454+
"items": [],
455+
"additionalItems" : {"type": "integer", "minimum": 5}
456+
}
457+
458+
errors = self.validator.iter_errors(instance, schema)
459+
e1, e2 = sorted_errors(errors)
460+
461+
self.assertEqual(list(e1.path), [0])
462+
self.assertEqual(list(e2.path), [1])
463+
464+
self.assertEqual(e1.validator, "type")
465+
self.assertEqual(e2.validator, "minimum")
466+
418467

419468
class TestErrorTree(unittest.TestCase):
420469
def setUp(self):

0 commit comments

Comments
 (0)