Skip to content

Commit 604fc69

Browse files
committed
#782: Fixes unique and equal checks - #686
1 parent 616e325 commit 604fc69

File tree

2 files changed

+49
-162
lines changed

2 files changed

+49
-162
lines changed

jsonschema/_utils.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,46 @@ def ensure_list(thing):
158158
return thing
159159

160160

161+
def dict_equal(one, two):
162+
"""
163+
Check if two dicts are the same using `equal`
164+
"""
165+
if len(one.keys()) != len(two.keys()):
166+
return False
167+
168+
for key in one:
169+
if key not in two:
170+
return False
171+
if not equal(one[key], two[key]):
172+
return False
173+
174+
return True
175+
176+
177+
def list_equal(one, two):
178+
"""
179+
Check if two lists are the same using `equal`
180+
"""
181+
if len(one) != len(two):
182+
return False
183+
184+
for i in range(0, len(one)):
185+
if not equal(one[i], two[i]):
186+
return False
187+
188+
return True
189+
190+
161191
def equal(one, two):
162192
"""
163193
Check if two things are equal, but evade booleans and ints being equal.
164194
"""
195+
if isinstance(one, list) and isinstance(two, list):
196+
return list_equal(one, two)
197+
198+
if isinstance(one, dict) and isinstance(two, dict):
199+
return dict_equal(one, two)
200+
165201
return unbool(one) == unbool(two)
166202

167203

@@ -192,15 +228,26 @@ def uniq(container):
192228
try:
193229
sort = sorted(unbool(i) for i in container)
194230
sliced = itertools.islice(sort, 1, None)
231+
195232
for i, j in zip(sort, sliced):
233+
if isinstance(i, list) and isinstance(j, list):
234+
return not list_equal(i, j)
196235
if i == j:
197236
return False
237+
198238
except (NotImplementedError, TypeError):
199239
seen = []
200240
for e in container:
201241
e = unbool(e)
202-
if e in seen:
203-
return False
242+
243+
for i in seen:
244+
if isinstance(i, dict) and isinstance(e, dict):
245+
if dict_equal(i, e):
246+
return False
247+
else:
248+
if i == e:
249+
return False
250+
204251
seen.append(e)
205252
return True
206253

jsonschema/tests/test_jsonschema_test_suite.py

Lines changed: 0 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -287,36 +287,6 @@ def ecmascript_regex_validation(test):
287287
"$ref prevents a sibling $id from changing the base uri"
288288
),
289289
)(test)
290-
or skip(
291-
message=bug(686),
292-
subject="uniqueItems",
293-
description="[0] and [false] are unique",
294-
)(test)
295-
or skip(
296-
message=bug(686),
297-
subject="uniqueItems",
298-
description="[1] and [true] are unique",
299-
)(test)
300-
or skip(
301-
message=bug(686),
302-
subject="uniqueItems",
303-
description="nested [0] and [false] are unique",
304-
)(test)
305-
or skip(
306-
message=bug(686),
307-
subject="uniqueItems",
308-
description="nested [1] and [true] are unique",
309-
)(test)
310-
or skip(
311-
message=bug(686),
312-
subject="uniqueItems",
313-
description='{"a": false} and {"a": 0} are unique',
314-
)(test)
315-
or skip(
316-
message=bug(686),
317-
subject="uniqueItems",
318-
description='{"a": true} and {"a": 1} are unique',
319-
)(test)
320290
),
321291
)
322292

@@ -382,36 +352,6 @@ def ecmascript_regex_validation(test):
382352
subject="refRemote",
383353
case_description="base URI change - change folder in subschema",
384354
)(test)
385-
or skip(
386-
message=bug(686),
387-
subject="uniqueItems",
388-
description="[0] and [false] are unique",
389-
)(test)
390-
or skip(
391-
message=bug(686),
392-
subject="uniqueItems",
393-
description="[1] and [true] are unique",
394-
)(test)
395-
or skip(
396-
message=bug(686),
397-
subject="uniqueItems",
398-
description="nested [0] and [false] are unique",
399-
)(test)
400-
or skip(
401-
message=bug(686),
402-
subject="uniqueItems",
403-
description="nested [1] and [true] are unique",
404-
)(test)
405-
or skip(
406-
message=bug(686),
407-
subject="uniqueItems",
408-
description='{"a": false} and {"a": 0} are unique',
409-
)(test)
410-
or skip(
411-
message=bug(686),
412-
subject="uniqueItems",
413-
description='{"a": true} and {"a": 1} are unique',
414-
)(test)
415355
),
416356
)
417357

