def test_parse_pattern_segment_as_text(self): # yapf: disable table = [ ('some -text_[x]', 'some -text_[x]'), ('?', None), ('*a?b*', None), ('%d', None), ('%-d', None), ('%m', None), ('%-m', None), ('%y', None), ('%Y', None), ('%H', None), ('%-H', None), ('%M', None), ('%-M', None), ('%S', None), ('%-S', None), ('%f', None), ('%%', '%'), ('%y%y', None), ('some text *%%*x%Y-%m-%dT%H-%M-%SZ.jpg', None) ] # yapf: enable for pattern_segment, expected_text in table: patseg = datetime_glob.parse_pattern_segment( pattern_segment=pattern_segment) if expected_text is not None: self.assertEqual(patseg.text, expected_text) self.assertIsNone(patseg.regex) else: self.assertIsNone(patseg.text) self.assertIsNotNone(patseg.regex)
def test_match_segment_for_arbitrary_patterns(self) -> None: patseg = datetime_glob.parse_pattern_segment( pattern_segment='%-d/%-m/%Y,%H:%M:%S*') mtch = datetime_glob.match_segment( segment='9/4/2013,00:00:00,7.8,7.4,9.53', pattern_segment=patseg) self.assertIsNotNone(mtch) assert mtch is not None # needed for mypy self.assertEqual(mtch.as_datetime(), datetime.datetime(2013, 4, 9))
def test_parse_pattern_segment(self) -> None: # yapf: disable table = [ ('some -text_[x]', None, {}), ('*', '^.*$', {}), ('?', '^.$', {}), ('*a?b*', '^.*a.b.*$', {}), ('%d', '^(0[1-9]|1[0-9]|2[0-9]|3[0-1])$', {1: '%d'}), ('%-d', '^(1[0-9]|2[0-9]|3[0-1]|[1-9])$', {1: '%-d'}), ('%m', '^(0[1-9]|1[0-2])$', {1: '%m'}), ('%-m', '^(1[0-2]|[1-9])$', {1: '%-m'}), ('%y', '^([0-9]{2})$', {1: '%y'}), ('%Y', '^([0-9]{4})$', {1: '%Y'}), ('%H', '^(0[0-9]|1[0-9]|2[0-3])$', {1: '%H'}), ('%-H', '^(1[0-9]|2[0-3]|[0-9])$', {1: '%-H'}), ('%M', '^([0-5][0-9])$', {1: '%M'}), ('%-M', '^([1-5][0-9]|[0-9])$', {1: '%-M'}), ('%S', '^([0-5][0-9])$', {1: '%S'}), ('%-S', '^([1-5][0-9]|[0-9])$', {1: '%-S'}), ('%f', '^([0-9]{6})$', {1: '%f'}), ('%%', None, {}), ('%y%y', '^([0-9]{2})([0-9]{2})$', {1: '%y', 2: '%y'}), ('some text *%%*x%Y-%m-%dT%H-%M-%SZ.jpg', '^some\\ text\\ .*%.*x' '([0-9]{4})\\-' '(0[1-9]|1[0-2])\\-' '(0[1-9]|1[0-9]|2[0-9]|3[0-1])' 'T' '(0[0-9]|1[0-9]|2[0-3])\\-' '([0-5][0-9])\\-' '([0-5][0-9])Z\\.jpg$', {1: '%Y', 2: '%m', 3: '%d', 4: '%H', 5: '%M', 6: '%S'}) ] # yapf: enable for pattern_segment, expected_regex, expected_group_map in table: patseg = datetime_glob.parse_pattern_segment( pattern_segment=pattern_segment) if expected_regex is None: self.assertIsNotNone(patseg.text) else: self.assertIsNotNone(patseg.regex, pattern_segment) assert patseg.regex is not None # needed for mypy self.assertEqual(patseg.regex.pattern, expected_regex, pattern_segment) self.assertDictEqual(patseg.group_map, expected_group_map, pattern_segment) # type: ignore
def test_match_segment(self): # yapf: disable table = [ ('some text *%%*x%Y-%m-%dT%H-%M-%S.%fZ.jpg', 'some text aa%bbx2016-12-02T03-04-05.123456Z.jpg', datetime_glob.Match(2016, 12, 2, 3, 4, 5, 123456)), ('decimal %Y-%-m-%-dT%-H-%-M-%-SZ.jpg', 'decimal 2016-1-2T3-4-5Z.jpg', datetime_glob.Match(2016, 1, 2, 3, 4, 5)), ('double year %y %Y', 'double year 18 2018', datetime_glob.Match(year=2018)), ('double year %y %Y', 'double year 17 2018', None), ('invalid day %Y-%m-%d', 'invalid day 2018-02-31', None) ] # yapf: enable for pattern_segment_str, segment, expected in table: patseg = datetime_glob.parse_pattern_segment( pattern_segment=pattern_segment_str) mtch = datetime_glob.match_segment(segment=segment, pattern_segment=patseg) self.assertTrue( match_equal(match=mtch, other=expected), "for input: {!r}, got: {}, expected: {}".format( segment, mtch, expected))
def test_parse_pattern_segment_invalid(self): with self.assertRaises(ValueError): _ = datetime_glob.parse_pattern_segment( pattern_segment='some text %1')
def test_match_segment_for_arbitrary_patterns(self): patseg = datetime_glob.parse_pattern_segment( pattern_segment='%-d/%-m/%Y,%H:%M:%S*') match = datetime_glob.match_segment( segment='9/4/2013,00:00:00,7.8,7.4,9.53', pattern_segment=patseg) self.assertEqual(match.as_datetime(), datetime.datetime(2013, 4, 9))