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:
parent
3e0eed49c5
commit
86061ad87d
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue