From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PULL 35/51] mkvenv: assume presence of importlib.metadata
Date: Thu, 7 Sep 2023 14:59:44 +0200 [thread overview]
Message-ID: <20230907130004.500601-36-pbonzini@redhat.com> (raw)
In-Reply-To: <20230907130004.500601-1-pbonzini@redhat.com>
importlib.metadata is included in Python 3.8, so there is no
need to fallback to either importlib-metadata or pkgresources
when generating console script shims.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
python/scripts/mkvenv.py | 197 ++++++---------------------------------
python/setup.cfg | 9 --
2 files changed, 28 insertions(+), 178 deletions(-)
diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index 57a24948031..6797e12e349 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -61,7 +61,6 @@
"""
-# The duplication between importlib and pkg_resources does not help
# pylint: disable=too-many-lines
# Copyright (C) 2022-2023 Red Hat, Inc.
@@ -74,6 +73,13 @@
# later. See the COPYING file in the top-level directory.
import argparse
+from importlib.metadata import (
+ Distribution,
+ EntryPoint,
+ PackageNotFoundError,
+ distribution,
+ version,
+)
from importlib.util import find_spec
import logging
import os
@@ -428,25 +434,7 @@ def _stringify(data: Union[str, bytes]) -> str:
print(builder.get_value("env_exe"))
-def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
- # pylint: disable=import-outside-toplevel
- # pylint: disable=no-name-in-module
- # pylint: disable=import-error
- try:
- # First preference: Python 3.8+ stdlib
- from importlib.metadata import ( # type: ignore
- EntryPoint,
- PackageNotFoundError,
- distribution,
- )
- except ImportError as exc:
- logger.debug("%s", str(exc))
- # Second preference: Commonly available PyPI backport
- from importlib_metadata import ( # type: ignore
- EntryPoint,
- PackageNotFoundError,
- distribution,
- )
+def _get_entry_points(packages: Sequence[str]) -> Iterator[str]:
def _generator() -> Iterator[str]:
for package in packages:
@@ -468,24 +456,6 @@ def _generator() -> Iterator[str]:
return _generator()
-def _gen_pkg_resources(packages: Sequence[str]) -> Iterator[str]:
- # pylint: disable=import-outside-toplevel
- # Bundled with setuptools; has a good chance of being available.
- import pkg_resources
-
- def _generator() -> Iterator[str]:
- for package in packages:
- try:
- eps = pkg_resources.get_entry_map(package, "console_scripts")
- except pkg_resources.DistributionNotFound:
- continue
-
- for entry_point in eps.values():
- yield str(entry_point)
-
- return _generator()
-
-
def generate_console_scripts(
packages: Sequence[str],
python_path: Optional[str] = None,
@@ -510,30 +480,11 @@ def generate_console_scripts(
if not packages:
return
- def _get_entry_points() -> Iterator[str]:
- """Python 3.7 compatibility shim for iterating entry points."""
- # Python 3.8+, or Python 3.7 with importlib_metadata installed.
- try:
- return _gen_importlib(packages)
- except ImportError as exc:
- logger.debug("%s", str(exc))
-
- # Python 3.7 with setuptools installed.
- try:
- return _gen_pkg_resources(packages)
- except ImportError as exc:
- logger.debug("%s", str(exc))
- raise Ouch(
- "Neither importlib.metadata nor pkg_resources found, "
- "can't generate console script shims.\n"
- "Use Python 3.8+, or install importlib-metadata or setuptools."
- ) from exc
-
maker = distlib.scripts.ScriptMaker(None, bin_path)
maker.variants = {""}
maker.clobber = False
- for entry_point in _get_entry_points():
+ for entry_point in _get_entry_points(packages):
for filename in maker.make(entry_point):
logger.debug("wrote console_script '%s'", filename)
@@ -587,57 +538,6 @@ def pkgname_from_depspec(dep_spec: str) -> str:
return match.group(0)
-def _get_path_importlib(package: str) -> Optional[str]:
- # pylint: disable=import-outside-toplevel
- # pylint: disable=no-name-in-module
- # pylint: disable=import-error
- try:
- # First preference: Python 3.8+ stdlib
- from importlib.metadata import ( # type: ignore
- PackageNotFoundError,
- distribution,
- )
- except ImportError as exc:
- logger.debug("%s", str(exc))
- # Second preference: Commonly available PyPI backport
- from importlib_metadata import ( # type: ignore
- PackageNotFoundError,
- distribution,
- )
-
- try:
- return str(distribution(package).locate_file("."))
- except PackageNotFoundError:
- return None
-
-
-def _get_path_pkg_resources(package: str) -> Optional[str]:
- # pylint: disable=import-outside-toplevel
- # Bundled with setuptools; has a good chance of being available.
- import pkg_resources
-
- try:
- return str(pkg_resources.get_distribution(package).location)
- except pkg_resources.DistributionNotFound:
- return None
-
-
-def _get_path(package: str) -> Optional[str]:
- try:
- return _get_path_importlib(package)
- except ImportError as exc:
- logger.debug("%s", str(exc))
-
- try:
- return _get_path_pkg_resources(package)
- except ImportError as exc:
- logger.debug("%s", str(exc))
- raise Ouch(
- "Neither importlib.metadata nor pkg_resources found. "
- "Use Python 3.8+, or install importlib-metadata or setuptools."
- ) from exc
-
-
def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
try:
return (
@@ -647,65 +547,14 @@ def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
return False
-def _is_system_package(package: str) -> bool:
- path = _get_path(package)
- return path is not None and not (
+def _is_system_package(dist: Distribution) -> bool:
+ path = str(dist.locate_file("."))
+ return not (
_path_is_prefix(sysconfig.get_path("purelib"), path)
or _path_is_prefix(sysconfig.get_path("platlib"), path)
)
-def _get_version_importlib(package: str) -> Optional[str]:
- # pylint: disable=import-outside-toplevel
- # pylint: disable=no-name-in-module
- # pylint: disable=import-error
- try:
- # First preference: Python 3.8+ stdlib
- from importlib.metadata import ( # type: ignore
- PackageNotFoundError,
- distribution,
- )
- except ImportError as exc:
- logger.debug("%s", str(exc))
- # Second preference: Commonly available PyPI backport
- from importlib_metadata import ( # type: ignore
- PackageNotFoundError,
- distribution,
- )
-
- try:
- return str(distribution(package).version)
- except PackageNotFoundError:
- return None
-
-
-def _get_version_pkg_resources(package: str) -> Optional[str]:
- # pylint: disable=import-outside-toplevel
- # Bundled with setuptools; has a good chance of being available.
- import pkg_resources
-
- try:
- return str(pkg_resources.get_distribution(package).version)
- except pkg_resources.DistributionNotFound:
- return None
-
-
-def _get_version(package: str) -> Optional[str]:
- try:
- return _get_version_importlib(package)
- except ImportError as exc:
- logger.debug("%s", str(exc))
-
- try:
- return _get_version_pkg_resources(package)
- except ImportError as exc:
- logger.debug("%s", str(exc))
- raise Ouch(
- "Neither importlib.metadata nor pkg_resources found. "
- "Use Python 3.8+, or install importlib-metadata or setuptools."
- ) from exc
-
-
def diagnose(
dep_spec: str,
online: bool,
@@ -731,7 +580,11 @@ def diagnose(
bad = False
pkg_name = pkgname_from_depspec(dep_spec)
- pkg_version = _get_version(pkg_name)
+ pkg_version: Optional[str] = None
+ try:
+ pkg_version = version(pkg_name)
+ except PackageNotFoundError:
+ pass
lines = []
@@ -868,19 +721,25 @@ def _do_ensure(
constraint = _make_version_constraint(info, False)
matcher = distlib.version.LegacyMatcher(name + constraint)
print(f"mkvenv: checking for {matcher}", file=sys.stderr)
- ver = _get_version(name)
+
+ dist: Optional[Distribution] = None
+ try:
+ dist = distribution(matcher.name)
+ except PackageNotFoundError:
+ pass
+
if (
- ver is None
+ dist is None
# Always pass installed package to pip, so that they can be
# updated if the requested version changes
- or not _is_system_package(name)
- or not matcher.match(distlib.version.LegacyVersion(ver))
+ or not _is_system_package(dist)
+ or not matcher.match(distlib.version.LegacyVersion(dist.version))
):
absent.append(name + _make_version_constraint(info, True))
if len(absent) == 1:
canary = info.get("canary", None)
else:
- logger.info("found %s %s", name, ver)
+ logger.info("found %s %s", name, dist.version)
present.append(name)
if present:
diff --git a/python/setup.cfg b/python/setup.cfg
index f6d2d8a1362..8c67dce4579 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -108,15 +108,6 @@ ignore_missing_imports = True
[mypy-pygments]
ignore_missing_imports = True
-[mypy-importlib.metadata]
-ignore_missing_imports = True
-
-[mypy-importlib_metadata]
-ignore_missing_imports = True
-
-[mypy-pkg_resources]
-ignore_missing_imports = True
-
[mypy-distlib]
ignore_missing_imports = True
--
2.41.0
next prev parent reply other threads:[~2023-09-07 13:07 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-07 12:59 [PULL 00/51] Build system, i386 changes for 2023-09-07 Paolo Bonzini
2023-09-07 12:59 ` [PULL 01/51] linux-user, bsd-user: disable on unsupported host architectures Paolo Bonzini
2023-09-07 12:59 ` [PULL 02/51] target/i386: raise FERR interrupt with iothread locked Paolo Bonzini
2023-09-07 12:59 ` [PULL 03/51] target/i386: generalize operand size "ph" for use in CVTPS2PD Paolo Bonzini
2023-09-07 12:59 ` [PULL 04/51] target/i386: fix memory operand size for CVTPS2PD Paolo Bonzini
2023-09-07 12:59 ` [PULL 05/51] target/i386: Add support for AMX-COMPLEX in CPUID enumeration Paolo Bonzini
2023-09-07 12:59 ` [PULL 06/51] include/sysemu/os-posix.h: move *daemonize* declarations together Paolo Bonzini
2023-09-07 12:59 ` [PULL 07/51] os-posix.c: create and export os_set_runas() Paolo Bonzini
2023-09-07 12:59 ` [PULL 08/51] os-posix.c: create and export os_set_chroot() Paolo Bonzini
2023-09-07 12:59 ` [PULL 09/51] os-posix.c, softmmu/vl.c: move os_parse_cmd_args() into qemu_init() Paolo Bonzini
2023-09-07 12:59 ` [PULL 10/51] os-posix.c: move code around Paolo Bonzini
2023-09-07 12:59 ` [PULL 11/51] os-posix.c: remove unneeded #includes Paolo Bonzini
2023-09-07 12:59 ` [PULL 12/51] softmmu/vl.c: inline include/qemu/qemu-options.h into vl.c Paolo Bonzini
2023-09-07 12:59 ` [PULL 13/51] util/async-teardown.c: move to softmmu/, only build it when system build is requested Paolo Bonzini
2023-09-07 12:59 ` [PULL 14/51] contrib/plugins: remove -soname argument Paolo Bonzini
2023-09-07 12:59 ` [PULL 15/51] contrib/plugins/cache: Fix string format Paolo Bonzini
2023-09-07 12:59 ` [PULL 16/51] contrib/plugins/drcov: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 17/51] contrib/plugins/howvec: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 18/51] contrib/plugins/lockstep: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 19/51] contrib/plugins: add Darwin support Paolo Bonzini
2023-09-07 12:59 ` [PULL 20/51] meson: do not unnecessarily use cmake for dependencies Paolo Bonzini
2023-09-07 12:59 ` [PULL 21/51] meson: update unsupported host/CPU messages Paolo Bonzini
2023-09-07 12:59 ` [PULL 22/51] configure: remove HOST_CC Paolo Bonzini
2023-09-07 12:59 ` [PULL 23/51] configure: create native file with contents of $host_cc Paolo Bonzini
2023-09-07 12:59 ` [PULL 24/51] meson: compile bundled device trees Paolo Bonzini
2023-09-08 16:27 ` Philippe Mathieu-Daudé
2023-09-08 17:20 ` Michael Tokarev
2023-09-08 19:21 ` BALATON Zoltan
2023-09-08 19:40 ` Michael Tokarev
2023-09-08 20:07 ` BALATON Zoltan
2023-09-11 14:48 ` Philippe Mathieu-Daudé
2023-09-11 15:16 ` Peter Maydell
2023-09-07 12:59 ` [PULL 25/51] configure: remove boolean variables for targets Paolo Bonzini
2023-09-07 12:59 ` [PULL 26/51] configure: move --enable-debug-tcg to meson Paolo Bonzini
2023-09-07 12:59 ` [PULL 27/51] contrib/plugins: use an independent makefile Paolo Bonzini
2023-09-07 12:59 ` [PULL 28/51] configure: unify recursion into sub-Makefiles Paolo Bonzini
2023-09-07 12:59 ` [PULL 29/51] configure, meson: move --enable-plugins to meson Paolo Bonzini
2023-09-07 12:59 ` [PULL 30/51] configure, meson: remove CONFIG_SOLARIS from config-host.mak Paolo Bonzini
2023-09-07 12:59 ` [PULL 31/51] configure, meson: remove target OS symbols " Paolo Bonzini
2023-09-07 12:59 ` [PULL 32/51] meson: list leftover CONFIG_* symbols Paolo Bonzini
2023-09-07 12:59 ` [PULL 33/51] configure: remove dead code Paolo Bonzini
2023-09-07 12:59 ` [PULL 34/51] Python: Drop support for Python 3.7 Paolo Bonzini
2023-09-07 12:59 ` Paolo Bonzini [this message]
2023-09-07 12:59 ` [PULL 36/51] Revert "mkvenv: work around broken pip installations on Debian 10" Paolo Bonzini
2023-09-07 12:59 ` [PULL 37/51] hw/i386/pc: Include missing 'sysemu/tcg.h' header Paolo Bonzini
2023-09-07 12:59 ` [PULL 38/51] hw/i386/pc: Include missing 'cpu.h' header Paolo Bonzini
2023-09-07 12:59 ` [PULL 39/51] hw/i386/fw_cfg: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 40/51] target/i386/helper: Restrict KVM declarations to system emulation Paolo Bonzini
2023-09-07 12:59 ` [PULL 41/51] target/i386/cpu-sysemu: Inline kvm_apic_in_kernel() Paolo Bonzini
2023-09-07 12:59 ` [PULL 42/51] target/i386: Remove unused KVM stubs Paolo Bonzini
2023-09-07 12:59 ` [PULL 43/51] target/i386: Allow elision of kvm_enable_x2apic() Paolo Bonzini
2023-09-07 12:59 ` [PULL 44/51] target/i386: Allow elision of kvm_hv_vpindex_settable() Paolo Bonzini
2023-09-07 12:59 ` [PULL 45/51] target/i386: Restrict declarations specific to CONFIG_KVM Paolo Bonzini
2023-09-07 12:59 ` [PULL 46/51] sysemu/kvm: Restrict kvm_arch_get_supported_cpuid/msr() to x86 targets Paolo Bonzini
2023-09-07 12:59 ` [PULL 47/51] sysemu/kvm: Restrict kvm_get_apic_state() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 48/51] sysemu/kvm: Restrict kvm_has_pit_state2() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 49/51] sysemu/kvm: Restrict kvm_pc_setup_irq_routing() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 50/51] subprojects: add wrap file for libblkio Paolo Bonzini
2023-10-11 5:35 ` Philippe Mathieu-Daudé
2023-10-11 8:47 ` Daniel P. Berrangé
2023-10-11 20:58 ` Stefan Hajnoczi
2023-10-12 7:14 ` Daniel P. Berrangé
2023-09-07 13:00 ` [PULL 51/51] docs/system/replay: do not show removed command line option Paolo Bonzini
2023-09-07 15:44 ` [PULL 00/51] Build system, i386 changes for 2023-09-07 Stefan Hajnoczi
2023-09-08 15:01 ` Kevin Wolf
2023-09-08 15:47 ` Stefan Hajnoczi
2023-09-11 10:10 ` Philippe Mathieu-Daudé
2023-09-11 10:22 ` Philippe Mathieu-Daudé
2023-09-11 12:12 ` Kevin Wolf
2023-09-11 11:06 ` Stefan Hajnoczi
2023-09-11 12:40 ` Thomas Huth
2023-09-08 16:11 ` Philippe Mathieu-Daudé
2023-09-08 17:16 ` Kevin Wolf
2023-09-08 17:22 ` Daniel P. Berrangé
2023-09-08 17:28 ` Michael Tokarev
2023-09-08 17:28 ` Kevin Wolf
2023-09-08 19:21 ` Paolo Bonzini
2023-09-11 10:11 ` Philippe Mathieu-Daudé
2023-09-11 14:18 ` Philippe Mathieu-Daudé
2023-09-11 10:41 ` Michael Tokarev
2023-09-11 10:44 ` Michael Tokarev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230907130004.500601-36-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).