Hello community,
here is the log from the commit of package python-croniter for openSUSE:Factory
checked in at 2019-03-10 09:35:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-croniter (Old)
and /work/SRC/openSUSE:Factory/.python-croniter.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-croniter"
Sun Mar 10 09:35:35 2019 rev:8 rq:682472 version:0.3.27
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-croniter/python-croniter.changes
2018-10-18 15:39:17.726095245 +0200
+++
/work/SRC/openSUSE:Factory/.python-croniter.new.28833/python-croniter.changes
2019-03-10 09:35:35.568173117 +0100
@@ -1,0 +2,10 @@
+Thu Mar 7 13:48:40 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 0.3.27:
+ * Handle -Sun notation
+ * Handle invalid ranges correctly
+ * Pypi hygiene
+ * fix get_next while perserving the fix of get_prev
+ * Don't count previous minute if now is dynamic If the code is triggered
from 5-asterisk based cron get_prev based on datetime.now() is expected to
return current cron iteration and not previous execution.
+
+-------------------------------------------------------------------
Old:
----
croniter-0.3.20.tar.gz
New:
----
croniter-0.3.27.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-croniter.spec ++++++
--- /var/tmp/diff_new_pack.L2WXxh/_old 2019-03-10 09:35:36.100172990 +0100
+++ /var/tmp/diff_new_pack.L2WXxh/_new 2019-03-10 09:35:36.104172989 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-croniter
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,24 +18,22 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-croniter
-Version: 0.3.20
+Version: 0.3.27
Release: 0
Summary: Python iterators for datetime objects with cron-like format
License: MIT
Group: Development/Languages/Python
-Url: http://github.com/kiorky/croniter
+URL: http://github.com/kiorky/croniter
Source:
https://files.pythonhosted.org/packages/source/c/croniter/croniter-%{version}.tar.gz
+BuildRequires: %{python_module pytest >= 3.0.3}
+BuildRequires: %{python_module python-dateutil}
+BuildRequires: %{python_module pytz}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: unzip
-# Test requirements:
-BuildRequires: %{python_module pytest}
-BuildRequires: %{python_module python-dateutil}
-BuildRequires: %{python_module pytz}
Requires: python-python-dateutil
BuildArch: noarch
-
%python_subpackages
%description
@@ -52,11 +50,11 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-%python_exec %{_bindir}/py.test src
+%pytest src
%files %{python_files}
-%defattr(-,root,root,-)
-%doc README.rst docs/LICENSE
+%license docs/LICENSE
+%doc README.rst
%{python_sitelib}/*
%changelog
++++++ croniter-0.3.20.tar.gz -> croniter-0.3.27.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/PKG-INFO new/croniter-0.3.27/PKG-INFO
--- old/croniter-0.3.20/PKG-INFO 2017-11-06 22:22:31.000000000 +0100
+++ new/croniter-0.3.27/PKG-INFO 2019-01-27 18:33:40.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: croniter
-Version: 0.3.20
+Version: 0.3.27
Summary: croniter provides iteration for datetime object with cron like format
Home-page: http://github.com/kiorky/croniter
Author: Matsumoto Taichi, kiorky
@@ -27,8 +27,16 @@
Travis badge
=============
- .. image:: https://travis-ci.org/kiorky/croniter.png
- :target: http://travis-ci.org/kiorky/croniter
+ .. image:: https://travis-ci.org/kiorky/croniter.svg?branch=master
+ :target: https://travis-ci.org/kiorky/croniter
+
+
+
+ Support development
+ ====================
+ - Ethereum: ``0xa287d95530ba6dcb6cd59ee7f571c7ebd532814e``
+ - Bitcoin: ``3GH1S8j68gBceTeEG5r8EJovS3BdUBP2jR``
+ - `paypal <https://paypal.me/kiorky>`_
Usage
============
@@ -39,26 +47,26 @@
>>> from datetime import datetime
>>> base = datetime(2010, 1, 25, 4, 46)
>>> iter = croniter('*/5 * * * *', base) # every 5 minutes
- >>> print iter.get_next(datetime) # 2010-01-25 04:50:00
- >>> print iter.get_next(datetime) # 2010-01-25 04:55:00
- >>> print iter.get_next(datetime) # 2010-01-25 05:00:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:50:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:55:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 05:00:00
>>>
>>> iter = croniter('2 4 * * mon,fri', base) # 04:02 on every
Monday and Friday
- >>> print iter.get_next(datetime) # 2010-01-26 04:02:00
- >>> print iter.get_next(datetime) # 2010-01-30 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-02 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-26 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-30 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-02 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base) # 04:02 on every
Wednesday OR on 1st day of month
- >>> print iter.get_next(datetime) # 2010-01-27 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-03 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-27 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-03 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base, day_or=False) # 04:02 on
every 1st day of the month if it is a Wednesday
- >>> print iter.get_next(datetime) # 2010-09-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-12-01 04:02:00
- >>> print iter.get_next(datetime) # 2011-06-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-09-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-12-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2011-06-01 04:02:00
>>> iter = croniter('0 0 * * sat#1,sun#2', base)
- >>> print iter.get_next(datetime) # datetime.datetime(2010, 2,
6, 0, 0)
+ >>> print(iter.get_next(datetime)) # datetime.datetime(2010, 2,
6, 0, 0)
All you need to know is how to use the constructor and the ``get_next``
method, the signature of these methods are listed below::
@@ -86,9 +94,9 @@
>>> base = datetime(2010, 8, 25)
>>> itr = croniter('0 0 1 * *', base)
- >>> print itr.get_prev(datetime) # 2010-08-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-07-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-06-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-08-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-07-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-06-01 00:00:00
You can validate your crons using ``is_valid`` class method. (>=
0.3.18)::
@@ -145,10 +153,49 @@
- yuzawa-san
-
Changelog
==============
+ 0.3.27 (2019-01-27)
+ -------------------
+ - Handle -Sun notation, This fixes `#119
<https://github.com/taichino/croniter/issues/119>`_.
+ [kiorky]
+ - Handle invalid ranges correctly, This fixes `#114
<https://github.com/taichino/croniter/issues/114>`_.
+ [kiorky]
+
+ 0.3.26 (2018-11-03)
+ -------------------
+
+ - Support
+
+
+ 0.3.25 (2018-08-07)
+ -------------------
+ - Pypi hygiene
+ [hugovk]
+
+
+ 0.3.24 (2018-06-20)
+ -------------------
+ - fix `#107 <https://github.com/taichino/croniter/issues/107>`_:
microsecond threshold
+ [kiorky]
+
+
+ 0.3.23 (2018-05-23)
+ -------------------
+
+ - fix `get_next` while perserving the fix of `get_prev` in 7661c2aaa
+ [Avikam Agur <[email protected]>]
+
+
+ 0.3.22 (2018-05-16)
+ -------------------
+ - Don't count previous minute if now is dynamic
+ If the code is triggered from 5-asterisk based cron
+ `get_prev` based on `datetime.now()` is expected to return
+ current cron iteration and not previous execution.
+ [Igor Khrol <[email protected]>]
+
0.3.20 (2017-11-06)
-------------------
@@ -286,5 +333,10 @@
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
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.20/README.rst
new/croniter-0.3.27/README.rst
--- old/croniter-0.3.20/README.rst 2017-11-06 22:22:31.000000000 +0100
+++ new/croniter-0.3.27/README.rst 2019-01-27 18:33:40.000000000 +0100
@@ -19,8 +19,16 @@
Travis badge
=============
-.. image:: https://travis-ci.org/kiorky/croniter.png
- :target: http://travis-ci.org/kiorky/croniter
+.. image:: https://travis-ci.org/kiorky/croniter.svg?branch=master
+ :target: https://travis-ci.org/kiorky/croniter
+
+
+
+Support development
+====================
+- Ethereum: ``0xa287d95530ba6dcb6cd59ee7f571c7ebd532814e``
+- Bitcoin: ``3GH1S8j68gBceTeEG5r8EJovS3BdUBP2jR``
+- `paypal <https://paypal.me/kiorky>`_
Usage
============
@@ -31,26 +39,26 @@
>>> from datetime import datetime
>>> base = datetime(2010, 1, 25, 4, 46)
>>> iter = croniter('*/5 * * * *', base) # every 5 minutes
- >>> print iter.get_next(datetime) # 2010-01-25 04:50:00
- >>> print iter.get_next(datetime) # 2010-01-25 04:55:00
- >>> print iter.get_next(datetime) # 2010-01-25 05:00:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:50:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:55:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 05:00:00
>>>
>>> iter = croniter('2 4 * * mon,fri', base) # 04:02 on every Monday and
Friday
- >>> print iter.get_next(datetime) # 2010-01-26 04:02:00
- >>> print iter.get_next(datetime) # 2010-01-30 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-02 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-26 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-30 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-02 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base) # 04:02 on every Wednesday OR on
1st day of month
- >>> print iter.get_next(datetime) # 2010-01-27 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-03 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-27 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-03 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base, day_or=False) # 04:02 on every
1st day of the month if it is a Wednesday
- >>> print iter.get_next(datetime) # 2010-09-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-12-01 04:02:00
- >>> print iter.get_next(datetime) # 2011-06-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-09-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-12-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2011-06-01 04:02:00
>>> iter = croniter('0 0 * * sat#1,sun#2', base)
- >>> print iter.get_next(datetime) # datetime.datetime(2010, 2, 6, 0, 0)
+ >>> print(iter.get_next(datetime)) # datetime.datetime(2010, 2, 6, 0, 0)
All you need to know is how to use the constructor and the ``get_next``
method, the signature of these methods are listed below::
@@ -78,9 +86,9 @@
>>> base = datetime(2010, 8, 25)
>>> itr = croniter('0 0 1 * *', base)
- >>> print itr.get_prev(datetime) # 2010-08-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-07-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-06-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-08-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-07-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-06-01 00:00:00
You can validate your crons using ``is_valid`` class method. (>= 0.3.18)::
@@ -135,4 +143,3 @@
- chris-baynes
- ipartola
- yuzawa-san
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/docs/CHANGES.rst
new/croniter-0.3.27/docs/CHANGES.rst
--- old/croniter-0.3.20/docs/CHANGES.rst 2017-11-06 22:22:31.000000000
+0100
+++ new/croniter-0.3.27/docs/CHANGES.rst 2019-01-27 18:33:40.000000000
+0100
@@ -1,6 +1,46 @@
Changelog
==============
+0.3.27 (2019-01-27)
+-------------------
+- Handle -Sun notation, This fixes `#119
<https://github.com/taichino/croniter/issues/119>`_.
+ [kiorky]
+- Handle invalid ranges correctly, This fixes `#114
<https://github.com/taichino/croniter/issues/114>`_.
+ [kiorky]
+
+0.3.26 (2018-11-03)
+-------------------
+
+- Support
+
+
+0.3.25 (2018-08-07)
+-------------------
+- Pypi hygiene
+ [hugovk]
+
+
+0.3.24 (2018-06-20)
+-------------------
+- fix `#107 <https://github.com/taichino/croniter/issues/107>`_: microsecond
threshold
+ [kiorky]
+
+
+0.3.23 (2018-05-23)
+-------------------
+
+- fix `get_next` while perserving the fix of `get_prev` in 7661c2aaa
+ [Avikam Agur <[email protected]>]
+
+
+0.3.22 (2018-05-16)
+-------------------
+- Don't count previous minute if now is dynamic
+ If the code is triggered from 5-asterisk based cron
+ `get_prev` based on `datetime.now()` is expected to return
+ current cron iteration and not previous execution.
+ [Igor Khrol <[email protected]>]
+
0.3.20 (2017-11-06)
-------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/setup.cfg
new/croniter-0.3.27/setup.cfg
--- old/croniter-0.3.20/setup.cfg 2017-11-06 22:22:31.000000000 +0100
+++ new/croniter-0.3.27/setup.cfg 2019-01-27 18:33:40.000000000 +0100
@@ -19,5 +19,4 @@
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/setup.py new/croniter-0.3.27/setup.py
--- old/croniter-0.3.20/setup.py 2017-11-06 22:22:31.000000000 +0100
+++ new/croniter-0.3.27/setup.py 2019-01-27 18:33:40.000000000 +0100
@@ -23,7 +23,7 @@
setup(
name='croniter',
- version='0.3.20',
+ version='0.3.27',
py_modules=['croniter', ],
description=(
'croniter provides iteration for datetime '
@@ -36,6 +36,7 @@
keywords='datetime, iterator, cron',
install_requires=install_requires,
license="MIT License",
+ python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
@@ -43,7 +44,11 @@
"Operating System :: POSIX",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.6",
+ "Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.4",
+ "Programming Language :: Python :: 3.5",
"Topic :: Software Development :: Libraries :: Python Modules"],
packages=find_packages('src'),
package_dir={'': 'src'},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/src/croniter/croniter.py
new/croniter-0.3.27/src/croniter/croniter.py
--- old/croniter-0.3.20/src/croniter/croniter.py 2017-11-06
22:22:31.000000000 +0100
+++ new/croniter-0.3.27/src/croniter/croniter.py 2019-01-27
18:33:40.000000000 +0100
@@ -80,6 +80,9 @@
self.tzinfo = None
if isinstance(start_time, datetime.datetime):
self.tzinfo = start_time.tzinfo
+ # milliseconds/microseconds rounds
+ if start_time.microsecond:
+ start_time = start_time + relativedelta(seconds=1)
start_time = self._datetime_to_timestamp(start_time)
self.start_time = start_time
@@ -223,11 +226,12 @@
if is_prev:
nearest_diff_method = self._get_prev_nearest_diff
sign = -1
+ offset = (len(expanded) == 6 or now % 60 > 0) and 1 or 60
else:
nearest_diff_method = self._get_next_nearest_diff
sign = 1
+ offset = (len(expanded) == 6) and 1 or 60
- offset = len(expanded) == 6 and 1 or 60
dst = now = self._timestamp_to_datetime(now + sign * offset)
month, year = dst.month, dst.year
@@ -503,11 +507,19 @@
not low or not high or int(low) > int(high)
or not only_int_re.search(str(step))
):
- raise CroniterBadDateError(
- "[{0}] is not acceptable".format(expr_format))
+ if i == 4 and high == '0':
+ # handle -Sun notation -> 7
+ high = '7'
+ else:
+ raise CroniterBadDateError(
+ "[{0}] is not acceptable".format(expr_format))
low, high, step = map(int, [low, high, step])
- rng = range(low, high + 1, step)
+ try:
+ rng = range(low, high + 1, step)
+ except ValueError as exc:
+ raise CroniterBadCronError(
+ 'invalid range: {0}'.format(exc))
e_list += (["{0}#{1}".format(item, nth) for item in rng]
if i == 4 and nth else rng)
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/src/croniter/tests/test_croniter.py
new/croniter-0.3.27/src/croniter/tests/test_croniter.py
--- old/croniter-0.3.20/src/croniter/tests/test_croniter.py 2017-11-06
22:22:31.000000000 +0100
+++ new/croniter-0.3.27/src/croniter/tests/test_croniter.py 2019-01-27
18:33:40.000000000 +0100
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
import unittest
-from datetime import datetime
+from datetime import datetime, timedelta
from time import sleep
import pytz
from croniter import croniter, CroniterBadDateError, CroniterBadCronError,
CroniterNotAlphaError
@@ -790,5 +790,117 @@
self.assertFalse(croniter.is_valid('0 * *'))
self.assertFalse(croniter.is_valid('* * * janu-jun *'))
+ def test_exactly_the_same_minute(self):
+ base = datetime(2018, 3, 5, 12, 30, 50)
+ itr = croniter('30 7,12,17 * * *', base)
+ n1 = itr.get_prev(datetime)
+ self.assertEqual(12, n1.hour)
+
+ n2 = itr.get_prev(datetime)
+ self.assertEqual(7, n2.hour)
+
+ n3 = itr.get_next(datetime)
+ self.assertEqual(12, n3.hour)
+
+ def test_next_when_now_satisfies_cron(self):
+ ts_a = datetime(2018, 5, 21, 0, 3, 0)
+ ts_b = datetime(2018, 5, 21, 0, 4, 20)
+ test_cron = '4 * * * *'
+
+ next_a = croniter(test_cron, start_time=ts_a).get_next()
+ next_b = croniter(test_cron, start_time=ts_b).get_next()
+
+ self.assertTrue(next_b > next_a)
+
+ def test_milliseconds(self):
+ """
+ https://github.com/taichino/croniter/issues/107
+ """
+ #
+ dt = datetime(2018, 1, 2, 10, 0, 0, 500)
+ c = croniter("0 10 * * * ", start_time=dt)
+ ts = "{0}".format(datetime.utcfromtimestamp(c.get_prev()))
+ self.assertEqual(ts, '2018-01-02 10:00:00')
+ #
+ dt = datetime(2018, 1, 2, 10, 0, 1, 0)
+ c = croniter("0 10 * * * ", start_time=dt)
+ ts = "{0}".format(datetime.utcfromtimestamp(c.get_prev()))
+ self.assertEqual(ts, '2018-01-02 10:00:00')
+ #
+ dt = datetime(2018, 1, 2, 9, 59, 59, 999999)
+ c = croniter("0 10 * * * ", start_time=dt)
+ ts = "{0}".format(datetime.utcfromtimestamp(c.get_prev()))
+ self.assertEqual(ts, '2018-01-01 10:00:00')
+
+ def test_invalid_zerorepeat(self):
+ self.assertFalse(croniter.is_valid('*/0 * * * *'))
+
+ def test_weekday_range(self):
+ ret = []
+ # jan 14 is monday
+ dt = datetime(2019, 1, 14, 0, 0, 0, 0)
+ for i in range(10):
+ c = croniter("0 0 * * 2-4 *", start_time=dt)
+ dt = datetime.utcfromtimestamp(c.get_next())
+ ret.append(dt)
+ dt += timedelta(days=1)
+ sret = ["{0}".format(r) for r in ret]
+ self.assertEquals(
+ sret,
+ ['2019-01-15 00:00:00',
+ '2019-01-16 00:00:01',
+ '2019-01-17 00:00:02',
+ '2019-01-22 00:00:00',
+ '2019-01-23 00:00:01',
+ '2019-01-24 00:00:02',
+ '2019-01-29 00:00:00',
+ '2019-01-30 00:00:01',
+ '2019-01-31 00:00:02',
+ '2019-02-05 00:00:00'])
+ ret = []
+ dt = datetime(2019, 1, 14, 0, 0, 0, 0)
+ for i in range(10):
+ c = croniter("0 0 * * 1-7 *", start_time=dt)
+ dt = datetime.utcfromtimestamp(c.get_next())
+ ret.append(dt)
+ dt += timedelta(days=1)
+ sret = ["{0}".format(r) for r in ret]
+ self.assertEquals(
+ sret,
+ ['2019-01-14 00:00:01',
+ '2019-01-15 00:00:02',
+ '2019-01-16 00:00:03',
+ '2019-01-17 00:00:04',
+ '2019-01-18 00:00:05',
+ '2019-01-19 00:00:06',
+ '2019-01-20 00:00:07',
+ '2019-01-21 00:00:08',
+ '2019-01-22 00:00:09',
+ '2019-01-23 00:00:10'])
+
+ def test_issue_monsun_117(self):
+ ret = []
+ dt = datetime(2019, 1, 14, 0, 0, 0, 0)
+ for i in range(10):
+ # c = croniter("0 0 * * Mon-Sun *", start_time=dt)
+ c = croniter("0 0 * * Wed-Sun *", start_time=dt)
+ dt = datetime.utcfromtimestamp(c.get_next())
+ ret.append(dt)
+ dt += timedelta(days=1)
+ sret = ["{0}".format(r) for r in ret]
+ self.assertEquals(
+ sret,
+ ['2019-01-16 00:00:00',
+ '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'])
+
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/croniter-0.3.20/src/croniter.egg-info/PKG-INFO
new/croniter-0.3.27/src/croniter.egg-info/PKG-INFO
--- old/croniter-0.3.20/src/croniter.egg-info/PKG-INFO 2017-11-06
22:22:31.000000000 +0100
+++ new/croniter-0.3.27/src/croniter.egg-info/PKG-INFO 2019-01-27
18:33:40.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: croniter
-Version: 0.3.20
+Version: 0.3.27
Summary: croniter provides iteration for datetime object with cron like format
Home-page: http://github.com/kiorky/croniter
Author: Matsumoto Taichi, kiorky
@@ -27,8 +27,16 @@
Travis badge
=============
- .. image:: https://travis-ci.org/kiorky/croniter.png
- :target: http://travis-ci.org/kiorky/croniter
+ .. image:: https://travis-ci.org/kiorky/croniter.svg?branch=master
+ :target: https://travis-ci.org/kiorky/croniter
+
+
+
+ Support development
+ ====================
+ - Ethereum: ``0xa287d95530ba6dcb6cd59ee7f571c7ebd532814e``
+ - Bitcoin: ``3GH1S8j68gBceTeEG5r8EJovS3BdUBP2jR``
+ - `paypal <https://paypal.me/kiorky>`_
Usage
============
@@ -39,26 +47,26 @@
>>> from datetime import datetime
>>> base = datetime(2010, 1, 25, 4, 46)
>>> iter = croniter('*/5 * * * *', base) # every 5 minutes
- >>> print iter.get_next(datetime) # 2010-01-25 04:50:00
- >>> print iter.get_next(datetime) # 2010-01-25 04:55:00
- >>> print iter.get_next(datetime) # 2010-01-25 05:00:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:50:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 04:55:00
+ >>> print(iter.get_next(datetime)) # 2010-01-25 05:00:00
>>>
>>> iter = croniter('2 4 * * mon,fri', base) # 04:02 on every
Monday and Friday
- >>> print iter.get_next(datetime) # 2010-01-26 04:02:00
- >>> print iter.get_next(datetime) # 2010-01-30 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-02 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-26 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-30 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-02 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base) # 04:02 on every
Wednesday OR on 1st day of month
- >>> print iter.get_next(datetime) # 2010-01-27 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-02-03 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-01-27 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-02-03 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base, day_or=False) # 04:02 on
every 1st day of the month if it is a Wednesday
- >>> print iter.get_next(datetime) # 2010-09-01 04:02:00
- >>> print iter.get_next(datetime) # 2010-12-01 04:02:00
- >>> print iter.get_next(datetime) # 2011-06-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-09-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2010-12-01 04:02:00
+ >>> print(iter.get_next(datetime)) # 2011-06-01 04:02:00
>>> iter = croniter('0 0 * * sat#1,sun#2', base)
- >>> print iter.get_next(datetime) # datetime.datetime(2010, 2,
6, 0, 0)
+ >>> print(iter.get_next(datetime)) # datetime.datetime(2010, 2,
6, 0, 0)
All you need to know is how to use the constructor and the ``get_next``
method, the signature of these methods are listed below::
@@ -86,9 +94,9 @@
>>> base = datetime(2010, 8, 25)
>>> itr = croniter('0 0 1 * *', base)
- >>> print itr.get_prev(datetime) # 2010-08-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-07-01 00:00:00
- >>> print itr.get_prev(datetime) # 2010-06-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-08-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-07-01 00:00:00
+ >>> print(itr.get_prev(datetime)) # 2010-06-01 00:00:00
You can validate your crons using ``is_valid`` class method. (>=
0.3.18)::
@@ -145,10 +153,49 @@
- yuzawa-san
-
Changelog
==============
+ 0.3.27 (2019-01-27)
+ -------------------
+ - Handle -Sun notation, This fixes `#119
<https://github.com/taichino/croniter/issues/119>`_.
+ [kiorky]
+ - Handle invalid ranges correctly, This fixes `#114
<https://github.com/taichino/croniter/issues/114>`_.
+ [kiorky]
+
+ 0.3.26 (2018-11-03)
+ -------------------
+
+ - Support
+
+
+ 0.3.25 (2018-08-07)
+ -------------------
+ - Pypi hygiene
+ [hugovk]
+
+
+ 0.3.24 (2018-06-20)
+ -------------------
+ - fix `#107 <https://github.com/taichino/croniter/issues/107>`_:
microsecond threshold
+ [kiorky]
+
+
+ 0.3.23 (2018-05-23)
+ -------------------
+
+ - fix `get_next` while perserving the fix of `get_prev` in 7661c2aaa
+ [Avikam Agur <[email protected]>]
+
+
+ 0.3.22 (2018-05-16)
+ -------------------
+ - Don't count previous minute if now is dynamic
+ If the code is triggered from 5-asterisk based cron
+ `get_prev` based on `datetime.now()` is expected to return
+ current cron iteration and not previous execution.
+ [Igor Khrol <[email protected]>]
+
0.3.20 (2017-11-06)
-------------------
@@ -286,5 +333,10 @@
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*