Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-APScheduler for 
openSUSE:Factory checked in at 2026-08-05 17:49:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-APScheduler (Old)
 and      /work/SRC/openSUSE:Factory/.python-APScheduler.new.16738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-APScheduler"

Wed Aug  5 17:49:23 2026 rev:28 rq:1369591 version:3.11.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-APScheduler/python-APScheduler.changes    
2026-03-30 18:34:51.283976828 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-APScheduler.new.16738/python-APScheduler.changes
 2026-08-05 17:50:17.353825909 +0200
@@ -1,0 +2,12 @@
+Tue Aug  4 21:13:50 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 3.11.3:
+  * Fixed sub-minute interval jobs stalling for the duration of a
+    DST spring-forward gap when the scheduler was configured with
+    a ZoneInfo time zone, caused by the wakeup delay being
+    computed from the naive wall-clock difference instead of the
+    actual UTC difference
+  * Fixed imported jobs missing their scheduler and job store
+    links
+
+-------------------------------------------------------------------

Old:
----
  apscheduler-3.11.2.tar.gz

New:
----
  apscheduler-3.11.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-APScheduler.spec ++++++
--- /var/tmp/diff_new_pack.2hYH70/_old  2026-08-05 17:50:17.877844295 +0200
+++ /var/tmp/diff_new_pack.2hYH70/_new  2026-08-05 17:50:17.877844295 +0200
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-APScheduler
-Version:        3.11.2
+Version:        3.11.3
 Release:        0
 Summary:        In-process task scheduler with Cron-like capabilities
 License:        MIT

++++++ apscheduler-3.11.2.tar.gz -> apscheduler-3.11.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/.github/workflows/publish.yml 
new/apscheduler-3.11.3/.github/workflows/publish.yml
--- old/apscheduler-3.11.2/.github/workflows/publish.yml        2025-12-22 
01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/.github/workflows/publish.yml        2026-06-28 
21:38:54.000000000 +0200
@@ -14,7 +14,7 @@
     runs-on: ubuntu-latest
     environment: release
     steps:
-    - uses: actions/checkout@v6
+    - uses: actions/checkout@v7
     - name: Set up Python
       uses: actions/setup-python@v6
       with:
@@ -24,7 +24,7 @@
     - name: Create packages
       run: python -m build
     - name: Archive packages
-      uses: actions/upload-artifact@v5
+      uses: actions/upload-artifact@v7
       with:
         name: dist
         path: dist
@@ -38,7 +38,7 @@
       id-token: write
     steps:
     - name: Retrieve packages
-      uses: actions/download-artifact@v6
+      uses: actions/download-artifact@v8
       with:
         name: dist
         path: dist
@@ -52,7 +52,7 @@
     permissions:
       contents: write
     steps:
-    - uses: actions/checkout@v6
+    - uses: actions/checkout@v7
     - id: changelog
       uses: agronholm/release-notes@v1
       with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/.github/workflows/test.yaml 
new/apscheduler-3.11.3/.github/workflows/test.yaml
--- old/apscheduler-3.11.2/.github/workflows/test.yaml  2025-12-22 
01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/.github/workflows/test.yaml  2026-06-28 
21:38:54.000000000 +0200
@@ -10,12 +10,12 @@
     strategy:
       fail-fast: false
       matrix:
-        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
+        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v7
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v6
       with:
         python-version: ${{ matrix.python-version }}
         cache: pip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/PKG-INFO 
new/apscheduler-3.11.3/PKG-INFO
--- old/apscheduler-3.11.2/PKG-INFO     2025-12-22 01:39:10.236482000 +0100
+++ new/apscheduler-3.11.3/PKG-INFO     2026-06-28 21:39:01.962425700 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: APScheduler
-Version: 3.11.2
+Version: 3.11.3
 Summary: In-process task scheduler with Cron-like capabilities
 Author-email: Alex Grönholm <[email protected]>
 License: MIT
@@ -20,6 +20,7 @@
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Requires-Python: >=3.8
 Description-Content-Type: text/x-rst
 License-File: LICENSE.txt
@@ -49,7 +50,7 @@
 Requires-Dist: pytest; extra == "test"
 Requires-Dist: pytest-timeout; extra == "test"
 Requires-Dist: anyio>=4.5.2; extra == "test"
