Source code for hippo.metadata

from collections import UserDict
from typing import Mapping


[docs] class MetaData(UserDict): """Metadata dictionary linked to a compound or pose in a HIPPO :class:`.Database` .. attention:: :class:`.Metadata` objects should not be created directly. Instead use the methods :meth:`.Compound.metadata` and :meth:`.Pose.metadata` """ def __init__( self, __dict: Mapping[str, str] | None, ) -> None: super().__init__() if __dict: for key, value in __dict.items(): super().__setitem__(key, value) self._db = None self._table: str = None self._id: str = None ### PROPERTIES @property def table(self) -> str: """name of the associated :class:`.Database` table""" return self._table @property def id(self) -> int: """entry ID in the associated :class:`.Database` table""" return self._id @property def db(self) -> "Database": """associated :class:`.Database`""" return self._db ### METHODS def _update_db( self, commit: bool = True, ) -> None: """Update the associated :class:`.Database` entry :param commit: commit the changes (Default value = True) """ self._db.insert_metadata( table=self._table, id=self._id, payload=self.data, commit=commit )
[docs] def update( self, data: dict, commit: bool = True, ) -> None: """Wrapper for dict.update() :param data: data with which to update the metadata :param commit: commit the changes (Default value = True) """ self.data.update(data) self._update_db(commit=commit)
[docs] def append( self, key: str, value, commit: bool = True, ) -> None: """Create or append to a list-like value with given key :param key: metadata dictionary key to be modified :param value: value to be appended to list-like ``metadata[key]`` :param commit: commit the changes (Default value = True) """ if key not in self: self.data[key] = [] if value not in self.data[key]: self.data[key].append(value) self._update_db(commit=commit)
### DUNDERS
[docs] def __setitem__( self, key: str, item, ) -> None: """Set the value associated to a specific dictionary key""" self.data.__setitem__(key, item) self._update_db()
[docs] def __delitem__(self, key: str) -> None: """Set a dictionary key""" self.data.__delitem__(key) self._update_db()