Skip to content

Commit 463e087

Browse files
committed
Teach unbool about deeply nested objects/arrays
Fixes #686
1 parent 9ffc81e commit 463e087

File tree

2 files changed

+11
-80
lines changed

2 files changed

+11
-80
lines changed

jsonschema/_utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,23 @@ def equal(one, two):
175175
def unbool(element, true=object(), false=object()):
176176
"""
177177
A hack to make True and 1 and False and 0 unique for ``uniq``.
178+
179+
Recurses through an arbitrarily deep object and unique-ifies True/1 and
180+
False/0. Also converts arrays/objects into immutable/hashable alternatives.
181+
We have to copy the items anyway to avoid unexpected mutations, so we might
182+
as well make the imminent equality check simpler.
178183
"""
179184

180185
if element is True:
181186
return true
182187
elif element is False:
183188
return false
189+
elif isinstance(element, list) or isinstance(element, tuple):
190+
return tuple(map(unbool, element))
191+
elif isinstance(element, dict):
192+
# Convert dicts to frozensets of 2-tuples. For equality checks, that's
193+
# a reasonable hashable alternative to dicts.
194+
return frozenset(map(unbool, element.items()))
184195
return element
185196

186197

jsonschema/tests/test_jsonschema_test_suite.py

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -87,26 +87,6 @@ def narrow_unicode_build(test): # pragma: no cover
8787
subject="host-name",
8888
description="ends with hyphen",
8989
)(test)
90-
or skip(
91-
message=bug(686),
92-
subject="uniqueItems",
93-
description="[0] and [false] are unique",
94-
)(test)
95-
or skip(
96-
message=bug(686),
97-
subject="uniqueItems",
98-
description="[1] and [true] are unique",
99-
)(test)
100-
or skip(
101-
message=bug(686),
102-
subject="uniqueItems",
103-
description="nested [0] and [false] are unique",
104-
)(test)
105-
or skip(
106-
message=bug(686),
107-
subject="uniqueItems",
108-
description="nested [1] and [true] are unique",
109-
)(test)
11090
),
11191
)
11292

@@ -161,26 +141,6 @@ def narrow_unicode_build(test): # pragma: no cover
161141
subject="hostname",
162142
description="ends with hyphen",
163143
)(test)
164-
or skip(
165-
message=bug(686),
166-
subject="uniqueItems",
167-
description="[0] and [false] are unique",
168-
)(test)
169-
or skip(
170-
message=bug(686),
171-
subject="uniqueItems",
172-
description="[1] and [true] are unique",
173-
)(test)
174-
or skip(
175-
message=bug(686),
176-
subject="uniqueItems",
177-
description="nested [0] and [false] are unique",
178-
)(test)
179-
or skip(
180-
message=bug(686),
181-
subject="uniqueItems",
182-
description="nested [1] and [true] are unique",
183-
)(test)
184144
),
185145
)
186146

@@ -234,26 +194,6 @@ def narrow_unicode_build(test): # pragma: no cover
234194
subject="hostname",
235195
description="ends with hyphen",
236196
)(test)
237-
or skip(
238-
message=bug(686),
239-
subject="uniqueItems",
240-
description="[0] and [false] are unique",
241-
)(test)
242-
or skip(
243-
message=bug(686),
244-
subject="uniqueItems",
245-
description="[1] and [true] are unique",
246-
)(test)
247-
or skip(
248-
message=bug(686),
249-
subject="uniqueItems",
250-
description="nested [0] and [false] are unique",
251-
)(test)
252-
or skip(
253-
message=bug(686),
254-
subject="uniqueItems",
255-
description="nested [1] and [true] are unique",
256-
)(test)
257197
),
258198
)
259199

@@ -327,26 +267,6 @@ def narrow_unicode_build(test): # pragma: no cover
327267
"validation of binary-encoded media type documents"
328268
),
329269
)(test)
330-
or skip(
331-
message=bug(686),
332-
subject="uniqueItems",
333-
description="[0] and [false] are unique",
334-
)(test)
335-
or skip(
336-
message=bug(686),
337-
subject="uniqueItems",
338-
description="[1] and [true] are unique",
339-
)(test)
340-
or skip(
341-
message=bug(686),
342-
subject="uniqueItems",
343-
description="nested [0] and [false] are unique",
344-
)(test)
345-
or skip(
346-
message=bug(686),
347-
subject="uniqueItems",
348-
description="nested [1] and [true] are unique",
349-
)(test)
350270
),
351271
)
352272

0 commit comments

Comments
 (0)