From 60b8927555dd9c9623b41790229b7e9d2d481291 Mon Sep 17 00:00:00 2001 From: armando2 Date: Thu, 9 Nov 2017 14:04:18 +0800 Subject: [PATCH] raise ParserError if year, month, or date is not found in string --- arrow/parser.py | 7 +++++-- tests/parser_tests.py | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/arrow/parser.py b/arrow/parser.py index e4f368ad5..7fd9b359a 100644 --- a/arrow/parser.py +++ b/arrow/parser.py @@ -180,7 +180,7 @@ def parse(self, string, fmt): else: value = match.group(token) self._parse_token(token, value, parts) - return self._build_datetime(parts) + return self._build_datetime(parts, fmt_pattern_re.pattern, string) def _parse_token(self, token, value, parts): @@ -247,7 +247,7 @@ def _parse_token(self, token, value, parts): parts['am_pm'] = 'pm' @staticmethod - def _build_datetime(parts): + def _build_datetime(parts, pattern, string): timestamp = parts.get('timestamp') @@ -263,6 +263,9 @@ def _build_datetime(parts): elif am_pm == 'am' and hour == 12: hour = 0 + if not parts.get('year') or not parts.get('month') or not parts.get('day'): + raise ParserError('Could not match input to any of {0} on \'{1}\''.format(pattern, string)) + return datetime(year=parts.get('year', 1), month=parts.get('month', 1), day=parts.get('day', 1), hour=hour, minute=parts.get('minute', 0), second=parts.get('second', 0), microsecond=parts.get('microsecond', 0), diff --git a/tests/parser_tests.py b/tests/parser_tests.py index 7682df8c3..f59086837 100644 --- a/tests/parser_tests.py +++ b/tests/parser_tests.py @@ -236,6 +236,10 @@ def test_parse_subsecond(self): assertEqual(self.parser.parse('2013-01-01 12:30:45.987654', 'YYYY-MM-DD HH:mm:ss.SSSSSS'), expected) assertEqual(self.parser.parse_iso('2013-01-01 12:30:45.987654'), expected) + def test_parse_unsupported_iso(self): + with assertRaises(ParserError): + self.parser.parse_iso('03.04.2017') + def test_parse_subsecond_rounding(self): expected = datetime(2013, 1, 1, 12, 30, 45, 987654) format = 'YYYY-MM-DD HH:mm:ss.S'