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:
brian m. carlson 2013-11-16 23:08:13 +00:00
parent 9f030febbf
commit e560f273b0
No known key found for this signature in database
GPG key ID: BF535D811F52F68B
2 changed files with 42 additions and 3 deletions

View file

@ -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
View 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()