Skip to content

Commit 8c9edd5

Browse files
committed
Split out dependencies for draft 3.
Draft 3 allowed simple string dependencies, but no later draft does. This also lets us use the same fix for boolean schema nonsense as we just did for items.
1 parent 434ca10 commit 8c9edd5

File tree

4 files changed

+58
-17
lines changed

4 files changed

+58
-17
lines changed

jsonschema/_legacy_validators.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,31 @@ def oneOf_draft4(validator, oneOf, instance, schema):
4747
)
4848

4949

50+
def dependencies_draft3(validator, dependencies, instance, schema):
51+
if not validator.is_type(instance, "object"):
52+
return
53+
54+
for property, dependency in iteritems(dependencies):
55+
if property not in instance:
56+
continue
57+
58+
if validator.is_type(dependency, "object"):
59+
for error in validator.descend(
60+
instance, dependency, schema_path=property,
61+
):
62+
yield error
63+
elif validator.is_type(dependency, "string"):
64+
if dependency not in instance:
65+
yield ValidationError(
66+
"%r is a dependency of %r" % (dependency, property)
67+
)
68+
else:
69+
for each in dependency:
70+
if each not in instance:
71+
message = "%r is a dependency of %r"
72+
yield ValidationError(message % (each, property))
73+
74+
5075
def disallow_draft3(validator, disallow, instance, schema):
5176
for disallowed in _utils.ensure_list(disallow):
5277
if validator.is_valid(instance, {"type": [disallowed]}):

jsonschema/_validators.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -220,24 +220,16 @@ def dependencies(validator, dependencies, instance, schema):
220220
if property not in instance:
221221
continue
222222

223-
# FIXME
224-
if dependency is True:
225-
dependency = {}
226-
elif dependency is False:
227-
dependency = {"not": {}}
228-
229-
if validator.is_type(dependency, "object"):
223+
if validator.is_type(dependency, "array"):
224+
for each in dependency:
225+
if each not in instance:
226+
message = "%r is a dependency of %r"
227+
yield ValidationError(message % (each, property))
228+
else:
230229
for error in validator.descend(
231230
instance, dependency, schema_path=property,
232231
):
233232
yield error
234-
else:
235-
dependencies = _utils.ensure_list(dependency)
236-
for dependency in dependencies:
237-
if dependency not in instance:
238-
yield ValidationError(
239-
"%r is a dependency of %r" % (dependency, property)
240-
)
241233

242234

243235
def enum(validator, enums, instance, schema):

jsonschema/tests/test_validators.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,34 @@ def test_maximum(self):
373373
message = self.message_for(instance=1, schema={"maximum": 0})
374374
self.assertEqual(message, "1 is greater than the maximum of 0")
375375

376-
def test_dependencies_failure_has_single_element_not_list(self):
376+
def test_dependencies_single_element(self):
377377
depend, on = "bar", "foo"
378378
schema = {u"dependencies": {depend: on}}
379-
message = self.message_for(instance={"bar": 2}, schema=schema)
379+
message = self.message_for(
380+
instance={"bar": 2},
381+
schema=schema,
382+
cls=validators.Draft3Validator,
383+
)
384+
self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
385+
386+
def test_dependencies_list_draft3(self):
387+
depend, on = "bar", "foo"
388+
schema = {u"dependencies": {depend: [on]}}
389+
message = self.message_for(
390+
instance={"bar": 2},
391+
schema=schema,
392+
cls=validators.Draft3Validator,
393+
)
394+
self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
395+
396+
def test_dependencies_list_draft7(self):
397+
depend, on = "bar", "foo"
398+
schema = {u"dependencies": {depend: [on]}}
399+
message = self.message_for(
400+
instance={"bar": 2},
401+
schema=schema,
402+
cls=validators.Draft7Validator,
403+
)
380404
self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
381405

382406
def test_additionalItems_single_failure(self):

jsonschema/validators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
409409
u"$ref": _validators.ref,
410410
u"additionalItems": _validators.additionalItems,
411411
u"additionalProperties": _validators.additionalProperties,
412-
u"dependencies": _validators.dependencies,
412+
u"dependencies": _legacy_validators.dependencies_draft3,
413413
u"disallow": _legacy_validators.disallow_draft3,
414414
u"divisibleBy": _validators.multipleOf,
415415
u"enum": _validators.enum,

0 commit comments

Comments
 (0)