diff --git a/src/poetry/core/packages/dependency.py b/src/poetry/core/packages/dependency.py index f5f559a85..b0dc4e37b 100644 --- a/src/poetry/core/packages/dependency.py +++ b/src/poetry/core/packages/dependency.py @@ -357,7 +357,7 @@ def deactivate(self) -> None: self._activated = False def with_constraint(self: T, constraint: str | VersionConstraint) -> T: - dependency = self.clone() + dependency = self.clone_shallow() dependency.constraint = constraint # type: ignore[assignment] return dependency diff --git a/src/poetry/core/packages/package.py b/src/poetry/core/packages/package.py index ddd63564a..6df142c01 100644 --- a/src/poetry/core/packages/package.py +++ b/src/poetry/core/packages/package.py @@ -469,7 +469,7 @@ def without_dependency_groups(self: T, groups: Collection[str]) -> T: """ Returns a clone of the package with the given dependency groups excluded. """ - package = self.clone() + package = self.clone_shallow() for group_name in groups: if group_name in package._dependency_groups: @@ -481,7 +481,8 @@ def without_optional_dependency_groups(self: T) -> T: """ Returns a clone of the package without optional dependency groups. """ - package = self.clone() + package = self.clone_shallow() + package._dependency_groups = package._dependency_groups.copy() for group_name, group in self._dependency_groups.items(): if group.is_optional(): @@ -500,7 +501,8 @@ def with_dependency_groups( If `only` is set to True, then only the given groups will be selected. """ - package = self.clone() + package = self.clone_shallow() + package._dependency_groups = package._dependency_groups.copy() for group_name, group in self._dependency_groups.items(): if (only or group.is_optional()) and group_name not in groups: diff --git a/src/poetry/core/packages/specification.py b/src/poetry/core/packages/specification.py index 8dd8ed06e..fd23ce208 100644 --- a/src/poetry/core/packages/specification.py +++ b/src/poetry/core/packages/specification.py @@ -167,8 +167,11 @@ def is_same_package_as(self, other: PackageSpecification) -> bool: def clone(self: T) -> T: return copy.deepcopy(self) + def clone_shallow(self: T) -> T: + return copy.copy(self) + def with_features(self: T, features: Iterable[str]) -> T: - package = self.clone() + package = self.clone_shallow() package._features = frozenset( canonicalize_name(feature) for feature in features