diff options
author | Julian Berman <Julian@GrayVines.com> | 2022-09-09 11:22:20 +0300 |
---|---|---|
committer | Julian Berman <Julian@GrayVines.com> | 2022-09-09 11:22:23 +0300 |
commit | d9e093d439ab3023ffb644d620155e277032740c (patch) | |
tree | 1f396eaad98b8ae9eedf358c83e9291e9f94d242 /jsonschema | |
parent | 8cec498ad54bbecf38b7eaf304308d500bcda9db (diff) | |
download | jsonschema-d9e093d439ab3023ffb644d620155e277032740c.tar.gz |
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.
Diffstat (limited to 'jsonschema')
-rw-r--r-- | jsonschema/tests/test_jsonschema_test_suite.py | 10 | ||||
-rw-r--r-- | jsonschema/validators.py | 27 |
2 files changed, 27 insertions, 10 deletions
diff --git a/jsonschema/tests/test_jsonschema_test_suite.py b/jsonschema/tests/test_jsonschema_test_suite.py index 5c9a2e8..43debbb 100644 --- a/jsonschema/tests/test_jsonschema_test_suite.py +++ b/jsonschema/tests/test_jsonschema_test_suite.py @@ -396,6 +396,11 @@ TestDraft201909 = DRAFT201909.to_unittest_testcase( "not just immediate parent" ), )(test) + or skip( + message=bug(), + subject="refRemote", + case_description="remote HTTP ref with nested absolute ref", + )(test) ), ) @@ -516,6 +521,11 @@ TestDraft202012 = DRAFT202012.to_unittest_testcase( "not just immediate parent" ), )(test) + or skip( + message=bug(), + subject="refRemote", + case_description="remote HTTP ref with nested absolute ref", + )(test) ), ) diff --git a/jsonschema/validators.py b/jsonschema/validators.py index ea6f52b..e321840 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -16,6 +16,7 @@ import reprlib import typing import warnings +from pyrsistent import m import attr from jsonschema import ( @@ -713,7 +714,7 @@ class RefResolver: self, base_uri, referrer, - store=(), + store=m(), cache_remote=True, handlers=(), urljoin_cache=None, @@ -729,8 +730,13 @@ class RefResolver: self.handlers = dict(handlers) self._scopes_stack = [base_uri] + self.store = _utils.URIDict(_store_schema_list()) self.store.update(store) + self.store.update( + (schema["$id"], schema) + for schema in store.values() if "$id" in schema + ) self.store[base_uri] = referrer self._urljoin_cache = urljoin_cache @@ -864,6 +870,7 @@ class RefResolver: if target_uri.rstrip("/") == uri.rstrip("/"): if fragment: subschema = self.resolve_fragment(subschema, fragment) + self.store[url] = subschema return url, subschema return None @@ -884,16 +891,16 @@ class RefResolver: Resolve the given URL. """ url, fragment = urldefrag(url) - if url: + if not url: + url = self.base_uri + + try: + document = self.store[url] + except KeyError: try: - document = self.store[url] - except KeyError: - try: - document = self.resolve_remote(url) - except Exception as exc: - raise exceptions.RefResolutionError(exc) - else: - document = self.referrer + document = self.resolve_remote(url) + except Exception as exc: + raise exceptions.RefResolutionError(exc) return self.resolve_fragment(document, fragment) |