from json import dumps, loads from collections import OrderedDict from logging import DEBUG, INFO, basicConfig, getLogger from os import environ, mkdir from os.path import exists from pathlib import Path class SimpleJsonStorage(OrderedDict): """A simple json file. It is a dictionary which saves to disk on all writes. It is optimised for ease of hacking and accessibility and not for performance or efficiency. Written by decentral1se, as part of: https://git.vvvvvvaria.org/decentral1se/xbotlib/src/branch/main/xbotlib.py """ def __init__(self, filename, log, *args, **kwargs): """Initialise the object.""" self.filename = Path(filename).absolute() self.log = getLogger(__name__) self._loads() self.update(*args, **kwargs) def _loads(self): """Load the file.""" if not exists(self.filename): return try: with open(self.filename, "r") as handle: self.update(loads(handle.read())) except Exception as exception: message = f"Loading file storage failed: {exception}" self.log.error(message, exc_info=exception) exit(1) def _dumps(self): """Save the file to disk.""" try: with open(self.filename, "w") as handle: handle.write(dumps(self, indent=4)) except Exception as exception: message = f"Saving file storage failed: {exception}" self.log.error(message, exc_info=exception) exit(1) def __setitem__(self, key, val): """Write data to the file.""" super().__setitem__(key, val) self._dumps() def __delitem__(self, key): """Remove data from the file.""" super().__delitem__(key) self._dumps() def update(self, *args, **kwargs): """Update the file.""" for k, v in OrderedDict(*args, **kwargs).items(): self[k] = v self._dumps()