def caster(self): '''Returns a function that takes a row that can be indexed by positions which returns a new row with all of the values cast to schema types. ''' from databundles.transform import CasterTransformBuilder bdr = CasterTransformBuilder() for c in self.columns: bdr.append(c.name, c.python_type) return bdr
def test_caster(self): from databundles.transform import CasterTransformBuilder import datetime ctb = CasterTransformBuilder() ctb.append('int',int) ctb.append('float',float) ctb.append('str',str) row = ctb({'int':1,'float':2,'str':'3'}) self.assertTrue(isinstance(row['int'],int)) self.assertEquals(row['int'],1) self.assertTrue(isinstance(row['float'],float)) self.assertEquals(row['float'],2.0) self.assertTrue(isinstance(row['str'],unicode)) self.assertEquals(row['str'],'3') # Should be idempotent row = ctb(row) self.assertTrue(isinstance(row['int'],int)) self.assertEquals(row['int'],1) self.assertTrue(isinstance(row['float'],float)) self.assertEquals(row['float'],2.0) self.assertTrue(isinstance(row['str'],unicode)) self.assertEquals(row['str'],'3') ctb = CasterTransformBuilder() ctb.append('date',datetime.date) ctb.append('time',datetime.time) ctb.append('datetime',datetime.datetime) row = ctb({'int':1,'float':2,'str':'3'}) self.assertIsNone(row['date']) self.assertIsNone(row['time']) self.assertIsNone(row['datetime']) row = ctb({'date':'1990-01-01','time':'10:52','datetime':'1990-01-01T12:30'}) self.assertTrue(isinstance(row['date'],datetime.date)) self.assertTrue(isinstance(row['time'],datetime.time)) self.assertTrue(isinstance(row['datetime'],datetime.datetime)) self.assertEquals(row['date'],datetime.date(1990, 1, 1)) self.assertEquals(row['time'],datetime.time(10, 52)) self.assertEquals(row['datetime'],datetime.datetime(1990, 1, 1, 12, 30)) # Should be idempotent row = ctb(row) self.assertTrue(isinstance(row['date'],datetime.date)) self.assertTrue(isinstance(row['time'],datetime.time)) self.assertTrue(isinstance(row['datetime'],datetime.datetime)) # Case insensitive row = ctb({'Date':'1990-01-01','Time':'10:52','Datetime':'1990-01-01T12:30'}) self.assertEquals(row['date'],datetime.date(1990, 1, 1)) self.assertEquals(row['time'],datetime.time(10, 52)) self.assertEquals(row['datetime'],datetime.datetime(1990, 1, 1, 12, 30))