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):
