Source code for geoh5py.shared.entity_type
# Copyright (c) 2024 Mira Geoscience Ltd.
#
# This file is part of geoh5py.
#
# geoh5py is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# geoh5py is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with geoh5py. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations
import uuid
import weakref
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, TypeVar, cast
if TYPE_CHECKING:
from .. import workspace as ws
EntityTypeT = TypeVar("EntityTypeT", bound="EntityType")
[docs]
class EntityType(ABC):
_attribute_map = {"Description": "description", "ID": "uid", "Name": "name"}
def __init__(self, workspace: ws.Workspace, uid: uuid.UUID | None = None, **kwargs):
assert workspace is not None
self._workspace = weakref.ref(workspace)
assert uid is None or isinstance(uid, uuid.UUID)
self._description: str | None = "Entity"
self._name: str | None = "Entity"
self._on_file = False
self._uid: uuid.UUID = uid if uid is not None else uuid.uuid4()
for attr, item in kwargs.items():
try:
if attr in self._attribute_map:
attr = self._attribute_map[attr]
setattr(self, attr, item)
except AttributeError:
continue
@property
def attribute_map(self):
"""
:obj:`dict` Correspondence map between property names used in geoh5py and
geoh5.
"""
return self._attribute_map
@property
def description(self) -> str | None:
return self._description
@description.setter
def description(self, description: str):
self._description = description
self.workspace.update_attribute(self, "attributes")
[docs]
@classmethod
def find(
cls: type[EntityTypeT], workspace: ws.Workspace, type_uid: uuid.UUID
) -> EntityTypeT | None:
"""Finds in the given Workspace the EntityType with the given UUID for
this specific EntityType implementation class.
:return: EntityType of None
"""
return cast(EntityTypeT, workspace.find_type(type_uid, cls))
@property
def on_file(self) -> bool:
"""
:obj:`bool` Entity already present in
:obj:`~geoh5py.workspace.workspace.Workspace.h5file`.
"""
return self._on_file
@on_file.setter
def on_file(self, value: bool):
self._on_file = value
@staticmethod
@abstractmethod
def _is_abstract() -> bool:
"""Trick to prevent from instantiating abstract base class."""
return True
@property
def name(self) -> str | None:
return self._name
@name.setter
def name(self, name: str):
self._name = name
self.workspace.update_attribute(self, "attributes")
@property
def uid(self) -> uuid.UUID:
"""
:obj:`uuid.UUID` The unique identifier of an entity, either as stored
in geoh5 or generated in :func:`~uuid.UUID.uuid4` format.
"""
return self._uid
@uid.setter
def uid(self, uid: str | uuid.UUID):
if isinstance(uid, str):
uid = uuid.UUID(uid)
self._uid = uid
self.workspace.update_attribute(self, "attributes")
@property
def workspace(self) -> ws.Workspace:
"""
:obj:`~geoh5py.workspace.workspace.Workspace` registering this type.
"""
workspace = self._workspace()
# Workspace should never be null, unless this is a dangling type object,
# which means workspace has been deleted.
assert workspace is not None
return workspace