from copy import deepcopy
[docs]class AttributeType:
"""
The type of an :class:`~tamr_unify_client.attribute.resource.Attribute` or :class:`~tamr_unify_client.attribute.subattribute.SubAttribute`.
See https://docs.tamr.com/reference#attribute-types
:param data: JSON data representing this type
:type data: :py:class:`dict`
"""
def __init__(self, data):
self._data = data
@property
def base_type(self):
""":type: str"""
return self._data.get("baseType")
@property
def inner_type(self):
""":type: :class:`~tamr_unify_client.attribute.type.AttributeType`"""
if "innerType" in self._data:
return AttributeType(self._data.get("innerType"))
else:
return None
@property
def attributes(self):
""":type: list[:class:`~tamr_unify_client.attribute.subattribute.SubAttribute`]"""
from tamr_unify_client.attribute.subattribute import SubAttribute
collection_json = self._data.get("attributes")
return [SubAttribute.from_json(attr) for attr in collection_json]
[docs] def spec(self):
"""Returns a spec representation of this attribute type.
:return: The attribute type spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
return AttributeTypeSpec.of(self)
def __repr__(self):
return (
f"{self.__class__.__module__}."
f"{self.__class__.__qualname__}("
f"base_type={self.base_type!r})"
)
[docs]class AttributeTypeSpec:
def __init__(self, data):
self._data = data
[docs] @staticmethod
def of(resource):
"""Creates an attribute type spec from an attribute type.
:param resource: The existing attribute type.
:type resource: :class:`~tamr_unify_client.attribute.type.AttributeType`
:return: The corresponding attribute type spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
return AttributeTypeSpec(deepcopy(resource._data))
[docs] @staticmethod
def new():
"""Creates a blank spec that could be used to construct a new attribute type.
:return: The empty spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
return AttributeTypeSpec({})
[docs] def to_dict(self):
"""Returns a version of this spec that conforms to the API representation.
:returns: The spec's dict.
:rtype: dict
"""
return deepcopy(self._data)
[docs] def with_base_type(self, new_base_type):
"""Creates a new spec with the same properties, updating the base type.
:param new_base_type: The new base type.
:type new_base_type: str
:return: The new spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
return AttributeTypeSpec({**self._data, "baseType": new_base_type})
[docs] def with_inner_type(self, new_inner_type):
"""Creates a new spec with the same properties, updating the inner type.
:param new_inner_type: The spec of the new inner type.
:type new_inner_type: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
:return: The new spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
inner_spec = new_inner_type.to_dict()
return AttributeTypeSpec({**self._data, "innerType": inner_spec})
[docs] def with_attributes(self, new_attributes):
"""Creates a new spec with the same properties, updating attributes.
:param new_attributes: The specs of the new attributes.
:type new_attributes: list[:class:`~tamr_unify_client.attribute.resource.AttributeSpec`]
:return: The new spec.
:rtype: :class:`~tamr_unify_client.attribute.type.AttributeTypeSpec`
"""
attr_specs = [attr.to_dict() for attr in new_attributes]
return AttributeTypeSpec({**self._data, "attributes": attr_specs})
def __repr__(self):
return (
f"{self.__class__.__module__}."
f"{self.__class__.__qualname__}("
f"dict={self._data!r})"
)