emmental/lib/data.py

65 lines
1.7 KiB
Python

# 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)