Exemplo n.º 1
0
    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]
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
        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