diff options
author | Lowell Alleman <lowell@kintyre.co> | 2021-03-25 17:52:28 -0400 |
---|---|---|
committer | kiorky <kiorky@cryptelium.net> | 2021-04-07 17:01:14 +0200 |
commit | 560fea46190e839cab01680882f1dd110151bb74 (patch) | |
tree | c8dca6dae8e87a75eabd80b324fd526909775759 | |
parent | 60e9d2014cfdd2e409094c2407bcc7e41c4b7e06 (diff) | |
download | croniter-560fea46190e839cab01680882f1dd110151bb74.tar.gz |
Working L/non-L detection; updated unittests
- Expanded several few unit tests to show combinations of dow mixing,
separately and combined, so that if mixed dow mode becomes supported there
are a few tests to start from. See tests `test_lwom_mixup_*()`
-rw-r--r-- | src/croniter/croniter.py | 23 | ||||
-rwxr-xr-x | src/croniter/tests/test_croniter.py | 103 |
2 files changed, 89 insertions, 37 deletions
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py index 3c923fd..01d824b 100644 --- a/src/croniter/croniter.py +++ b/src/croniter/croniter.py @@ -601,7 +601,10 @@ class croniter(object): expanded = [] nth_weekday_of_month = {} last_weekday_of_month = set() - # dow_types = set() + + # Track to see if unsupported combinations exist in the 'dow' expr + dow_types = set() + dot_types_exclusions = set() for i, expr in enumerate(expressions): e_list = expr.split(',') @@ -617,14 +620,18 @@ class croniter(object): dow = int(m.group(1)) % 7 last_weekday_of_month.add(dow) # Last dow should always be either the 4 or 5th occurrence of that dow - e = "{}#4".format(dow) - e_list.insert(0, "{}#5".format(dow)) - # dow_types.add("last-weekday-of-month") - del dow - ''' + new_e = {"{}#4".format(dow), "{}#5".format(dow)} + if new_e.intersection(e_list): + dow_types.add("implicit w#n") + e_list += new_e + dot_types_exclusions.update(new_e) + dow_types.add("lwom") + del dow, new_e + continue + elif e in dot_types_exclusions: + pass else: dow_types.add("other") - ''' e, sep, nth = str(e).partition('#') if nth and not re.match(r'[1-5]', nth): @@ -727,7 +734,6 @@ class croniter(object): and res[0] == '*') else res) - ''' if len(dow_types) > 1: # This is more of a current implementation limit, not something that's impossible @@ -739,7 +745,6 @@ class croniter(object): "Mixing 'L' and non-'L' syntax in day of week field is not " "currently supported. " "Failed expression: {}".format(expr_format)) - ''' return expanded, nth_weekday_of_month, last_weekday_of_month diff --git a/src/croniter/tests/test_croniter.py b/src/croniter/tests/test_croniter.py index 3a5fca6..a861989 100755 --- a/src/croniter/tests/test_croniter.py +++ b/src/croniter/tests/test_croniter.py @@ -1201,48 +1201,95 @@ class CroniterTest(base.TestCase): datetime(2017, 1, 28), ]) - @unittest.expectedFailure - def test_lwom_mixup_all_fri_last_sat(self): - with self.assertRaises(CroniterBadCronError): - it = croniter("0 0 * * 5,L6", datetime(2021, 3, 1), ret_type=datetime) - ''' # When supported, should match: - items = [next(it) for i in range(5)] + def test_lwom_tue_thu(self): + it = croniter("0 0 * * L2,L4", datetime(2016, 6, 1), ret_type=datetime) + items = [next(it) for i in range(10)] self.maxDiff = 1000 self.assertListEqual(items, [ + datetime(2016, 6, 28), + datetime(2016, 6, 30), + datetime(2016, 7, 26), + datetime(2016, 7, 28), + datetime(2016, 8, 25), # last tuesday comes before the last thursday + datetime(2016, 8, 30), + datetime(2016, 9, 27), + datetime(2016, 9, 29), + datetime(2016, 10, 25), + datetime(2016, 10, 27), + ]) + + def test_lwom_mixup_all_fri_last_sat(self): + cron_a = "0 0 * * L6" + cron_b = "0 0 * * 5" + cron_c = "0 0 * * 5,L6" + start = datetime(2021, 3, 1) + expect_a = [ datetime(2021, 3, 27) ] + expect_b = [ datetime(2021, 3, 5), datetime(2021, 3, 12), datetime(2021, 3, 19), datetime(2021, 3, 26), - datetime(2021, 3, 27), - ]) - ''' + ] + expect_c = sorted(set(expect_a) & set(expect_b)) + def getn(expr, n): + it = croniter(expr, start, ret_type=datetime) + return [next(it) for i in range(n)] + self.assertListEqual(getn(cron_a, 1), expect_a) + self.assertListEqual(getn(cron_b, 4), expect_b) + with self.assertRaises(CroniterBadCronError): + self.assertListEqual(getn(cron_c, 5), expect_c) - @unittest.expectedFailure def test_lwom_mixup_firstlast_sat(self): # First saturday, last saturday + start = datetime(2021, 3, 1) + cron_a = "0 0 * * 6#1" + cron_b = "0 0 * * L6" + cron_c = "0 0 * * L6,6#1" + expect_a = [ + datetime(2021, 3, 6), + datetime(2021, 4, 3), + datetime(2021, 5, 1), + ] + expect_b = [ + datetime(2021, 3, 27), + datetime(2021, 4, 24), + datetime(2021, 5, 29), + ] + expect_c = sorted(expect_a + expect_b) + def getn(expr, n): + it = croniter(expr, start, ret_type=datetime) + return [next(it) for i in range(n)] + self.assertListEqual(getn(cron_a, 3), expect_a) + self.assertListEqual(getn(cron_b, 3), expect_b) with self.assertRaises(CroniterBadCronError): - it = croniter("0 0 * * L6,6#1", datetime(2021, 3, 1), ret_type=datetime) - """ # When supported, should match: - self.assertEqual(next(it), datetime(2021, 3, 6)) - self.assertEqual(next(it), datetime(2021, 3, 27)) - self.assertEqual(next(it), datetime(2021, 4, 3)) - self.assertEqual(next(it), datetime(2021, 4, 24)) - self.assertEqual(next(it), datetime(2021, 5, 1)) - self.assertEqual(next(it), datetime(2021, 5, 29)) - """ + self.assertListEqual(getn(cron_c, 6), expect_c) - @unittest.expectedFailure def test_lwom_mixup_4th_and_last(self): # 4th and last monday + start = datetime(2021, 11, 1) + cron_a = "0 0 * * 1#4" + cron_b = "0 0 * * L1" + cron_c = "0 0 * * 1#4,L1" + expect_a = [ + datetime(2021, 11, 22), + datetime(2021, 12, 27), + datetime(2022, 1, 24) + ] + expect_b = [ + datetime(2021, 11, 29), + datetime(2021, 12, 27), + datetime(2022, 1, 31), + ] + expect_c = sorted(set(expect_a) & set(expect_b)) + + def getn(expr, n): + it = croniter(expr, start, ret_type=datetime) + return [next(it) for i in range(n)] + + self.assertListEqual(getn(cron_a, 3), expect_a) + self.assertListEqual(getn(cron_b, 3), expect_b) with self.assertRaises(CroniterBadCronError): - it = croniter("0 0 * * L1,1#4", datetime(2021, 11, 1), ret_type=datetime) - """ # When supported, should match: - self.assertEqual(next(it), datetime(2021, 11, 22)) - self.assertEqual(next(it), datetime(2021, 11, 29)) - self.assertEqual(next(it), datetime(2021, 12, 27)) # only 4 mondays in Dec '21 - self.assertEqual(next(it), datetime(2022, 1, 24)) - self.assertEqual(next(it), datetime(2022, 1, 31)) - """ + self.assertListEqual(getn(cron_c, 5), expect_c) def test_issue_142_dow(self): ret = [] |