Skip to content

Commit 1809d1b

Browse files
authored
Merge pull request #34 from alexei/feature/date_fields
Date fields
2 parents b93b769 + a92757b commit 1809d1b

2 files changed

Lines changed: 72 additions & 2 deletions

File tree

adapters/fields.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@
1010

1111

1212
__all__ = [
13-
'BooleanField', 'CharField', 'DecimalField', 'Field', 'FloatField',
14-
'IntField', 'TimeField']
13+
'BooleanField',
14+
'CharField',
15+
'DateField',
16+
'DateTimeField',
17+
'DecimalField',
18+
'Field',
19+
'FloatField',
20+
'IntField',
21+
'TimeField',
22+
]
1523

1624

1725
class BooleanField(BaseField):
@@ -24,6 +32,26 @@ def adapt(self, data):
2432
return unicode(data)
2533

2634

35+
class DateField(BaseField):
36+
def adapt(self, data):
37+
if isinstance(data, datetime.date):
38+
return data
39+
elif isinstance(data, (str, unicode)):
40+
return dateutil.parser.parse(data).date()
41+
else:
42+
raise ValueError("Invalid date argument")
43+
44+
45+
class DateTimeField(BaseField):
46+
def adapt(self, data):
47+
if isinstance(data, datetime.datetime):
48+
return data
49+
elif isinstance(data, (str, unicode)):
50+
return dateutil.parser.parse(data)
51+
else:
52+
raise ValueError("Invalid date argument")
53+
54+
2755
class DecimalField(BaseField):
2856
def adapt(self, data):
2957
return Decimal(data)

tests/test_fields.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,45 @@ def test_time_field_from_string(self):
8787
actual = adapters.TimeField().adapt(time.strftime('%H:%M'))
8888
expected = datetime.time(13, 14)
8989
self.assertEqual(actual, expected)
90+
91+
def test_date_field(self):
92+
today = datetime.datetime.today().date()
93+
actual = adapters.DateField().adapt(today)
94+
expected = today
95+
self.assertEqual(actual, expected)
96+
97+
def test_date_field_from_string(self):
98+
date = datetime.date(1986, 7, 25)
99+
actual = adapters.DateField().adapt(date.strftime('%Y-%m-%d'))
100+
expected = date
101+
self.assertEqual(actual, expected)
102+
103+
def test_datetime_field(self):
104+
now = datetime.datetime.today()
105+
actual = adapters.DateTimeField().adapt(now)
106+
expected = now
107+
self.assertEqual(actual, expected)
108+
109+
def test_datetime_field_from_string(self):
110+
tzoffset = dateutil.tz.tzoffset(None, 7200)
111+
time = datetime.datetime(1986, 7, 25, 13, 14, 15, 16, tzinfo=tzoffset)
112+
113+
data = '1986-07-25 13:14:15.000016+02:00'
114+
actual = adapters.DateTimeField().adapt(data)
115+
expected = time
116+
self.assertEqual(actual, expected)
117+
118+
data = '1986-07-25 13:14:15.000016'
119+
actual = adapters.DateTimeField().adapt(data)
120+
expected = datetime.datetime(1986, 7, 25, 13, 14, 15, 16)
121+
self.assertEqual(actual, expected)
122+
123+
data = '1986-07-25 13:14:15'
124+
actual = adapters.DateTimeField().adapt(data)
125+
expected = datetime.datetime(1986, 7, 25, 13, 14, 15)
126+
self.assertEqual(actual, expected)
127+
128+
data = '1986-07-25 13:14'
129+
actual = adapters.DateTimeField().adapt(data)
130+
expected = datetime.datetime(1986, 7, 25, 13, 14)
131+
self.assertEqual(actual, expected)

0 commit comments

Comments
 (0)