diff --git a/src/poetry/utils/isolated_build.py b/src/poetry/utils/isolated_build.py index 803360df183..9d6367258a8 100644 --- a/src/poetry/utils/isolated_build.py +++ b/src/poetry/utils/isolated_build.py @@ -124,10 +124,17 @@ def install(self, requirements: Collection[str]) -> None: # We build Poetry dependencies from the requirements package = ProjectPackage("__root__", "0.0.0") package.python_versions = ".".join(str(v) for v in self._env.version_info[:3]) + env_markers = self._env.get_marker_env() for requirement in requirements: dependency = Dependency.create_from_pep_508(requirement) - package.add_dependency(dependency) + + if dependency.marker.is_empty() or dependency.marker.validate(env_markers): + # we ignore dependencies that are not valid for this environment + # this ensures that we do not end up with unnecessary constraint + # errors when solving build system requirements; this is assumed + # safe as this environment is ephemeral + package.add_dependency(dependency) io = BufferedIO() diff --git a/tests/inspection/test_info.py b/tests/inspection/test_info.py index 405a53b3a2a..37b9ed1a732 100644 --- a/tests/inspection/test_info.py +++ b/tests/inspection/test_info.py @@ -329,7 +329,8 @@ def test_info_no_setup_pkg_info_no_deps_dynamic(fixture_dir: FixtureDirGetter) - def test_info_setup_simple(mocker: MockerFixture, demo_setup: Path) -> None: spy = mocker.spy(VirtualEnv, "run") info = PackageInfo.from_directory(demo_setup) - assert spy.call_count == 4 + + assert spy.call_count == 6 demo_check_info(info, requires_dist={"package"}) diff --git a/tests/utils/test_isolated_build.py b/tests/utils/test_isolated_build.py index 044dac1404e..b8d72ca2390 100644 --- a/tests/utils/test_isolated_build.py +++ b/tests/utils/test_isolated_build.py @@ -2,6 +2,7 @@ import shutil import sys +import uuid from pathlib import Path from typing import TYPE_CHECKING @@ -56,6 +57,38 @@ def test_isolated_env_install_success(pool: RepositoryPool) -> None: ) +def test_isolated_env_install_discards_requirements_not_needed_by_env( + pool: RepositoryPool, +) -> None: + with ephemeral_environment(Path(sys.executable)) as venv: + env = IsolatedEnv(venv, pool) + assert not InstalledRepository.load(venv).find_packages( + get_dependency("poetry-core") + ) + + venv_python_version = venv.get_marker_env().get("python_version") + package_one = uuid.uuid4().hex + package_two = uuid.uuid4().hex + + env.install( + { + f"poetry-core; python_version=='{venv_python_version}'", + f"{package_one}>=1.0.0; python_version=='0.0'", + f"{package_two}>=2.0.0; platform_system=='Mirrors'", + } + ) + assert InstalledRepository.load(venv).find_packages( + get_dependency("poetry-core") + ) + assert not InstalledRepository.load(venv).find_packages( + get_dependency(package_one) + ) + + assert not InstalledRepository.load(venv).find_packages( + get_dependency(package_two) + ) + + @pytest.mark.parametrize( ("requirements", "exception"), [