summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Le Marec - Pasquet <kiorky@cryptelium.net>2021-12-03 20:57:55 +0100
committerMathieu Le Marec - Pasquet <kiorky@cryptelium.net>2021-12-03 20:57:55 +0100
commit8e5c9e07dfdae13a5cd09ed51048d78c005a67af (patch)
tree82d13981cb76777757da51bfb53a3e921d433550
parentbf19b21add35a57c48018fc21ef2468bc0410863 (diff)
downloadcroniter-8e5c9e07dfdae13a5cd09ed51048d78c005a67af.tar.gz
Be stricter on month=0
This relates #6
-rw-r--r--docs/CHANGES.rst6
-rw-r--r--src/croniter/croniter.py8
-rwxr-xr-xsrc/croniter/tests/test_croniter.py25
3 files changed, 24 insertions, 15 deletions
diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst
index d1d7ae6..25d28c4 100644
--- a/docs/CHANGES.rst
+++ b/docs/CHANGES.rst
@@ -1,11 +1,11 @@
Changelog
==============
-1.0.16 (unreleased)
+1.1.0 (unreleased)
-------------------
-- Nothing changed yet.
-
+- Enforce validation for month=1. Before this release we used to support month=0 and it was silently glided to month=1 to support having both day in month in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6
+ [kiorky]
1.0.15 (2021-06-25)
-------------------
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py
index e96ea52..a2c162e 100644
--- a/src/croniter/croniter.py
+++ b/src/croniter/croniter.py
@@ -712,7 +712,13 @@ class croniter(object):
except ValueError:
pass
- if t in cls.LOWMAP[i]:
+ if t in cls.LOWMAP[i] and not (
+ # do not support 0 as a month either for classical 5 fields cron
+ # or 6fields second repeat form
+ # but still let conversion happen if day field is shifted
+ (i == 3 and len(expressions) == 5) or
+ (i == 4 and len(expressions) == 6)
+ ):
t = cls.LOWMAP[i][t]
if (
diff --git a/src/croniter/tests/test_croniter.py b/src/croniter/tests/test_croniter.py
index 413329f..e7d1c96 100755
--- a/src/croniter/tests/test_croniter.py
+++ b/src/croniter/tests/test_croniter.py
@@ -317,14 +317,14 @@ class CroniterTest(base.TestCase):
wildcard = ['*']
m, h, d, mon, dow, s = range(6)
# Test each field individually
- self.assertEqual(croniter('0-59 0 0 0 0').expanded[m], wildcard)
- self.assertEqual(croniter('0 0-23 0 0 0').expanded[h], wildcard)
- self.assertEqual(croniter('0 0 0-31 0 0').expanded[d], wildcard)
+ self.assertEqual(croniter('0-59 0 0 1 0').expanded[m], wildcard)
+ self.assertEqual(croniter('0 0-23 0 1 0').expanded[h], wildcard)
+ self.assertEqual(croniter('0 0 0-31 1 0').expanded[d], wildcard)
self.assertEqual(croniter('0 0 0 1-12 0').expanded[mon], wildcard)
- self.assertEqual(croniter('0 0 0 0 0-6').expanded[dow], wildcard)
- self.assertEqual(croniter('0 0 0 0 1-7').expanded[dow], wildcard)
- self.assertEqual(croniter('0 0 0 0 1-7,sat#3').expanded[dow], wildcard)
- self.assertEqual(croniter('0 0 0 0 0 0-59').expanded[s], wildcard)
+ self.assertEqual(croniter('0 0 0 1 0-6').expanded[dow], wildcard)
+ self.assertEqual(croniter('0 0 0 1 1-7').expanded[dow], wildcard)
+ self.assertEqual(croniter('0 0 0 1 1-7,sat#3').expanded[dow], wildcard)
+ self.assertEqual(croniter('0 0 0 1 0 0-59').expanded[s], wildcard)
# Real life examples
self.assertEqual(croniter('30 1-12,0,10-23 15-21 * fri').expanded[h], wildcard)
self.assertEqual(croniter('30 1-23,0 15-21 * fri').expanded[h], wildcard)
@@ -993,12 +993,12 @@ class CroniterTest(base.TestCase):
'2019-01-17 00:00:01',
'2019-01-18 00:00:02',
'2019-01-19 00:00:03',
- '2019-01-20 00:00:04',
'2019-01-23 00:00:00',
'2019-01-24 00:00:01',
'2019-01-25 00:00:02',
'2019-01-26 00:00:03',
- '2019-01-27 00:00:04'])
+ '2019-01-30 00:00:00',
+ '2019-01-31 00:00:01'])
def test_mixdow(self):
base = datetime(2018, 10, 1, 0, 0)
@@ -1433,11 +1433,14 @@ class CroniterTest(base.TestCase):
def test_confirm_sort(self):
m, h, d, mon, dow, s = range(6)
- self.assertListEqual(croniter('0 8,22,10,23 0 0 0').expanded[h], [8, 10, 22, 23])
- self.assertListEqual(croniter('0 0 25-L 0 0').expanded[d], [25, 26, 27, 28, 29, 30, 31])
+ self.assertListEqual(croniter('0 8,22,10,23 0 1 0').expanded[h], [8, 10, 22, 23])
+ self.assertListEqual(croniter('0 0 25-L 1 0').expanded[d], [25, 26, 27, 28, 29, 30, 31])
self.assertListEqual(croniter("1 1 7,14,21,L * *").expanded[d], [7, 14, 21, "l"])
self.assertListEqual(croniter("0 0 * * *,sat#3").expanded[dow], ["*", 6])
+ def test_issue_k6(self):
+ self.assertRaises(CroniterBadCronError, croniter, '0 0 0 0 0')
+
if __name__ == '__main__':
unittest.main()