Hello community, here is the log from the commit of package python-APScheduler for openSUSE:Factory checked in at 2019-02-04 14:25:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-APScheduler (Old) and /work/SRC/openSUSE:Factory/.python-APScheduler.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-APScheduler" Mon Feb 4 14:25:22 2019 rev:5 rq:670904 version:3.5.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-APScheduler/python-APScheduler.changes 2018-10-18 15:39:25.510086392 +0200 +++ /work/SRC/openSUSE:Factory/.python-APScheduler.new.28833/python-APScheduler.changes 2019-02-04 14:25:31.113050733 +0100 @@ -1,0 +2,19 @@ +Sun Feb 3 16:13:03 UTC 2019 - Antonio Larrosa <[email protected]> + +- update to 3.5.3 + * Fixed regression introduced in 3.5.2: Class methods were mistaken + for instance methods and thus were broken during serialization + * Fixed callable name detection for methods in old style classes +- update to 3.5.2 + * Fixed scheduling of bound methods on persistent job stores (the + workaround of scheduling YourClass.methodname along with an + explicit self argument is no longer necessary as this is now done + automatically for you) + * Added the FAQ section to the docs + * Made BaseScheduler.start() raise a RuntimeError if running under + uWSGI with threads disabled +- Add fix-tests.patch to fix tests that fail with python 3.7 +- Add 0001-Correct-update_job-to-raise-with-job-id.patch from upstream + to fix a wrong variable being used. + +------------------------------------------------------------------- Old: ---- APScheduler-3.5.1.tar.gz New: ---- 0001-Correct-update_job-to-raise-with-job-id.patch APScheduler-3.5.3.tar.gz fix-tests.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-APScheduler.spec ++++++ --- /var/tmp/diff_new_pack.vkxDNi/_old 2019-02-04 14:25:31.601050502 +0100 +++ /var/tmp/diff_new_pack.vkxDNi/_new 2019-02-04 14:25:31.601050502 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-APScheduler # -# 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,13 +18,17 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-APScheduler -Version: 3.5.1 +Version: 3.5.3 Release: 0 Summary: In-process task scheduler with Cron-like capabilities License: MIT Group: Development/Languages/Python URL: http://pypi.python.org/pypi/APScheduler/ Source: https://files.pythonhosted.org/packages/source/A/APScheduler/APScheduler-%{version}.tar.gz +# PATCH-FIX-UPSTREAM fix-tests.patch -- Fix python 3.7 incompatibilities +Patch0: fix-tests.patch +# PATCH-FIX-UPSTREAM 0001-Correct-update_job-to-raise-with-job-id.patch +Patch1: 0001-Correct-update_job-to-raise-with-job-id.patch BuildRequires: %{python_module SQLAlchemy >= 0.8} BuildRequires: %{python_module Twisted} BuildRequires: %{python_module gevent} @@ -84,6 +88,8 @@ %prep %setup -q -n APScheduler-%{version} +%patch0 -p1 +%patch1 -p1 # we don't want the tweaked pytest config options rm setup.cfg ++++++ 0001-Correct-update_job-to-raise-with-job-id.patch ++++++ >From faef2bd7017f4414510b075fe71d6b43f8f2fdfc Mon Sep 17 00:00:00 2001 From: Ugrend <[email protected]> Date: Fri, 14 Dec 2018 09:23:25 +1100 Subject: [PATCH] Correct update_job to raise with job id --- apscheduler/jobstores/sqlalchemy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apscheduler/jobstores/sqlalchemy.py b/apscheduler/jobstores/sqlalchemy.py index beb27fb..fecbd83 100644 --- a/apscheduler/jobstores/sqlalchemy.py +++ b/apscheduler/jobstores/sqlalchemy.py @@ -106,7 +106,7 @@ def update_job(self, job): }).where(self.jobs_t.c.id == job.id) result = self.engine.execute(update) if result.rowcount == 0: - raise JobLookupError(id) + raise JobLookupError(job.id) def remove_job(self, job_id): delete = self.jobs_t.delete().where(self.jobs_t.c.id == job_id) ++++++ APScheduler-3.5.1.tar.gz -> APScheduler-3.5.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/.github/ISSUE_TEMPLATE.md new/APScheduler-3.5.3/.github/ISSUE_TEMPLATE.md --- old/APScheduler-3.5.1/.github/ISSUE_TEMPLATE.md 1970-01-01 01:00:00.000000000 +0100 +++ new/APScheduler-3.5.3/.github/ISSUE_TEMPLATE.md 2018-08-15 07:53:22.000000000 +0200 @@ -0,0 +1,33 @@ +This issue tracker is **ONLY** for reporting bugs. +Issues other than bug reports will be summarily closed. + +Any support questions or feature requests should be directed to: + +* [StackOverflow](http://stackoverflow.com/questions/tagged/apscheduler) +* [Gitter](https://gitter.im/apscheduler/Lobby) +* [Google groups](http://groups.google.com/group/apscheduler) + +<!--- Provide a general summary of the issue in the Title above --> + +## Expected Behavior +<!--- Tell us what should happen --> + +## Current Behavior +<!--- Tell us what happens instead of the expected behavior --> + +## Steps to Reproduce +<!--- Provide a link to a live example, or an unambiguous set of steps to --> +<!--- reproduce this bug. Include code to reproduce, if relevant --> +1. +2. +3. +4. + +## Context (Environment) +<!--- How has this issue affected you? What are you trying to accomplish? --> +<!--- Providing context helps us come up with a solution that is most useful in the real world --> + +<!--- Provide a general summary of the issue in the Title above --> + +## Detailed Description +<!--- Provide a detailed description of the change or addition you are proposing --> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/.travis.yml new/APScheduler-3.5.3/.travis.yml --- old/APScheduler-3.5.1/.travis.yml 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/.travis.yml 2018-08-15 07:53:22.000000000 +0200 @@ -65,9 +65,3 @@ webhooks: urls: - https://webhooks.gitter.im/e/f41346c0f7c22d4fe002 - irc: - channels: - - "chat.freenode.net#apscheduler" - on_success: change - use_notice: true - skip_join: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/APScheduler.egg-info/PKG-INFO new/APScheduler-3.5.3/APScheduler.egg-info/PKG-INFO --- old/APScheduler-3.5.1/APScheduler.egg-info/PKG-INFO 2018-01-16 00:12:51.000000000 +0100 +++ new/APScheduler-3.5.3/APScheduler.egg-info/PKG-INFO 2018-08-15 07:53:41.000000000 +0200 @@ -1,12 +1,11 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: APScheduler -Version: 3.5.1 +Version: 3.5.3 Summary: In-process task scheduler with Cron-like capabilities Home-page: https://github.com/agronholm/apscheduler Author: Alex Grönholm Author-email: [email protected] License: MIT -Description-Content-Type: UNKNOWN Description: .. image:: https://travis-ci.org/agronholm/apscheduler.svg?branch=master :target: https://travis-ci.org/agronholm/apscheduler :alt: Build Status @@ -80,7 +79,6 @@ If you have problems or other questions, you can either: * Ask in the `apscheduler <https://gitter.im/apscheduler/Lobby>`_ room on Gitter - * Ask on the ``#apscheduler`` channel on `Freenode IRC <http://freenode.net/irc_servers.shtml>`_ * Ask on the `APScheduler Google group <http://groups.google.com/group/apscheduler>`_, or * Ask on `StackOverflow <http://stackoverflow.com/questions/tagged/apscheduler>`_ and tag your question with the ``apscheduler`` tag @@ -96,3 +94,13 @@ Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Provides-Extra: testing +Provides-Extra: rethinkdb +Provides-Extra: redis +Provides-Extra: tornado +Provides-Extra: sqlalchemy +Provides-Extra: mongodb +Provides-Extra: zookeeper +Provides-Extra: gevent +Provides-Extra: asyncio +Provides-Extra: twisted diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/APScheduler.egg-info/SOURCES.txt new/APScheduler-3.5.3/APScheduler.egg-info/SOURCES.txt --- old/APScheduler-3.5.1/APScheduler.egg-info/SOURCES.txt 2018-01-16 00:12:51.000000000 +0100 +++ new/APScheduler-3.5.3/APScheduler.egg-info/SOURCES.txt 2018-08-15 07:53:41.000000000 +0200 @@ -8,6 +8,7 @@ setup.cfg setup.py tox.ini +.github/ISSUE_TEMPLATE.md APScheduler.egg-info/PKG-INFO APScheduler.egg-info/SOURCES.txt APScheduler.egg-info/dependency_links.txt @@ -56,6 +57,7 @@ docs/conf.py docs/contributing.rst docs/extending.rst +docs/faq.rst docs/index.rst docs/migration.rst docs/userguide.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/APScheduler.egg-info/requires.txt new/APScheduler-3.5.3/APScheduler.egg-info/requires.txt --- old/APScheduler-3.5.1/APScheduler.egg-info/requires.txt 2018-01-16 00:12:51.000000000 +0100 +++ new/APScheduler-3.5.3/APScheduler.egg-info/requires.txt 2018-08-15 07:53:41.000000000 +0200 @@ -26,9 +26,9 @@ sqlalchemy>=0.8 [testing] -pytest +pytest<3.7 pytest-cov -pytest-tornado +pytest-tornado5 [testing:python_version != "2.7"] pytest_asyncio<0.6.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/PKG-INFO new/APScheduler-3.5.3/PKG-INFO --- old/APScheduler-3.5.1/PKG-INFO 2018-01-16 00:12:51.000000000 +0100 +++ new/APScheduler-3.5.3/PKG-INFO 2018-08-15 07:53:41.000000000 +0200 @@ -1,12 +1,11 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: APScheduler -Version: 3.5.1 +Version: 3.5.3 Summary: In-process task scheduler with Cron-like capabilities Home-page: https://github.com/agronholm/apscheduler Author: Alex Grönholm Author-email: [email protected] License: MIT -Description-Content-Type: UNKNOWN Description: .. image:: https://travis-ci.org/agronholm/apscheduler.svg?branch=master :target: https://travis-ci.org/agronholm/apscheduler :alt: Build Status @@ -80,7 +79,6 @@ If you have problems or other questions, you can either: * Ask in the `apscheduler <https://gitter.im/apscheduler/Lobby>`_ room on Gitter - * Ask on the ``#apscheduler`` channel on `Freenode IRC <http://freenode.net/irc_servers.shtml>`_ * Ask on the `APScheduler Google group <http://groups.google.com/group/apscheduler>`_, or * Ask on `StackOverflow <http://stackoverflow.com/questions/tagged/apscheduler>`_ and tag your question with the ``apscheduler`` tag @@ -96,3 +94,13 @@ Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Provides-Extra: testing +Provides-Extra: rethinkdb +Provides-Extra: redis +Provides-Extra: tornado +Provides-Extra: sqlalchemy +Provides-Extra: mongodb +Provides-Extra: zookeeper +Provides-Extra: gevent +Provides-Extra: asyncio +Provides-Extra: twisted diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/README.rst new/APScheduler-3.5.3/README.rst --- old/APScheduler-3.5.1/README.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/README.rst 2018-08-15 07:53:22.000000000 +0200 @@ -71,7 +71,6 @@ If you have problems or other questions, you can either: * Ask in the `apscheduler <https://gitter.im/apscheduler/Lobby>`_ room on Gitter -* Ask on the ``#apscheduler`` channel on `Freenode IRC <http://freenode.net/irc_servers.shtml>`_ * Ask on the `APScheduler Google group <http://groups.google.com/group/apscheduler>`_, or * Ask on `StackOverflow <http://stackoverflow.com/questions/tagged/apscheduler>`_ and tag your question with the ``apscheduler`` tag diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/apscheduler/job.py new/APScheduler-3.5.3/apscheduler/job.py --- old/APScheduler-3.5.1/apscheduler/job.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/apscheduler/job.py 2018-08-15 07:53:22.000000000 +0200 @@ -1,4 +1,5 @@ from collections import Iterable, Mapping +from inspect import ismethod, isclass from uuid import uuid4 import six @@ -235,13 +236,20 @@ 'be determined. Consider giving a textual reference (module:function name) ' 'instead.' % (self.func,)) + # Instance methods cannot survive serialization as-is, so store the "self" argument + # explicitly + if ismethod(self.func) and not isclass(self.func.__self__): + args = (self.func.__self__,) + tuple(self.args) + else: + args = self.args + return { 'version': 1, 'id': self.id, 'func': self.func_ref, 'trigger': self.trigger, 'executor': self.executor, - 'args': self.args, + 'args': args, 'kwargs': self.kwargs, 'name': self.name, 'misfire_grace_time': self.misfire_grace_time, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/apscheduler/schedulers/base.py new/APScheduler-3.5.3/apscheduler/schedulers/base.py --- old/APScheduler-3.5.1/apscheduler/schedulers/base.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/apscheduler/schedulers/base.py 2018-08-15 07:53:22.000000000 +0200 @@ -127,11 +127,14 @@ :param bool paused: if ``True``, don't start job processing until :meth:`resume` is called :raises SchedulerAlreadyRunningError: if the scheduler is already running + :raises RuntimeError: if running under uWSGI with threads disabled """ if self.state != STATE_STOPPED: raise SchedulerAlreadyRunningError + self._check_uwsgi() + with self._executors_lock: # Create a default executor if nothing else is configured if 'default' not in self._executors: @@ -826,6 +829,14 @@ except BaseException: self._logger.exception('Error notifying listener') + def _check_uwsgi(self): + """Check if we're running under uWSGI with threads disabled.""" + uwsgi_module = sys.modules.get('uwsgi') + if not getattr(uwsgi_module, 'has_threads', True): + raise RuntimeError('The scheduler seems to be running under uWSGI, but threads have ' + 'been disabled. You must run uWSGI with the --enable-threads ' + 'option for the scheduler to work.') + def _real_add_job(self, job, jobstore_alias, replace_existing): """ :param Job job: the job to add diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/apscheduler/triggers/cron/__init__.py new/APScheduler-3.5.3/apscheduler/triggers/cron/__init__.py --- old/APScheduler-3.5.1/apscheduler/triggers/cron/__init__.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/apscheduler/triggers/cron/__init__.py 2018-08-15 07:53:22.000000000 +0200 @@ -1,6 +1,5 @@ from datetime import datetime, timedelta -from pytz import NonExistentTimeError, AmbiguousTimeError from tzlocal import get_localzone import six @@ -146,7 +145,7 @@ difference = datetime(**values) - dateval.replace(tzinfo=None) return self.timezone.normalize(dateval + difference), fieldnum - def _set_field_value(self, dateval, fieldnum, new_value, is_dst=None): + def _set_field_value(self, dateval, fieldnum, new_value): values = {} for i, field in enumerate(self.fields): if field.REAL: @@ -157,7 +156,7 @@ else: values[field.name] = new_value - return self.timezone.localize(datetime(**values), is_dst=is_dst) + return self.timezone.localize(datetime(**values)) def get_next_fire_time(self, previous_fire_time, now): if previous_fire_time: @@ -180,21 +179,8 @@ elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: - try: - next_date = self._set_field_value(next_date, fieldnum, next_value) - fieldnum += 1 - except NonExistentTimeError: - # Skip this field value - next_date, fieldnum = self._increment_field_value(next_date, fieldnum) - except AmbiguousTimeError: - # Try this datetime with DST set unless it's earlier than start_date, - # in which case don't set DST - next_date = self._set_field_value(next_date, fieldnum, next_value, - is_dst=True) - if next_date < start_date: - next_date = self._set_field_value(next_date, fieldnum, next_value, - is_dst=False) - fieldnum += 1 + next_date = self._set_field_value(next_date, fieldnum, next_value) + fieldnum += 1 else: next_date, fieldnum = self._increment_field_value(next_date, fieldnum) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/apscheduler/util.py new/APScheduler-3.5.3/apscheduler/util.py --- old/APScheduler-3.5.1/apscheduler/util.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/apscheduler/util.py 2018-08-15 07:53:22.000000000 +0200 @@ -5,6 +5,7 @@ from datetime import date, datetime, time, timedelta, tzinfo from calendar import timegm from functools import partial +from inspect import isclass import re from pytz import timezone, utc, FixedOffset @@ -224,7 +225,7 @@ # class methods, bound and unbound methods f_self = getattr(func, '__self__', None) or getattr(func, 'im_self', None) if f_self and hasattr(func, '__name__'): - f_class = f_self if isinstance(f_self, type) else f_self.__class__ + f_class = f_self if isclass(f_self) else f_self.__class__ else: f_class = getattr(func, 'im_class', None) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/extending.rst new/APScheduler-3.5.3/docs/extending.rst --- old/APScheduler-3.5.1/docs/extending.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/docs/extending.rst 2018-08-15 07:53:22.000000000 +0200 @@ -23,7 +23,7 @@ trigger = MyTrigger(arg1='foo') scheduler.add_job(target, trigger) -You can also register it as a plugin so you can use can use the alternate form of +You can also register it as a plugin so you can use the alternate form of ``add_jobstore``:: scheduler.add_job(target, 'my_trigger', arg1='foo') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/faq.rst new/APScheduler-3.5.3/docs/faq.rst --- old/APScheduler-3.5.1/docs/faq.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/APScheduler-3.5.3/docs/faq.rst 2018-08-15 07:53:22.000000000 +0200 @@ -0,0 +1,97 @@ +########################## +Frequently Asked Questions +########################## + +Why doesn't the scheduler run my jobs? +====================================== + +This could be caused by a number of things. The two most common issues are: + +#. Running the scheduler inside a uWSGI worker process while threads have not been enabled (see the + next section for this) +#. Running a :class:`~apscheduler.schedulers.background.BackgroundScheduler` and then letting the + execution reach the end of the script + +To demonstrate the latter case, a script like this will **not work**:: + + from apscheduler.schedulers.background import BackgroundScheduler + + def myjob(): + print('hello') + + scheduler = BackgroundScheduler() + scheduler.start() + scheduler.add_job(myjob, 'cron', hour=0) + +The script above will **exit** right after calling ``add_job()`` so the scheduler will not have a +chance to run the scheduled job. + +If you're having any other issue, then enabling debug logging as instructed in the +:ref:`troubleshooting` section should shed some light into the problem. + +How can I use APScheduler with uWSGI? +===================================== + +uWSGI employs some tricks which disable the Global Interpreter Lock and with it, the use of threads +which are vital to the operation of APScheduler. To fix this, you need to re-enable the GIL using +the ``--enable-threads`` switch. See the `uWSGI documentation <uWSGI-threads>`_ for more details. + +Also, assuming that you will run more than one worker process (as you typically would in +production), you should also read the next section. + +.. _uWSGI-threads: https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#a-note-on-python-threads + +How do I share a single job store among one or more worker processes? +===================================================================== + +Short answer: You can't. + +Long answer: Sharing a persistent job store among two or more processes will lead to incorrect +scheduler behavior like duplicate execution or the scheduler missing jobs, etc. This is because +APScheduler does not currently have any interprocess synchronization and signalling scheme that +would enable the scheduler to be notified when a job has been added, modified or removed from a job +store. + +Workaround: Run the scheduler in a dedicated process and connect to it via some sort of remote +access mechanism like RPyC_, gRPC_ or an HTTP server. The source repository contains an example_ of +a RPyC based service that is accessed by a client. + +.. _RPyC: https://rpyc.readthedocs.io/en/latest/ +.. _gRPC: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwj-wMe-1eLcAhXSbZoKHdzGDZsQFjAAegQICRAB&url=https%3A%2F%2Fgrpc.io%2F&usg=AOvVaw0Jt5Y0OKbHd8MdFt9Kc2FO +.. _example: https://github.com/agronholm/apscheduler/tree/master/examples/rpc + +How do I use APScheduler in a web application? +============================================== + +First read through the previous section. + +If you're running Django, you may want to check out django_apscheduler_. Note, however, that this +is a third party library and APScheduler developers are not responsible for it. + +Likewise, there is an unofficial extension called Flask-APScheduler_ which may or may not be useful +when running APScheduler with Flask. + +For Pyramid users, the pyramid_scheduler_ library may potentially be helpful. + +Other than that, you pretty much run APScheduler normally, usually using +:class:`~apscheduler.schedulers.background.BackgroundScheduler`. If you're running an asynchronous +web framework like aiohttp_, you probably want to use a different scheduler in order to take some +advantage of the asynchronous nature of the framework. + +Is there a graphical user interface for APScheduler? +==================================================== + +No graphical interface is provided by the library itself. However, there are some third party +implementations, but APScheduler developers are not responsible for them. Here is a potentially +incomplete list: + +* django_apscheduler_ +* apschedulerweb_ +* `Nextdoor scheduler`_ + +.. _django_apscheduler: https://pypi.org/project/django-apscheduler/ +.. _Flask-APScheduler: https://pypi.org/project/flask-apscheduler/ +.. _pyramid_scheduler: https://github.com/cadithealth/pyramid_scheduler +.. _aiohttp: https://pypi.org/project/aiohttp/ +.. _apschedulerweb: https://github.com/marwinxxii/apschedulerweb +.. _Nextdoor scheduler: https://github.com/Nextdoor/ndscheduler \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/index.rst new/APScheduler-3.5.3/docs/index.rst --- old/APScheduler-3.5.1/docs/index.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/docs/index.rst 2018-08-15 07:53:22.000000000 +0200 @@ -16,6 +16,7 @@ migration contributing extending + faq Indices and tables diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/modules/schedulers/gevent.rst new/APScheduler-3.5.3/docs/modules/schedulers/gevent.rst --- old/APScheduler-3.5.1/docs/modules/schedulers/gevent.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/docs/modules/schedulers/gevent.rst 2018-08-15 07:53:22.000000000 +0200 @@ -26,6 +26,3 @@ * - Example - ``examples/schedulers/gevent_.py`` (`view online <https://github.com/agronholm/apscheduler/tree/master/examples/schedulers/gevent_.py>`_). - -.. tip:: Until there is an official Python 3 compatible release of gevent, you can use an - `unofficial port <https://github.com/fantix/gevent>`_. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/userguide.rst new/APScheduler-3.5.3/docs/userguide.rst --- old/APScheduler-3.5.1/docs/userguide.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/docs/userguide.rst 2018-08-15 07:53:22.000000000 +0200 @@ -239,7 +239,7 @@ Starting the scheduler is done by simply calling :meth:`~apscheduler.schedulers.base.BaseScheduler.start` on the scheduler. For schedulers other -than `~apscheduler.schedulers.blocking.BlockingScheduler`, this call will return immediately and +than :class:`~apscheduler.schedulers.blocking.BlockingScheduler`, this call will return immediately and you can continue the initialization process of your application, possibly adding jobs to the scheduler. @@ -458,6 +458,8 @@ scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR) +.. _troubleshooting: + Troubleshooting --------------- @@ -473,6 +475,7 @@ This should provide lots of useful information about what's going on inside the scheduler. +Also make sure that you check the :doc:`faq` section to see if your problem already has a solution. Reporting bugs -------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/docs/versionhistory.rst new/APScheduler-3.5.3/docs/versionhistory.rst --- old/APScheduler-3.5.1/docs/versionhistory.rst 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/docs/versionhistory.rst 2018-08-15 07:53:22.000000000 +0200 @@ -4,6 +4,25 @@ To find out how to migrate your application from a previous version of APScheduler, see the :doc:`migration section <migration>`. +3.5.3 +----- + +* Fixed regression introduced in 3.5.2: Class methods were mistaken for instance methods and thus + were broken during serialization +* Fixed callable name detection for methods in old style classes + + +3.5.2 +----- + +* Fixed scheduling of bound methods on persistent job stores (the workaround of scheduling + ``YourClass.methodname`` along with an explicit ``self`` argument is no longer necessary as this + is now done automatically for you) +* Added the FAQ section to the docs +* Made ``BaseScheduler.start()`` raise a ``RuntimeError`` if running under uWSGI with threads + disabled + + 3.5.1 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/setup.py new/APScheduler-3.5.3/setup.py --- old/APScheduler-3.5.1/setup.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/setup.py 2018-08-15 07:53:22.000000000 +0200 @@ -54,9 +54,9 @@ 'twisted': ['twisted'], 'zookeeper': ['kazoo'], 'testing': [ - 'pytest', + 'pytest < 3.7', 'pytest-cov', - 'pytest-tornado' + 'pytest-tornado5' ], 'testing:python_version == "2.7"': ['mock'], 'testing:python_version != "2.7"': ['pytest_asyncio < 0.6.0'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/tests/test_jobstores.py new/APScheduler-3.5.3/tests/test_jobstores.py --- old/APScheduler-3.5.1/tests/test_jobstores.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/tests/test_jobstores.py 2018-08-15 07:53:22.000000000 +0200 @@ -18,6 +18,15 @@ pass +class DummyClass: + def dummy_method(self, a, b): + return a + b + + @classmethod + def dummy_classmethod(cls, a, b): + return a + b + + @pytest.yield_fixture def memjobstore(): yield MemoryJobStore() @@ -103,6 +112,19 @@ return create +def test_add_instance_method_job(jobstore, create_add_job): + instance = DummyClass() + initial_job = create_add_job(jobstore, instance.dummy_method, kwargs={'a': 1, 'b': 2}) + job = jobstore.lookup_job(initial_job.id) + assert job.func(*job.args, **job.kwargs) == 3 + + +def test_add_class_method_job(jobstore, create_add_job): + initial_job = create_add_job(jobstore, DummyClass.dummy_classmethod, kwargs={'a': 1, 'b': 2}) + job = jobstore.lookup_job(initial_job.id) + assert job.func(*job.args, **job.kwargs) == 3 + + def test_lookup_job(jobstore, create_add_job): initial_job = create_add_job(jobstore) job = jobstore.lookup_job(initial_job.id) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/APScheduler-3.5.1/tests/test_triggers.py new/APScheduler-3.5.3/tests/test_triggers.py --- old/APScheduler-3.5.1/tests/test_triggers.py 2018-01-16 00:12:28.000000000 +0100 +++ new/APScheduler-3.5.3/tests/test_triggers.py 2018-08-15 07:53:22.000000000 +0200 @@ -410,30 +410,6 @@ trigger = CronTrigger.from_crontab(expr, timezone) assert repr(trigger) == expected_repr - @pytest.mark.parametrize('args, now, expected', [ - ({'minute': '*/5'}, datetime(2016, 3, 27, 1, 59), datetime(2016, 3, 27, 3)), - ({'hour': 2, 'minute': 30}, datetime(2016, 3, 26, 2, 31), datetime(2016, 3, 28, 2, 30)) - ], ids=['jump_forward', 'skip_day']) - def test_dst_forward(self, args, now, expected, timezone): - trigger = CronTrigger(timezone=timezone, **args) - now = timezone.localize(now) - expected = timezone.localize(expected) - assert trigger.get_next_fire_time(None, now) == expected - - @pytest.mark.parametrize('args, previous, previous_dst, expected, expected_dst', [ - ({'minute': '*/5'}, datetime(2016, 10, 30, 2, 59), True, datetime(2016, 10, 30, 2), False), - ({'hour': 2, 'minute': 30}, datetime(2016, 10, 30, 2, 30), True, - datetime(2016, 10, 30, 2, 30), False), - ({'hour': 2, 'minute': 30}, datetime(2016, 10, 30, 1), True, - datetime(2016, 10, 30, 2, 30), True) - ], ids=['backward1', 'backward2', 'forward']) - def test_dst_backward(self, args, previous, previous_dst, expected, expected_dst, timezone): - trigger = CronTrigger(timezone=timezone, **args) - now = timezone.localize(datetime(2016, 10, 30, 4)) - previous = timezone.localize(previous, is_dst=previous_dst) - expected = timezone.localize(expected, is_dst=expected_dst) - assert trigger.get_next_fire_time(previous, now) == expected - class TestDateTrigger(object): @pytest.mark.parametrize('run_date,alter_tz,previous,now,expected', [ ++++++ fix-tests.patch ++++++ From: Antonio Larrosa <[email protected] Subject: Fix false positive tests Fix two tests that fail with python 3.7 Index: APScheduler-3.5.3/tests/test_triggers.py =================================================================== --- APScheduler-3.5.3.orig/tests/test_triggers.py +++ APScheduler-3.5.3/tests/test_triggers.py @@ -538,9 +538,13 @@ class TestIntervalTrigger(object): assert repr(trigger) == "<CronTrigger (day='1-2,4-7', timezone='Europe/Berlin')>" def test_repr(self, trigger): - assert repr(trigger) == ("<IntervalTrigger (interval=datetime.timedelta(0, 1), " - "start_date='2009-08-04 00:00:02 CEST', " - "timezone='Europe/Berlin')>") + assert (repr(trigger) == ("<IntervalTrigger (interval=datetime.timedelta(0, 1), " + "start_date='2009-08-04 00:00:02 CEST', " + "timezone='Europe/Berlin')>") or + repr(trigger) == ("<IntervalTrigger (interval=datetime.timedelta(seconds=1), " + "start_date='2009-08-04 00:00:02 CEST', " + "timezone='Europe/Berlin')>")) + def test_str(self, trigger): assert str(trigger) == "interval[0:00:01]" Index: APScheduler-3.5.3/tests/test_schedulers.py =================================================================== --- APScheduler-3.5.3.orig/tests/test_schedulers.py +++ APScheduler-3.5.3/tests/test_schedulers.py @@ -729,7 +729,9 @@ Jobstore other: def test_create_trigger_bad_plugin_type(self, scheduler): scheduler._trigger_classes = {} - scheduler._trigger_plugins = {'dummy': MagicMock(return_value=object)} + mock = MagicMock() + mock.load = MagicMock(return_value=object) + scheduler._trigger_plugins = {'dummy': mock} exc = pytest.raises(TypeError, scheduler._create_trigger, 'dummy', {}) assert str(exc.value) == 'The trigger entry point does not point to a trigger class'
