import json from collections import UserDict import os import sys from . import data class SettingsLoader(UserDict): def __init__(self: object, files: list) -> None: self.data = {} self.files = files self.reload() def load_settings_file(self: object, file: str) -> None: if not data.exists('conf', file): return ext = os.path.splitext(file)[1] with data.fd_open('conf', file) as fd: if ext == '.json': self.data.update(json.load(fd)) else: raise ValueError("Cannot open this type of settings file") def reload(self: object) -> None: self.data = {} for f in self.files: self.load_settings_file(f) class SettingsReadOnly(SettingsLoader): pass class SettingsMutable(SettingsLoader): pass class SettingsWritable(SettingsMutable): def __init__(self: object, files: list, outfile: str): super().__init__(files) self.outfile = outfile def save(self: object): defaults = SettingsReadOnly([x for x in self.files if x != self.outfile]) outdata = {} for k in self.data.keys(): if not k in defaults: outdata[k] = self.data[k] if outdata or data.exists('conf', self.outfile): with data.fd_write('conf', self.outfile) as fd: json.dump(outdata, fd, indent=4) init = SettingsWritable(['default.json', 'user.json'], 'user.json')