Skip to content

Commit

Permalink
Fix over-aggressive date parsing. Closes #653.
Browse files Browse the repository at this point in the history
  • Loading branch information
onyxfish committed Dec 29, 2016
1 parent 28ae01b commit 7806232
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
1.5.5
-----

* :meth:`.Date.cast` will no longer parse strings like :code:`05_leslie3d_base` as dates. (#653)
* :meth:`.Text.cast` will no longer strip leading or trailing whitespace. (#654)
* Fixed :code:`'NoneType' object has no attribute 'groupdict'` error in :meth:`.TimeDelta.cast`. (#656)

Expand Down
10 changes: 0 additions & 10 deletions agate/data_types/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,6 @@ def cast(self, d):
if ctx.hasDate and not ctx.hasTime:
return value.date()

try:
dt = isodate.parse_date(d)

if ctx.hasTime:
raise ValueError('isodate.parse_date discarded a time component')

return dt
except (isodate.ISO8601Error, ValueError):
pass

raise CastError('Can not parse value "%s" as date.' % d)

def csvify(self, d):
Expand Down
30 changes: 30 additions & 0 deletions tests/test_data_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), True)
self.assertEqual(self.type.test('A\nB'), True)
self.assertEqual(self.type.test(u'👍'), True)
self.assertEqual(self.type.test('05_leslie3d_base'), True)
self.assertEqual(self.type.test('2016-12-29'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), True)

def test_cast(self):
values = ('a', 1, None, Decimal('2.7'), 'n/a', u'👍', ' foo', 'foo ')
Expand Down Expand Up @@ -86,6 +91,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), False)
self.assertEqual(self.type.test('A\nB'), False)
self.assertEqual(self.type.test(u'👍'), False)
self.assertEqual(self.type.test('05_leslie3d_base'), False)
self.assertEqual(self.type.test('2016-12-29'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), False)

def test_cast(self):
values = (True, 'yes', None, False, 'no', 'n/a', '1', 0)
Expand Down Expand Up @@ -130,6 +140,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), False)
self.assertEqual(self.type.test('A\nB'), False)
self.assertEqual(self.type.test(u'👍'), False)
self.assertEqual(self.type.test('05_leslie3d_base'), False)
self.assertEqual(self.type.test('2016-12-29'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), False)

def test_cast(self):
values = (2, 1, None, Decimal('2.7'), 'n/a', '2.7', '200,000,000')
Expand Down Expand Up @@ -187,6 +202,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), False)
self.assertEqual(self.type.test('A\nB'), False)
self.assertEqual(self.type.test(u'👍'), False)
self.assertEqual(self.type.test('05_leslie3d_base'), False)
self.assertEqual(self.type.test('2016-12-29'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), False)

def test_test_format(self):
date_type = Date(date_format='%m-%d-%Y')
Expand Down Expand Up @@ -260,6 +280,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), False)
self.assertEqual(self.type.test('A\nB'), False)
self.assertEqual(self.type.test(u'👍'), False)
self.assertEqual(self.type.test('05_leslie3d_base'), False)
self.assertEqual(self.type.test('2016-12-29'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), True)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), True)

def test_test_format(self):
datetime_type = DateTime(datetime_format='%m-%d-%Y %I:%M %p')
Expand Down Expand Up @@ -350,6 +375,11 @@ def test_test(self):
self.assertEqual(self.type.test('a'), False)
self.assertEqual(self.type.test('A\nB'), False)
self.assertEqual(self.type.test(u'👍'), False)
self.assertEqual(self.type.test('05_leslie3d_base'), False)
self.assertEqual(self.type.test('2016-12-29'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30Z'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30+06:00'), False)
self.assertEqual(self.type.test('2016-12-29T11:43:30-06:00'), False)

def test_cast_parser(self):
values = ('4:10', '1.2m', '172 hours', '5 weeks, 2 days', 'n/a')
Expand Down

0 comments on commit 7806232

Please sign in to comment.