here.content.content
Source code for here.content.content
Copyright (C) 2019-2022 HERE Global B.V. and its affiliate(s).
All rights reserved.
This software and other materials contain proprietary information
controlled by HERE and are protected by applicable copyright legislation.
Any use and utilization of this software and other materials and
disclosure to any third parties is conditional upon having a separate
agreement with HERE for the access, use, utilization or disclosure of this
software. In the absence of such agreement, the use of the software is not
allowed.
"""HERE Platform Python SDK, Content access module
"""
from typing import Optional
from here.platform import Platform
from here.platform.adapter import Adapter, ContentAdapter
from here.platform.adapter_default import DefaultContentAdapter
hmc_schema_version = "2.201.0"
[docs]
class Content:
"""
Represent the source used by content bindings to access the data.
"""
def init(
self,
platform: Platform,
catalog_hrn: str,
version: Optional[int] = None,
):
"""
Initialize the content source.
Platform is provided for the bindings to access the platform.
Catalog HRN and version, when applicable, to select the content source.
:param platform: access to the HERE platform
:param catalog_hrn: which instance of the content to read
:param version: which version of the content to read, the latest if not specified
:raises Exception: If catalog is empty.
"""
The catalog HRN, as passed
self.catalog_hrn = catalog_hrn
This is the catalog used to access the data, adapter is never applied to it
This catalog is for internal use only of the content and content binding
self._catalog = platform.get_catalog(catalog_hrn, adapter=platform.default_adapter)
Platform instance, for internal use of content and content binding
self._platform = platform
The version must be set or detected once and in one place, otherwise
we risk operating on two different versions if the catalog is modified
between multiple latest_version calls.
latest_version calls.self.version: int = (
version or self._catalog.latest_version() or self._catalog.configuration.version
)
if not self.version:
raise Exception(f"Catalog {catalog_hrn} is empty.")
todo: check that a version exists if specified from outside
todo: generalize also for catalogs without versioned layers to support volatile layers
[docs]
class ContentBinding:
"""
Base class for all the bindings.
"""
def init(self, content: Content, adapter: Optional[Adapter] = None):
"""
Initialize the content binding.
:param content: the content to bind to
:param adapter: adapter to expose the content in a specific format. If not specified,
the adapter defined in the Platform instance used for Content
is used by default in all the functions of the content binding.
"""
self.content: Content = content
The following two are for implementations of this interface
self._catalog = content._catalog
self._version: int = content.version
self._content_adapter = (adapter or content._platform.adapter).content_adapter
The following two are needed by legacy HMC bindings only, to be removed
self._adapter = adapter
self._default_adapter = content._platform.default_adapter
The following function should also be removed when legacy HMC bindings are removed
def _legacy_hmc_content_adapter(self, adapter: Optional[Adapter]) -> Optional[ContentAdapter]:
"""
Select an adapter and return its content adapter.
Each binding function can override the selection with a preferred adapter.
If not specified, the default adapter of the binding is selected.
If this is also not specified, the adapter is taken from the platform instance.
It never returns :class:DefaultContentAdapter. None is returned in this case.
This is temporary and needed for backward compatibility with existing bindings.
:param adapter: the preferred adapter to select, if available.
:return: the content adapter associated with the selected adapter
"""
candidate = (adapter or self._adapter or self.content._platform.adapter).content_adapter
return candidate if not isinstance(candidate, DefaultContentAdapter) else None