Hello community, here is the log from the commit of package python-croniter for openSUSE:Factory checked in at 2020-06-10 00:47:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-croniter (Old) and /work/SRC/openSUSE:Factory/.python-croniter.new.3606 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-croniter" Wed Jun 10 00:47:20 2020 rev:12 rq:812619 version:0.3.32 Changes: -------- --- /work/SRC/openSUSE:Factory/python-croniter/python-croniter.changes 2020-03-16 10:19:16.251610026 +0100 +++ /work/SRC/openSUSE:Factory/.python-croniter.new.3606/python-croniter.changes 2020-06-10 00:47:28.638797561 +0200 @@ -1,0 +2,9 @@ +Mon Jun 8 13:31:08 UTC 2020 - Dirk Mueller <dmuel...@suse.com> + +- update to 0.3.32: + - document seconds repeats, fixes #122 + - Implement match method, fixes #54 + - Adding tests for #127 (test more DSTs and croniter behavior around) + - Changed lag_hours comparison to absolute to manage dst boundary when getting previous + +------------------------------------------------------------------- Old: ---- croniter-0.3.31.tar.gz New: ---- croniter-0.3.32.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-croniter.spec ++++++ --- /var/tmp/diff_new_pack.CjGJdd/_old 2020-06-10 00:47:29.286799295 +0200 +++ /var/tmp/diff_new_pack.CjGJdd/_new 2020-06-10 00:47:29.290799306 +0200 @@ -18,20 +18,23 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-croniter -Version: 0.3.31 +Version: 0.3.32 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 natsort} BuildRequires: %{python_module pytest >= 3.0.3} BuildRequires: %{python_module python-dateutil} BuildRequires: %{python_module pytz} BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module tzlocal} BuildRequires: fdupes BuildRequires: python-rpm-macros BuildRequires: unzip +Requires: python-natsort Requires: python-python-dateutil BuildArch: noarch %python_subpackages ++++++ croniter-0.3.31.tar.gz -> croniter-0.3.32.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/PKG-INFO new/croniter-0.3.32/PKG-INFO --- old/croniter-0.3.31/PKG-INFO 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/PKG-INFO 2020-05-27 18:01:44.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: croniter -Version: 0.3.31 +Version: 0.3.32 Summary: croniter provides iteration for datetime object with cron like format Home-page: http://github.com/kiorky/croniter Author: Matsumoto Taichi, kiorky @@ -103,6 +103,30 @@ >>> local_date = tz.localize(datetime(2017, 3, 26)) >>> val = croniter('0 0 * * *', local_date).get_next(datetime) + About second repeats + ===================== + Croniter is able to do second repeatition crontabs form:: + + >>> croniter('* * * * * 1', local_date).get_next(datetime) + >>> base = datetime(2012, 4, 6, 13, 26, 10) + >>> itr = croniter('* * * * * 15,25', base) + >>> itr.get_next(datetime) # 4/6 13:26:15 + >>> itr.get_next(datetime) # 4/6 13:26:25 + >>> itr.get_next(datetime) # 4/6 13:27:15 + + You can also note that this expression will repeat every second from the start datetime. + + >>> croniter('* * * * * *', local_date).get_next(datetime) + + Testing if a date matchs a crontab + ================================== + As simple as:: + + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 0, 0, 0)) + True + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 2, 0, 0)) + False + Develop this package ==================== @@ -149,19 +173,31 @@ Changelog ============== + 0.3.32 (2020-05-27) + ------------------- + + - document seconds repeats, fixes #122 + [kiorky] + - Implement match method, fixes #54 + [kiorky] + - Adding tests for #127 (test more DSTs and croniter behavior around) + [kiorky] + - Changed lag_hours comparison to absolute to manage dst boundary when getting previous + [Sokkka] + 0.3.31 (2020-01-02) ------------------- - Fix get_next() when start_time less then 1s before next instant [AlexHill] + 0.3.30 (2019-04-20) ------------------- - credits - 0.3.29 (2019-03-26) ------------------- @@ -341,5 +377,7 @@ Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 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.31/README.rst new/croniter-0.3.32/README.rst --- old/croniter-0.3.31/README.rst 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/README.rst 2020-05-27 18:01:43.000000000 +0200 @@ -95,6 +95,30 @@ >>> local_date = tz.localize(datetime(2017, 3, 26)) >>> val = croniter('0 0 * * *', local_date).get_next(datetime) +About second repeats +===================== +Croniter is able to do second repeatition crontabs form:: + + >>> croniter('* * * * * 1', local_date).get_next(datetime) + >>> base = datetime(2012, 4, 6, 13, 26, 10) + >>> itr = croniter('* * * * * 15,25', base) + >>> itr.get_next(datetime) # 4/6 13:26:15 + >>> itr.get_next(datetime) # 4/6 13:26:25 + >>> itr.get_next(datetime) # 4/6 13:27:15 + +You can also note that this expression will repeat every second from the start datetime. + + >>> croniter('* * * * * *', local_date).get_next(datetime) + +Testing if a date matchs a crontab +================================== +As simple as:: + + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 0, 0, 0)) + True + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 2, 0, 0)) + False + Develop this package ==================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/docs/CHANGES.rst new/croniter-0.3.32/docs/CHANGES.rst --- old/croniter-0.3.31/docs/CHANGES.rst 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/docs/CHANGES.rst 2020-05-27 18:01:43.000000000 +0200 @@ -1,19 +1,31 @@ Changelog ============== +0.3.32 (2020-05-27) +------------------- + +- document seconds repeats, fixes #122 + [kiorky] +- Implement match method, fixes #54 + [kiorky] +- Adding tests for #127 (test more DSTs and croniter behavior around) + [kiorky] +- Changed lag_hours comparison to absolute to manage dst boundary when getting previous + [Sokkka] + 0.3.31 (2020-01-02) ------------------- - Fix get_next() when start_time less then 1s before next instant [AlexHill] + 0.3.30 (2019-04-20) ------------------- - credits - 0.3.29 (2019-03-26) ------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/requirements/base.txt new/croniter-0.3.32/requirements/base.txt --- old/croniter-0.3.31/requirements/base.txt 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/requirements/base.txt 2020-05-27 18:01:43.000000000 +0200 @@ -1,2 +1,3 @@ python_dateutil +natsort -e . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/requirements/test.txt new/croniter-0.3.32/requirements/test.txt --- old/croniter-0.3.31/requirements/test.txt 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/requirements/test.txt 2020-05-27 18:01:43.000000000 +0200 @@ -5,4 +5,5 @@ coverage>=4.2 mock>=2.0.0 # For Python 2 coveralls -flake8 \ No newline at end of file +flake8 +tzlocal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/setup.cfg new/croniter-0.3.32/setup.cfg --- old/croniter-0.3.31/setup.cfg 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/setup.cfg 2020-05-27 18:01:44.000000000 +0200 @@ -1,6 +1,10 @@ [bdist_wheel] universal = 1 +[flake8] +max-line-length = 120 +ignore = W504,W503 + [coverage:run] source = . branch = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/setup.py new/croniter-0.3.32/setup.py --- old/croniter-0.3.31/setup.py 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/setup.py 2020-05-27 18:01:43.000000000 +0200 @@ -23,7 +23,7 @@ setup( name='croniter', - version='0.3.31', + version='0.3.32', py_modules=['croniter', ], description=( 'croniter provides iteration for datetime ' @@ -49,6 +49,8 @@ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", "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.31/src/croniter/croniter.py new/croniter-0.3.32/src/croniter/croniter.py --- old/croniter-0.3.31/src/croniter/croniter.py 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/src/croniter/croniter.py 2020-05-27 18:01:43.000000000 +0200 @@ -10,6 +10,7 @@ from dateutil.relativedelta import relativedelta from dateutil.tz import tzutc import calendar +import natsort step_search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$') search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$') @@ -80,13 +81,11 @@ start_time = time() self.tzinfo = None - if isinstance(start_time, datetime.datetime): - self.tzinfo = start_time.tzinfo - start_time = self._datetime_to_timestamp(start_time) - self.start_time = start_time - self.dst_start_time = start_time - self.cur = start_time + self.start_time = None + self.dst_start_time = None + self.cur = None + self.set_current(start_time) self.expanded, self.nth_weekday_of_month = self.expand(expr_format) @@ -98,7 +97,9 @@ raise CroniterNotAlphaError( "[{0}] is not acceptable".format(" ".join(expressions))) - def get_next(self, ret_type=None): + def get_next(self, ret_type=None, start_time=None): + if start_time is not None: + self.set_current(start_time) return self._get_next(ret_type or self._ret_type, is_prev=False) def get_prev(self, ret_type=None): @@ -106,10 +107,20 @@ def get_current(self, ret_type=None): ret_type = ret_type or self._ret_type - if issubclass(ret_type, datetime.datetime): + if issubclass(ret_type, datetime.datetime): return self._timestamp_to_datetime(self.cur) return self.cur + def set_current(self, start_time): + if isinstance(start_time, datetime.datetime): + self.tzinfo = start_time.tzinfo + start_time = self._datetime_to_timestamp(start_time) + + self.start_time = start_time + self.dst_start_time = start_time + self.cur = start_time + return self.cur + @classmethod def _datetime_to_timestamp(cls, d): """ @@ -202,16 +213,17 @@ if dtresult and self.tzinfo: dtresult_utcoffset = dtresult.utcoffset() lag_hours = ( - self._timedelta_to_seconds(dtresult - dtstarttime) / (60*60) + self._timedelta_to_seconds(dtresult - dtstarttime) / (60 * 60) ) lag = self._timedelta_to_seconds( dtresult_utcoffset - dtstarttime_utcoffset ) hours_before_midnight = 24 - dtstarttime.hour if dtresult_utcoffset != dtstarttime_utcoffset: - if ((lag > 0 and lag_hours >= hours_before_midnight) + if ( + (lag > 0 and abs(lag_hours) >= hours_before_midnight) or (lag < 0 and - ((3600*lag_hours+abs(lag)) >= hours_before_midnight*3600)) + ((3600 * abs(lag_hours) + abs(lag)) >= hours_before_midnight * 3600)) ): dtresult = dtresult - datetime.timedelta(seconds=lag) result = self._datetime_to_timestamp(dtresult) @@ -315,7 +327,8 @@ for wday, nth in nth_weekday_of_month.items(): w = (wday + 6) % 7 c = calendar.Calendar(w).monthdayscalendar(d.year, d.month) - if c[0][0] == 0: c.pop(0) + if c[0][0] == 0: + c.pop(0) for n in nth: if len(c) < n: continue @@ -522,19 +535,19 @@ 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) + if i == 4 and nth else rng) else: if t.startswith('-'): - raise CroniterBadCronError( - "[{0}] is not acceptable,\ - negative numbers not allowed".format( - expr_format)) + raise CroniterBadCronError(( + "[{0}] is not acceptable," + "negative numbers not allowed" + ).format(expr_format)) if not star_or_int_re.search(t): t = cls._alphaconv(i, t, expressions) try: t = int(t) - except: + except ValueError: pass if t in cls.LOWMAP[i]: @@ -556,7 +569,7 @@ nth_weekday_of_month[t] = set() nth_weekday_of_month[t].add(int(nth)) - res.sort() + res = natsort.natsorted(res) expanded.append(['*'] if (len(res) == 1 and res[0] == '*') else res) @@ -571,3 +584,11 @@ return False else: return True + + @classmethod + def match(cls, cron_expression, testdate): + cron = cls(cron_expression, testdate, ret_type=datetime.datetime) + td, ms1 = cron.get_current(datetime.datetime), relativedelta(microseconds=1) + cron.set_current(td + ms1) + 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.31/src/croniter/tests/test_croniter.py new/croniter-0.3.32/src/croniter/tests/test_croniter.py --- old/croniter-0.3.31/src/croniter/tests/test_croniter.py 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/src/croniter/tests/test_croniter.py 2020-05-27 18:01:43.000000000 +0200 @@ -8,10 +8,22 @@ import pytz from croniter import croniter, CroniterBadDateError, CroniterBadCronError, CroniterNotAlphaError from croniter.tests import base +from tzlocal import get_localzone class CroniterTest(base.TestCase): + def testSecondSec(self): + base = datetime(2012, 4, 6, 13, 26, 10) + itr = croniter('* * * * * 15,25', base) + n = itr.get_next(datetime) + self.assertEqual(15, n.second) + n = itr.get_next(datetime) + self.assertEqual(25, n.second) + n = itr.get_next(datetime) + self.assertEqual(15, n.second) + self.assertEqual(27, n.minute) + def testSecond(self): base = datetime(2012, 4, 6, 13, 26, 10) itr = croniter('*/1 * * * * *', base) @@ -776,6 +788,27 @@ lret1 = ['{0}'.format(d[1]) for d in local_dates] self.assertEqual(sret1, lret1) + def test_std_dst3(self): + """ + DST tests + + This fixes https://github.com/taichino/croniter/issues/90 + + Adelaide, Australia: 15/04/2020 00:00 -> 15/03/2020 + + """ + + tz = pytz.timezone('Australia/Adelaide') + + schedule = croniter('0 0 24 * *', tz.localize(datetime(2020, 4,15))) + val1 = schedule.get_prev(datetime) + dt1 = tz.localize(datetime(2020, 3, 24)) + self.assertEqual(val1, dt1) + + val2 = schedule.get_next(datetime) + dt2 = tz.localize(datetime(2020, 4, 24)) + self.assertEqual(val2, dt2) + def test_error_alpha_cron(self): self.assertRaises(CroniterNotAlphaError, croniter.expand, '* * * janu-jun *') @@ -919,6 +952,78 @@ '2019-01-26 00:00:03', '2019-01-27 00:00:04']) + def test_mixdow(self): + base = datetime(2018, 10, 1, 0, 0) + itr = croniter('1 1 7,14,21,L * *', base) + self.assertTrue(isinstance(itr.get_next(), float)) + + def test_match(self): + self.assertTrue(croniter.match( + "0 0 * * *", + datetime(2019, 1, 14, 0, 0, 0, 0) + )) + self.assertFalse(croniter.match( + "0 0 * * *", + datetime(2019, 1, 14, 0, 1, 0, 0) + )) + self.assertTrue(croniter.match( + "31 * * * *", + datetime(2019, 1, 14, 1, 31, 0, 0) + )) + + + def test_dst_issue90_st31ny(self): + tz = pytz.timezone("Europe/Paris") + now = datetime(2020, 3, 29, 1, 59, 55, tzinfo=tz) + it = croniter('1 2 * * *', now) + # + # Taking around DST @ 29/03/20 01:59 + # + ret = [ + it.get_next(datetime).isoformat(), + it.get_prev(datetime).isoformat(), + it.get_prev(datetime).isoformat(), + it.get_next(datetime).isoformat(), + it.get_next(datetime).isoformat(), + ] + self.assertEqual(ret, [ + '2020-03-30T02:01:00+02:00', + '2020-03-29T01:01:00+01:00', + '2020-03-28T03:01:00+01:00', + '2020-03-29T02:01:00+02:00', + '2020-03-29T03:01:00+02:00']) + # + nowp = datetime(2020, 3, 28, 1, 58, 55, tzinfo=tz) + itp = croniter('1 2 * * *', nowp) + retp = [ + itp.get_next(datetime).isoformat(), + itp.get_prev(datetime).isoformat(), + itp.get_prev(datetime).isoformat(), + itp.get_next(datetime).isoformat(), + itp.get_next(datetime).isoformat(), + ] + self.assertEqual(retp, [ + '2020-03-29T02:01:00+02:00', + '2020-03-28T02:01:00+01:00', + '2020-03-27T02:01:00+01:00', + '2020-03-28T02:01:00+01:00', + '2020-03-29T03:01:00+02:00']) + # + nowt = datetime(2020, 3, 29, 2, 0, 0, tzinfo=tz) + itt = croniter('1 2 * * *', nowt) + rett = [ + itt.get_next(datetime).isoformat(), + itt.get_prev(datetime).isoformat(), + itt.get_prev(datetime).isoformat(), + itt.get_next(datetime).isoformat(), + itt.get_next(datetime).isoformat(), + ] + self.assertEqual(ret, [ + '2020-03-30T02:01:00+02:00', + '2020-03-29T01:01:00+01:00', + '2020-03-28T03:01:00+01:00', + '2020-03-29T02:01:00+02:00', + '2020-03-29T03:01:00+02:00']) if __name__ == '__main__': unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/src/croniter.egg-info/PKG-INFO new/croniter-0.3.32/src/croniter.egg-info/PKG-INFO --- old/croniter-0.3.31/src/croniter.egg-info/PKG-INFO 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/src/croniter.egg-info/PKG-INFO 2020-05-27 18:01:44.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: croniter -Version: 0.3.31 +Version: 0.3.32 Summary: croniter provides iteration for datetime object with cron like format Home-page: http://github.com/kiorky/croniter Author: Matsumoto Taichi, kiorky @@ -103,6 +103,30 @@ >>> local_date = tz.localize(datetime(2017, 3, 26)) >>> val = croniter('0 0 * * *', local_date).get_next(datetime) + About second repeats + ===================== + Croniter is able to do second repeatition crontabs form:: + + >>> croniter('* * * * * 1', local_date).get_next(datetime) + >>> base = datetime(2012, 4, 6, 13, 26, 10) + >>> itr = croniter('* * * * * 15,25', base) + >>> itr.get_next(datetime) # 4/6 13:26:15 + >>> itr.get_next(datetime) # 4/6 13:26:25 + >>> itr.get_next(datetime) # 4/6 13:27:15 + + You can also note that this expression will repeat every second from the start datetime. + + >>> croniter('* * * * * *', local_date).get_next(datetime) + + Testing if a date matchs a crontab + ================================== + As simple as:: + + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 0, 0, 0)) + True + >>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 2, 0, 0)) + False + Develop this package ==================== @@ -149,19 +173,31 @@ Changelog ============== + 0.3.32 (2020-05-27) + ------------------- + + - document seconds repeats, fixes #122 + [kiorky] + - Implement match method, fixes #54 + [kiorky] + - Adding tests for #127 (test more DSTs and croniter behavior around) + [kiorky] + - Changed lag_hours comparison to absolute to manage dst boundary when getting previous + [Sokkka] + 0.3.31 (2020-01-02) ------------------- - Fix get_next() when start_time less then 1s before next instant [AlexHill] + 0.3.30 (2019-04-20) ------------------- - credits - 0.3.29 (2019-03-26) ------------------- @@ -341,5 +377,7 @@ Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 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.31/src/croniter.egg-info/requires.txt new/croniter-0.3.32/src/croniter.egg-info/requires.txt --- old/croniter-0.3.31/src/croniter.egg-info/requires.txt 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/src/croniter.egg-info/requires.txt 2020-05-27 18:01:44.000000000 +0200 @@ -1 +1,2 @@ python_dateutil +natsort diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/croniter-0.3.31/tox.ini new/croniter-0.3.32/tox.ini --- old/croniter-0.3.31/tox.ini 2020-01-02 16:22:28.000000000 +0100 +++ new/croniter-0.3.32/tox.ini 2020-05-27 18:01:43.000000000 +0200 @@ -1,7 +1,7 @@ [tox] minversion = 2.3 envlist = - {py26,py27,py34,py35}-std + {py26,py27,py34,py35,py36,py37}-std py27-coverage skipsdist = true @@ -14,9 +14,8 @@ COVERAGE_FILE={envdir}/coverage_report changedir = src commands = - {py26,py27,py34,py35,py36}-std: py.test -v . - {py27,py34,py35,py36}-std: flake8 src/croniter/croniter.py + {py26,py27,py34,py35,py36,py37}-std: py.test -v . + {py27,py34,py35,py36,py37}-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 -