lib: Enable reading and writing text DataFiles
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
7b901b8380
commit
e2bb85b854
16
lib/data.py
16
lib/data.py
|
@ -10,6 +10,8 @@ if os.environ.get("EMMENTAL_TESTING"):
|
||||||
|
|
||||||
READ = 'rb'
|
READ = 'rb'
|
||||||
WRITE = 'wb'
|
WRITE = 'wb'
|
||||||
|
READ_TEXT = 'r'
|
||||||
|
WRITE_TEXT = 'w'
|
||||||
|
|
||||||
emmental_data = pathlib.Path(xdg.BaseDirectory.save_data_path(__resource))
|
emmental_data = pathlib.Path(xdg.BaseDirectory.save_data_path(__resource))
|
||||||
|
|
||||||
|
@ -21,9 +23,9 @@ class DataFile:
|
||||||
self.file = None
|
self.file = None
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
if self.mode == WRITE:
|
if self.mode in [ WRITE, WRITE_TEXT ]:
|
||||||
self.file = self.temp.open(self.mode)
|
self.file = self.temp.open(self.mode)
|
||||||
elif self.mode == READ and self.path.exists():
|
elif self.mode in [ READ, READ_TEXT ] and self.path.exists():
|
||||||
self.file = self.path.open(self.mode)
|
self.file = self.path.open(self.mode)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
@ -31,7 +33,7 @@ class DataFile:
|
||||||
if self.file:
|
if self.file:
|
||||||
self.file.flush()
|
self.file.flush()
|
||||||
self.file.close()
|
self.file.close()
|
||||||
if self.mode == WRITE:
|
if self.mode in [ WRITE, WRITE_TEXT ] and exp_type == None:
|
||||||
self.temp.replace(self.path)
|
self.temp.replace(self.path)
|
||||||
self.file = None
|
self.file = None
|
||||||
return exp_type == None
|
return exp_type == None
|
||||||
|
@ -43,6 +45,10 @@ class DataFile:
|
||||||
if self.file:
|
if self.file:
|
||||||
pickle.dump(obj, self.file, pickle.HIGHEST_PROTOCOL)
|
pickle.dump(obj, self.file, pickle.HIGHEST_PROTOCOL)
|
||||||
|
|
||||||
|
def read(self):
|
||||||
|
if self.file:
|
||||||
|
return self.file.read()
|
||||||
|
|
||||||
def remove(self):
|
def remove(self):
|
||||||
if self.file == None:
|
if self.file == None:
|
||||||
self.path.unlink(missing_ok = True)
|
self.path.unlink(missing_ok = True)
|
||||||
|
@ -50,3 +56,7 @@ class DataFile:
|
||||||
def unpickle(self):
|
def unpickle(self):
|
||||||
if self.file:
|
if self.file:
|
||||||
return pickle.load(self.file)
|
return pickle.load(self.file)
|
||||||
|
|
||||||
|
def write(self, text):
|
||||||
|
if self.file:
|
||||||
|
self.file.write(text)
|
||||||
|
|
|
@ -20,6 +20,8 @@ class TestDataModule(unittest.TestCase):
|
||||||
self.assertTrue(testing_data.is_dir())
|
self.assertTrue(testing_data.is_dir())
|
||||||
self.assertEqual(data.READ, 'rb')
|
self.assertEqual(data.READ, 'rb')
|
||||||
self.assertEqual(data.WRITE, 'wb')
|
self.assertEqual(data.WRITE, 'wb')
|
||||||
|
self.assertEqual(data.READ_TEXT, 'r')
|
||||||
|
self.assertEqual(data.WRITE_TEXT, 'w')
|
||||||
|
|
||||||
def test_data_file_init(self):
|
def test_data_file_init(self):
|
||||||
f = data.DataFile("test.file", data.READ)
|
f = data.DataFile("test.file", data.READ)
|
||||||
|
@ -68,3 +70,45 @@ class TestDataModule(unittest.TestCase):
|
||||||
f = data.DataFile("test.file", data.READ)
|
f = data.DataFile("test.file", data.READ)
|
||||||
f.remove()
|
f.remove()
|
||||||
self.assertFalse(f.exists())
|
self.assertFalse(f.exists())
|
||||||
|
|
||||||
|
def test_data_file_read_write_text(self):
|
||||||
|
test = "test saving a string"
|
||||||
|
with data.DataFile("test.file", data.READ_TEXT) as f:
|
||||||
|
self.assertIsNone(f.file)
|
||||||
|
f.write(test)
|
||||||
|
self.assertIsNone(f.read())
|
||||||
|
f.remove()
|
||||||
|
self.assertFalse(f.exists())
|
||||||
|
|
||||||
|
with data.DataFile("test.file", data.WRITE_TEXT) as f:
|
||||||
|
self.assertIsNotNone(f.file)
|
||||||
|
self.assertEqual(pathlib.Path(f.file.name), testing_temp)
|
||||||
|
self.assertFalse(f.exists())
|
||||||
|
self.assertTrue(testing_temp.exists())
|
||||||
|
f.write(test)
|
||||||
|
f.remove()
|
||||||
|
self.assertFalse(f.exists())
|
||||||
|
|
||||||
|
self.assertIsNone(f.file)
|
||||||
|
self.assertFalse(testing_temp.exists())
|
||||||
|
self.assertTrue(f.exists())
|
||||||
|
|
||||||
|
with data.DataFile("test.file", data.READ_TEXT) as f:
|
||||||
|
self.assertIsNotNone(f.file)
|
||||||
|
self.assertEqual(pathlib.Path(f.file.name), testing_file)
|
||||||
|
txt = f.read()
|
||||||
|
self.assertEqual(test, txt)
|
||||||
|
f.remove()
|
||||||
|
self.assertTrue(f.exists())
|
||||||
|
|
||||||
|
f = data.DataFile("test.file", data.READ)
|
||||||
|
f.remove()
|
||||||
|
self.assertFalse(f.exists())
|
||||||
|
|
||||||
|
def test_data_file_exception(self):
|
||||||
|
f = data.DataFile("test.file", data.WRITE_TEXT)
|
||||||
|
with self.assertRaises(Exception):
|
||||||
|
with f:
|
||||||
|
f.write("test")
|
||||||
|
raise Exception("Test Exception")
|
||||||
|
self.assertFalse(f.exists())
|
||||||
|
|
Loading…
Reference in New Issue