summaryrefslogtreecommitdiff
path: root/jsonschema
diff options
context:
space:
mode:
authorJulian Berman <Julian@GrayVines.com>2022-09-09 11:22:20 +0300
committerJulian Berman <Julian@GrayVines.com>2022-09-09 11:22:23 +0300
commitd9e093d439ab3023ffb644d620155e277032740c (patch)
tree1f396eaad98b8ae9eedf358c83e9291e9f94d242 /jsonschema
parent8cec498ad54bbecf38b7eaf304308d500bcda9db (diff)
downloadjsonschema-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.py10
-rw-r--r--jsonschema/validators.py27
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)