
| Current Path : /proc/thread-self/root/usr/local/lib/python3.8/dist-packages/disk/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //proc/thread-self/root/usr/local/lib/python3.8/dist-packages/disk/Box.py |
from .Path import Path
import atexit
from chronometry import get_elapsed, get_now
# Box is an object that saves itself to the disk
class Box:
def __init__(self, path, save_interval_seconds=60):
self._path = Path(path=path)
if not self._path.exists():
self._path.make_parent_directory(ignore_if_exists=True)
self._num_saved_items = None
self._dict = {}
self._save_interval_seconds = save_interval_seconds
self._save_time = get_now()
self.load(append=False)
atexit.register(self.save)
_STATE_ATTRIBUTES_ = ['_path', '_num_saved_items', '_dict', '_save_interval_seconds', '_save_time']
def __getstate__(self):
return {key: getattr(self, key) for key in self._STATE_ATTRIBUTES_}
def __setstate__(self, state):
for key, value in state.items():
setattr(self, key, value)
self._path.make_parent_directory(ignore_if_exists=True)
self.load(append=True)
atexit.register(self.save)
def check(self, echo=0):
echo = max(0, echo)
# if the number of items increased by more than 10% o
if get_elapsed(start=self._save_time, unit='sec') > self._save_interval_seconds:
self.save(echo=echo)
@property
def path(self):
"""
:rtype: Path
"""
return self._path
def load(self, append=True, echo=0):
echo = max(0, echo)
if self.path.exists():
dictionary = self.path.unpickle(method='pickle', echo=echo)
if append:
dictionary.update(self._dict)
self._dict = dictionary
def save(self, echo=0):
echo = max(0, echo)
self.path.pickle(obj=self._dict, echo=echo)
self._save_time = get_now()
@property
def size_bytes(self):
self.check()
return self.path.size_bytes
@property
def names(self):
self.check()
return self._dict.keys()
@property
def items(self):
self.check()
return self._dict.items()
@property
def objects(self):
self.check()
return self._dict.values()
def get_all_names(self):
self.check()
return self._dict.keys()
@property
def size(self):
self.check()
return len(self._dict)
def contains(self, name):
self.check()
return name in self._dict
def get(self, name):
self.check()
if name not in self._dict:
self.load(append=True)
return self._dict[name]
def set(self, name, obj):
self._dict[name] = obj
self.check()
def __getitem__(self, item):
return self.get(name=item)
def __setitem__(self, key, value):
self.set(name=key, obj=value)
def __contains__(self, item):
return self.contains(name=item)
def remove(self, name):
del self._dict[name]
self.check()
def flush(self):
self._dict = {}
self.check()