Source code for meerkat.mixins.cloneable

from dataclasses import dataclass

from meerkat.mixins.blockable import BlockableMixin
from meerkat.provenance import ProvenanceMixin


[docs]@dataclass class StateClass: """An internal class to store the state of an object alongside its associated class.""" klass: type state: object
[docs]class CloneableMixin: def __init__(self, *args, **kwargs): super(CloneableMixin, self).__init__(*args, **kwargs) @classmethod def _state_keys(cls) -> set: """""" raise NotImplementedError() @classmethod def _clone_keys(cls) -> set: return set()
[docs] def copy(self, **kwargs) -> object: new_data = self._copy_data() return self._clone(data=new_data)
[docs] def view(self) -> object: return self._clone()
def _clone(self, data: object = None): if data is None: if isinstance(self, BlockableMixin) and self.is_blockable(): data = self._pack_block_view() else: data = self._view_data() state = self._get_state(clone=True) obj = self.__class__.__new__(self.__class__) obj._set_state(state) obj._set_data(data) if isinstance(self, ProvenanceMixin): # need to create a node for the object obj._init_node() return obj def _copy_data(self) -> object: raise NotImplementedError def _view_data(self) -> object: return self.data def _get_state(self, clone: bool = False) -> dict: state = {key: getattr(self, key) for key in self._state_keys()} if clone: state.update({key: getattr(self, key) for key in self._clone_keys()}) return state def _set_state(self, state: dict): self.__dict__.update(state)