From 72faa11e27ffb82fe84c5438e0c40c0d64120bfd Mon Sep 17 00:00:00 2001 From: Tal Einat <532281+taleinat@users.noreply.github.com> Date: Wed, 22 Mar 2023 21:53:05 +0200 Subject: [PATCH 1/3] Replace pkg_resources.parse_version with packaging.version.parse This is a step towards removing the dependency on pkg_resources, which is part of setuptools, and thus makes setuptools a runtime dependency. --- gunicorn/workers/geventlet.py | 2 +- gunicorn/workers/ggevent.py | 2 +- setup.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 4daf6d1c..e8086746 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -11,7 +11,7 @@ try: except ImportError: raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") else: - from pkg_resources import parse_version + from packaging.version import parse as parse_version if parse_version(eventlet.__version__) < parse_version('0.24.1'): raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 0a844db3..fa38fdbd 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -14,7 +14,7 @@ try: except ImportError: raise RuntimeError("gevent worker requires gevent 1.4 or higher") else: - from pkg_resources import parse_version + from packaging.version import parse as parse_version if parse_version(gevent.__version__) < parse_version('1.4'): raise RuntimeError("gevent worker requires gevent 1.4 or higher") diff --git a/setup.py b/setup.py index bfe5e45d..f2fd73c4 100644 --- a/setup.py +++ b/setup.py @@ -75,6 +75,7 @@ install_requires = [ # is the first version to support Python 3.4 which we require as a # floor. 'setuptools>=3.0', + 'packaging', ] extras_require = { From b8d6b1e97cb318ce16cf7ed0db471fbb01481202 Mon Sep 17 00:00:00 2001 From: Tal Einat <532281+taleinat@users.noreply.github.com> Date: Wed, 22 Mar 2023 21:56:52 +0200 Subject: [PATCH 2/3] Add myself to THANKS --- THANKS | 1 + 1 file changed, 1 insertion(+) diff --git a/THANKS b/THANKS index 524ab48b..552675f0 100644 --- a/THANKS +++ b/THANKS @@ -168,6 +168,7 @@ Stephen DiCato Stephen Holsapple Steven Cummings Sébastien Fievet +Tal Einat <532281+taleinat@users.noreply.github.com> Talha Malik TedWantsMore Teko012 <112829523+Teko012@users.noreply.github.com> From 7f480daf071d134664ba4b525b2b821f704e0136 Mon Sep 17 00:00:00 2001 From: Maxwell G Date: Tue, 4 Apr 2023 18:50:22 +0000 Subject: [PATCH 3/3] replace pkg_resources.load_entry_point pkg_resources is deprecated. Use the corresponding importlib.metadata interface instead. Use the stdlib version on python >= 3.8 and use the importlib_metadata backport on older versions. --- gunicorn/util.py | 18 +++++++++++++++--- setup.py | 6 +----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gunicorn/util.py b/gunicorn/util.py index b7cdd4e2..a330d9f1 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -22,7 +22,10 @@ import time import traceback import warnings -import pkg_resources +try: + import importlib.metadata as importlib_metadata +except ImportError: + import importlib_metadata from gunicorn.errors import AppImportError from gunicorn.workers import SUPPORTED_WORKERS @@ -54,6 +57,15 @@ except ImportError: pass +def load_entry_point(distribution, group, name): + dist_obj = importlib_metadata.distribution(distribution) + eps = [ep for ep in dist_obj.entry_points + if ep.group == group and ep.name == name] + if not eps: + raise ImportError("Entry point %r not found" % ((group, name),)) + return eps[0].load() + + def load_class(uri, default="gunicorn.workers.sync.SyncWorker", section="gunicorn.workers"): if inspect.isclass(uri): @@ -68,7 +80,7 @@ def load_class(uri, default="gunicorn.workers.sync.SyncWorker", name = default try: - return pkg_resources.load_entry_point(dist, section, name) + return load_entry_point(dist, section, name) except Exception: exc = traceback.format_exc() msg = "class uri %r invalid or not found: \n\n[%s]" @@ -85,7 +97,7 @@ def load_class(uri, default="gunicorn.workers.sync.SyncWorker", break try: - return pkg_resources.load_entry_point( + return load_entry_point( "gunicorn", section, uri ) except Exception: diff --git a/setup.py b/setup.py index f2fd73c4..434bdc26 100644 --- a/setup.py +++ b/setup.py @@ -70,11 +70,7 @@ class PyTestCommand(TestCommand): install_requires = [ - # We depend on functioning pkg_resources.working_set.add_entry() and - # pkg_resources.load_entry_point(). These both work as of 3.0 which - # is the first version to support Python 3.4 which we require as a - # floor. - 'setuptools>=3.0', + 'importlib_metadata; python_version<"3.8"', 'packaging', ]