Skip to content

Commit d9e093d

Browse files
committed
Fix more $ref cases when the lookup URL is different from an $id
Passes a few more of the just-added upstream tests (and in particular is a last URN $id-related fix). One test still fails which is waiting for more tweaks to how remote ref lookups are done.
1 parent 8cec498 commit d9e093d

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

jsonschema/tests/test_jsonschema_test_suite.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,11 @@ def leap_second(test):
396396
"not just immediate parent"
397397
),
398398
)(test)
399+
or skip(
400+
message=bug(),
401+
subject="refRemote",
402+
case_description="remote HTTP ref with nested absolute ref",
403+
)(test)
399404
),
400405
)
401406

@@ -516,6 +521,11 @@ def leap_second(test):
516521
"not just immediate parent"
517522
),
518523
)(test)
524+
or skip(
525+
message=bug(),
526+
subject="refRemote",
527+
case_description="remote HTTP ref with nested absolute ref",
528+
)(test)
519529
),
520530
)
521531

jsonschema/validators.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import typing
1717
import warnings
1818

19+
from pyrsistent import m
1920
import attr
2021

2122
from jsonschema import (
@@ -713,7 +714,7 @@ def __init__(
713714
self,
714715
base_uri,
715716
referrer,
716-
store=(),
717+
store=m(),
717718
cache_remote=True,
718719
handlers=(),
719720
urljoin_cache=None,
@@ -729,8 +730,13 @@ def __init__(
729730
self.handlers = dict(handlers)
730731

731732
self._scopes_stack = [base_uri]
733+
732734
self.store = _utils.URIDict(_store_schema_list())
733735
self.store.update(store)
736+
self.store.update(
737+
(schema["$id"], schema)
738+
for schema in store.values() if "$id" in schema
739+
)
734740
self.store[base_uri] = referrer
735741

736742
self._urljoin_cache = urljoin_cache
@@ -864,6 +870,7 @@ def _find_in_subschemas(self, url):
864870
if target_uri.rstrip("/") == uri.rstrip("/"):
865871
if fragment:
866872
subschema = self.resolve_fragment(subschema, fragment)
873+
self.store[url] = subschema
867874
return url, subschema
868875
return None
869876

@@ -884,16 +891,16 @@ def resolve_from_url(self, url):
884891
Resolve the given URL.
885892
"""
886893
url, fragment = urldefrag(url)
887-
if url:
894+
if not url:
895+
url = self.base_uri
896+
897+
try:
898+
document = self.store[url]
899+
except KeyError:
888900
try:
889-
document = self.store[url]
890-
except KeyError:
891-
try:
892-
document = self.resolve_remote(url)
893-
except Exception as exc:
894-
raise exceptions.RefResolutionError(exc)
895-
else:
896-
document = self.referrer
901+
document = self.resolve_remote(url)
902+
except Exception as exc:
903+
raise exceptions.RefResolutionError(exc)
897904

898905
return self.resolve_fragment(document, fragment)
899906

0 commit comments

Comments
 (0)