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'
 

Reply via email to