Skip to content

Commit 7f218a6

Browse files
committed
Refactor RefResolver a bit to fix #102
1 parent 806bda7 commit 7f218a6

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

jsonschema.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,6 @@ def __init__(
11141114
):
11151115
self.base_uri = base_uri
11161116
self.resolution_scope = base_uri
1117-
self.referrer = referrer
11181117
self.cache_remote = cache_remote
11191118
self.handlers = dict(handlers)
11201119

@@ -1123,6 +1122,7 @@ def __init__(
11231122
for id, validator in iteritems(meta_schemas)
11241123
)
11251124
self.store.update(store)
1125+
self.store[base_uri] = referrer
11261126

11271127
@classmethod
11281128
def from_schema(cls, schema, *args, **kwargs):
@@ -1157,24 +1157,23 @@ def resolving(self, ref):
11571157

11581158
full_uri = urlparse.urljoin(self.resolution_scope, ref)
11591159
uri, fragment = urlparse.urldefrag(full_uri)
1160+
if not uri:
1161+
uri = self.base_uri
11601162

11611163
if uri in self.store:
11621164
document = self.store[uri]
1163-
elif not uri or uri == self.base_uri:
1164-
document = self.referrer
11651165
else:
11661166
try:
11671167
document = self.resolve_remote(uri)
11681168
except Exception as exc:
11691169
raise RefResolutionError(exc)
11701170

1171-
old_base_uri, old_referrer = self.base_uri, self.referrer
1172-
self.base_uri, self.referrer = uri, document
1171+
old_base_uri, self.base_uri = self.base_uri, uri
11731172
try:
11741173
with self.in_scope(uri):
11751174
yield self.resolve_fragment(document, fragment)
11761175
finally:
1177-
self.base_uri, self.referrer = old_base_uri, old_referrer
1176+
self.base_uri = old_base_uri
11781177

11791178
def resolve_fragment(self, document, fragment):
11801179
"""

tests.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,14 @@ def test_it_resolves_local_refs(self):
859859
with self.resolver.resolving(ref) as resolved:
860860
self.assertEqual(resolved, self.referrer["properties"]["foo"])
861861

862+
def test_it_resolves_local_refs_with_id(self):
863+
schema = {"id": "foo://bar/schema#", "a": {"foo": "bar"}}
864+
resolver = RefResolver.from_schema(schema)
865+
with resolver.resolving("#/a") as resolved:
866+
self.assertEqual(resolved, schema["a"])
867+
with resolver.resolving("foo://bar/schema#/a") as resolved:
868+
self.assertEqual(resolved, schema["a"])
869+
862870
def test_it_retrieves_stored_refs(self):
863871
with self.resolver.resolving(self.stored_uri) as resolved:
864872
self.assertIs(resolved, self.stored_schema)
@@ -893,13 +901,23 @@ def test_it_can_construct_a_base_uri_from_a_schema(self):
893901
schema = {"id" : "foo"}
894902
resolver = RefResolver.from_schema(schema)
895903
self.assertEqual(resolver.base_uri, "foo")
896-
self.assertEqual(resolver.referrer, schema)
904+
with resolver.resolving("") as resolved:
905+
self.assertEqual(resolved, schema)
906+
with resolver.resolving("#") as resolved:
907+
self.assertEqual(resolved, schema)
908+
with resolver.resolving("foo") as resolved:
909+
self.assertEqual(resolved, schema)
910+
with resolver.resolving("foo#") as resolved:
911+
self.assertEqual(resolved, schema)
897912

898913
def test_it_can_construct_a_base_uri_from_a_schema_without_id(self):
899914
schema = {}
900915
resolver = RefResolver.from_schema(schema)
901916
self.assertEqual(resolver.base_uri, "")
902-
self.assertEqual(resolver.referrer, schema)
917+
with resolver.resolving("") as resolved:
918+
self.assertEqual(resolved, schema)
919+
with resolver.resolving("#") as resolved:
920+
self.assertEqual(resolved, schema)
903921

904922
def test_custom_uri_scheme_handlers(self):
905923
schema = {"foo": "bar"}

0 commit comments

Comments
 (0)