@@ -757,6 +757,10 @@ def resolving(self, ref):
757
757
finally :
758
758
self .pop_scope ()
759
759
760
+ @lru_cache ()
761
+ def _find_in_referrer (self , key ):
762
+ return list (self ._finditem (self .referrer , key ))
763
+
760
764
def _finditem (self , schema , key ):
761
765
values = deque ([schema ])
762
766
while values :
@@ -773,8 +777,11 @@ def _find_subschemas(self):
773
777
774
778
@lru_cache ()
775
779
def _find_in_subschemas (self , url ):
780
+ subschemas = self ._find_subschemas ()
781
+ if not subschemas :
782
+ return None
776
783
uri , fragment = urldefrag (url )
777
- for subschema in self . _find_subschemas () :
784
+ for subschema in subschemas :
778
785
target_uri = self ._urljoin_cache (
779
786
self .resolution_scope , subschema ["$id" ],
780
787
)
@@ -831,12 +838,19 @@ def resolve_fragment(self, document, fragment):
831
838
if not fragment :
832
839
return document
833
840
841
+ if document is self .referrer :
842
+ find = self ._find_in_referrer
843
+ else :
844
+
845
+ def find (key ):
846
+ return self ._finditem (document , key )
847
+
834
848
for keyword in ["$anchor" , "$dynamicAnchor" ]:
835
- for subschema in self . _finditem ( document , keyword ):
849
+ for subschema in find ( keyword ):
836
850
if fragment == subschema [keyword ]:
837
851
return subschema
838
852
for keyword in ["id" , "$id" ]:
839
- for subschema in self . _finditem ( document , keyword ):
853
+ for subschema in find ( keyword ):
840
854
if "#" + fragment == subschema [keyword ]:
841
855
return subschema
842
856
0 commit comments