def evaluate(self, instance: JSON, scope: Scope) -> None: refschema = self.refschema if self.dynamic: base_scope = scope.root checked_uris = set() for key in scope.path: if (base_schema := base_scope.schema) is refschema: break if (base_uri := base_schema.base_uri ) is not None and base_uri not in checked_uris: checked_uris |= {base_uri} target_uri = URI(f"#{self.fragment}").resolve(base_uri) try: found_schema = Catalogue.get_schema(target_uri) if (dynamic_anchor := found_schema.get("$dynamicAnchor")) and \ dynamic_anchor.value == self.fragment: refschema = found_schema break except CatalogueError: pass base_scope = base_scope.children[key]
class RefKeyword(Keyword): key = "$ref" def __init__(self, parentschema: JSONSchema, value: str): super().__init__(parentschema, value) self.refschema = None def resolve(self) -> None: uri = URI(self.json.value) if not uri.has_absolute_base(): if (base_uri := self.parentschema.base_uri) is not None: uri = uri.resolve(base_uri) else: raise JSONSchemaError( f'No base URI against which to resolve the "$ref" value "{uri}"' ) self.refschema = Catalogue.get_schema( uri, metaschema_uri=self.parentschema.metaschema_uri)
def resolve(self) -> None: if (base_uri := self.parentschema.base_uri) is not None: self.refschema = Catalogue.get_schema( base_uri, metaschema_uri=self.parentschema.metaschema_uri)
def parentschema(self) -> Optional[JSONSchema]: parent = self.parent while parent is not None: if isinstance(parent, JSONSchema): return parent parent = parent.parent @property def metaschema(self) -> Metaschema: from jschon.catalogue import Catalogue if (uri := self.metaschema_uri) is None: raise JSONSchemaError( "The schema's metaschema URI has not been set") if not isinstance(metaschema := Catalogue.get_schema(uri), Metaschema): raise JSONSchemaError( f"The schema referenced by {uri} is not a metachema") return metaschema @property def metaschema_uri(self) -> Optional[URI]: if self._metaschema_uri is not None: return self._metaschema_uri if self.parentschema is not None: return self.parentschema.metaschema_uri @metaschema_uri.setter def metaschema_uri(self, value: Optional[URI]) -> None: self._metaschema_uri = value
self.fragment = fragment self.refschema = None self.dynamic = False def resolve(self) -> None: uri = URI(self.json.value) if not uri.has_absolute_base(): if (base_uri := self.parentschema.base_uri) is not None: uri = uri.resolve(base_uri) else: raise JSONSchemaError( f'No base URI against which to resolve the "$dynamicRef" value "{uri}"' ) self.refschema = Catalogue.get_schema( uri, metaschema_uri=self.parentschema.metaschema_uri) if (dynamic_anchor := self.refschema.get("$dynamicAnchor") ) and dynamic_anchor.value == self.fragment: self.dynamic = True def evaluate(self, instance: JSON, scope: Scope) -> None: refschema = self.refschema if self.dynamic: base_scope = scope.root checked_uris = set() for key in scope.path: if (base_schema := base_scope.schema) is refschema: break