Skip to content

Commit 400b11f

Browse files
committed
Fix missing dependenices
1 parent 8c8a05c commit 400b11f

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

fastjsonschema/draft04.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ def __init__(self, definition, resolver=None, formats={}):
5858
('minProperties', self.generate_min_properties),
5959
('maxProperties', self.generate_max_properties),
6060
('required', self.generate_required),
61+
# Check dependencies before properties generates default values.
62+
('dependencies', self.generate_dependencies),
6163
('properties', self.generate_properties),
6264
('patternProperties', self.generate_pattern_properties),
6365
('additionalProperties', self.generate_additional_properties),
64-
('dependencies', self.generate_dependencies),
6566
))
6667

6768
@property
@@ -559,16 +560,19 @@ def generate_dependencies(self):
559560
"""
560561
self.create_variable_is_dict()
561562
with self.l('if {variable}_is_dict:'):
562-
self.create_variable_keys()
563+
isEmpty = True
563564
for key, values in self._definition["dependencies"].items():
564565
if values == [] or values is True:
565566
continue
566-
with self.l('if "{}" in {variable}_keys:', self.e(key)):
567+
isEmpty = False
568+
with self.l('if "{}" in {variable}:', self.e(key)):
567569
if values is False:
568570
self.exc('{} in {name} must not be there', key, rule='dependencies')
569571
elif isinstance(values, list):
570572
for value in values:
571-
with self.l('if "{}" not in {variable}_keys:', self.e(value)):
573+
with self.l('if "{}" not in {variable}:', self.e(value)):
572574
self.exc('{name} missing dependency {} for {}', self.e(value), self.e(key), rule='dependencies')
573575
else:
574576
self.generate_func_code_block(values, self._variable, self._variable_name, clear_variables=True)
577+
if isEmpty:
578+
self.l('pass')

tests/test_object.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,25 @@ def test_object_with_ref_property(asserter, value, expected):
182182
"$ref": {"type": "string"}
183183
}
184184
}, value, expected)
185+
186+
187+
@pytest.mark.parametrize('value, expected', [
188+
({}, {}),
189+
({'foo': 'foo'}, JsonSchemaException('data missing dependency bar for foo', value={'foo': 'foo'}, name='data', definition='{definition}', rule='dependencies')),
190+
({'foo': 'foo', 'bar': 'bar'}, {'foo': 'foo', 'bar': 'bar'}),
191+
])
192+
def test_dependencies(asserter, value, expected):
193+
asserter({
194+
'type': 'object',
195+
"properties": {
196+
"foo": {
197+
"type": "string"
198+
},
199+
"bar": {
200+
"type": "string"
201+
}
202+
},
203+
"dependencies": {
204+
"foo": ["bar"],
205+
},
206+
}, value, expected)

0 commit comments

Comments
 (0)