preferences.py (1902B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\brennivin\preferences.py 2 import json 3 import logging 4 import os 5 import sys 6 import traceback 7 logger = logging.getLogger(__name__) 8 9 class Preferences(object): 10 11 def __init__(self, filename, onloaderror = None): 12 directory = os.path.dirname(filename) 13 if not os.path.exists(directory): 14 os.makedirs(directory) 15 self.prefs = {} 16 self.filename = filename 17 self.onloaderror = onloaderror 18 self.load() 19 20 def loader(self, fp): 21 return json.load(fp) 22 23 def dumper(self, obj, fp): 24 return json.dump(obj, fp) 25 26 def openmode(self): 27 return 'b' 28 29 def get(self, region, variable, defaultValue): 30 try: 31 return self.prefs[region][variable] 32 except KeyError: 33 return defaultValue 34 35 def set(self, region, variable, value): 36 if region not in self.prefs: 37 self.prefs[region] = {} 38 self.prefs[region][variable] = value 39 self.save() 40 41 def setdefault(self, region, variable, defaultValue): 42 sentinel = object() 43 result = self.get(region, variable, sentinel) 44 if result == sentinel: 45 result = defaultValue 46 self.set(region, variable, result) 47 return result 48 49 def save(self): 50 with open(self.filename, 'w' + self.openmode()) as f: 51 self.dumper(self.prefs, f) 52 53 def load(self): 54 try: 55 if os.path.isfile(self.filename): 56 with open(self.filename, 'r' + self.openmode()) as f: 57 self.prefs = self.loader(f) 58 except Exception: 59 if self.onloaderror: 60 self.onloaderror(*sys.exc_info()) 61 else: 62 logger.error(traceback.format_exc()) 63 64 if not isinstance(self.prefs, dict): 65 self.prefs = {}