Skip to content

Commit 36810ff

Browse files
nezharJulian
authored andcommitted
#686: Fixes unique and equal checks
1 parent 31426f6 commit 36810ff

File tree

2 files changed

+46
-162
lines changed

2 files changed

+46
-162
lines changed

jsonschema/_utils.py

+46-2
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,14 +228,22 @@ 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+
204248
seen.append(e)
205249
return True

jsonschema/tests/test_jsonschema_test_suite.py

-160
Original file line numberDiff line numberDiff line change
@@ -145,36 +145,6 @@ def leap_second(test):
145145
"$ref prevents a sibling id from changing the base uri"
146146
),
147147
)(test)
148-
or skip(
149-
message=bug(686),
150-
subject="uniqueItems",
151-
description="[0] and [false] are unique",
152-
)(test)
153-
or skip(
154-
message=bug(686),
155-
subject="uniqueItems",
156-
description="[1] and [true] are unique",
157-
)(test)
158-
or skip(
159-
message=bug(686),
160-
subject="uniqueItems",
161-
description="nested [0] and [false] are unique",
162-
)(test)
163-
or skip(
164-
message=bug(686),
165-
subject="uniqueItems",
166-
description="nested [1] and [true] are unique",
167-
)(test)
168-
or skip(
169-
message=bug(686),
170-
subject="uniqueItems",
171-
description='{"a": false} and {"a": 0} are unique',
172-
)(test)
173-
or skip(
174-
message=bug(686),
175-
subject="uniqueItems",
176-
description='{"a": true} and {"a": 1} are unique',
177-
)(test)
178148
),
179149
)
180150

@@ -240,36 +210,6 @@ def leap_second(test):
240210
subject="refRemote",
241211
case_description="base URI change - change folder in subschema",
242212
)(test)
243-
or skip(
244-
message=bug(686),
245-
subject="uniqueItems",
246-
description="[0] and [false] are unique",
247-
)(test)
248-
or skip(
249-
message=bug(686),
250-
subject="uniqueItems",
251-
description="[1] and [true] are unique",
252-
)(test)
253-
or skip(
254-
message=bug(686),
255-
subject="uniqueItems",
256-
description="nested [0] and [false] are unique",
257-
)(test)
258-
or skip(
259-
message=bug(686),
260-
subject="uniqueItems",
261-
description="nested [1] and [true] are unique",
262-
)(test)
263-
or skip(
264-
message=bug(686),
265-
subject="uniqueItems",
266-
description='{"a": false} and {"a": 0} are unique',
267-
)(test)
268-
or skip(
269-
message=bug(686),
270-
subject="uniqueItems",
271-
description='{"a": true} and {"a": 1} are unique',
272-
)(test)
273213
),
274214
)
275215

@@ -351,56 +291,6 @@ def leap_second(test):
351291
subject="refRemote",
352292
case_description="base URI change - change folder in subschema",
353293
)(test)
354-
or skip(
355-
message=bug(686),
356-
subject="uniqueItems",
357-
description="[0] and [false] are unique",
358-
)(test)
359-
or skip(
360-
message=bug(686),
361-
subject="uniqueItems",
362-
description="[1] and [true] are unique",
363-
)(test)
364-
or skip(
365-
message=bug(686),
366-
subject="uniqueItems",
367-
description="nested [0] and [false] are unique",
368-
)(test)
369-
or skip(
370-
message=bug(686),
371-
subject="uniqueItems",
372-
description="nested [1] and [true] are unique",
373-
)(test)
374-
or skip(
375-
message=bug(686),
376-
subject="uniqueItems",
377-
description='{"a": false} and {"a": 0} are unique',
378-
)(test)
379-
or skip(
380-
message=bug(686),
381-
subject="uniqueItems",
382-
description='{"a": true} and {"a": 1} are unique',
383-
)(test)
384-
or skip(
385-
message=bug(686),
386-
subject="const",
387-
case_description="const with [false] does not match [0]",
388-
)(test)
389-
or skip(
390-
message=bug(686),
391-
subject="const",
392-
case_description="const with [true] does not match [1]",
393-
)(test)
394-
or skip(
395-
message=bug(686),
396-
subject="const",
397-
case_description='const with {"a": false} does not match {"a": 0}',
398-
)(test)
399-
or skip(
400-
message=bug(686),
401-
subject="const",
402-
case_description='const with {"a": true} does not match {"a": 1}',
403-
)(test)
404294
),
405295
)
406296

@@ -506,55 +396,5 @@ def leap_second(test):
506396
"validation of binary-encoded media type documents"
507397
),
508398
)(test)
509-
or skip(
510-
message=bug(686),
511-
subject="uniqueItems",
512-
description="[0] and [false] are unique",
513-
)(test)
514-
or skip(
515-
message=bug(686),
516-
subject="uniqueItems",
517-
description="[1] and [true] are unique",
518-
)(test)
519-
or skip(
520-
message=bug(686),
521-
subject="uniqueItems",
522-
description="nested [0] and [false] are unique",
523-
)(test)
524-
or skip(
525-
message=bug(686),
526-
subject="uniqueItems",
527-
description="nested [1] and [true] are unique",
528-
)(test)
529-
or skip(
530-
message=bug(686),
531-
subject="uniqueItems",
532-
description='{"a": false} and {"a": 0} are unique',
533-
)(test)
534-
or skip(
535-
message=bug(686),
536-
subject="uniqueItems",
537-
description='{"a": true} and {"a": 1} are unique',
538-
)(test)
539-
or skip(
540-
message=bug(686),
541-
subject="const",
542-
case_description="const with [false] does not match [0]",
543-
)(test)
544-
or skip(
545-
message=bug(686),
546-
subject="const",
547-
case_description="const with [true] does not match [1]",
548-
)(test)
549-
or skip(
550-
message=bug(686),
551-
subject="const",
552-
case_description='const with {"a": false} does not match {"a": 0}',
553-
)(test)
554-
or skip(
555-
message=bug(686),
556-
subject="const",
557-
case_description='const with {"a": true} does not match {"a": 1}',
558-
)(test)
559399
),
560400
)

0 commit comments

Comments
 (0)