diff --git a/kedro/framework/cli/micropkg.py b/kedro/framework/cli/micropkg.py index 9fabcba31e..b84358cd4d 100644 --- a/kedro/framework/cli/micropkg.py +++ b/kedro/framework/cli/micropkg.py @@ -15,11 +15,13 @@ import click from packaging.requirements import InvalidRequirement, Requirement from packaging.utils import canonicalize_name +from pyproject_metadata import StandardMetadata from rope.base.project import Project from rope.contrib import generate from rope.refactor.move import MoveModule from rope.refactor.rename import Rename from setuptools.discovery import FlatLayoutPackageFinder +import toml from build.util import project_wheel_metadata from kedro.framework.cli.pipeline import ( @@ -210,12 +212,8 @@ def _pull_package( # noqa: too-many-arguments ) project_root_dir = contents[0] - # This is much slower than parsing the requirements - # directly from the metadata files - # because it installs the package in an isolated environment, - # but it's the only reliable way of doing it - # without making assumptions on the project metadata. - library_meta = project_wheel_metadata(project_root_dir) + with open(project_root_dir / "pyproject.toml") as fh: + library_meta = StandardMetadata.from_pyproject(toml.load(fh)) # Project name will be `my-pipeline` even if `pyproject.toml` says `my_pipeline` # because standards mandate normalization of names for comparison, @@ -971,10 +969,7 @@ def _get_all_library_reqs(metadata): """Get all library requirements from metadata, leaving markers intact.""" # See https://discuss.python.org/t/\ # programmatically-getting-non-optional-requirements-of-current-directory/26963/2 - return [ - str(_EquivalentRequirement(dep_str)) - for dep_str in metadata.get_all("Requires-Dist", []) - ] + return [str(_EquivalentRequirement(str(dep))) for dep in metadata.dependencies] def _safe_parse_requirements( diff --git a/pyproject.toml b/pyproject.toml index 00810d6600..59eaf5f469 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,6 @@ requires-python = ">=3.8" dependencies = [ "anyconfig>=0.10.0", "attrs>=21.3", - "build>=0.7.0", "cachetools>=4.1", "click>=4.0", "cookiecutter>=2.1.1,<3.0", @@ -30,6 +29,7 @@ dependencies = [ "parse>=1.19.0", "pip-tools>=6.5", "pluggy>=1.0", + "pyproject_metadata", "PyYAML>=4.2,<7.0", "rich>=12.0,<14.0", "rope>=0.21,<2.0", # subject to LGPLv3 license diff --git a/tests/framework/cli/micropkg/test_micropkg_pull.py b/tests/framework/cli/micropkg/test_micropkg_pull.py index 13754d9503..0b88dd1e65 100644 --- a/tests/framework/cli/micropkg/test_micropkg_pull.py +++ b/tests/framework/cli/micropkg/test_micropkg_pull.py @@ -584,17 +584,6 @@ def test_pull_from_pypi( return_value=tmp_path, ) - # Mock needed to avoid an error when build.util.project_wheel_metadata - # calls tempfile.TemporaryDirectory, which is mocked - class _FakeWheelMetadata: - def get_all(self, name, failobj=None): - return [] - - mocker.patch( - "kedro.framework.cli.micropkg.project_wheel_metadata", - return_value=_FakeWheelMetadata(), - ) - options = ["-e", env] if env else [] options += ["--alias", alias] if alias else []