From 26016b5ee5d4d79caee5fae1136eb2964ecf7d3c Mon Sep 17 00:00:00 2001 From: David Hotham Date: Sun, 3 Sep 2023 15:01:22 +0100 Subject: [PATCH] rearrange EnvManager build_venv() so that it is possible to force installation of setuptools and wheel --- src/poetry/inspection/info.py | 2 +- src/poetry/utils/env/__init__.py | 2 +- src/poetry/utils/env/env_manager.py | 48 +++++++++++++++++------------ tests/utils/test_env.py | 7 +++-- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/poetry/inspection/info.py b/src/poetry/inspection/info.py index e45046dceea..2fa1f7e97e0 100644 --- a/src/poetry/inspection/info.py +++ b/src/poetry/inspection/info.py @@ -579,7 +579,7 @@ def get_pep517_metadata(path: Path) -> PackageInfo: return info with ephemeral_environment( - flags={"no-pip": False, "no-setuptools": False, "no-wheel": False} + flags={"no-pip": False, "setuptools": "bundle", "wheel": "bundle"} ) as venv: # TODO: cache PEP 517 build environment corresponding to each project venv dest_dir = venv.path.parent / "dist" diff --git a/src/poetry/utils/env/__init__.py b/src/poetry/utils/env/__init__.py index dc5bc36b4ad..ed22bb3797b 100644 --- a/src/poetry/utils/env/__init__.py +++ b/src/poetry/utils/env/__init__.py @@ -41,7 +41,7 @@ @contextmanager def ephemeral_environment( executable: Path | None = None, - flags: dict[str, bool] | None = None, + flags: dict[str, str | bool] | None = None, ) -> Iterator[VirtualEnv]: with temporary_directory() as tmp_dir: # TODO: cache PEP 517 build environment corresponding to each project venv diff --git a/src/poetry/utils/env/env_manager.py b/src/poetry/utils/env/env_manager.py index 1fa70afad1f..e7b0cc751d9 100644 --- a/src/poetry/utils/env/env_manager.py +++ b/src/poetry/utils/env/env_manager.py @@ -612,35 +612,40 @@ def build_venv( cls, path: Path, executable: Path | None = None, - flags: dict[str, bool] | None = None, + flags: dict[str, str | bool] | None = None, with_pip: bool | None = None, with_wheel: bool | None = None, with_setuptools: bool | None = None, prompt: str | None = None, ) -> virtualenv.run.session.Session: - if WINDOWS: - path = get_real_windows_path(path) - executable = get_real_windows_path(executable) if executable else None - flags = flags or {} - flags["no-pip"] = ( - not with_pip if with_pip is not None else flags.pop("no-pip", True) - ) + if with_pip is not None: + flags["no-pip"] = not with_pip - flags["no-setuptools"] = ( - not with_setuptools - if with_setuptools is not None - else flags.pop("no-setuptools", True) - ) + if with_wheel is not None: + wheel_flags: dict[str, str | bool] = ( + {"wheel": "bundle"} if with_wheel else {"no-wheel": True} + ) + flags.update(wheel_flags) - # we want wheels to be enabled when pip is required and it has not been - # explicitly disabled - flags["no-wheel"] = ( - not with_wheel - if with_wheel is not None - else flags.pop("no-wheel", flags["no-pip"]) - ) + if with_setuptools is not None: + setuptools_flags: dict[str, str | bool] = ( + {"setuptools": "bundle"} if with_setuptools else {"no-setuptools": True} + ) + flags.update(setuptools_flags) + + flags.setdefault("no-pip", True) + + if "setuptools" not in flags and "no-setuptools" not in flags: + flags["no-setuptools"] = True + + if "wheel" not in flags and "no-wheel" not in flags: + flags["no-wheel"] = True + + if WINDOWS: + path = get_real_windows_path(path) + executable = get_real_windows_path(executable) if executable else None executable_str = None if executable is None else executable.resolve().as_posix() @@ -658,6 +663,9 @@ def build_venv( if value is True: args.append(f"--{flag}") + elif value is not False: + args.append(f"--{flag}={value}") + args.append(str(path)) cli_result = virtualenv.cli_run(args) diff --git a/tests/utils/test_env.py b/tests/utils/test_env.py index 688fa98c73d..dafd9af4c08 100644 --- a/tests/utils/test_env.py +++ b/tests/utils/test_env.py @@ -1489,18 +1489,21 @@ def test_env_system_packages_are_relative_to_lib( @pytest.mark.parametrize( ("flags", "packages"), [ - ({"no-pip": False}, {"pip", "wheel"}), + ({"no-pip": False}, {"pip"}), ({"no-pip": False, "no-wheel": True}, {"pip"}), + ({"no-pip": False, "no-wheel": False}, {"pip", "wheel"}), ({"no-pip": True}, set()), ({"no-setuptools": False}, {"setuptools"}), ({"no-setuptools": True}, set()), + ({"setuptools": "bundle"}, {"setuptools"}), ({"no-pip": True, "no-setuptools": False}, {"setuptools"}), ({"no-wheel": False}, {"wheel"}), + ({"wheel": "bundle"}, {"wheel"}), ({}, set()), ], ) def test_env_no_pip( - tmp_path: Path, poetry: Poetry, flags: dict[str, bool], packages: set[str] + tmp_path: Path, poetry: Poetry, flags: dict[str, str | bool], packages: set[str] ) -> None: venv_path = tmp_path / "venv" EnvManager(poetry).build_venv(path=venv_path, flags=flags)