crunk
1 year ago
7 changed files with 119 additions and 31 deletions
@ -0,0 +1 @@ |
|||||
|
{} |
@ -0,0 +1,60 @@ |
|||||
|
from os import environ, mkdir |
||||
|
from os.path import exists |
||||
|
from pathlib import Path |
||||
|
from logging import DEBUG, INFO, basicConfig, getLogger |
||||
|
from json import dumps, loads |
||||
|
|
||||
|
class SimpleJsonStorage(dict): |
||||
|
"""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, sort_keys=True)) |
||||
|
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 dict(*args, **kwargs).items(): |
||||
|
self[k] = v |
||||
|
self._dumps() |
Loading…
Reference in new issue