Skip to content

Commit e0b0f91

Browse files
committed
fix(env): isolated env must validate requirements
This change ensures that when an isolated environment is created, the temporary lockfile created does not consider dependencies that are not valid for the environment. This reduces the possibility of constraint errors when building dependencies from source that use complex build-system requirements. Resolves: #8409
1 parent 1e1e272 commit e0b0f91

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/poetry/utils/isolated_build.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,17 @@ def install(self, requirements: Collection[str]) -> None:
124124
# We build Poetry dependencies from the requirements
125125
package = ProjectPackage("__root__", "0.0.0")
126126
package.python_versions = ".".join(str(v) for v in self._env.version_info[:3])
127+
env_markers = self._env.get_marker_env()
127128

128129
for requirement in requirements:
129130
dependency = Dependency.create_from_pep_508(requirement)
130-
package.add_dependency(dependency)
131+
132+
if dependency.marker.is_empty() or dependency.marker.validate(env_markers):
133+
# we ignore dependencies that are not valid for this environment
134+
# this ensures that we do not end up with unnecessary constraint
135+
# errors when solving build system requirements; this is assumed
136+
# safe as this environment is ephemeral
137+
package.add_dependency(dependency)
131138

132139
io = BufferedIO()
133140

tests/inspection/test_info.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,8 @@ def test_info_no_setup_pkg_info_no_deps_dynamic(fixture_dir: FixtureDirGetter) -
329329
def test_info_setup_simple(mocker: MockerFixture, demo_setup: Path) -> None:
330330
spy = mocker.spy(VirtualEnv, "run")
331331
info = PackageInfo.from_directory(demo_setup)
332-
assert spy.call_count == 4
332+
333+
assert spy.call_count == 6
333334
demo_check_info(info, requires_dist={"package"})
334335

335336

tests/utils/test_isolated_build.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import shutil
44
import sys
5+
import uuid
56

67
from pathlib import Path
78
from typing import TYPE_CHECKING
@@ -56,6 +57,38 @@ def test_isolated_env_install_success(pool: RepositoryPool) -> None:
5657
)
5758

5859

60+
def test_isolated_env_install_discards_requirements_not_needed_by_env(
61+
pool: RepositoryPool,
62+
) -> None:
63+
with ephemeral_environment(Path(sys.executable)) as venv:
64+
env = IsolatedEnv(venv, pool)
65+
assert not InstalledRepository.load(venv).find_packages(
66+
get_dependency("poetry-core")
67+
)
68+
69+
venv_python_version = venv.get_marker_env().get("python_version")
70+
package_one = uuid.uuid4().hex
71+
package_two = uuid.uuid4().hex
72+
73+
env.install(
74+
{
75+
f"poetry-core; python_version=='{venv_python_version}'",
76+
f"{package_one}>=1.0.0; python_version=='0.0'",
77+
f"{package_two}>=2.0.0; platform_system=='Mirrors'",
78+
}
79+
)
80+
assert InstalledRepository.load(venv).find_packages(
81+
get_dependency("poetry-core")
82+
)
83+
assert not InstalledRepository.load(venv).find_packages(
84+
get_dependency(package_one)
85+
)
86+
87+
assert not InstalledRepository.load(venv).find_packages(
88+
get_dependency(package_two)
89+
)
90+
91+
5992
@pytest.mark.parametrize(
6093
("requirements", "exception"),
6194
[

0 commit comments

Comments
 (0)