@@ -493,56 +433,6 @@ def ecmascript_regex_validation(test):
493433
subject="refRemote",
494434
case_description="base URI change - change folder in subschema",
495435
)(test)
496-
or skip(
497-
message=bug(686),
498-
subject="uniqueItems",
499-
description="[0] and [false] are unique",
500-
)(test)
501-
or skip(
502-
message=bug(686),
503-
subject="uniqueItems",
504-
description="[1] and [true] are unique",
505-
)(test)
506-
or skip(
507-
message=bug(686),
508-
subject="uniqueItems",
509-
description="nested [0] and [false] are unique",
510-
)(test)
511-
or skip(
512-
message=bug(686),
513-
subject="uniqueItems",
514-
description="nested [1] and [true] are unique",
515-
)(test)
516-
or skip(
517-
message=bug(686),
518-
subject="uniqueItems",
519-
description='{"a": false} and {"a": 0} are unique',
520-
)(test)
521-
or skip(
522-
message=bug(686),
523-
subject="uniqueItems",
524-
description='{"a": true} and {"a": 1} are unique',
525-
)(test)
526-
or skip(
527-
message=bug(686),
528-
subject="const",
529-
case_description="const with [false] does not match [0]",
530-
)(test)
531-
or skip(
532-
message=bug(686),
533-
subject="const",
534-
case_description="const with [true] does not match [1]",
535-
)(test)
536-
or skip(
537-
message=bug(686),
538-
subject="const",
539-
case_description='const with {"a": false} does not match {"a": 0}',
540-
)(test)
541-
or skip(
542-
message=bug(686),
543-
subject="const",
544-
case_description='const with {"a": true} does not match {"a": 1}',
545-
)(test)
546436
),
547437
)
548438

@@ -648,56 +538,6 @@ def ecmascript_regex_validation(test):
648538
"validation of binary-encoded media type documents"
649539
),
650540
)(test)
651-
or skip(
652-
message=bug(686),
653-
subject="uniqueItems",
654-
description="[0] and [false] are unique",
655-
)(test)
656-
or skip(
657-
message=bug(686),
658-
subject="uniqueItems",
659-
description="[1] and [true] are unique",
660-
)(test)
661-
or skip(
662-
message=bug(686),
663-
subject="uniqueItems",
664-
description="nested [0] and [false] are unique",
665-
)(test)
666-
or skip(
667-
message=bug(686),
668-
subject="uniqueItems",
669-
description="nested [1] and [true] are unique",
670-
)(test)
671-
or skip(
672-
message=bug(686),
673-
subject="uniqueItems",
674-
description='{"a": false} and {"a": 0} are unique',
675-
)(test)
676-
or skip(
677-
message=bug(686),
678-
subject="uniqueItems",
679-
description='{"a": true} and {"a": 1} are unique',
680-
)(test)
681-
or skip(
682-
message=bug(686),
683-
subject="const",
684-
case_description="const with [false] does not match [0]",
685-
)(test)
686-
or skip(
687-
message=bug(686),
688-
subject="const",
689-
case_description="const with [true] does not match [1]",
690-
)(test)
691-
or skip(
692-
message=bug(686),
693-
subject="const",
694-
case_description='const with {"a": false} does not match {"a": 0}',
695-
)(test)
696-
or skip(
697-
message=bug(686),
698-
subject="const",
699-
case_description='const with {"a": true} does not match {"a": 1}',
700-
)(test)
701541
),
702542
)
703543

0 commit comments

Comments
 (0)