-Requires-Dist: PySide6; (platform_python_implementation == "CPython" and 
python_version < "3.14") and extra == "test"
+Requires-Dist: PySide6; platform_python_implementation == "CPython" and extra 
== "test"
 Requires-Dist: gevent; python_version < "3.14" and extra == "test"
 Requires-Dist: pytz; extra == "test"
 Requires-Dist: twisted; python_version < "3.14" and extra == "test"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/docs/versionhistory.rst 
new/apscheduler-3.11.3/docs/versionhistory.rst
--- old/apscheduler-3.11.2/docs/versionhistory.rst      2025-12-22 
01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/docs/versionhistory.rst      2026-06-28 
21:38:54.000000000 +0200
@@ -4,19 +4,30 @@
 To find out how to migrate your application from a previous version of
 APScheduler, see the :doc:`migration section <migration>`.
 
+**3.11.3**
+
+- Fixed sub-minute interval jobs stalling for the duration of a DST 
spring-forward gap
+  when the scheduler was configured with a ``ZoneInfo`` time zone, caused by 
the wakeup
+  delay being computed from the naive wall-clock difference instead of the 
actual UTC
+  difference
+  (`#1103 <https://github.com/agronholm/apscheduler/issues/1103>`_)
+- Fixed imported jobs missing their scheduler and job store links
+  (`#1119 <https://github.com/agronholm/apscheduler/issues/1119>`_)
+
 **3.11.2**
 
 - Fixed an issue where a job using a ``CronTrigger`` scheduled in a repeated 
time
   interval during DST transitions could cause the scheduler to get stuck in an 
infinite
   loop
-  (#1021 <https://github.com/agronholm/apscheduler/issues/1021>_; PR by 
@soulofakuma)
+  (`#1021 <https://github.com/agronholm/apscheduler/issues/1021>`_; PR by 
@soulofakuma)
 
 **3.11.1**
 
 - Fixed ``scheduler.shutdown()`` not raising ``SchedulerNotRunning`` (or 
raising the
   wrong exception) for asynchronous schedulers when the scheduler is in fact 
