summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Dygalo <dmitry@dygalo.dev>2021-12-15 21:13:04 +0100
committerDmitry Dygalo <dmitry@dygalo.dev>2021-12-15 21:13:04 +0100
commit60242e770882f2ae2dea772350a6de3f767817ad (patch)
tree547193dc2730e4fcdd9fd88e1cbea714cd7131dc
parent0878727e6dc39f1f9268a626a6b6390b2dde2f4a (diff)
downloadjsonschema-60242e770882f2ae2dea772350a6de3f767817ad.tar.gz
perf: Cache reference lookups for subschemas
-rw-r--r--CHANGELOG.rst1
-rw-r--r--jsonschema/validators.py24
2 files changed, 18 insertions, 7 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d10f50f..507b112 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -3,6 +3,7 @@ v4.3.0
* Fix undesired fallback to brute force container uniqueness check on
certain input types (#893)
+* Cache reference lookups for subschemas (#893)
* Implement a PEP544 Protocol for validator classes (#890)
v4.2.1
diff --git a/jsonschema/validators.py b/jsonschema/validators.py
index e037c4b..46cd8e1 100644
--- a/jsonschema/validators.py
+++ b/jsonschema/validators.py
@@ -767,15 +767,14 @@ class RefResolver(object):
yield each
values.extendleft(each.values())
- def resolve(self, ref):
- """
- Resolve the given reference.
- """
- url = self._urljoin_cache(self.resolution_scope, ref).rstrip("/")
+ @lru_cache()
+ def _find_subschemas(self):
+ return list(self._finditem(self.referrer, "$id"))
+ @lru_cache()
+ def _find_in_subschemas(self, url):
uri, fragment = urldefrag(url)
-
- for subschema in self._finditem(self.referrer, "$id"):
+ for subschema in self._find_subschemas():
target_uri = self._urljoin_cache(
self.resolution_scope, subschema["$id"],
)
@@ -783,6 +782,17 @@ class RefResolver(object):
if fragment:
subschema = self.resolve_fragment(subschema, fragment)
return url, subschema
+ return None
+
+ def resolve(self, ref):
+ """
+ Resolve the given reference.
+ """
+ url = self._urljoin_cache(self.resolution_scope, ref).rstrip("/")
+
+ match = self._find_in_subschemas(url)
+ if match is not None:
+ return match
return url, self._remote_cache(url)