diff options
author | Dmitry Dygalo <dmitry@dygalo.dev> | 2021-12-15 21:13:04 +0100 |
---|---|---|
committer | Dmitry Dygalo <dmitry@dygalo.dev> | 2021-12-15 21:13:04 +0100 |
commit | 60242e770882f2ae2dea772350a6de3f767817ad (patch) | |
tree | 547193dc2730e4fcdd9fd88e1cbea714cd7131dc | |
parent | 0878727e6dc39f1f9268a626a6b6390b2dde2f4a (diff) | |
download | jsonschema-60242e770882f2ae2dea772350a6de3f767817ad.tar.gz |
perf: Cache reference lookups for subschemas
-rw-r--r-- | CHANGELOG.rst | 1 | ||||
-rw-r--r-- | jsonschema/validators.py | 24 |
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) |