not running
-- Fixed ``CronTrigger`` sticking on a folded datetime during the fall-back DST 
transition
-  (#1021 <https://github.com/agronholm/apscheduler/issues/1021>_; PR by 
@berianjames)`
+- Fixed ``CronTrigger`` sticking on a folded datetime during the fall-back DST
+  transition
+  (`#1021 <https://github.com/agronholm/apscheduler/issues/1021>`_; PR by 
@berianjames)`
 
 **3.11.0**
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/pyproject.toml 
new/apscheduler-3.11.3/pyproject.toml
--- old/apscheduler-3.11.2/pyproject.toml       2025-12-22 01:39:06.000000000 
+0100
+++ new/apscheduler-3.11.3/pyproject.toml       2026-06-28 21:38:54.000000000 
+0200
@@ -22,6 +22,7 @@
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
 ]
 keywords = ["scheduling", "cron"]
 license = {text = "MIT"}
@@ -53,7 +54,7 @@
     "pytest",
     "pytest-timeout",
     "anyio >= 4.5.2",
-    "PySide6; python_implementation == 'CPython' and python_version < '3.14'",
+    "PySide6; python_implementation == 'CPython'",
     "gevent; python_version < '3.14'",
     "pytz",
     "twisted; python_version < '3.14'",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/src/APScheduler.egg-info/PKG-INFO 
new/apscheduler-3.11.3/src/APScheduler.egg-info/PKG-INFO
--- old/apscheduler-3.11.2/src/APScheduler.egg-info/PKG-INFO    2025-12-22 
01:39:10.000000000 +0100
+++ new/apscheduler-3.11.3/src/APScheduler.egg-info/PKG-INFO    2026-06-28 
21:39:01.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: APScheduler
-Version: 3.11.2
+Version: 3.11.3
 Summary: In-process task scheduler with Cron-like capabilities
 Author-email: Alex Grönholm <[email protected]>
 License: MIT
@@ -20,6 +20,7 @@
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Requires-Python: >=3.8
 Description-Content-Type: text/x-rst
 License-File: LICENSE.txt
@@ -49,7 +50,7 @@
 Requires-Dist: pytest; extra == "test"
 Requires-Dist: pytest-timeout; extra == "test"
 Requires-Dist: anyio>=4.5.2; extra == "test"
-Requires-Dist: PySide6; (platform_python_implementation == "CPython" and 
python_version < "3.14") and extra == "test"
+Requires-Dist: PySide6; platform_python_implementation == "CPython" and extra 
== "test"
 Requires-Dist: gevent; python_version < "3.14" and extra == "test"
 Requires-Dist: pytz; extra == "test"
 Requires-Dist: twisted; python_version < "3.14" and extra == "test"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/APScheduler.egg-info/SOURCES.txt 
new/apscheduler-3.11.3/src/APScheduler.egg-info/SOURCES.txt
--- old/apscheduler-3.11.2/src/APScheduler.egg-info/SOURCES.txt 2025-12-22 
01:39:10.000000000 +0100
+++ new/apscheduler-3.11.3/src/APScheduler.egg-info/SOURCES.txt 2026-06-28 
21:39:01.000000000 +0200
@@ -70,6 +70,8 @@
 src/APScheduler.egg-info/dependency_links.txt
 src/APScheduler.egg-info/entry_points.txt
 src/APScheduler.egg-info/requires.txt
+src/APScheduler.egg-info/scm_file_list.json
+src/APScheduler.egg-info/scm_version.json
 src/APScheduler.egg-info/top_level.txt
 src/apscheduler/__init__.py
 src/apscheduler/events.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/APScheduler.egg-info/requires.txt 
new/apscheduler-3.11.3/src/APScheduler.egg-info/requires.txt
--- old/apscheduler-3.11.2/src/APScheduler.egg-info/requires.txt        
2025-12-22 01:39:10.000000000 +0100
+++ new/apscheduler-3.11.3/src/APScheduler.egg-info/requires.txt        
2026-06-28 21:39:01.000000000 +0200
@@ -34,7 +34,7 @@
 anyio>=4.5.2
 pytz
 
-[test:platform_python_implementation == "CPython" and python_version < "3.14"]
+[test:platform_python_implementation == "CPython"]
 PySide6
 
 [test:python_version < "3.14"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/APScheduler.egg-info/scm_file_list.json 
new/apscheduler-3.11.3/src/APScheduler.egg-info/scm_file_list.json
--- old/apscheduler-3.11.2/src/APScheduler.egg-info/scm_file_list.json  
1970-01-01 01:00:00.000000000 +0100
+++ new/apscheduler-3.11.3/src/APScheduler.egg-info/scm_file_list.json  
2026-06-28 21:39:01.000000000 +0200
@@ -0,0 +1,123 @@
+{
+  "files": [
+    ".pre-commit-config.yaml",
+    "LICENSE.txt",
+    "pyproject.toml",
+    "README.rst",
+    ".readthedocs.yml",
+    ".gitignore",
+    "docker-compose.yml",
+    ".mailmap",
+    "docs/contributing.rst",
+    "docs/index.rst",
+    "docs/versionhistory.rst",
+    "docs/userguide.rst",
+    "docs/py-modindex.rst",
+    "docs/migration.rst",
+    "docs/conf.py",
+    "docs/extending.rst",
+    "docs/faq.rst",
+    "docs/modules/schedulers.rst",
+    "docs/modules/job.rst",
+    "docs/modules/events.rst",
+    "docs/modules/schedulers/base.rst",
+    "docs/modules/schedulers/asyncio.rst",
+    "docs/modules/schedulers/background.rst",
+    "docs/modules/schedulers/gevent.rst",
+    "docs/modules/schedulers/twisted.rst",
+    "docs/modules/schedulers/tornado.rst",
+    "docs/modules/schedulers/qt.rst",
+    "docs/modules/schedulers/blocking.rst",
+    "docs/modules/triggers/base.rst",
+    "docs/modules/triggers/date.rst",
+    "docs/modules/triggers/combining.rst",
+    "docs/modules/triggers/cron.rst",
+    "docs/modules/triggers/calendarinterval.rst",
+    "docs/modules/triggers/interval.rst",
+    "docs/modules/jobstores/base.rst",
+    "docs/modules/jobstores/memory.rst",
+    "docs/modules/jobstores/sqlalchemy.rst",
+    "docs/modules/jobstores/mongodb.rst",
+    "docs/modules/jobstores/redis.rst",
+    "docs/modules/jobstores/rethinkdb.rst",
+    "docs/modules/jobstores/zookeeper.rst",
+    "docs/modules/executors/pool.rst",
+    "docs/modules/executors/base.rst",
+    "docs/modules/executors/asyncio.rst",
+    "docs/modules/executors/gevent.rst",
+    "docs/modules/executors/twisted.rst",
+    "docs/modules/executors/debug.rst",
+    "src/apscheduler/__init__.py",
+    "src/apscheduler/events.py",
+    "src/apscheduler/job.py",
+    "src/apscheduler/util.py",
+    "src/apscheduler/schedulers/__init__.py",
+    "src/apscheduler/schedulers/twisted.py",
+    "src/apscheduler/schedulers/asyncio.py",
+    "src/apscheduler/schedulers/qt.py",
+    "src/apscheduler/schedulers/background.py",
+    "src/apscheduler/schedulers/gevent.py",
+    "src/apscheduler/schedulers/tornado.py",
+    "src/apscheduler/schedulers/base.py",
+    "src/apscheduler/schedulers/blocking.py",
+    "src/apscheduler/triggers/__init__.py",
+    "src/apscheduler/triggers/combining.py",
+    "src/apscheduler/triggers/calendarinterval.py",
+    "src/apscheduler/triggers/interval.py",
+    "src/apscheduler/triggers/date.py",
+    "src/apscheduler/triggers/base.py",
+    "src/apscheduler/triggers/cron/__init__.py",
+    "src/apscheduler/triggers/cron/fields.py",
+    "src/apscheduler/triggers/cron/expressions.py",
+    "src/apscheduler/jobstores/etcd.py",
+    "src/apscheduler/jobstores/memory.py",
+    "src/apscheduler/jobstores/__init__.py",
+    "src/apscheduler/jobstores/zookeeper.py",
+    "src/apscheduler/jobstores/sqlalchemy.py",
+    "src/apscheduler/jobstores/rethinkdb.py",
+    "src/apscheduler/jobstores/mongodb.py",
+    "src/apscheduler/jobstores/redis.py",
+    "src/apscheduler/jobstores/base.py",
+    "src/apscheduler/executors/pool.py",
+    "src/apscheduler/executors/__init__.py",
+    "src/apscheduler/executors/twisted.py",
+    "src/apscheduler/executors/asyncio.py",
+    "src/apscheduler/executors/gevent.py",
+    "src/apscheduler/executors/tornado.py",
+    "src/apscheduler/executors/debug.py",
+    "src/apscheduler/executors/base.py",
+    "tests/__init__.py",
+    "tests/test_expressions.py",
+    "tests/test_job.py",
+    "tests/test_schedulers.py",
+    "tests/test_executors.py",
+    "tests/test_jobstores.py",
+    "tests/conftest.py",
+    "tests/test_util.py",
+    "tests/triggers/test_combining.py",
+    "tests/triggers/test_cron.py",
+    "tests/triggers/test_calendarinterval.py",
+    "tests/triggers/test_date.py",
+    "tests/triggers/test_interval.py",
+    "examples/schedulers/tornado_.py",
+    "examples/schedulers/qt.py",
+    "examples/schedulers/background.py",
+    "examples/schedulers/twisted_.py",
+    "examples/schedulers/gevent_.py",
+    "examples/schedulers/blocking.py",
+    "examples/schedulers/asyncio_.py",
+    "examples/jobstores/etcd.py",
+    "examples/jobstores/zookeeper.py",
+    "examples/jobstores/rethinkdb_.py",
+    "examples/jobstores/mongodb.py",
+    "examples/jobstores/redis_.py",
+    "examples/jobstores/sqlalchemy_.py",
+    "examples/executors/processpool.py",
+    "examples/rpc/client.py",
+    "examples/rpc/server.py",
+    "examples/misc/reference.py",
+    ".github/ISSUE_TEMPLATE.md",
+    ".github/workflows/test.yaml",
+    ".github/workflows/publish.yml"
+  ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/APScheduler.egg-info/scm_version.json 
new/apscheduler-3.11.3/src/APScheduler.egg-info/scm_version.json
--- old/apscheduler-3.11.2/src/APScheduler.egg-info/scm_version.json    
1970-01-01 01:00:00.000000000 +0100
+++ new/apscheduler-3.11.3/src/APScheduler.egg-info/scm_version.json    
2026-06-28 21:39:01.000000000 +0200
@@ -0,0 +1,8 @@
+{
+  "tag": "3.11.3",
+  "distance": 0,
+  "node": "g4308ec95b94069f5dbdddb6c60fb792dfc8c40a4",
+  "dirty": false,
+  "branch": "HEAD",
+  "node_date": "2026-06-28"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/apscheduler/schedulers/base.py 
new/apscheduler-3.11.3/src/apscheduler/schedulers/base.py
--- old/apscheduler-3.11.2/src/apscheduler/schedulers/base.py   2025-12-22 
01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/src/apscheduler/schedulers/base.py   2026-06-28 
21:38:54.000000000 +0200
@@ -867,7 +867,7 @@
 
             return dct
 
-        jobstore = self._jobstores[jobstore]
+        jobstore_instance = self._jobstores[jobstore]
         with ExitStack() as stack:
             if not hasattr(infile, "read"):
                 infile = stack.enter_context(open(infile))
@@ -882,7 +882,9 @@
             for job_state in data["jobs"]:
                 job = object.__new__(Job)
                 job.__setstate__(job_state)
-                jobstore.add_job(job)
+                job._scheduler = self
+                job._jobstore_alias = jobstore
+                jobstore_instance.add_job(job)
 
     @abstractmethod
     def wakeup(self):
@@ -1253,7 +1255,7 @@
         else:
             now = datetime.now(self.timezone)
             wait_seconds = min(
-                max((next_wakeup_time - now).total_seconds(), 0), TIMEOUT_MAX
+                max((next_wakeup_time.timestamp() - now.timestamp()), 0), 
TIMEOUT_MAX
             )
             self._logger.debug(
                 "Next wakeup is due at %s (in %f seconds)",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apscheduler-3.11.2/src/apscheduler/triggers/cron/__init__.py 
new/apscheduler-3.11.3/src/apscheduler/triggers/cron/__init__.py
--- old/apscheduler-3.11.2/src/apscheduler/triggers/cron/__init__.py    
2025-12-22 01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/src/apscheduler/triggers/cron/__init__.py    
2026-06-28 21:38:54.000000000 +0200
@@ -126,6 +126,13 @@
 
         See https://en.wikipedia.org/wiki/Cron for more information on the 
format accepted here.
 
+        .. warning:: Due to a historical mistake, there is a mismatch between 
weekday
+            numbers, as APScheduler treats 0 as Monday while the original 
crontab treats
+            it as Sunday. This has been rectified in the v4.x series but 
cannot be
+            changed in the 3.x series due to backwards compatibility. See
+            `issue 286 <https://github.com/agronholm/apscheduler/issues/286>`_ 
for more
+            information.
+
         :param expr: minute, hour, day of month, month, day of week
         :param datetime.tzinfo|str timezone: time zone to use for the 
