|
7 | 7 | import os |
8 | 8 | import shutil |
9 | 9 | import sys |
10 | | -from collections.abc import Callable, Iterable, Mapping, Sequence |
| 10 | +from collections.abc import Callable, Collection, Iterable, Mapping, Sequence |
11 | 11 | from copy import deepcopy |
12 | 12 | from functools import cached_property, reduce |
13 | 13 | from pathlib import Path |
@@ -161,9 +161,19 @@ def iter_workspace_dependencies(self) -> Iterable[Requirement]: |
161 | 161 | """Iterate over implicit editable requirements for workspace members.""" |
162 | 162 | yield from self.workspace.iter_dependencies() |
163 | 163 |
|
164 | | - def with_workspace_dependencies(self, requirements: Iterable[Requirement]) -> list[Requirement]: |
165 | | - """Return requirements with implicit workspace member dependencies included.""" |
166 | | - return self.workspace.with_dependencies(requirements) |
| 164 | + def with_workspace_dependencies( |
| 165 | + self, |
| 166 | + requirements: Iterable[Requirement], |
| 167 | + *, |
| 168 | + exclude: Collection[str] | None = None, |
| 169 | + ) -> list[Requirement]: |
| 170 | + """Return requirements with implicit workspace member dependencies included. |
| 171 | +
|
| 172 | + Members already declared in other dependency groups are skipped so they |
| 173 | + keep those groups in the lockfile instead of being forced into |
| 174 | + ``default`` (#3816). |
| 175 | + """ |
| 176 | + return self.workspace.with_dependencies(requirements, exclude=exclude) |
167 | 177 |
|
168 | 178 | def pyproject_content_hash(self, algo: str = "sha256") -> str: |
169 | 179 | """Return a lockfile content hash including workspace members.""" |
@@ -554,7 +564,12 @@ def _get_dependencies(group: str) -> tuple[list[Requirement], set[str]]: |
554 | 564 | for group, deps in extra_deps.items(): |
555 | 565 | group_deps[group].extend(deps) |
556 | 566 | if "default" in group_deps and self.is_workspace_root: |
557 | | - group_deps["default"] = self.with_workspace_dependencies(group_deps["default"]) |
| 567 | + # Do not force workspace members that are already declared in other |
| 568 | + # groups into default (keeps lockfile groups accurate) (#3816). |
| 569 | + declared_elsewhere = { |
| 570 | + req.identify() for group, deps in group_deps.items() if group != "default" for req in deps |
| 571 | + } |
| 572 | + group_deps["default"] = self.with_workspace_dependencies(group_deps["default"], exclude=declared_elsewhere) |
558 | 573 | return group_deps |
559 | 574 |
|
560 | 575 | @property |
|
0 commit comments