def test_different_key_mapping(self): p1 = to_obj(Person, {'name': 'Yin', 'age': 10, 'pid': '001'}) o2j_map = {'pid': 'perid'} j2o_map = {v: k for k, v in o2j_map.items()} p1j = to_json(p1, **o2j_map) p2 = to_obj(Person, p1j, **j2o_map) self.assertEqual(p1, p2)
def test_different_key_mapping(self): p1 = to_obj(Person, {'name': 'Yin', 'age': 10, 'pid': '001'}) o2j_map = {'pid': 'perid'} j2o_map = {v: k for k, v in o2j_map.items()} p1j = to_dict(p1, **o2j_map) p2 = to_obj(Person, p1j, **j2o_map) self.assertEqual(p1, p2)
def test_mapping(self): p1 = to_obj(Person, {'name': 'Yin', 'age': 10, 'pid': '001'}) p2 = to_obj(Person, {'name': 'Yang', 'age': 5, 'pid': '002'}) p2.job = Job("pupil", -100) # p2 > json p2json = json.loads(dumps(p2)) update_obj(p2json, p1, 'name', 'age', 'pid') p1.job = to_obj(Job, p2json['job']) self.assertEqual(p1, p2) # now change p1 salary p1.job.sal = -200 self.assertNotEqual(p1.job.sal, p2.job.sal)
def test_csv(self): print("Test CSV io") # test writing numbers => strings data = ((1, 2, 3), (4, 5, 6)) CSV.write(TEST_CSV, data) indata = CSV.read(TEST_CSV) self.assertEqual(indata, [['1', '2', '3'], ['4', '5', '6']]) # test writing strings with spaces data = [["Doraemon", "Nobita Nobi", "Shizuka Minamoto", "Dorami"], ["Takeshi Goda", "Suneo Honekawa", "Jaiko", "Hidetoshi Dekisugi"]] CSV.write_tsv(TEST_CSV, data) indata = CSV.read(TEST_CSV) self.assertEqual(data, indata) # writing only 1 string with space? data = [['Takeshi Goda']] CSV.write_tsv(TEST_CSV, data, quoting=None) indata = CSV.read(TEST_CSV) expected = [['Takeshi', 'Goda']] # not quoting => CSV reader cannot guess the format self.assertEqual(indata, expected) # read file with a proper dialect indata = CSV.read(TEST_CSV, dialect='excel-tab') self.assertEqual(data, indata) # write file with forced quoting (default option) data = [['Takeshi Goda']] CSV.write_tsv(TEST_CSV, data) indata = CSV.read(TEST_CSV) self.assertEqual(data, indata) # with header names = ["Doraemon - D001", "Nobita Nobi N001", "Shizuka Minamoto M001", "Dorami - D002", "Takeshi Goda G001", "Suneo Honekawa H001", "Jaiko - G002", "Hidetoshi Dekisugi D003"] persons = [Person.parse(name) for name in names] header = ['first', 'last'] CSV.write(TEST_CSV, [to_json(p) for p in persons], header=header) inrows = CSV.read(TEST_CSV, header=True) getLogger().debug("Inrows: {}".format(inrows)) expected = [{'first': 'Doraemon', 'last': '-'}, {'first': 'Nobita', 'last': 'Nobi'}, {'first': 'Shizuka', 'last': 'Minamoto'}, {'first': 'Dorami', 'last': '-'}, {'first': 'Takeshi', 'last': 'Goda'}, {'first': 'Suneo', 'last': 'Honekawa'}, {'first': 'Jaiko', 'last': '-'}, {'first': 'Hidetoshi', 'last': 'Dekisugi'}] self.assertEqual(inrows, expected) # read in as objects csv_rows = chio.read_csv(TEST_CSV, fieldnames=True) inpersons = [to_obj(Person, row) for row in csv_rows] expected_names = [to_obj(Person, row) for row in expected] # without idno self.assertEqual(inpersons, expected_names) # with idno header = ['first', 'last', 'idno'] CSV.write(TEST_CSV, [to_json(p) for p in persons], header=header) inpersons = [to_obj(Person, row) for row in CSV.read(TEST_CSV, header=True)] self.assertEqual(persons, inpersons)
def test_new_object(self): p = to_obj(Person, {'name': 'Ji', 'age': 10, 'pid': 'p001'}) p.job = 'dev' pj = to_dict(p) p2 = to_obj(Person, pj) self.assertIsInstance(p2, Person) self.assertEqual(p, p2) # pj2 = to_dict(pj, 'name', 'age', 'pid') p3 = to_obj(Person, pj2) self.assertFalse(p3.job) # obj to obj p4 = to_obj(Person, p3.__dict__) self.assertEqual(p3, p4)
def test_new_object(self): p = to_obj(Person, {'name': 'Ji', 'age': 10, 'pid': 'p001'}) p.job = 'dev' pj = to_json(p) p2 = to_obj(Person, pj) self.assertIsInstance(p2, Person) self.assertEqual(p, p2) # pj2 = to_json(pj, 'name', 'age', 'pid') p3 = to_obj(Person, pj2) self.assertFalse(p3.job) # obj to obj p4 = to_obj(Person, p3.__dict__) self.assertEqual(p3, p4)
def test_typeless_json(self): p = to_obj(Person, {'name': 'Chun', 'age': 15}) p.change_job('pupil', -500) pjstr = json.dumps(p, cls=PersonifyJSONEncoder) pjson = json.loads(pjstr) self.assertIn('__type__', pjson) self.assertEqual(pjson['__type__'], '__person__') self.assertIn('__type__', pjson['job']) self.assertEqual(pjson['job']['__type__'], '__job__') # Test typeless json # helper function pjtl = dumps(p, indent=2) pjson1 = json.loads(pjtl) # or full method pjtl2 = json.dumps(p, cls=TypelessSONEncoder) pjson2 = json.loads(pjtl2) self.assertEqual(pjson1, pjson2)
def test_json_encoder(self): p = to_obj(Person, {'name': 'Ji', 'age': 10}) # Person > typed-json js = json.dumps(p, cls=PersonifyJSONEncoder) # typed-json > Person np = json.loads(js, cls=PersonifyJSONDecoder) self.assertIsInstance(np, Person) npjson = json.dumps(np, cls=PersonifyJSONEncoder) self.assertEqual(npjson, js) # # changing info p.change_job('dev', 5000) js2 = json.dumps(p, cls=PersonifyJSONEncoder) # change salary in JSON js2_json = json.loads(js2) js2_json['job']['sal'] = 10000 # convert js2_json to object np2 = json.loads(json.dumps(js2_json), cls=PersonifyJSONDecoder) self.assertEqual(np2.job.sal, 10000)
def from_string(patch_string): lines = [l.split("\t") for l in patch_string.splitlines()] patch_dict = {k: v for k, v in lines} return to_obj(DefPatch, patch_dict, **DefPatch.JOHN_MCCRAE_FIELD_MAP)
def test_csv(self): print("Test CSV io") # test writing numbers => strings data = ((1, 2, 3), (4, 5, 6)) chio.write_csv(TEST_CSV, data) indata = chio.read_csv(TEST_CSV) self.assertEqual(indata, [['1', '2', '3'], ['4', '5', '6']]) # test writing strings with spaces data = [["Doraemon", "Nobita Nobi", "Shizuka Minamoto", "Dorami"], [ "Takeshi Goda", "Suneo Honekawa", "Jaiko", "Hidetoshi Dekisugi" ]] chio.write_tsv(TEST_CSV, data) indata = chio.read_csv(TEST_CSV) self.assertEqual(data, indata) # writing only 1 string with space? data = [['Takeshi Goda']] chio.write_tsv(TEST_CSV, data, quoting=None) indata = chio.read_csv(TEST_CSV) expected = [['Takeshi', 'Goda'] ] # not quoting => CSV reader cannot guess the format self.assertEqual(indata, expected) # read file with a proper dialect indata = chio.read_csv(TEST_CSV, dialect='excel-tab') self.assertEqual(data, indata) # write file with forced quoting (default option) data = [['Takeshi Goda']] chio.write_tsv(TEST_CSV, data) indata = chio.read_csv(TEST_CSV) self.assertEqual(data, indata) # with header names = [ "Doraemon - D001", "Nobita Nobi N001", "Shizuka Minamoto M001", "Dorami - D002", "Takeshi Goda G001", "Suneo Honekawa H001", "Jaiko - G002", "Hidetoshi Dekisugi D003" ] persons = [Person.parse(name) for name in names] header = ['first', 'last'] chio.write_csv(TEST_CSV, [to_dict(p) for p in persons], fieldnames=header) inrows = chio.read_csv(TEST_CSV, fieldnames=True) getLogger().debug("Inrows: {}".format(inrows)) expected = [{ 'first': 'Doraemon', 'last': '-' }, { 'first': 'Nobita', 'last': 'Nobi' }, { 'first': 'Shizuka', 'last': 'Minamoto' }, { 'first': 'Dorami', 'last': '-' }, { 'first': 'Takeshi', 'last': 'Goda' }, { 'first': 'Suneo', 'last': 'Honekawa' }, { 'first': 'Jaiko', 'last': '-' }, { 'first': 'Hidetoshi', 'last': 'Dekisugi' }] self.assertEqual(inrows, expected) # read in as objects csv_rows = chio.read_csv(TEST_CSV, fieldnames=True) inpersons = [to_obj(Person, row) for row in csv_rows] expected_names = [to_obj(Person, row) for row in expected] # without idno self.assertEqual(inpersons, expected_names) # with idno header = ['first', 'last', 'idno'] chio.write_csv(TEST_CSV, [to_dict(p) for p in persons], fieldnames=header) inpersons = [ to_obj(Person, row) for row in chio.read_csv(TEST_CSV, fieldnames=True) ] self.assertEqual(persons, inpersons)