Skip to content

Commit ad85d88

Browse files
committed
pr feedback: remove unneeded non-root case and fix tests
1 parent 7646ed0 commit ad85d88

File tree

4 files changed

+65
-148
lines changed

4 files changed

+65
-148
lines changed

src/poetry/puzzle/provider.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -555,13 +555,13 @@ def complete_package(
555555
if dep.name in self.UNSAFE_PACKAGES:
556556
continue
557557

558-
active_extras = (
559-
self._active_root_extras if package.is_root() else dependency.extras
560-
)
561-
if self._env and not dep.marker.validate(
562-
self._marker_values(active_extras)
563-
):
564-
continue
558+
if self._env:
559+
marker_values = (
560+
self._marker_values(self._active_root_extras) if package.is_root()
561+
else self._env.marker_env
562+
)
563+
if not dep.marker.validate(marker_values):
564+
continue
565565

566566
if not package.is_root() and (
567567
(dep.is_optional() and dep.name not in optional_dependencies)

tests/installation/fixtures/with-dependencies-differing-extras.test

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,43 @@ version = "1.0.0"
44
description = ""
55
optional = true
66
python-versions = "*"
7-
files = []
7+
files = [ ]
88

9-
[package.extras]
10-
demo-extra-one = ["transitive-dep-one"]
11-
demo-extra-two = ["transitive-dep-two"]
9+
[package.dependencies.transitive-dep-one]
10+
version = "1.1.0"
11+
optional = true
12+
markers = 'extra == "demo-extra-one" and extra != "demo-extra-two"'
1213

13-
[package.dependencies]
14-
transitive-dep-one = {version = "1.1.0", optional = true}
15-
transitive-dep-two = {version = "1.2.0", optional = true}
14+
[package.dependencies.transitive-dep-two]
15+
version = "1.2.0"
16+
optional = true
17+
markers = 'extra != "demo-extra-one" and extra == "demo-extra-two"'
18+
19+
[package.extras]
20+
demo-extra-one = [ "transitive-dep-one", "transitive-dep-two" ]
21+
demo-extra-two = [ "transitive-dep-one", "transitive-dep-two" ]
1622

1723
[[package]]
1824
name = "transitive-dep-one"
1925
version = "1.1.0"
2026
description = ""
2127
optional = true
2228
python-versions = "*"
23-
files = []
29+
files = [ ]
2430

2531
[[package]]
2632
name = "transitive-dep-two"
2733
version = "1.2.0"
2834
description = ""
2935
optional = true
3036
python-versions = "*"
31-
files = []
37+
files = [ ]
3238

3339
[extras]
34-
extra-one = ["demo", "demo"]
35-
extra-two = ["demo", "demo"]
40+
extra-one = [ "demo", "demo" ]
41+
extra-two = [ "demo", "demo" ]
3642

3743
[metadata]
38-
python-versions = "*"
3944
lock-version = "2.0"
45+
python-versions = "*"
4046
content-hash = "123456789"

tests/installation/test_installer.py

Lines changed: 37 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,110 +1027,6 @@ def test_run_with_dependencies_nested_extras(
10271027
assert locker.written_data == expected
10281028

10291029

1030-
@pytest.mark.parametrize("locked", [False]) # TODO: lock data
1031-
@pytest.mark.parametrize("extra", [None, "extra-one", "extra-two"])
1032-
def test_run_with_conflicting_dependency_extras(
1033-
installer: Installer,
1034-
pool: RepositoryPool,
1035-
locker: Locker,
1036-
installed: CustomInstalledRepository,
1037-
repo: Repository,
1038-
config: Config,
1039-
package: ProjectPackage,
1040-
extra: str | None,
1041-
locked: bool,
1042-
) -> None:
1043-
"""https://github.com/python-poetry/poetry/issues/834
1044-
1045-
Tests resolution of extras in both root ('extra-one', 'extra-two') and transitive
1046-
('demo-extra-one', 'demo-extra-two') dependencies
1047-
"""
1048-
# Demo package with two optional transitive dependencies, one for each extra
1049-
demo_pkg = get_package("demo", "1.0.0")
1050-
transitive_dep_one = get_package("transitive-dep", "1.1.0")
1051-
transitive_dep_two = get_package("transitive-dep", "1.2.0")
1052-
demo_pkg.extras = {
1053-
canonicalize_name("demo-extra-one"): [
1054-
get_dependency("transitive-dep", constraint={"version": "1.1.0", "optional": True})
1055-
],
1056-
canonicalize_name("demo-extra-two"): [
1057-
get_dependency("transitive-dep", constraint={"version": "1.2.0", "optional": True})
1058-
],
1059-
}
1060-
demo_pkg.add_dependency(
1061-
Factory.create_dependency(
1062-
"transitive-dep",
1063-
{
1064-
"version": "1.1.0",
1065-
"markers": "extra == 'demo-extra-one' and extra != 'demo-extra-two'",
1066-
"optional": True,
1067-
}
1068-
)
1069-
)
1070-
demo_pkg.add_dependency(
1071-
Factory.create_dependency(
1072-
"transitive-dep",
1073-
{
1074-
"version": "1.2.0",
1075-
"markers": "extra != 'demo-extra-one' and extra == 'demo-extra-two'",
1076-
"optional": True,
1077-
}
1078-
)
1079-
)
1080-
repo.add_package(demo_pkg)
1081-
repo.add_package(transitive_dep_one)
1082-
repo.add_package(transitive_dep_two)
1083-
1084-
# 'demo' with extra 'demo-extra-one' when package has 'extra-one' extra
1085-
# and with extra 'demo-extra-two' when 'extra-two'
1086-
extra_one_dep = Factory.create_dependency(
1087-
"demo",
1088-
{
1089-
"version": "1.0.0",
1090-
"markers": "extra == 'extra-one' and extra != 'extra-two'",
1091-
"extras": ["demo-extra-one"],
1092-
"optional": True,
1093-
},
1094-
)
1095-
extra_two_dep = Factory.create_dependency(
1096-
"demo",
1097-
{
1098-
"version": "1.0.0",
1099-
"markers": "extra != 'extra-one' and extra == 'extra-two'",
1100-
"extras": ["demo-extra-two"],
1101-
"optional": True,
1102-
},
1103-
)
1104-
package.add_dependency(extra_one_dep)
1105-
package.add_dependency(extra_two_dep)
1106-
package.extras = {
1107-
canonicalize_name("extra-one"): [extra_one_dep],
1108-
canonicalize_name("extra-two"): [extra_two_dep],
1109-
}
1110-
1111-
locker.locked(locked)
1112-
if locked:
1113-
raise ValueError("no lock data for this test yet")
1114-
locker.mock_lock_data(dict(fixture("TODO")))
1115-
1116-
if extra is not None:
1117-
installer.extras([extra])
1118-
result = installer.run()
1119-
assert result == 0
1120-
1121-
if not locked:
1122-
raise ValueError("no lock data for this test yet")
1123-
expected = fixture("TODO")
1124-
assert locker.written_data == expected
1125-
1126-
# Results of installation are consistent with the 'extra' input
1127-
assert isinstance(installer.executor, Executor)
1128-
if extra is None:
1129-
assert len(installer.executor.installations) == 0
1130-
else:
1131-
assert len(installer.executor.installations) == 2
1132-
1133-
11341030
@pytest.mark.parametrize("locked", [True, False])
11351031
@pytest.mark.parametrize("extra", [None, "cpu", "cuda"])
11361032
def test_run_with_exclusive_extras_different_sources(
@@ -1331,30 +1227,42 @@ def test_run_with_different_dependency_extras(
13311227
extra: str | None,
13321228
locked: bool,
13331229
) -> None:
1334-
"""https://github.com/python-poetry/poetry/issues/834"""
1335-
# Demo package with two optional transitive dependencies, one for each extra
1230+
"""https://github.com/python-poetry/poetry/issues/834
1231+
1232+
This tests different sets of extras in a dependency of the root project. These different dependency extras are
1233+
themselves conditioned on extras in the root project.
1234+
"""
1235+
# Three packages in additon to root: demo (direct dependency) and two transitive dep packages
13361236
demo_pkg = get_package("demo", "1.0.0")
1337-
transitive_dep_one = get_package("transitive-dep-one", "1.1.0")
1338-
transitive_dep_two = get_package("transitive-dep-two", "1.2.0")
1339-
demo_pkg.extras = {
1340-
canonicalize_name("demo-extra-one"): [get_dependency("transitive-dep-one")],
1341-
canonicalize_name("demo-extra-two"): [get_dependency("transitive-dep-two")],
1342-
}
1343-
demo_pkg.add_dependency(
1344-
Factory.create_dependency(
1345-
"transitive-dep-one", {"version": "1.1.0", "optional": True}
1346-
)
1237+
transitive_one_pkg = get_package("transitive-dep-one", "1.1.0")
1238+
transitive_two_pkg = get_package("transitive-dep-two", "1.2.0")
1239+
1240+
# Switch each transitive dependency based on extra markers in the 'demo' package
1241+
transitive_dep_one = Factory.create_dependency(
1242+
"transitive-dep-one",
1243+
{
1244+
"version": "1.1.0",
1245+
"markers": "extra == 'demo-extra-one' and extra != 'demo-extra-two'",
1246+
"optional": True,
1247+
}
13471248
)
1348-
demo_pkg.add_dependency(
1349-
Factory.create_dependency(
1350-
"transitive-dep-two", {"version": "1.2.0", "optional": True}
1351-
)
1249+
transitive_dep_two = Factory.create_dependency(
1250+
"transitive-dep-two",
1251+
{
1252+
"version": "1.2.0",
1253+
"markers": "extra != 'demo-extra-one' and extra == 'demo-extra-two'",
1254+
"optional": True,
1255+
}
13521256
)
1353-
repo.add_package(demo_pkg)
1354-
repo.add_package(transitive_dep_one)
1355-
repo.add_package(transitive_dep_two)
1257+
# Include both packages in both demo extras, to validate that they're filtered out based on extra markers alone
1258+
demo_pkg.extras = {
1259+
canonicalize_name("demo-extra-one"): [get_dependency("transitive-dep-one"), get_dependency("transitive-dep-two")],
1260+
canonicalize_name("demo-extra-two"): [get_dependency("transitive-dep-one"), get_dependency("transitive-dep-two")],
1261+
}
1262+
demo_pkg.add_dependency(transitive_dep_one)
1263+
demo_pkg.add_dependency(transitive_dep_two)
13561264

1357-
# 'demo' with extra 'one' when package has 'extra-one' extra and with extra 'two' when 'extra-two'
1265+
# Now define the demo dependency, similarly switched on extra markers in the root package
13581266
extra_one_dep = Factory.create_dependency(
13591267
"demo",
13601268
{
@@ -1373,12 +1281,16 @@ def test_run_with_different_dependency_extras(
13731281
)
13741282
package.add_dependency(extra_one_dep)
13751283
package.add_dependency(extra_two_dep)
1376-
# We don't want to cheat by only including the correct dependency in the 'extra' mapping
1284+
# Again we don't want to cheat by only including the correct dependency in the 'extra' mapping
13771285
package.extras = {
13781286
canonicalize_name("extra-one"): [extra_one_dep, extra_two_dep],
13791287
canonicalize_name("extra-two"): [extra_one_dep, extra_two_dep],
13801288
}
13811289

1290+
repo.add_package(demo_pkg)
1291+
repo.add_package(transitive_one_pkg)
1292+
repo.add_package(transitive_two_pkg)
1293+
13821294
locker.locked(locked)
13831295
if locked:
13841296
locker.mock_lock_data(dict(fixture("with-dependencies-differing-extras")))

tests/puzzle/test_solver.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4776,9 +4776,8 @@ def test_solver_resolves_duplicate_dependency_in_root_extra(
47764776
"""
47774777
Without extras, a newer version of A can be chosen than with root extras.
47784778
"""
4779-
constraint: dict[str, Any] = {"version": "*"}
4780-
if with_extra:
4781-
constraint["extras"] = ["foo"]
4779+
extra = ["foo"] if with_extra else []
4780+
47824781
package_a1 = get_package("A", "1.0")
47834782
package_a2 = get_package("A", "2.0")
47844783

@@ -4793,7 +4792,7 @@ def test_solver_resolves_duplicate_dependency_in_root_extra(
47934792
repo.add_package(package_a1)
47944793
repo.add_package(package_a2)
47954794

4796-
solver = Solver(package, pool, [], [], io)
4795+
solver = Solver(package, pool, [], [], io, active_root_extras=extra)
47974796
transaction = solver.solve()
47984797

47994798
check_solver_result(

0 commit comments

Comments
 (0)