diff options
-rw-r--r-- | jsonschema/validators.py | 11 | ||||
-rw-r--r-- | test_jsonschema.py | 22 |
2 files changed, 26 insertions, 7 deletions
diff --git a/jsonschema/validators.py b/jsonschema/validators.py index c080ac8..9741125 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -602,6 +602,7 @@ class RefResolver(object): ): self.base_uri = base_uri self.resolution_scope = base_uri + # This attribute is not used, it is for backwards compatibility self.referrer = referrer self.cache_remote = cache_remote self.handlers = dict(handlers) @@ -611,6 +612,7 @@ class RefResolver(object): for id, validator in iteritems(meta_schemas) ) self.store.update(store) + self.store[base_uri] = referrer @classmethod def from_schema(cls, schema, *args, **kwargs): @@ -645,24 +647,23 @@ class RefResolver(object): full_uri = urlparse.urljoin(self.resolution_scope, ref) uri, fragment = urlparse.urldefrag(full_uri) + if not uri: + uri = self.base_uri if uri in self.store: document = self.store[uri] - elif not uri or uri == self.base_uri: - document = self.referrer else: try: document = self.resolve_remote(uri) except Exception as exc: raise RefResolutionError(exc) - old_base_uri, old_referrer = self.base_uri, self.referrer - self.base_uri, self.referrer = uri, document + old_base_uri, self.base_uri = self.base_uri, uri try: with self.in_scope(uri): yield self.resolve_fragment(document, fragment) finally: - self.base_uri, self.referrer = old_base_uri, old_referrer + self.base_uri = old_base_uri def resolve_fragment(self, document, fragment): """ diff --git a/test_jsonschema.py b/test_jsonschema.py index 3d01e82..11d8cd8 100644 --- a/test_jsonschema.py +++ b/test_jsonschema.py @@ -860,6 +860,14 @@ class TestRefResolver(unittest.TestCase): with self.resolver.resolving(ref) as resolved: self.assertEqual(resolved, self.referrer["properties"]["foo"]) + def test_it_resolves_local_refs_with_id(self): + schema = {"id": "/bar/schema#", "a": {"foo": "bar"}} + resolver = RefResolver.from_schema(schema) + with resolver.resolving("#/a") as resolved: + self.assertEqual(resolved, schema["a"]) + with resolver.resolving("/bar/schema#/a") as resolved: + self.assertEqual(resolved, schema["a"]) + def test_it_retrieves_stored_refs(self): with self.resolver.resolving(self.stored_uri) as resolved: self.assertIs(resolved, self.stored_schema) @@ -894,13 +902,23 @@ class TestRefResolver(unittest.TestCase): schema = {"id" : "foo"} resolver = RefResolver.from_schema(schema) self.assertEqual(resolver.base_uri, "foo") - self.assertEqual(resolver.referrer, schema) + with resolver.resolving("") as resolved: + self.assertEqual(resolved, schema) + with resolver.resolving("#") as resolved: + self.assertEqual(resolved, schema) + with resolver.resolving("foo") as resolved: + self.assertEqual(resolved, schema) + with resolver.resolving("foo#") as resolved: + self.assertEqual(resolved, schema) def test_it_can_construct_a_base_uri_from_a_schema_without_id(self): schema = {} resolver = RefResolver.from_schema(schema) self.assertEqual(resolver.base_uri, "") - self.assertEqual(resolver.referrer, schema) + with resolver.resolving("") as resolved: + self.assertEqual(resolved, schema) + with resolver.resolving("#") as resolved: + self.assertEqual(resolved, schema) def test_custom_uri_scheme_handlers(self): schema = {"foo": "bar"} |