Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-croniter for openSUSE:Factory
checked in at 2021-03-12 13:33:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-croniter (Old)
and /work/SRC/openSUSE:Factory/.python-croniter.new.2401 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-croniter"
Fri Mar 12 13:33:27 2021 rev:15 rq:878436 version:1.0.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-croniter/python-croniter.changes
2020-11-26 23:16:11.877075064 +0100
+++
/work/SRC/openSUSE:Factory/.python-croniter.new.2401/python-croniter.changes
2021-03-12 13:33:28.406338771 +0100
@@ -1,0 +2,12 @@
+Fri Mar 12 03:42:51 UTC 2021 - Steve Kowalik <[email protected]>
+
+- Update to 1.0.8:
+ * Update `_expand` to lowercase each component of the expression.
+ * Fix _expand to reject int literals with underscores
+ * Fix combination of star and invalid expression bugs
+ * Security fix: fix overflow when using cron ranges
+ * Fix #155: raise CroniterBadCronError when error syntax
+ * Fix match when datetime has microseconds
+ * Added Python 3.8 and 3.9 support
+
+-------------------------------------------------------------------
Old:
----
croniter-0.3.36.tar.gz
New:
----
croniter-1.0.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-croniter.spec ++++++
--- /var/tmp/diff_new_pack.127KwU/_old 2021-03-12 13:33:29.230339927 +0100
+++ /var/tmp/diff_new_pack.127KwU/_new 2021-03-12 13:33:29.234339933 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-croniter
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,13 +18,13 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-croniter
-Version: 0.3.36
+Version: 1.0.8
Release: 0
Summary: Python iterators for datetime objects with cron-like format
License: MIT
-Group: Development/Languages/Python
URL: http://github.com/kiorky/croniter
Source:
https://files.pythonhosted.org/packages/source/c/croniter/croniter-%{version}.tar.gz
+BuildRequires: %{python_module future}
BuildRequires: %{python_module natsort}
BuildRequires: %{python_module pytest >= 3.0.3}
BuildRequires: %{python_module python-dateutil}
++++++ croniter-0.3.36.tar.gz -> croniter-1.0.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/PKG-INFO new/croniter-1.0.8/PKG-INFO
--- old/croniter-0.3.36/PKG-INFO 2020-11-02 17:09:51.354224200 +0100
+++ new/croniter-1.0.8/PKG-INFO 2021-03-06 12:30:08.018225700 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: croniter
-Version: 0.3.36
+Version: 1.0.8
Summary: croniter provides iteration for datetime object with cron like format
Home-page: http://github.com/kiorky/croniter
Author: Matsumoto Taichi, kiorky
@@ -232,10 +232,70 @@
Changelog
==============
+ 1.0.8 (2021-03-06)
+ ------------------
+
+ - Update `_expand` to lowercase each component of the expression.
+ This is in relation to #157. With this change, croniter accepts and
correctly handles `* * 10-L * *`.
+ [cuu508]
+
+
+ 1.0.7 (2021-03-02)
+ ------------------
+
+ - Fix _expand to reject int literals with underscores
+ [cuu508]
+ - Remove a debug statement to make flake8 happy
+ [cuu508]
+
+ 1.0.6 (2021-02-01)
+ ------------------
+
+ - Fix combination of star and invalid expression bugs
+ [kiorky]
+
+
+ 1.0.5 (2021-01-29)
+ ------------------
+
+ - Security fix: fix overflow when using cron ranges
+ [kiorky]
+
+ 1.0.4 (2021-01-29)
+ ------------------
+
+ - Spelling fix release
+
+
+ 1.0.3 (2021-01-29)
+ ------------------
+
+ - Fix #155: raise CroniterBadCronError when error syntax
+ [kiorky]
+
+
+ 1.0.2 (2021-01-19)
+ ------------------
+
+ - Fix match when datetime has microseconds
+ [kiorky]
+
+ 1.0.1 (2021-01-06)
+ ------------------
+ - no changes, just to make sense with new semver2 (making croniter on
a stable state)
+ [kiorky]
+
+
+ 0.3.37 (2020-12-31)
+ -------------------
+
+ - Added Python 3.8 and 3.9 support
+ [eumiro]
+
+
0.3.36 (2020-11-02)
-------------------
- - Nothing changed yet.
- Updated docs section regarding ``max_years_between_matches`` to be
more shorter and hopefully more relevant.
[Kintyre]
- Don't install tests
@@ -482,5 +542,7 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/docs/CHANGES.rst
new/croniter-1.0.8/docs/CHANGES.rst
--- old/croniter-0.3.36/docs/CHANGES.rst 2020-11-02 17:09:51.000000000
+0100
+++ new/croniter-1.0.8/docs/CHANGES.rst 2021-03-06 12:30:07.000000000 +0100
@@ -1,10 +1,70 @@
Changelog
==============
+1.0.8 (2021-03-06)
+------------------
+
+- Update `_expand` to lowercase each component of the expression.
+ This is in relation to #157. With this change, croniter accepts and
correctly handles `* * 10-L * *`.
+ [cuu508]
+
+
+1.0.7 (2021-03-02)
+------------------
+
+- Fix _expand to reject int literals with underscores
+ [cuu508]
+- Remove a debug statement to make flake8 happy
+ [cuu508]
+
+1.0.6 (2021-02-01)
+------------------
+
+- Fix combination of star and invalid expression bugs
+ [kiorky]
+
+
+1.0.5 (2021-01-29)
+------------------
+
+- Security fix: fix overflow when using cron ranges
+ [kiorky]
+
+1.0.4 (2021-01-29)
+------------------
+
+- Spelling fix release
+
+
+1.0.3 (2021-01-29)
+------------------
+
+- Fix #155: raise CroniterBadCronError when error syntax
+ [kiorky]
+
+
+1.0.2 (2021-01-19)
+------------------
+
+- Fix match when datetime has microseconds
+ [kiorky]
+
+1.0.1 (2021-01-06)
+------------------
+- no changes, just to make sense with new semver2 (making croniter on a stable
state)
+ [kiorky]
+
+
+0.3.37 (2020-12-31)
+-------------------
+
+- Added Python 3.8 and 3.9 support
+ [eumiro]
+
+
0.3.36 (2020-11-02)
-------------------
-- Nothing changed yet.
- Updated docs section regarding ``max_years_between_matches`` to be more
shorter and hopefully more relevant.
[Kintyre]
- Don't install tests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/requirements/base.txt
new/croniter-1.0.8/requirements/base.txt
--- old/croniter-0.3.36/requirements/base.txt 2020-11-02 17:09:51.000000000
+0100
+++ new/croniter-1.0.8/requirements/base.txt 2021-03-06 12:30:07.000000000
+0100
@@ -1,3 +1,4 @@
python_dateutil
+future
natsort
-e .
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/setup.py new/croniter-1.0.8/setup.py
--- old/croniter-0.3.36/setup.py 2020-11-02 17:09:51.000000000 +0100
+++ new/croniter-1.0.8/setup.py 2021-03-06 12:30:07.000000000 +0100
@@ -23,7 +23,7 @@
setup(
name='croniter',
- version='0.3.36',
+ version='1.0.8',
py_modules=['croniter', ],
description=(
'croniter provides iteration for datetime '
@@ -51,6 +51,8 @@
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
"Topic :: Software Development :: Libraries :: Python Modules"],
packages=find_packages('src', exclude=['tests*', '*.tests*']),
package_dir={'': 'src'},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/src/croniter/croniter.py
new/croniter-1.0.8/src/croniter/croniter.py
--- old/croniter-0.3.36/src/croniter/croniter.py 2020-11-02
17:09:51.000000000 +0100
+++ new/croniter-1.0.8/src/croniter/croniter.py 2021-03-06 12:30:07.000000000
+0100
@@ -5,17 +5,18 @@
import math
import re
+import sys
from time import time
import datetime
from dateutil.relativedelta import relativedelta
from dateutil.tz import tzutc
import calendar
import natsort
+from future.utils import raise_from
-step_search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$')
-search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$')
+
+step_search_re = re.compile(r'^([^-]+)-([^-/]+)(/(\d+))?$')
only_int_re = re.compile(r'^\d+$')
-any_int_re = re.compile(r'^\d+')
star_or_int_re = re.compile(r'^(\d+|\*)$')
VALID_LEN_EXPRESSION = [5, 6]
@@ -47,7 +48,7 @@
(0, 23),
(1, 31),
(1, 12),
- (0, 6),
+ (0, 7),
(0, 59)
)
DAYS = (
@@ -115,7 +116,7 @@
@classmethod
def _alphaconv(cls, index, key, expressions):
try:
- return cls.ALPHACONV[index][key.lower()]
+ return cls.ALPHACONV[index][key]
except KeyError:
raise CroniterNotAlphaError(
"[{0}] is not acceptable".format(" ".join(expressions)))
@@ -294,7 +295,9 @@
DAYS = self.DAYS
def proc_month(d):
- if expanded[3][0] != '*':
+ try:
+ expanded[3].index('*')
+ except ValueError:
diff_month = nearest_diff_method(
d.month, expanded[3], self.MONTHS_IN_YEAR)
days = DAYS[month - 1]
@@ -316,7 +319,9 @@
return False, d
def proc_day_of_month(d):
- if expanded[2][0] != '*':
+ try:
+ expanded[2].index('*')
+ except ValueError:
days = DAYS[month - 1]
if month == 2 and self.is_leap(year) is True:
days += 1
@@ -342,7 +347,9 @@
return False, d
def proc_day_of_week(d):
- if expanded[4][0] != '*':
+ try:
+ expanded[4].index('*')
+ except ValueError:
diff_day_of_week = nearest_diff_method(
d.isoweekday() % 7, expanded[4], 7)
if diff_day_of_week is not None and diff_day_of_week != 0:
@@ -406,7 +413,9 @@
return False, d
def proc_hour(d):
- if expanded[1][0] != '*':
+ try:
+ expanded[1].index('*')
+ except ValueError:
diff_hour = nearest_diff_method(d.hour, expanded[1], 24)
if diff_hour is not None and diff_hour != 0:
if is_prev:
@@ -418,7 +427,9 @@
return False, d
def proc_minute(d):
- if expanded[0][0] != '*':
+ try:
+ expanded[0].index('*')
+ except ValueError:
diff_min = nearest_diff_method(d.minute, expanded[0], 60)
if diff_min is not None and diff_min != 0:
if is_prev:
@@ -430,7 +441,9 @@
def proc_second(d):
if len(expanded) == 6:
- if expanded[5][0] != '*':
+ try:
+ expanded[5].index('*')
+ except ValueError:
diff_sec = nearest_diff_method(d.second, expanded[5], 60)
if diff_sec is not None and diff_sec != 0:
d += relativedelta(seconds=diff_sec)
@@ -516,8 +529,11 @@
return False
@classmethod
- def expand(cls, expr_format):
- expressions = expr_format.split()
+ def _expand(cls, expr_format):
+ # Split the expression in components, and normalize L -> l, MON -> mon,
+ # etc. Keep expr_format untouched so we can use it in the exception
+ # messages.
+ expressions = [e.lower() for e in expr_format.split()]
if len(expressions) not in VALID_LEN_EXPRESSION:
raise CroniterBadCronError(cls.bad_length)
@@ -538,27 +554,34 @@
raise CroniterBadCronError(
"[{0}] is not acceptable".format(expr_format))
+ # Before matching step_search_re, normalize "*" to
"{min}-{max}".
+ # Example: in the minute field, "*/5" normalizes to "0-59/5"
t = re.sub(r'^\*(\/.+)$', r'%d-%d\1' % (
cls.RANGES[i][0],
cls.RANGES[i][1]),
str(e))
- m = search_re.search(t)
+ m = step_search_re.search(t)
if not m:
+ # Before matching step_search_re,
+ # normalize "{start}/{step}" to "{start}-{max}/{step}".
+ # Example: in the minute field, "10/5" normalizes to
"10-59/5"
t = re.sub(r'^(.+)\/(.+)$', r'\1-%d/\2' % (
cls.RANGES[i][1]),
str(e))
m = step_search_re.search(t)
if m:
+ # early abort if low/high are out of bounds
+
(low, high, step) = m.group(1), m.group(2), m.group(4) or 1
if i == 2 and high == 'l':
high = '31'
- if not any_int_re.search(low):
+ if not only_int_re.search(low):
low = "{0}".format(cls._alphaconv(i, low, expressions))
- if not any_int_re.search(high):
+ if not only_int_re.search(high):
high = "{0}".format(cls._alphaconv(i, high,
expressions))
if (
@@ -573,6 +596,11 @@
"[{0}] is not acceptable".format(expr_format))
low, high, step = map(int, [low, high, step])
+ if (
+ max(low, high) > max(cls.RANGES[i][0],
cls.RANGES[i][1])
+ ):
+ raise CroniterBadCronError(
+ "{0} is out of bands".format(expr_format))
try:
rng = range(low, high + 1, step)
except ValueError as exc:
@@ -625,6 +653,17 @@
return expanded, nth_weekday_of_month
@classmethod
+ def expand(cls, expr_format):
+ """Shallow non Croniter ValueError inside a nice
CroniterBadCronError"""
+ try:
+ return cls._expand(expr_format)
+ except ValueError as exc:
+ error_type, error_instance, traceback = sys.exc_info()
+ if isinstance(exc, CroniterError):
+ raise
+ raise_from(CroniterBadCronError, exc)
+
+ @classmethod
def is_valid(cls, expression):
try:
cls.expand(expression)
@@ -637,7 +676,9 @@
def match(cls, cron_expression, testdate, day_or=True):
cron = cls(cron_expression, testdate, ret_type=datetime.datetime,
day_or=day_or)
td, ms1 = cron.get_current(datetime.datetime),
relativedelta(microseconds=1)
- cron.set_current(td + ms1)
+ if not td.microsecond:
+ td = td + ms1
+ cron.set_current(td)
tdp, tdt = cron.get_current(), cron.get_prev()
return (max(tdp, tdt) - min(tdp, tdt)).total_seconds() < 60
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/src/croniter/tests/test_croniter.py
new/croniter-1.0.8/src/croniter/tests/test_croniter.py
--- old/croniter-0.3.36/src/croniter/tests/test_croniter.py 2020-11-02
17:09:51.000000000 +0100
+++ new/croniter-1.0.8/src/croniter/tests/test_croniter.py 2021-03-06
12:30:07.000000000 +0100
@@ -6,10 +6,8 @@
from functools import partial
from time import sleep
import pytz
-import croniter as cr
from croniter import croniter, croniter_range, CroniterBadDateError,
CroniterBadCronError, CroniterNotAlphaError
from croniter.tests import base
-from tzlocal import get_localzone
import dateutil.tz
@@ -237,6 +235,16 @@
self.assertEqual(n4.month, 12)
self.assertEqual(n4.day, 31)
+ def testRangeWithUppercaseLastDayOfMonth(self):
+ base = datetime(2015, 9, 4)
+ itr = croniter('0 0 29-L * *', base)
+ n1 = itr.get_next(datetime)
+ self.assertEqual(n1.month, 9)
+ self.assertEqual(n1.day, 29)
+ n2 = itr.get_next(datetime)
+ self.assertEqual(n2.month, 9)
+ self.assertEqual(n2.day, 30)
+
def testPrevLastDayOfMonth(self):
base = datetime(2009, 12, 31, hour=20)
itr = croniter('0 0 l * *', base)
@@ -288,6 +296,9 @@
self.assertRaises(ValueError, croniter, '-90 * * * *')
self.assertRaises(ValueError, croniter, 'a * * * *')
self.assertRaises(ValueError, croniter, '* * * janu-jun *')
+ self.assertRaises(ValueError, croniter, '1-1_0 * * * *')
+ self.assertRaises(ValueError, croniter, '0-10/ * * * *')
+ self.assertRaises(CroniterBadCronError, croniter, "0-1& * * * *",
datetime.now())
def testSundayToThursdayWithAlphaConversion(self):
base = datetime(2010, 8, 25, 15, 56) # wednesday
@@ -1285,6 +1296,23 @@
with self.assertRaises(StopIteration):
next(iterable)
+ def test_issue151(self):
+ """."""
+ self.assertTrue(
+ croniter.match("* * * * *", datetime(2019, 1, 14, 11, 0, 59,
999999)))
+
+ def test_overflow(self):
+ """."""
+ self.assertRaises(CroniterBadCronError, croniter , "0-10000000 * * *
*", datetime.now())
+
+ def test_issue156(self):
+ """."""
+ dt = croniter("* * * * *,0", datetime(2019, 1, 14, 11, 0, 59,
999999)).get_next()
+ self.assertEqual(1547463660.0, dt)
+ self.assertRaises(CroniterBadCronError, croniter, "* * * * *,b")
+ dt = croniter("0 0 * * *,sat#3", datetime(2019, 1, 14, 11, 0, 59,
999999)).get_next()
+ self.assertEqual(1547856000.0, dt)
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/src/croniter.egg-info/PKG-INFO
new/croniter-1.0.8/src/croniter.egg-info/PKG-INFO
--- old/croniter-0.3.36/src/croniter.egg-info/PKG-INFO 2020-11-02
17:09:51.000000000 +0100
+++ new/croniter-1.0.8/src/croniter.egg-info/PKG-INFO 2021-03-06
12:30:07.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: croniter
-Version: 0.3.36
+Version: 1.0.8
Summary: croniter provides iteration for datetime object with cron like format
Home-page: http://github.com/kiorky/croniter
Author: Matsumoto Taichi, kiorky
@@ -232,10 +232,70 @@
Changelog
==============
+ 1.0.8 (2021-03-06)
+ ------------------
+
+ - Update `_expand` to lowercase each component of the expression.
+ This is in relation to #157. With this change, croniter accepts and
correctly handles `* * 10-L * *`.
+ [cuu508]
+
+
+ 1.0.7 (2021-03-02)
+ ------------------
+
+ - Fix _expand to reject int literals with underscores
+ [cuu508]
+ - Remove a debug statement to make flake8 happy
+ [cuu508]
+
+ 1.0.6 (2021-02-01)
+ ------------------
+
+ - Fix combination of star and invalid expression bugs
+ [kiorky]
+
+
+ 1.0.5 (2021-01-29)
+ ------------------
+
+ - Security fix: fix overflow when using cron ranges
+ [kiorky]
+
+ 1.0.4 (2021-01-29)
+ ------------------
+
+ - Spelling fix release
+
+
+ 1.0.3 (2021-01-29)
+ ------------------
+
+ - Fix #155: raise CroniterBadCronError when error syntax
+ [kiorky]
+
+
+ 1.0.2 (2021-01-19)
+ ------------------
+
+ - Fix match when datetime has microseconds
+ [kiorky]
+
+ 1.0.1 (2021-01-06)
+ ------------------
+ - no changes, just to make sense with new semver2 (making croniter on
a stable state)
+ [kiorky]
+
+
+ 0.3.37 (2020-12-31)
+ -------------------
+
+ - Added Python 3.8 and 3.9 support
+ [eumiro]
+
+
0.3.36 (2020-11-02)
-------------------
- - Nothing changed yet.
- Updated docs section regarding ``max_years_between_matches`` to be
more shorter and hopefully more relevant.
[Kintyre]
- Don't install tests
@@ -482,5 +542,7 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/src/croniter.egg-info/requires.txt
new/croniter-1.0.8/src/croniter.egg-info/requires.txt
--- old/croniter-0.3.36/src/croniter.egg-info/requires.txt 2020-11-02
17:09:51.000000000 +0100
+++ new/croniter-1.0.8/src/croniter.egg-info/requires.txt 2021-03-06
12:30:07.000000000 +0100
@@ -1,2 +1,3 @@
+future
natsort
python_dateutil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.36/tox.ini new/croniter-1.0.8/tox.ini
--- old/croniter-0.3.36/tox.ini 2020-11-02 17:09:51.000000000 +0100
+++ new/croniter-1.0.8/tox.ini 2021-03-06 12:30:07.000000000 +0100
@@ -1,7 +1,7 @@
[tox]
minversion = 2.3
envlist =
- {py26,py27,py34,py35,py36,py37}-std
+ {py26,py27,py34,py35,py36,py37,py38,py39}-std
py27-coverage
skipsdist = true
@@ -14,8 +14,8 @@
COVERAGE_FILE={envdir}/coverage_report
changedir = src
commands =
- {py26,py27,py34,py35,py36,py37}-std: py.test -v .
- {py27,py34,py35,py36,py37}-std: flake8 croniter/croniter.py
+ {py26,py27,py34,py35,py36,py37,py38,py39}-std: py.test -v .
+ {py27,py34,py35,py36,py37,py38,py39}-std: flake8 croniter/croniter.py
py27-coverage: coverage erase
py27-coverage: sh -c 'cd .. && coverage run $(which py.test) -v src'
py27-coverage: coverage report