Source code for pystac.provider
from html import escape
from typing import Any, Optional
from pystac.html.jinja_env import get_jinja_env
from pystac.utils import StringEnum
[docs]class ProviderRole(StringEnum):
"""Enumerates the allows values of the Provider "role" field."""
LICENSOR = "licensor"
PRODUCER = "producer"
PROCESSOR = "processor"
HOST = "host"
[docs]class Provider:
"""Provides information about a provider of STAC data. A provider is any of the
organizations that captured or processed the content of the collection and therefore
influenced the data offered by this collection. May also include information about
the final storage provider hosting the data.
Args:
name : The name of the organization or the individual.
description : Optional multi-line description to add further provider
information such as processing details for processors and producers,
hosting details for hosts or basic contact information.
roles : Optional roles of the provider. Any of
licensor, producer, processor or host.
url : Optional homepage on which the provider describes the dataset
and publishes contact information.
extra_fields : Optional dictionary containing additional top-level fields
defined on the Provider object.
"""
name: str
"""The name of the organization or the individual."""
description: Optional[str]
"""Optional multi-line description to add further provider
information such as processing details for processors and producers,
hosting details for hosts or basic contact information."""
roles: Optional[list[ProviderRole]]
"""Optional roles of the provider. Any of
licensor, producer, processor or host."""
url: Optional[str]
"""Optional homepage on which the provider describes the dataset
and publishes contact information."""
extra_fields: dict[str, Any]
"""Dictionary containing additional top-level fields defined on the Provider
object."""
def __init__(
self,
name: str,
description: Optional[str] = None,
roles: Optional[list[ProviderRole]] = None,
url: Optional[str] = None,
extra_fields: Optional[dict[str, Any]] = None,
):
self.name = name
self.description = description
self.roles = roles
self.url = url
self.extra_fields = extra_fields or {}
def __eq__(self, o: object) -> bool:
if not isinstance(o, Provider):
return NotImplemented
return self.to_dict() == o.to_dict()
def _repr_html_(self) -> str:
jinja_env = get_jinja_env()
if jinja_env:
template = jinja_env.get_template("JSON.jinja2")
return str(template.render(dict=self.to_dict()))
else:
return escape(repr(self))
[docs] def to_dict(self) -> dict[str, Any]:
"""Returns this provider as a dictionary.
Returns:
dict: A serialization of the Provider.
"""
d: dict[str, Any] = {"name": self.name}
if self.description is not None:
d["description"] = self.description
if self.roles is not None:
d["roles"] = self.roles
if self.url is not None:
d["url"] = self.url
d.update(self.extra_fields)
return d
[docs] @staticmethod
def from_dict(d: dict[str, Any]) -> "Provider":
"""Constructs an Provider from a dict.
Returns:
Provider: The Provider deserialized from the JSON dict.
"""
return Provider(
name=d["name"],
description=d.get("description"),
roles=d.get(
"roles",
),
url=d.get("url"),
extra_fields={
k: v
for k, v in d.items()
if k not in {"name", "description", "roles", "url"}
},
)