53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
from pathlib import Path
|
|
import json
|
|
|
|
class Settings(dict):
|
|
|
|
def __init__(self, filepath):
|
|
super(Settings, self).__init__()
|
|
self._filepath = filepath
|
|
self._save = True
|
|
if Path(self._filepath).exists():
|
|
self._load()
|
|
else:
|
|
data = {}
|
|
self.update(data)
|
|
self.save()
|
|
|
|
|
|
def _load(self):
|
|
data = {}
|
|
with open(self._filepath, 'r') as f:
|
|
try:
|
|
data.update(json.load(f))
|
|
except json.decoder.JSONDecodeError:
|
|
pass
|
|
|
|
self._save = False
|
|
self.update(data)
|
|
self._save = True
|
|
|
|
def save(self):
|
|
if self._save:
|
|
data = {}
|
|
data.update(self)
|
|
with open(self._filepath, 'w') as f:
|
|
json.dump(data, f, sort_keys=True, indent=4)
|
|
return
|
|
|
|
def __setitem__(self, key, value):
|
|
super(Settings, self).__setitem__(key, value)
|
|
self.save()
|
|
|
|
def __delitem__(self, key):
|
|
super(Settings, self).__delitem__(key)
|
|
self.save()
|
|
|
|
def update(self, *args, **kwargs):
|
|
super(Settings, self).update(*args, **kwargs)
|
|
self.save()
|
|
|
|
def setdefault(self, key, value=None):
|
|
ret = super(Settings, self).setdefault(key, value)
|
|
self.save()
|
|
return ret
|