Remove final use of pkg_resources

'pkg_resources' is slow, while 'importlib.metadata' is the new shiny and
is *much* faster. Recent version of 'importlib.metadata' - namely those
found in Python 3.10 or provided by the 4.4 'importlib-metadata'
backport - now provide the last bit of functionality we were missing to
remove 'pkg_resources' entirely, namely the ability to map package names
to modules. This is used for generating epilogs.

The benefits of this are huge, yielding a near 40% decrease in runtime
for the cliffdemo app (100mS after compared to 160mS) before.

Change-Id: I934d8a196d76622671781643f36bdb8a07d2f319
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2022-05-18 12:22:26 +01:00
parent 3e0eed49c5
commit 86061ad87d
2 changed files with 9 additions and 17 deletions

View File

@ -13,6 +13,7 @@
import abc import abc
import inspect import inspect
import importlib_metadata
from stevedore import extension from stevedore import extension
from cliff import _argparse from cliff import _argparse
@ -27,26 +28,15 @@ def _get_distributions_by_modules():
distribution name (the name used with pip and PyPI) do not distribution name (the name used with pip and PyPI) do not
always match. We want to report which distribution caused the always match. We want to report which distribution caused the
command to be installed, so we need to look up the values. command to be installed, so we need to look up the values.
""" """
import pkg_resources
global _dists_by_mods global _dists_by_mods
if _dists_by_mods is None: if _dists_by_mods is None:
results = {} # There can be multiple distribution in the case of namespace packages
for dist in pkg_resources.working_set: # so we'll just grab the first one
try: _dists_by_mods = {
mod_names = dist.get_metadata('top_level.txt').strip() k: v[0] for k, v in
except Exception: importlib_metadata.packages_distributions().items()
# Could not retrieve metadata. Either the file is not }
# present or we cannot read it. Ignore the
# distribution.
pass
else:
# Distributions may include multiple top-level
# packages (see setuptools for an example).
for mod_name in mod_names.splitlines():
results[mod_name] = dist.project_name
_dists_by_mods = results
return _dists_by_mods return _dists_by_mods

View File

@ -1,4 +1,6 @@
autopage>=0.4.0 # Apache 2.0 autopage>=0.4.0 # Apache 2.0
# TODO: Drop this when Python 3.10 is our minimum supported version
importlib_metadata>=4.4 # Apache-2.0
cmd2>=1.0.0 # MIT cmd2>=1.0.0 # MIT
PrettyTable>=0.7.2 # BSD PrettyTable>=0.7.2 # BSD
stevedore>=2.0.1 # Apache-2.0 stevedore>=2.0.1 # Apache-2.0