Skip to content

Commit

Permalink
Account for extras when walking the tree
Browse files Browse the repository at this point in the history
  • Loading branch information
dimbleby committed Feb 8, 2022
1 parent d76d1ce commit 0a4da5a
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions src/poetry/packages/locker.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@


if TYPE_CHECKING:
from poetry.core.version.markers import BaseMarker
from tomlkit.toml_document import TOMLDocument

from poetry.core.version.markers import BaseMarker
from poetry.repositories import Repository

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -240,6 +240,7 @@ def __walk_dependencies(
cls,
dependencies: List[Dependency],
packages_by_name: Dict[str, List[Package]],
extras: Union[bool, Sequence[str]] = False,
) -> Dict[Package, Dependency]:
nested_dependencies: Dict[Package, Dependency] = {}

Expand All @@ -255,10 +256,7 @@ def __walk_dependencies(
)

if not locked_package:
# Should normally be able to satisfy all requirements, but this case is
# permissible eg if we encounter a dev dependency when walking the
# non-dev dependencies.
continue
raise RuntimeError(f"Dependency walk failed at {requirement}")

# create dependency from locked package to retain dependency metadata
# if this is not done, we can end-up with incorrect nested dependencies
Expand All @@ -270,6 +268,16 @@ def __walk_dependencies(
requirement.set_constraint(constraint)

for require in locked_package.requires:
# Ignore unwanted extras.
if require.is_optional():
keep = (
extras
if isinstance(extras, bool)
else any(extra in require.in_extras for extra in extras)
)
if not keep:
continue

require = deepcopy(require)
require.marker = require.marker.intersect(requirement.marker)
if not require.marker.is_empty():
Expand All @@ -290,7 +298,9 @@ def get_project_dependencies(
cls,
project_requires: List[Dependency],
locked_packages: List[Package],
extras: Optional[Union[bool, Sequence[str]]] = None,
) -> Iterable[Tuple[Package, Dependency]]:
extras = extras or False
# group packages entries by name, this is required because requirement might use
# different constraints.
packages_by_name = {}
Expand Down Expand Up @@ -323,6 +333,7 @@ def get_project_dependencies(
nested_dependencies = cls.__walk_dependencies(
dependencies=dependencies,
packages_by_name=packages_by_name,
extras=extras,
)

return nested_dependencies.items()
Expand Down Expand Up @@ -368,6 +379,7 @@ def get_project_dependency_packages(
for package, dependency in self.get_project_dependencies(
project_requires=selected,
locked_packages=repository.packages,
extras=extras,
):
for extra in dependency.extras:
package.requires_extras.append(extra)
Expand Down

0 comments on commit 0a4da5a

Please sign in to comment.