Skip to content

Commit

Permalink
Working type inference for all but dates/datetimes. #210.
Browse files Browse the repository at this point in the history
  • Loading branch information
onyxfish committed Sep 5, 2015
1 parent 2f82123 commit 7befda6
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 2 deletions.
17 changes: 15 additions & 2 deletions agate/column_types.py
Expand Up @@ -119,7 +119,10 @@ def cast(self, d):
if self.date_format:
return datetime.datetime.strptime(d, self.date_format).date()

return parse(d).date()
try:
return parse(d).date()
except (TypeError, ValueError):
raise CastError('Can not parse value "%s" to as datetime for DateColumn.' % d)

def _create_column(self, table, index):
from agate.columns import DateColumn
Expand Down Expand Up @@ -155,7 +158,10 @@ def cast(self, d):
if self.datetime_format:
return datetime.datetime.strptime(d, self.datetime_format)

return parse(d)
try:
return parse(d)
except (TypeError, ValueError):
raise CastError('Can not parse value "%s" to as datetime for DateTimeColumn.' % d)

def _create_column(self, table, index):
from agate.columns import DateTimeColumn
Expand Down Expand Up @@ -184,6 +190,9 @@ def cast(self, d):

seconds = pytimeparse.parse(d)

if seconds is None:
raise CastError('Can not parse value "%s" to as timedelta for TimeDeltaColumn.' % d)

return datetime.timedelta(seconds=seconds)

def _create_column(self, table, index):
Expand Down Expand Up @@ -228,6 +237,10 @@ class TextType(ColumnType):
"""
Column type for :class:`TextColumn`.
"""
@classmethod
def test(cls, d):
return True

def cast(self, d):
"""
Cast a single value to :func:`unicode` (:func:`str` in Python 3).
Expand Down
79 changes: 79 additions & 0 deletions tests/test_inference.py
@@ -0,0 +1,79 @@
#!/usr/bin/env python

try:
import unittest2 as unittest
except ImportError:
import unittest

from agate.column_types import *
from agate.inference import *

class TestTypeInference(unittest.TestCase):
def setUp(self):
pass

def testTextType(self):
rows = [
('a',),
('b',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], TextType)

def testNumberType(self):
rows = [
('1.7',),
('200000000',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], NumberType)

def testBooleanType(self):
rows = [
('True',),
('FALSE',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], BooleanType)

def testDateType(self):
rows = [
('5/7/84',),
('2/28/1997',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], DateType)

def testDateTimeType(self):
rows = [
('5/7/84 3:44:12',),
('2/28/1997 3:12 AM',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], DateTimeType)

def testTimeDeltaType(self):
rows = [
('1:42',),
('1w 27h',),
('',)
]

inferred = infer_types(rows)

self.assertIsInstance(inferred[0], TimeDeltaType)

0 comments on commit 7befda6

Please sign in to comment.