From 6115d0e46127e2097322a6308d60beeae5b57b37 Mon Sep 17 00:00:00 2001 From: Andrew-Katcha Date: Sun, 8 Apr 2018 12:22:01 -0400 Subject: [PATCH 1/5] Added tests before implementing functionality to help with QA --- tests/parser_tests.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/parser_tests.py b/tests/parser_tests.py index a179be4e6..f1543c4c8 100644 --- a/tests/parser_tests.py +++ b/tests/parser_tests.py @@ -375,6 +375,25 @@ def test_YYYY_MM_DD(self): self.parser.parse_iso(separator.join(('2013', '02', '03'))), datetime(2013, 2, 3) ) + + def test_incorrect_year_placement(self): + """ + Tests when year is in the wrong slot. + """ + + with assertRaises(ParserError): + self.parser.parse_iso('02-2018-03') + + with assertRaises(ParserError): + self.parser.parse_iso('02-03-2018') + + with assertRaises(ParserError): + self.parser.parse_iso('02/2018/03') + + with assertRaises(ParserError): + self.parser.parse_iso('02/03/2018') + + def test_YYYY_MM_DDTHH_mmZ(self): From a760e13deb2fb0ee38c03fcb1bb6ac0f94dc34ec Mon Sep 17 00:00:00 2001 From: Andrew-Katcha Date: Sun, 8 Apr 2018 21:16:49 -0400 Subject: [PATCH 2/5] added more tests to account for when there are . and / --- tests/parser_tests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/parser_tests.py b/tests/parser_tests.py index f1543c4c8..854aba179 100644 --- a/tests/parser_tests.py +++ b/tests/parser_tests.py @@ -393,6 +393,13 @@ def test_incorrect_year_placement(self): with assertRaises(ParserError): self.parser.parse_iso('02/03/2018') + with assertRaises(ParserError): + self.parser.parse_iso('02.2018.03') + + with assertRaises(ParserError): + self.parser.parse_iso('02.03.2018') + + def test_YYYY_MM_DDTHH_mmZ(self): From e31c39c4be9ba73a156211339e6a02965dcde3df Mon Sep 17 00:00:00 2001 From: Andrew-Katcha Date: Mon, 9 Apr 2018 10:05:30 -0400 Subject: [PATCH 3/5] Implemented fix to solve bug and formatted tests for consistent indentation --- arrow/parser.py | 17 +++++++++++++++++ tests/parser_tests.py | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/arrow/parser.py b/arrow/parser.py index df8cc1a47..b3f3c7bac 100644 --- a/arrow/parser.py +++ b/arrow/parser.py @@ -165,6 +165,19 @@ def _generate_pattern_re(self, fmt): return tokens, re.compile(final_fmt_pattern, flags=re.IGNORECASE) + def check_incorrect_year_placement(self, string, fmt): + """ + Determines wheather a year (YYYY) is incorrectly formatted. + """ + if fmt == 'YYYY-MM-DD' or fmt == 'YYYY/MM/DD' or fmt == 'YYYY.MM.DD': + # Ensuring that the 3rd and 4th number of a date is a number + # instead of a '-', '/', or '.' + if not string[2].isdigit() or not string[3].isdigit(): + return True + return False + else: + return False + def parse(self, string, fmt): if isinstance(fmt, list): @@ -280,6 +293,10 @@ def _parse_multiformat(self, string, formats): _datetime = self.parse(string, fmt) break except ParserError: + if self.check_incorrect_year_placement(string, fmt): + # For an invalid string, set datetime to 'None' to fire an exception + _datetime = None + break pass if _datetime is None: diff --git a/tests/parser_tests.py b/tests/parser_tests.py index 854aba179..d666d9bdc 100644 --- a/tests/parser_tests.py +++ b/tests/parser_tests.py @@ -383,10 +383,10 @@ def test_incorrect_year_placement(self): with assertRaises(ParserError): self.parser.parse_iso('02-2018-03') - - with assertRaises(ParserError): - self.parser.parse_iso('02-03-2018') - + + with assertRaises(ParserError): + self.parser.parse_iso('02-03-2018') + with assertRaises(ParserError): self.parser.parse_iso('02/2018/03') From 111ddcc652b65cf14f4ea04bd855fd0da7d7c110 Mon Sep 17 00:00:00 2001 From: Andrew-Katcha Date: Mon, 9 Apr 2018 13:35:11 -0400 Subject: [PATCH 4/5] Removed 'pass' in order to achieve 100% coverage in parsers.py --- arrow/parser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/arrow/parser.py b/arrow/parser.py index b3f3c7bac..6a8cc3ba2 100644 --- a/arrow/parser.py +++ b/arrow/parser.py @@ -297,7 +297,6 @@ def _parse_multiformat(self, string, formats): # For an invalid string, set datetime to 'None' to fire an exception _datetime = None break - pass if _datetime is None: raise ParserError('Could not match input to any of {0} on \'{1}\''.format(formats, string)) From 2decd5c64479379da32ea8598519ddbbeba181ac Mon Sep 17 00:00:00 2001 From: Andrew-Katcha Date: Sat, 8 Sep 2018 23:31:59 -0700 Subject: [PATCH 5/5] removed extraneous code for throwing an error --- arrow/parser.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/arrow/parser.py b/arrow/parser.py index 6a8cc3ba2..9eadaf2b2 100644 --- a/arrow/parser.py +++ b/arrow/parser.py @@ -294,8 +294,6 @@ def _parse_multiformat(self, string, formats): break except ParserError: if self.check_incorrect_year_placement(string, fmt): - # For an invalid string, set datetime to 'None' to fire an exception - _datetime = None break if _datetime is None: