Fix JSON round-tripping.
This also includes a unit test to ensure that round-tripping works properly for those serializations where it's supported. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
This commit is contained in:
parent
9f030febbf
commit
e560f273b0
2 changed files with 42 additions and 3 deletions
|
|
@ -373,9 +373,9 @@ class JSONFile(FileFormat):
|
|||
self._txnstore.commit_close()
|
||||
def load(self):
|
||||
"""Read this file as a list of records."""
|
||||
self._txnstore.prepare_open(self._filename, "rb")
|
||||
fp = self._open("rb")
|
||||
self._txnstore.commit_open(self._filename, "rb")
|
||||
self._txnstore.prepare_open(self._filename, "r")
|
||||
fp = self._open("r")
|
||||
self._txnstore.commit_open(self._filename, "r")
|
||||
decoder = json.JSONDecoder(self._object_hook, strict=False)
|
||||
recs = decoder.decode(fp.read())
|
||||
if not isinstance(recs, list):
|
||||
|
|
|
|||
39
test/testfilemanip.py
Executable file
39
test/testfilemanip.py
Executable file
|
|
@ -0,0 +1,39 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
from newfol.filemanip import Record, FileStorage
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
class TestRoundTripping(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.data = [
|
||||
Record(["0", "1", "2", "3"]),
|
||||
Record(["4", "5", "6", "7"]),
|
||||
Record(["a", "b", "c", "d"], "foo"),
|
||||
Record(["e", "f", "c", "d"], "bar"),
|
||||
]
|
||||
self.tempdir = tempfile.TemporaryDirectory()
|
||||
def compare(self, l, m, lossy):
|
||||
for a, b in zip(l, m):
|
||||
for c, d in zip(a.fields, b.fields):
|
||||
self.assertEqual(c, d)
|
||||
if lossy:
|
||||
self.assertEqual(a.table or "", b.table or "")
|
||||
else:
|
||||
self.assertEqual(a.uuid, b.uuid)
|
||||
self.assertEqual(a.table, b.table)
|
||||
def run_test(self, fmt, lossy=False):
|
||||
options = {"table-is-field-0": True}
|
||||
fs = FileStorage(fmt, self.tempdir.name + "/" + fmt, options=options)
|
||||
fs.store(self.data)
|
||||
m = fs.load()
|
||||
self.compare(self.data, m, lossy)
|
||||
def test_csv(self):
|
||||
self.run_test("csv", True)
|
||||
def test_json(self):
|
||||
self.run_test("json")
|
||||
def test_pickle(self):
|
||||
self.run_test("pickle")
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Loading…
Reference in a new issue