"""Tenancies interface
Access to the tenancies endpoint.
The user is not expected to use this class directly. It is an attribute of the
:class:`Archivist` class.
For example instantiate an Archivist instance and execute the methods of the class:
.. code-block:: python
with open(".auth_token", mode="r", encoding="utf-8") as tokenfile:
authtoken = tokenfile.read().strip()
# Initialize connection to Archivist
arch = Archivist(
"https://app.datatrails.ai",
authtoken,
)
tenancy = arch.tenancies.read(...)
"""
from logging import getLogger
from typing import TYPE_CHECKING
if TYPE_CHECKING:
# pylint:disable=cyclic-import # but pylint doesn't understand this feature
from .archivist import Archivist
from .constants import (
TENANCIES_LABEL,
TENANCIES_PREFIX,
TENANCIES_SUBPATH,
)
LOGGER = getLogger(__name__)
[docs]
class Tenant(dict):
"""Tenant object"""
[docs]
class _TenanciesClient:
"""TenanciesClient
Access to tenants entities using CRUD interface. This class is usually
accessed as an attribute of the Archivist class.
Args:
archivist (Archivist): :class:`Archivist` instance
"""
maxDiff = None
def __init__(self, archivist_instance: "Archivist"):
self._archivist = archivist_instance
self._subpath = f"{archivist_instance.root}/{TENANCIES_SUBPATH}"
self._label = f"{self._subpath}/{TENANCIES_LABEL}"
def __str__(self) -> str:
return f"TenanciesClient({self._archivist.url})"
[docs]
def _identity(self, identity: str) -> str:
"""Returns identity suitable for endpoint"""
prefix, uuid = identity.split("/")
if prefix == TENANCIES_PREFIX:
return "/".join((TENANCIES_LABEL, uuid))
return identity
[docs]
def publicinfo(self, identity: str) -> Tenant:
"""Read Tenant public info
Reads Tenant public info
Args:
identity (str): tenancies identity e.g. tenancies/xxxxxxxxxxxxxxxxxxxxxxx
or tenant/xxxxxxxxxxxxxxxxxxxxxxx
The tenant identity returned by most endpoints has the prefix 'tenant/'.
However the tenancies endpoint expects 'tenancies/'. This is a wart in the
archivist API and will be fixed at some future date.
Returns:
:class:`Tenant` instance
"""
return Tenant(
**self._archivist.get(
f"{self._subpath}/{self._identity(identity)}:publicinfo"
)
)