Source code for pystac.extensions.item_assets
"""Implements the :stac-ext:`Item Assets Definition Extension <item-assets>`."""
from __future__ import annotations
import warnings
from typing import Any, Literal
import pystac
from pystac.errors import DeprecatedWarning
from pystac.extensions.base import ExtensionManagementMixin
from pystac.extensions.hooks import ExtensionHooks
from pystac.item_assets import ItemAssetDefinition
from pystac.serialization.identify import STACJSONDescription, STACVersionID
from pystac.utils import get_required
SCHEMA_URI = "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json"
ITEM_ASSETS_PROP = "item_assets"
[docs]
class AssetDefinition(ItemAssetDefinition):
"""
DEPRECATED
.. deprecated:: 1.12.0
Use :class:`~pystac.ItemAssetDefinition` instead.
"""
def __init__(cls, *args: Any, **kwargs: Any) -> None:
warnings.warn(
(
"``AssetDefinition`` is deprecated. "
"Please use ``pystac.ItemAssetDefinition`` instead."
),
DeprecationWarning,
)
super().__init__(*args, **kwargs)
[docs]
class ItemAssetsExtension(ExtensionManagementMixin[pystac.Collection]):
"""
DEPRECATED
.. deprecated:: 1.12.0
Use :attr:`~pystac.Collection.item_assets` instead.
"""
name: Literal["item_assets"] = "item_assets"
collection: pystac.Collection
def __init__(self, collection: pystac.Collection) -> None:
warnings.warn(
(
"The ``item_assets`` extension is deprecated. "
"``item_assets`` is now a top-level property of ``Collection``."
),
DeprecatedWarning,
)
self.collection = collection
@property
def item_assets(self) -> dict[str, ItemAssetDefinition]:
"""Gets or sets a dictionary of assets that can be found in member Items. Maps
the asset key to an :class:`AssetDefinition` instance."""
result: dict[str, Any] = get_required(
self.collection.extra_fields.get(ITEM_ASSETS_PROP), self, ITEM_ASSETS_PROP
)
return {k: ItemAssetDefinition(v, self.collection) for k, v in result.items()}
@item_assets.setter
def item_assets(self, v: dict[str, ItemAssetDefinition]) -> None:
self.collection.extra_fields[ITEM_ASSETS_PROP] = {
k: asset_def.properties for k, asset_def in v.items()
}
def __repr__(self) -> str:
return f"<ItemAssetsExtension collection.id = {self.collection.id}>"
[docs]
@classmethod
def get_schema_uri(cls) -> str:
return SCHEMA_URI
[docs]
@classmethod
def ext(
cls, obj: pystac.Collection, add_if_missing: bool = False
) -> ItemAssetsExtension:
"""Extends the given :class:`~pystac.Collection` with properties from the
:stac-ext:`Item Assets Extension <item-assets>`.
Raises:
pystac.ExtensionTypeError : If an invalid object type is passed.
"""
if isinstance(obj, pystac.Collection):
cls.ensure_has_extension(obj, add_if_missing)
return cls(obj)
else:
raise pystac.ExtensionTypeError(cls._ext_error_message(obj))
[docs]
class ItemAssetsExtensionHooks(ExtensionHooks):
schema_uri: str = SCHEMA_URI
prev_extension_ids = {"asset", "item-assets"}
stac_object_types = {pystac.STACObjectType.COLLECTION}
[docs]
def migrate(
self, obj: dict[str, Any], version: STACVersionID, info: STACJSONDescription
) -> None:
# Handle that the "item-assets" extension had the id of "assets", before
# collection assets (since removed) took over the ID of "assets"
if version < "1.0.0-beta.1" and "asset" in info.extensions:
if "assets" in obj:
obj["item_assets"] = obj["assets"]
del obj["assets"]
super().migrate(obj, version, info)
# As of STAC spec version 1.1.0 item-assets are part of core
if obj["stac_version"] >= "1.1.0" and self.schema_uri in obj.get(
"stac_extensions", []
):
obj["stac_extensions"].remove(self.schema_uri)
ITEM_ASSETS_EXTENSION_HOOKS: ExtensionHooks = ItemAssetsExtensionHooks()