Skip to content

Commit d8fd3f8

Browse files
committed
Merge pull request #103 from gazpachoking/local_ref_refactor
Refactor RefResolver a bit to fix #102
2 parents 806bda7 + 9189f43 commit d8fd3f8

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

jsonschema.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,7 @@ def __init__(
11141114
):
11151115
self.base_uri = base_uri
11161116
self.resolution_scope = base_uri
1117+
# This attribute is not used, it is for backwards compatibility
11171118
self.referrer = referrer
11181119
self.cache_remote = cache_remote
11191120
self.handlers = dict(handlers)
@@ -1123,6 +1124,7 @@ def __init__(
11231124
for id, validator in iteritems(meta_schemas)
11241125
)
11251126
self.store.update(store)
1127+
self.store[base_uri] = referrer
11261128

11271129
@classmethod
11281130
def from_schema(cls, schema, *args, **kwargs):
@@ -1157,24 +1159,23 @@ def resolving(self, ref):
11571159

11581160
full_uri = urlparse.urljoin(self.resolution_scope, ref)
11591161
uri, fragment = urlparse.urldefrag(full_uri)
1162+
if not uri:
1163+
uri = self.base_uri
11601164

11611165
if uri in self.store:
11621166
document = self.store[uri]
1163-
elif not uri or uri == self.base_uri:
1164-
document = self.referrer
11651167
else:
11661168
try:
11671169
document = self.resolve_remote(uri)
11681170
except Exception as exc:
11691171
raise RefResolutionError(exc)
11701172

1171-
old_base_uri, old_referrer = self.base_uri, self.referrer
1172-
self.base_uri, self.referrer = uri, document
1173+
old_base_uri, self.base_uri = self.base_uri, uri
11731174
try:
11741175
with self.in_scope(uri):
11751176
yield self.resolve_fragment(document, fragment)
11761177
finally:
1177-
self.base_uri, self.referrer = old_base_uri, old_referrer
1178+
self.base_uri = old_base_uri
11781179

11791180
def resolve_fragment(self, document, fragment):
11801181
"""

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": "/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("/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)