From 3afb91c1ac0efafd14db2246299579ffe47ae828 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Tue, 4 Apr 2023 11:54:53 +0300 Subject: [3.x] Fix pkg_resources deprecation - use importlib.metadata when available (#726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix pkg_resources deprecation - use importlib.metadata when available Usage of pkg_resources now emits a deprecation warning. It is also quite slow (just importing it). Use importlib.metadata instead which is the recommended alternative. * Use importlib-metadata backport for older pythons * Removed setuptools as a run-time dependency --------- Co-authored-by: Alex Grönholm --- apscheduler/__init__.py | 13 +++++++++---- apscheduler/schedulers/base.py | 18 ++++++++++++++---- setup.py | 4 ++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/apscheduler/__init__.py b/apscheduler/__init__.py index 968169a..651aba4 100644 --- a/apscheduler/__init__.py +++ b/apscheduler/__init__.py @@ -1,10 +1,15 @@ -from pkg_resources import get_distribution, DistributionNotFound +import sys +if sys.version_info >= (3, 8): + import importlib.metadata as importlib_metadata +else: + import importlib_metadata + try: - release = get_distribution('APScheduler').version.split('-')[0] -except DistributionNotFound: + release = importlib_metadata.version('APScheduler').split('-')[0] +except importlib_metadata.PackageNotFoundError: release = '3.5.0' version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.')) version = __version__ = '.'.join(str(x) for x in version_info[:3]) -del get_distribution, DistributionNotFound +del sys, importlib_metadata diff --git a/apscheduler/schedulers/base.py b/apscheduler/schedulers/base.py index 444de8e..3ce2bfc 100644 --- a/apscheduler/schedulers/base.py +++ b/apscheduler/schedulers/base.py @@ -7,7 +7,6 @@ from logging import getLogger import warnings import sys -from pkg_resources import iter_entry_points from tzlocal import get_localzone import six @@ -31,6 +30,11 @@ try: except ImportError: from collections import MutableMapping +try: + from importlib.metadata import entry_points +except ModuleNotFoundError: + from importlib_metadata import entry_points + #: constant indicating a scheduler's stopped state STATE_STOPPED = 0 #: constant indicating a scheduler's running state (started and processing jobs) @@ -62,12 +66,18 @@ class BaseScheduler(six.with_metaclass(ABCMeta)): .. seealso:: :ref:`scheduler-config` """ + # The `group=...` API is only available in the backport, used in <=3.7, and in std>=3.10. + if (3, 8) <= sys.version_info <= (3, 9): + _trigger_plugins = {ep.name: ep for ep in entry_points()['apscheduler.triggers']} + _executor_plugins = {ep.name: ep for ep in entry_points()['apscheduler.executors']} + _jobstore_plugins = {ep.name: ep for ep in entry_points()['apscheduler.jobstores']} + else: + _trigger_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.triggers')} + _executor_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.executors')} + _jobstore_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.jobstores')} - _trigger_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.triggers')) _trigger_classes = {} - _executor_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.executors')) _executor_classes = {} - _jobstore_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.jobstores')) _jobstore_classes = {} # diff --git a/setup.py b/setup.py index 3b452aa..cd93e10 100644 --- a/setup.py +++ b/setup.py @@ -39,10 +39,10 @@ setup( 'setuptools_scm' ], install_requires=[ - 'setuptools >= 0.7', 'six >= 1.4.0', 'pytz', - 'tzlocal >= 2.0, != 3.*' + 'tzlocal >= 2.0, != 3.*', + 'importlib-metadata >= 3.6.0; python_version < "3.8"', ], extras_require={ 'gevent': ['gevent'], -- cgit v1.2.1