Source code for punchbowl.auto.control.cache_layer.loader_base_class

import abc
import pickle
from typing import TypeVar

from punchbowl.auto.control.cache_layer import manager
from punchbowl.util import DataLoader

T = TypeVar("T")


[docs] class LoaderABC(DataLoader[T]):
[docs] @abc.abstractmethod def gen_key(self) -> str: """Generate a cache key"""
[docs] @abc.abstractmethod def src_repr(self) -> str: """Return a string representation of the source data (e.g. a file path)"""
[docs] @abc.abstractmethod def load_from_disk(self) -> T: """Load the object"""
[docs] @abc.abstractmethod def __repr__(self): """Return a string representation of this loader"""
[docs] def load(self) -> T: with manager.try_read_from_key(self.gen_key()) as buffer: if buffer is None: result = self.load_from_disk() self.try_caching(result) else: result = self.from_bytes(buffer.data) return result
[docs] def try_caching(self, object: T) -> None: data = self.to_bytes(object) manager.try_write_to_key(self.gen_key(), data)
[docs] def to_bytes(self, object: T) -> bytes: return pickle.dumps(object)
[docs] def from_bytes(self, bytes: bytes) -> T: return pickle.loads(bytes)
[docs] def __str__(self): return self.__repr__()