Skip to content

Commit 9a62047

Browse files
committed
Temporarily simplify _finditem, and unskip some tests.
_finditem will be removed (in favor of more robust finding of scope changes), so this won't matter much, but it's tidier.
1 parent beea67b commit 9a62047

File tree

2 files changed

+13
-46
lines changed

2 files changed

+13
-46
lines changed

jsonschema/tests/test_jsonschema_test_suite.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -190,18 +190,6 @@ def leap_second(test):
190190
subject="ref",
191191
case_description="Recursive references between schemas",
192192
)(test)
193-
or skip(
194-
message=bug(371),
195-
subject="ref",
196-
case_description="Location-independent identifier",
197-
)(test)
198-
or skip(
199-
message=bug(371),
200-
subject="ref",
201-
case_description=(
202-
"Location-independent identifier with absolute URI"
203-
),
204-
)(test)
205193
or skip(
206194
message=bug(371),
207195
subject="ref",
@@ -250,18 +238,6 @@ def leap_second(test):
250238
or allowed_leading_zeros(test)
251239
or missing_format(draft6_format_checker)(test)
252240
or complex_email_validation(test)
253-
or skip(
254-
message=bug(371),
255-
subject="ref",
256-
case_description="Location-independent identifier",
257-
)(test)
258-
or skip(
259-
message=bug(371),
260-
subject="ref",
261-
case_description=(
262-
"Location-independent identifier with absolute URI"
263-
),
264-
)(test)
265241
or skip(
266242
message=bug(371),
267243
subject="ref",
@@ -295,18 +271,6 @@ def leap_second(test):
295271
or leap_second(test)
296272
or missing_format(draft7_format_checker)(test)
297273
or complex_email_validation(test)
298-
or skip(
299-
message=bug(371),
300-
subject="ref",
301-
case_description="Location-independent identifier",
302-
)(test)
303-
or skip(
304-
message=bug(371),
305-
subject="ref",
306-
case_description=(
307-
"Location-independent identifier with absolute URI"
308-
),
309-
)(test)
310274
or skip(
311275
message=bug(371),
312276
subject="ref",

jsonschema/validators.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""
22
Creation and extension of validators, with implementations for existing drafts.
33
"""
4+
from collections import deque
45
from collections.abc import Sequence
56
from functools import lru_cache
67
from urllib.parse import unquote, urldefrag, urljoin, urlsplit
@@ -717,16 +718,14 @@ def resolving(self, ref):
717718
self.pop_scope()
718719

719720
def _finditem(self, schema, key):
720-
results = []
721-
if isinstance(schema, dict):
722-
if key in schema:
723-
results.append(schema)
724-
725-
for v in schema.values():
726-
if isinstance(v, dict):
727-
results += self._finditem(v, key)
728-
729-
return results
721+
values = deque([schema])
722+
while values:
723+
each = values.pop()
724+
if not isinstance(each, dict):
725+
continue
726+
if key in each:
727+
yield each
728+
values.extendleft(each.values())
730729

731730
def resolve(self, ref):
732731
"""
@@ -786,6 +785,10 @@ def resolve_fragment(self, document, fragment):
786785
for subschema in self._finditem(document, keyword):
787786
if fragment == subschema[keyword]:
788787
return subschema
788+
for keyword in ["id", "$id"]:
789+
for subschema in self._finditem(document, keyword):
790+
if "#" + fragment == subschema[keyword]:
791+
return subschema
789792

790793
# Resolve via path
791794
parts = unquote(fragment).split("/") if fragment else []

0 commit comments

Comments
 (0)