class SerializedEntity: # pragma: no cover -- TODO requires functional tests. def __init__(self, filename, current_version, entity_name='data', unlink=False, readable=False): self.filename = Path(filename) self.version = current_version self.entity_name = entity_name self.unlink = unlink self.readable = readable self.entity = None def load(self): if not self.filename.exists(): return None data = self.filename.read_text() savedata = jsonpickle.decode(data, keys=True) if savedata['version'] > self.version: raise RuntimeError( "Stored data version {0} is newer than currently supported {1}" .format(savedata['version'], self.version)) self.entity = savedata[self.entity_name] if self.unlink: os.unlink(str(self.filename)) return self.entity def reset(self, new_value=None): self.entity = new_value def save(self, entity=None): if entity is None: entity = self.entity if entity is None: return savedata = {'version': self.version, self.entity_name: entity} if self.readable: data = jsonpickle.encode(savedata, indent=2, keys=True) else: data = jsonpickle.encode(savedata, keys=True) self.filename.write_bytes(data.encode('utf-8', 'replace')) def __enter__(self): self.load() return self def __exit__(self, *args, **kwargs): self.save()