Skip to content

Commit 95e8cc4

Browse files
committed
Implement TimeField; close #7
1 parent 3a18a14 commit 95e8cc4

3 files changed

Lines changed: 43 additions & 1 deletion

File tree

adapters/fields.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
from __future__ import unicode_literals
44

5+
import datetime
6+
import dateutil.parser
57
from decimal import Decimal
68

79
from .base import BaseField
810

911

1012
__all__ = [
1113
'BooleanField', 'CharField', 'DecimalField', 'Field', 'FloatField',
12-
'IntField']
14+
'IntField', 'TimeField']
1315

1416

1517
class BooleanField(BaseField):
@@ -39,3 +41,13 @@ def adapt(self, data):
3941
class IntField(BaseField):
4042
def adapt(self, data):
4143
return int(data)
44+
45+
46+
class TimeField(BaseField):
47+
def adapt(self, data):
48+
if isinstance(data, datetime.time):
49+
return data
50+
elif isinstance(data, (str, unicode)):
51+
return dateutil.parser.parse(data).timetz()
52+
else:
53+
raise ValueError("Invalid time argument")

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python-dateutil==2.6.0

tests/test_fields.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
from __future__ import unicode_literals
44

5+
import datetime
56
from decimal import Decimal
67
import unittest
78

89
import adapters
910

11+
import dateutil.tz
12+
1013

1114
class FieldsTest(unittest.TestCase):
1215
def test_char_field(self):
@@ -58,3 +61,29 @@ def test_boolean_field_from_string(self):
5861
def test_boolean_field_from_null(self):
5962
actual = adapters.BooleanField().adapt(None)
6063
self.assertFalse(actual)
64+
65+
def test_time_field(self):
66+
now = datetime.datetime.today().time()
67+
actual = adapters.TimeField().adapt(now)
68+
expected = now
69+
self.assertEqual(actual, expected)
70+
71+
def test_time_field_from_string(self):
72+
tzoffset = dateutil.tz.tzoffset(None, 7200)
73+
time = datetime.time(13, 14, 15, 16, tzinfo=tzoffset)
74+
75+
actual = adapters.TimeField().adapt('13:14:15.000016+02:00')
76+
expected = time
77+
self.assertEqual(actual, expected)
78+
79+
actual = adapters.TimeField().adapt('13:14:15.000016')
80+
expected = datetime.time(13, 14, 15, 16)
81+
self.assertEqual(actual, expected)
82+
83+
actual = adapters.TimeField().adapt(time.strftime('%H:%M:%S'))
84+
expected = datetime.time(13, 14, 15)
85+
self.assertEqual(actual, expected)
86+
87+
actual = adapters.TimeField().adapt(time.strftime('%H:%M'))
88+
expected = datetime.time(13, 14)
89+
self.assertEqual(actual, expected)

0 commit comments

Comments
 (0)