From 870a9fff002e72d6fd8849077c9c05444330ad73 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Fri, 7 Jul 2023 16:12:21 -0400 Subject: [PATCH] Bump importlib metadata dependency (#631) * Consolidate importlib metadata import * Rely on importlib_metadata for Python 3.9 and earlier. Fixes #630. * Bump minimum importlib-metadata to 4.6 * Apply suggestions from code review * Update _importlib.py --------- Co-authored-by: Henry Schreiner --- pyproject.toml | 2 +- src/build/_importlib.py | 14 ++++++++++++++ src/build/_util.py | 9 +++------ src/build/util.py | 14 ++++---------- tests/constraints.txt | 2 +- tests/test_projectbuilder.py | 21 ++++++++------------- tests/test_self_packaging.py | 2 ++ 7 files changed, 33 insertions(+), 31 deletions(-) create mode 100644 src/build/_importlib.py diff --git a/pyproject.toml b/pyproject.toml index dfeb60ac..04575786 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "pyproject_hooks", # not actually a runtime dependency, only supplied as there is not "recommended dependency" support 'colorama; os_name == "nt"', - 'importlib-metadata >= 0.22; python_version < "3.8"', + 'importlib-metadata >= 4.6; python_version < "3.10"', # Not required for 3.8+, but fixes a stdlib bug 'tomli >= 1.1.0; python_version < "3.11"', ] diff --git a/src/build/_importlib.py b/src/build/_importlib.py new file mode 100644 index 00000000..f95b2a69 --- /dev/null +++ b/src/build/_importlib.py @@ -0,0 +1,14 @@ +import sys + + +if sys.version_info < (3, 8): + import importlib_metadata as metadata +elif sys.version_info < (3, 9, 10) or (3, 10, 0) <= sys.version_info < (3, 10, 2): + try: + import importlib_metadata as metadata + except ModuleNotFoundError: + from importlib import metadata +else: + from importlib import metadata + +__all__ = ['metadata'] diff --git a/src/build/_util.py b/src/build/_util.py index 234297fe..0582a283 100644 --- a/src/build/_util.py +++ b/src/build/_util.py @@ -27,10 +27,7 @@ def check_dependency( """ import packaging.requirements - if sys.version_info >= (3, 8): - import importlib.metadata as importlib_metadata - else: - import importlib_metadata + from ._importlib import metadata req = packaging.requirements.Requirement(req_string) normalised_req_string = str(req) @@ -51,8 +48,8 @@ def check_dependency( return try: - dist = importlib_metadata.distribution(req.name) - except importlib_metadata.PackageNotFoundError: + dist = metadata.distribution(req.name) + except metadata.PackageNotFoundError: # dependency is not installed in the environment. yield (*ancestral_req_strings, normalised_req_string) else: diff --git a/src/build/util.py b/src/build/util.py index 9f0570ee..9f204b85 100644 --- a/src/build/util.py +++ b/src/build/util.py @@ -3,25 +3,19 @@ from __future__ import annotations import pathlib -import sys import tempfile import pyproject_hooks from . import PathType, ProjectBuilder, RunnerType +from ._importlib import metadata from .env import DefaultIsolatedEnv -if sys.version_info >= (3, 8): - import importlib.metadata as importlib_metadata -else: - import importlib_metadata - - -def _project_wheel_metadata(builder: ProjectBuilder) -> importlib_metadata.PackageMetadata: +def _project_wheel_metadata(builder: ProjectBuilder) -> metadata.PackageMetadata: with tempfile.TemporaryDirectory() as tmpdir: path = pathlib.Path(builder.metadata_path(tmpdir)) - return importlib_metadata.PathDistribution(path).metadata + return metadata.PathDistribution(path).metadata def project_wheel_metadata( @@ -29,7 +23,7 @@ def project_wheel_metadata( isolated: bool = True, *, runner: RunnerType = pyproject_hooks.quiet_subprocess_runner, -) -> importlib_metadata.PackageMetadata: +) -> metadata.PackageMetadata: """ Return the wheel metadata for a project. diff --git a/tests/constraints.txt b/tests/constraints.txt index ee7ad5f9..36446db9 100644 --- a/tests/constraints.txt +++ b/tests/constraints.txt @@ -1,4 +1,4 @@ -importlib-metadata==0.22 +importlib-metadata==4.6 packaging==19.0 pyproject_hooks==1.0 setuptools==42.0.0; python_version < "3.10" diff --git a/tests/test_projectbuilder.py b/tests/test_projectbuilder.py index f03839d3..98a96ee4 100644 --- a/tests/test_projectbuilder.py +++ b/tests/test_projectbuilder.py @@ -4,6 +4,7 @@ import copy import logging import os +import pathlib import sys import textwrap @@ -12,13 +13,7 @@ import build - -if sys.version_info >= (3, 8): # pragma: no cover - from importlib import metadata as importlib_metadata -else: # pragma: no cover - import importlib_metadata - -import pathlib +from build import _importlib build_open_owner = 'builtins' @@ -30,7 +25,7 @@ } -class MockDistribution(importlib_metadata.Distribution): +class MockDistribution(_importlib.metadata.Distribution): def locate_file(self, path): # pragma: no cover return '' @@ -48,7 +43,7 @@ def from_name(cls, name): return CircularMockDistribution() elif name == 'nested_circular_dep': return NestedCircularMockDistribution() - raise importlib_metadata.PackageNotFoundError + raise _importlib.metadata.PackageNotFoundError class ExtraMockDistribution(MockDistribution): @@ -167,7 +162,7 @@ def read_text(self, filename): ], ) def test_check_dependency(monkeypatch, requirement_string, expected): - monkeypatch.setattr(importlib_metadata, 'Distribution', MockDistribution) + monkeypatch.setattr(_importlib.metadata, 'Distribution', MockDistribution) assert next(build.check_dependency(requirement_string), None) == expected @@ -502,7 +497,7 @@ def dummy_runner(cmd, cwd=None, extra_environ=None): def test_metadata_path_no_prepare(tmp_dir, package_test_no_prepare): builder = build.ProjectBuilder(package_test_no_prepare) - metadata = importlib_metadata.PathDistribution( + metadata = _importlib.metadata.PathDistribution( pathlib.Path(builder.metadata_path(tmp_dir)), ).metadata @@ -513,7 +508,7 @@ def test_metadata_path_no_prepare(tmp_dir, package_test_no_prepare): def test_metadata_path_with_prepare(tmp_dir, package_test_setuptools): builder = build.ProjectBuilder(package_test_setuptools) - metadata = importlib_metadata.PathDistribution( + metadata = _importlib.metadata.PathDistribution( pathlib.Path(builder.metadata_path(tmp_dir)), ).metadata @@ -524,7 +519,7 @@ def test_metadata_path_with_prepare(tmp_dir, package_test_setuptools): def test_metadata_path_legacy(tmp_dir, package_legacy): builder = build.ProjectBuilder(package_legacy) - metadata = importlib_metadata.PathDistribution( + metadata = _importlib.metadata.PathDistribution( pathlib.Path(builder.metadata_path(tmp_dir)), ).metadata diff --git a/tests/test_self_packaging.py b/tests/test_self_packaging.py index 00870fdf..b134f53c 100644 --- a/tests/test_self_packaging.py +++ b/tests/test_self_packaging.py @@ -21,6 +21,7 @@ 'src/build/__init__.py', 'src/build/__main__.py', 'src/build/_exceptions.py', + 'src/build/_importlib.py', 'src/build/_util.py', 'src/build/env.py', 'src/build/py.typed', @@ -31,6 +32,7 @@ 'build/__init__.py', 'build/__main__.py', 'build/_exceptions.py', + 'build/_importlib.py', 'build/_util.py', 'build/env.py', 'build/py.typed',