Source code for pystac.validation.local_validator

import json
from typing import Any, cast

from jsonschema import Draft7Validator, ValidationError

from pystac.errors import STACLocalValidationError
from pystac.version import STACVersion

VERSION = STACVersion.DEFAULT_STAC_VERSION


def _read_schema(file_name: str) -> dict[str, Any]:
    import importlib.resources

    with (
        importlib.resources.files("pystac.validation.jsonschemas")
        .joinpath(file_name)
        .open("r") as f
    ):
        return cast(dict[str, Any], json.load(f))


[docs] def get_local_schema_cache() -> dict[str, dict[str, Any]]: return { **{ ( f"https://schemas.stacspec.org/v{VERSION}/" f"{name}-spec/json-schema/{name}.json" ): _read_schema(f"stac-spec/v{VERSION}/{name}.json") for name in ("item", "catalog", "collection") }, **{ f"https://geojson.org/schema/{name}.json": _read_schema( f"geojson/{name}.json" ) for name in ("Feature", "Geometry") }, **{ ( f"https://schemas.stacspec.org/v{VERSION}/" f"item-spec/json-schema/{name}.json" ): _read_schema(f"stac-spec/v{VERSION}/{name}.json") for name in ( "bands", "basics", "common", "data-values", "datetime", "instrument", "licensing", "provider", ) }, }
############################### DEPRECATED ################################# _deprecated_ITEM_SCHEMA_URI = ( f"https://schemas.stacspec.org/v{VERSION}/item-spec/json-schema/item.json" ) _deprecated_COLLECTION_SCHEMA_URI = ( f"https://schemas.stacspec.org/v{VERSION}/" "collection-spec/json-schema/collection.json" ) _deprecated_CATALOG_SCHEMA_URI = ( f"https://schemas.stacspec.org/v{VERSION}/catalog-spec/json-schema/catalog.json" ) deprecated_names = ["ITEM_SCHEMA_URI", "COLLECTION_SCHEMA_URI", "CATALOG_SCHEMA_URI"] def __getattr__(name: str) -> Any: if name in deprecated_names: import warnings warnings.warn(f"{name} is deprecated and will be removed in v2.", FutureWarning) return globals()[f"_deprecated_{name}"] raise AttributeError(f"module {__name__} has no attribute {name}")
[docs] class LocalValidator: def __init__(self) -> None: """DEPRECATED""" import warnings warnings.warn( "``LocalValidator`` is deprecated and will be removed in v2.", DeprecationWarning, ) self.schema_cache = get_local_schema_cache()
[docs] def registry(self) -> Any: from referencing import Registry, Resource return Registry().with_resources( [(k, Resource.from_contents(v)) for k, v in self.schema_cache.items()] )
def _validate_from_local( self, schema_uri: str, stac_dict: dict[str, Any] ) -> list[ValidationError]: if schema_uri == _deprecated_ITEM_SCHEMA_URI: validator = self.item_validator(VERSION) elif schema_uri == _deprecated_COLLECTION_SCHEMA_URI: validator = self.collection_validator(VERSION) elif schema_uri == _deprecated_CATALOG_SCHEMA_URI: validator = self.catalog_validator(VERSION) else: raise STACLocalValidationError( f"Schema not available locally: {schema_uri}" ) return list(validator.iter_errors(stac_dict)) def _validator(self, stac_type: str, version: str) -> Draft7Validator: schema = _read_schema(f"stac-spec/v{version}/{stac_type}.json") return Draft7Validator(schema, registry=self.registry())
[docs] def catalog_validator(self, version: str = VERSION) -> Draft7Validator: return self._validator("catalog", version)
[docs] def collection_validator(self, version: str = VERSION) -> Draft7Validator: return self._validator("collection", version)
[docs] def item_validator(self, version: str = VERSION) -> Draft7Validator: return self._validator("item", version)