date/time calculations (
             defaults to scheduler timezone)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/tests/test_job.py 
new/apscheduler-3.11.3/tests/test_job.py
--- old/apscheduler-3.11.2/tests/test_job.py    2025-12-22 01:39:06.000000000 
+0100
+++ new/apscheduler-3.11.3/tests/test_job.py    2026-06-28 21:38:54.000000000 
+0200
@@ -150,8 +150,10 @@
 
 def test_private_modify_bad_func(job):
     """Tests that given a func of something else than a callable or string 
raises a TypeError."""
-    exc = pytest.raises(TypeError, job._modify, func=1)
-    assert str(exc.value) == "func must be a callable or a textual reference 
to one"
+    with pytest.raises(
+        TypeError, match="func must be a callable or a textual reference to 
one"
+    ):
+        job._modify(func=1)
 
 
 def test_private_modify_func_ref(job):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apscheduler-3.11.2/tests/test_schedulers.py 
new/apscheduler-3.11.3/tests/test_schedulers.py
--- old/apscheduler-3.11.2/tests/test_schedulers.py     2025-12-22 
01:39:06.000000000 +0100
+++ new/apscheduler-3.11.3/tests/test_schedulers.py     2026-06-28 
21:38:54.000000000 +0200
@@ -2,6 +2,7 @@
 import json
 import logging
 import pickle
