From db602be6faf268bab9d0ef9fa8dbec62d6f1cecd Mon Sep 17 00:00:00 2001 From: Forest Gregg Date: Thu, 7 Dec 2017 19:32:11 -0600 Subject: [PATCH 1/2] text fields innapropriately cast to date and datetime --- tests/test_data_types.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_data_types.py b/tests/test_data_types.py index cac2673a..2a51bc42 100644 --- a/tests/test_data_types.py +++ b/tests/test_data_types.py @@ -207,6 +207,8 @@ def test_test(self): 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) + self.assertEqual(self.type.test('MC 5.7.10 Per Dorothy Carroll'), False) + self.assertEqual(self.type.test('testing workgroup fix - 4/7/2010 - Marcy Liberty'), False) def test_test_format(self): date_type = Date(date_format='%m-%d-%Y') @@ -285,6 +287,7 @@ def test_test(self): 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) + self.assertEqual(self.type.test('720(38-4)31A-1.1(A)'), False) def test_test_format(self): datetime_type = DateTime(datetime_format='%m-%d-%Y %I:%M %p') From 259ae2ee00ee6d1c74583c9b760ea1773c8f0605 Mon Sep 17 00:00:00 2001 From: Forest Gregg Date: Thu, 7 Dec 2017 20:16:06 -0600 Subject: [PATCH 2/2] make sure that pytimeparse uses entire field --- agate/data_types/date.py | 11 +++++++---- agate/data_types/date_time.py | 25 +++++++++++++++---------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/agate/data_types/date.py b/agate/data_types/date.py index 377c0acb..b8c15f3d 100644 --- a/agate/data_types/date.py +++ b/agate/data_types/date.py @@ -72,10 +72,13 @@ def cast(self, d): return dt.date() - value, ctx = self.parser.parseDT(d, sourceTime=ZERO_DT) - - if ctx.hasDate and not ctx.hasTime: - return value.date() + try: + (value, ctx, _, _, matched_text), = self.parser.nlp(d, sourceTime=ZERO_DT) + except (TypeError, ValueError): + raise CastError('Value "%s" does not match date format.' % d) + else: + if matched_text == d and ctx.hasDate and not ctx.hasTime: + return value.date() raise CastError('Can not parse value "%s" as date.' % d) diff --git a/agate/data_types/date_time.py b/agate/data_types/date_time.py index d650e0c6..482f3e22 100644 --- a/agate/data_types/date_time.py +++ b/agate/data_types/date_time.py @@ -78,16 +78,21 @@ def cast(self, d): except: raise CastError('Value "%s" does not match date format.' % d) - value, ctx = self._parser.parseDT( - d, - sourceTime=self._source_time, - tzinfo=self.timezone - ) - - if ctx.hasDate and ctx.hasTime: - return value - elif ctx.hasDate and not ctx.hasTime: - return datetime.datetime.combine(value.date(), datetime.time.min) + try: + (_, _, _, _, matched_text), = self._parser.nlp(d, sourceTime=self._source_time) + except: + matched_text = None + else: + value, ctx = self._parser.parseDT( + d, + sourceTime=self._source_time, + tzinfo=self.timezone + ) + + if matched_text == d and ctx.hasDate and ctx.hasTime: + return value + elif matched_text == d and ctx.hasDate and not ctx.hasTime: + return datetime.datetime.combine(value.date(), datetime.time.min) try: dt = isodate.parse_datetime(d)