# Copyright 2019 (c) Anna Schumaker. from . import version import pathlib import pickle import xdg.BaseDirectory __resource = "emmental" if version.TESTING == True: __resource = "emmental-testing" elif __debug__ == True: __resource = "emmental-debug" READ = 'rb' WRITE = 'wb' READ_TEXT = 'r' WRITE_TEXT = 'w' emmental_data = pathlib.Path(xdg.BaseDirectory.save_data_path(__resource)) class DataFile: def __init__(self, path, mode): self.path = emmental_data / path self.temp = emmental_data / f".{path}.tmp" self.mode = mode self.file = None def __enter__(self): if self.mode in [ WRITE, WRITE_TEXT ]: self.file = self.temp.open(self.mode) elif self.mode in [ READ, READ_TEXT ] and self.path.exists(): self.file = self.path.open(self.mode) return self def __exit__(self, exp_type, exp_value, traceback): if self.file: self.file.flush() self.file.close() if self.mode in [ WRITE, WRITE_TEXT ] and exp_type == None: self.temp.replace(self.path) self.file = None return exp_type == None def exists(self): return self.path.exists() def pickle(self, obj): if self.file: pickle.dump(obj, self.file, pickle.HIGHEST_PROTOCOL) def read(self): if self.file: return self.file.read() def remove(self): if self.file == None: self.path.unlink(missing_ok = True) def unpickle(self): if self.file: return pickle.load(self.file) def write(self, text): if self.file: self.file.write(text)