+import sys
 from copy import deepcopy
 from datetime import datetime, timedelta, timezone
 from io import StringIO
@@ -43,7 +44,7 @@
 from apscheduler.schedulers.asyncio import AsyncIOScheduler
 from apscheduler.schedulers.base import STATE_RUNNING, STATE_STOPPED, 
BaseScheduler
 from apscheduler.triggers.base import BaseTrigger
-from apscheduler.util import undefined
+from apscheduler.util import localize, undefined
 
 
 class DummyScheduler(BaseScheduler):
@@ -779,6 +780,8 @@
         jobs.sort(key=lambda job: job.name)
 
         job = jobs.pop(0)
+        assert job._scheduler is new_scheduler
+        assert job._jobstore_alias == "default"
         assert job.name == "cronjob"
         assert job.args == ["foo", "bar"]
         assert job.kwargs == {"end": ""}
@@ -787,6 +790,8 @@
         )
 
         job = jobs.pop(0)
+        assert job._scheduler is new_scheduler
+        assert job._jobstore_alias == "default"
         assert job.name == "datejob"
         assert job.args == ["foo", "bar"]
         assert job.kwargs == {"end": ""}
@@ -795,6 +800,8 @@
         )
 
         job = jobs.pop(0)
+        assert job._scheduler is new_scheduler
+        assert job._jobstore_alias == "default"
         assert job.name == "intervaljob"
         assert job.args == ["foo", "bar"]
         assert job.kwargs == {"end": ""}
