Metadata-Version: 2.1 Name: croniter Version: 0.3.25 Summary: croniter provides iteration for datetime object with cron like format Home-page: http://github.com/kiorky/croniter Author: Matsumoto Taichi, kiorky Author-email: taichino@gmail.com, kiorky@cryptelium.net License: MIT License Keywords: datetime,iterator,cron Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License 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.* Requires-Dist: python-dateutil Introduction ============ .. contents:: croniter provides iteration for the datetime object with a cron like format. :: _ _ ___ _ __ ___ _ __ (_) |_ ___ _ __ / __| '__/ _ \| '_ \| | __/ _ \ '__| | (__| | | (_) | | | | | || __/ | \___|_| \___/|_| |_|_|\__\___|_| Website: https://github.com/kiorky/croniter Travis badge ============= .. image:: https://travis-ci.org/kiorky/croniter.svg?branch=master :target: https://travis-ci.org/kiorky/croniter Usage ============ A simple example:: >>> from croniter import croniter >>> 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 >>> >>> 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 >>> >>> 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 >>> >>> 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 >>> iter = croniter('0 0 * * sat#1,sun#2', base) >>> 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:: >>> def __init__(self, cron_format, start_time=time.time(), day_or=True) croniter iterates along with ``cron_format`` from ``start_time``. ``cron_format`` is **min hour day month day_of_week**, you can refer to http://en.wikipedia.org/wiki/Cron for more details. The ``day_or`` switch is used to control how croniter handles **day** and **day_of_week** entries. Default option is the cron behaviour, which connects those values using **OR**. If the switch is set to False, the values are connected using **AND**. This behaves like fcron and enables you to e.g. define a job that executes each 2nd friday of a month by setting the days of month and the weekday. :: >>> def get_next(self, ret_type=float) get_next calculates the next value according to the cron expression and returns an object of type ``ret_type``. ``ret_type`` should be a ``float`` or a ``datetime`` object. Supported added for ``get_prev`` method. (>= 0.2.0):: >>> 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 You can validate your crons using ``is_valid`` class method. (>= 0.3.18):: >>> croniter.is_valid('0 0 1 * *') # True >>> croniter.is_valid('0 wrong_value 1 * *') # False About DST ========= Be sure to init your croniter instance with a TZ aware datetime for this to work !:: >>> local_date = tz.localize(datetime(2017, 3, 26)) >>> val = croniter('0 0 * * *', local_date).get_next(datetime) Develop this package ==================== :: git clone https://github.com/kiorky/croniter.git cd croniter virtualenv --no-site-packages venv . venv/bin/activate pip install --upgrade -r requirements/test.txt py.test src Make a new release ==================== We use zest.fullreleaser, a great release infrastructure. Do and follow these instructions :: . venv/bin/activate pip install --upgrade -r requirements/release.txt fullrelease Contributors =============== Thanks to all who have contributed to this project! If you have contributed and your name is not listed below please let me know. - mrmachine - Hinnack - shazow - kiorky - jlsandell - mag009 - djmitche - GreatCombinator - chris-baynes - ipartola - yuzawa-san Changelog ============== 0.3.25 (2018-08-07) ------------------- - Pypî hygiene [hugovk] 0.3.24 (2018-06-20) ------------------- - fix `#107 `_: microsecond threshold [kiorky] 0.3.23 (2018-05-23) ------------------- - fix `get_next` while perserving the fix of `get_prev` in 7661c2aaa [Avikam Agur ] 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 ] 0.3.20 (2017-11-06) ------------------- - More DST fixes [Kevin Rose ] 0.3.19 (2017-08-31) ------------------- - fix #87: backward dst changes [kiorky] 0.3.18 (2017-08-31) ------------------- - Add is valid method, refactor errors [otherpirate, Mauro Murari ] 0.3.17 (2017-05-22) ------------------- - DOW occurence sharp style support. [kiorky, Kengo Seki ] 0.3.16 (2017-03-15) ------------------- - Better test suite [mrcrilly@github] - DST support [kiorky] 0.3.15 (2017-02-16) ------------------- - fix bug around multiple conditions and range_val in _get_prev_nearest_diff. [abeja-yuki@github] 0.3.14 (2017-01-25) ------------------- - issue #69: added day_or option to change behavior when day-of-month and day-of-week is given [Andreas Vogl ] 0.3.13 (2016-11-01) ------------------- - `Real fix for #34 `_ [kiorky@github] - `Modernize test infra `_ [kiorky@github] - `Release as a universal wheel `_ [adamchainz@github] - `Raise ValueError on negative numbers `_ [josegonzalez@github] - `Compare types using "issubclass" instead of exact match `_ [darkk@github] - `Implement step cron with a variable base `_ [josegonzalez@github] 0.3.12 (2016-03-10) ------------------- - support setting ret_type in __init__ [Brent Tubbs ] 0.3.11 (2016-01-13) ------------------- - Bug fix: The get_prev API crashed when last day of month token was used. Some essential logic was missing. [Iddo Aviram ] 0.3.10 (2015-11-29) ------------------- - The fuctionality of 'l' as day of month was broken, since the month variable was not properly updated [Iddo Aviram ] 0.3.9 (2015-11-19) ------------------ - Don't use datetime functions python 2.6 doesn't support [petervtzand] 0.3.8 (2015-06-23) ------------------ - Truncate microseconds by setting to 0 [Corey Wright] 0.3.7 (2015-06-01) ------------------ - converting sun in range sun-thu transforms to int 0 which is recognized as empty string; the solution was to convert sun to string "0" 0.3.6 (2015-05-29) ------------------ - Fix default behavior when no start_time given Default value for `start_time` parameter is calculated at module init time rather than call time. - Fix timezone support and stop depending on the system time zone 0.3.5 (2014-08-01) ------------------ - support for 'l' (last day of month) 0.3.4 (2014-01-30) ------------------ - Python 3 compat - QA Relase 0.3.3 (2012-09-29) ------------------ - proper packaging