jsondict/jsondict/__init__.py

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)