@@ -1133,6 +1140,27 @@
 
         assert scheduler._process_jobs() == 5
 
+    def test_wait_time_across_dst_transition(self, scheduler, freeze_time, 
timezone):
+        """
+        Tests that the wait time is computed from absolute (UTC) instants 
across a
+        DST spring-forward transition.
+
+        Regression test for #1103: when the scheduler time zone is a 
``ZoneInfo``
+        object, ``next_wakeup_time`` and ``now`` share the same ``tzinfo``
+        instance, so subtracting them used to ignore the UTC offsets and 
produce
+        the naive wall-clock difference. Across the spring-forward gap that
+        yielded a ~1 hour wait instead of ~1 second, stalling sub-minute 
interval
+        jobs for the entire DST gap.
+
+        """
+        now = localize(datetime(2026, 3, 29, 1, 59, 59), timezone)
+        next_run_time = localize(datetime(2026, 3, 29, 3, 0, 0), timezone)
+        jobstore = MagicMock(BaseJobStore)
+        jobstore.get_next_run_time.configure_mock(return_value=next_run_time)
+        scheduler = DummyScheduler(jobstores={"default": jobstore}, 
timezone=timezone)
+        freeze_time.set(now)
+        assert scheduler._process_jobs() == 1
+
 
 class SchedulerImplementationTestBase:
     @pytest.fixture(autouse=True)
@@ -1318,10 +1346,19 @@
 
 
 class TestQtScheduler(SchedulerImplementationTestBase):
-    @pytest.fixture(scope="class")
-    def coreapp(self):
-        QtCore = pytest.importorskip("PySide6.QtCore")
-        QtCore.QCoreApplication([])
+    if sys.version_info >= (3, 10):  # pytest 9.1.x or later
+
+        @pytest.fixture(scope="class")
+        @classmethod
+        def coreapp(cls):
+            QtCore = pytest.importorskip("PySide6.QtCore")
+            QtCore.QCoreApplication([])
+    else:
+
+        @pytest.fixture(scope="class")
+        def coreapp(self):
+            QtCore = pytest.importorskip("PySide6.QtCore")
+            QtCore.QCoreApplication([])
 
     @pytest.fixture
     def scheduler(self, coreapp):

Reply via email to