65 lines
1.7 KiB
Python
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)
|