64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
from attrdict import AttrDict
|
|
import json
|
|
import os.path
|
|
import os
|
|
import tempfile
|
|
|
|
|
|
class JsonDict(object):
|
|
def __init__(self,persistence=None):
|
|
# TODO: either filename or file-like object
|
|
# for now, just filename
|
|
self._persistence = persistence
|
|
self._wrapped = dict()
|
|
|
|
def __len__(self):
|
|
self._reread()
|
|
return len(self._wrapped)
|
|
|
|
def keys(self):
|
|
self._reread()
|
|
return self._wrapped.keys()
|
|
|
|
def values(self):
|
|
self._reread()
|
|
return self._wrapped.values()
|
|
|
|
def __setitem__(self, key, item):
|
|
self._wrapped[key] = item
|
|
self._commit()
|
|
return item
|
|
|
|
def __delitem__(self, key):
|
|
del self._wrapped[key]
|
|
self._commit()
|
|
|
|
def __getitem__(self, key):
|
|
self._reread()
|
|
if key in self._wrapped:
|
|
return self._wrapped[key]
|
|
else:
|
|
return None
|
|
|
|
def _commit(self):
|
|
serialized = json.dumps(self._wrapped)
|
|
atomic_write(self._persistence, serialized)
|
|
|
|
def _reread(self):
|
|
with open(self._persistence, 'rb') as fd:
|
|
self._wrapped = json.load(fd)
|
|
|
|
#def PersistentAppAttrDict(appname):
|
|
#configfilename = appdirs.user_data_dir(appname,appname) + "appconfig.json"
|
|
#open
|
|
|
|
def atomic_write(fn,content):
|
|
filedir = os.path.dirname(os.path.abspath(fn))
|
|
if not os.path.exists(filedir):
|
|
os.makedirs(filedir)
|
|
(tempfd, tempfn) = tempfile.mkstemp(dir=filedir)
|
|
tempfh = os.fdopen(tempfd, 'w')
|
|
tempfh.write(content)
|
|
tempfh.close()
|
|
os.rename(tempfn,fn)
|