diff --git a/src/poetry/puzzle/provider.py b/src/poetry/puzzle/provider.py index 12567762bbf..ba4b71358ef 100644 --- a/src/poetry/puzzle/provider.py +++ b/src/poetry/puzzle/provider.py @@ -614,7 +614,7 @@ def complete_package( if len(duplicates_by_extras) == 1: active_extras = ( - self._active_root_extras if package.is_root() else dependency.extras + self._active_root_extras if package.is_root() else found_extras ) deps = self._resolve_overlapping_markers(package, deps, active_extras) else: diff --git a/tests/conftest.py b/tests/conftest.py index a0a84b67031..547471e6f84 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -543,6 +543,7 @@ def create_new_package( version: str | None = None, dependencies: list[Dependency] | None = None, extras: dict[str, list[str]] | None = None, + merge_extras: bool = False, ) -> Package: version = version or "1.0" package = get_package(name, version) @@ -574,16 +575,20 @@ def create_new_package( extra_dependency.constraint = parse_constraint(f"^{pkg.version}") - # if requirement already exists in the package, update the marker - for requirement in package.requires: - if ( - requirement.name == extra_dependency.name - and requirement.is_optional() - ): - requirement.marker = requirement.marker.union( - extra_dependency.marker - ) - break + if merge_extras: + # if requirement already exists in the package, + # update the marker + for requirement in package.requires: + if ( + requirement.name == extra_dependency.name + and requirement.is_optional() + ): + requirement.marker = requirement.marker.union( + extra_dependency.marker + ) + break + else: + package.add_dependency(extra_dependency) else: package.add_dependency(extra_dependency) diff --git a/tests/puzzle/test_solver.py b/tests/puzzle/test_solver.py index a13a1a2fd4a..25b13daed68 100644 --- a/tests/puzzle/test_solver.py +++ b/tests/puzzle/test_solver.py @@ -571,6 +571,7 @@ def test_solver_returns_extras_if_requested_in_multiple_groups( (["py"], ["py310-package", "a"]), ], ) +@pytest.mark.parametrize("merge_extras", [True, False]) @pytest.mark.parametrize("top_level_dependency", [True, False]) def test_solver_resolves_self_referential_extras( enabled_extras: list[str], @@ -580,6 +581,7 @@ def test_solver_resolves_self_referential_extras( repo: Repository, package: ProjectPackage, create_package: PackageFactory, + merge_extras: bool, ) -> None: dependency = ( create_package( @@ -587,13 +589,15 @@ def test_solver_resolves_self_referential_extras( str(package.version), extras={ "download": ["download-package"], + "download2": ["download-package"], # same package as download "install": ["install-package"], "py38": ["py38-package ; python_version == '3.8'"], "py310": ["py310-package ; python_version > '3.8'"], - "all": ["a[download,install]"], + "all": ["a[download,download2,install]"], "py": ["a[py38,py310]"], "nested": ["a[all]"], }, + merge_extras=merge_extras, ) .to_dependency() .with_features(enabled_extras) diff --git a/tests/types.py b/tests/types.py index d4081448b09..9c2c84d1069 100644 --- a/tests/types.py +++ b/tests/types.py @@ -78,6 +78,7 @@ def __call__( version: str | None = None, dependencies: list[Dependency] | None = None, extras: dict[str, list[str]] | None = None, + merge_extras: bool = False, ) -> Package: ...