Skip to content

Commit 79f0e23

Browse files
committed
Improve error message for oneOf and anyOf
1 parent d63d682 commit 79f0e23

File tree

4 files changed

+20
-14
lines changed

4 files changed

+20
-14
lines changed

fastjsonschema/draft04.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def generate_any_of(self):
158158
self.l('except JsonSchemaValueException: pass')
159159

160160
with self.l('if not {variable}_any_of_count{count}:', count=count, optimize=False):
161-
self.exc('{name} must be valid by one of anyOf definition', rule='anyOf')
161+
self.exc('{name} cannot be validated by any definition', rule='anyOf')
162162

163163
def generate_one_of(self):
164164
"""
@@ -188,7 +188,8 @@ def generate_one_of(self):
188188
self.l('except JsonSchemaValueException: pass')
189189

190190
with self.l('if {variable}_one_of_count{count} != 1:', count=count):
191-
self.exc('{name} must be valid exactly by one of oneOf definition', rule='oneOf')
191+
dynamic = '" (" + str({variable}_one_of_count{}) + " matches found)"'
192+
self.exc('{name} must be valid exactly by one definition', count, append_to_msg=dynamic, rule='oneOf')
192193

193194
def generate_not(self):
194195
"""

fastjsonschema/generator.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,14 @@ def e(self, string):
247247
"""
248248
return str(string).replace('"', '\\"')
249249

250-
def exc(self, msg, *args, rule=None):
250+
def exc(self, msg, *args, append_to_msg=None, rule=None):
251251
"""
252252
Short-cut for creating raising exception in the code.
253253
"""
254-
msg = 'raise JsonSchemaValueException("'+msg+'", value={variable}, name="{name}", definition={definition}, rule={rule})'
254+
arg = '"'+msg+'"'
255+
if append_to_msg:
256+
arg += ' + (' + append_to_msg + ')'
257+
msg = 'raise JsonSchemaValueException('+arg+', value={variable}, name="{name}", definition={definition}, rule={rule})'
255258
definition = self._expand_refs(self._definition)
256259
definition_rule = self.e(definition.get(rule) if isinstance(definition, dict) else None)
257260
self.l(msg, *args, definition=repr(definition), rule=repr(rule), definition_rule=definition_rule)

tests/test_common.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def test_all_of(asserter, value, expected):
3939
]}, value, expected)
4040

4141

42-
exc = JsonSchemaValueException('data must be valid by one of anyOf definition', value='{data}', name='data', definition='{definition}', rule='anyOf')
42+
exc = JsonSchemaValueException('data cannot be validated by any definition', value='{data}', name='data', definition='{definition}', rule='anyOf')
4343
@pytest.mark.parametrize('value, expected', [
4444
(0, 0),
4545
(None, exc),
@@ -55,13 +55,16 @@ def test_any_of(asserter, value, expected):
5555
]}, value, expected)
5656

5757

58-
exc = JsonSchemaValueException('data must be valid exactly by one of oneOf definition', value='{data}', name='data', definition='{definition}', rule='oneOf')
58+
def exc(n):
59+
suffix = " ({} matches found)".format(n)
60+
return JsonSchemaValueException('data must be valid exactly by one definition' + suffix, value='{data}', name='data', definition='{definition}', rule='oneOf')
61+
5962
@pytest.mark.parametrize('value, expected', [
60-
(0, exc),
61-
(2, exc),
63+
(0, exc(2)),
64+
(2, exc(0)),
6265
(9, 9),
6366
(10, 10),
64-
(15, exc),
67+
(15, exc(2)),
6568
])
6669
def test_one_of(asserter, value, expected):
6770
asserter({'oneOf': [
@@ -70,13 +73,12 @@ def test_one_of(asserter, value, expected):
7073
]}, value, expected)
7174

7275

73-
exc = JsonSchemaValueException('data must be valid exactly by one of oneOf definition', value='{data}', name='data', definition='{definition}', rule='oneOf')
7476
@pytest.mark.parametrize('value, expected', [
75-
(0, exc),
76-
(2, exc),
77+
(0, exc(2)),
78+
(2, exc(0)),
7779
(9, 9),
7880
(10, 10),
79-
(15, exc),
81+
(15, exc(2)),
8082
])
8183
def test_one_of_factorized(asserter, value, expected):
8284
asserter({

tests/test_integration.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
),
9999
(
100100
[9, 'hello', [1], {'a': 'a', 'b': 'b', 'x': 'x'}, 42, 15],
101-
JsonSchemaValueException('data[5] must be valid exactly by one of oneOf definition', value=15, name='data[5]', definition=definition['items'][5], rule='oneOf'),
101+
JsonSchemaValueException('data[5] must be valid exactly by one definition (2 matches found)', value=15, name='data[5]', definition=definition['items'][5], rule='oneOf'),
102102
),
103103
])
104104
def test_integration(asserter, value, expected):

0 commit comments

Comments
 (0)