Spec: filter conditional edges in Spec.dependencies/edges_to_dependencies

Signed-off-by: Gregory Becker <becker33@llnl.gov>
This commit is contained in:
Gregory Becker 2025-05-12 14:14:04 -07:00
parent 79610ce80e
commit ebf4c8b445
No known key found for this signature in database
GPG Key ID: 2362541F6D14ED84

View File

@ -1027,6 +1027,7 @@ def select(
child: Optional[str] = None, child: Optional[str] = None,
depflag: dt.DepFlag = dt.ALL, depflag: dt.DepFlag = dt.ALL,
virtuals: Optional[Union[str, Sequence[str]]] = None, virtuals: Optional[Union[str, Sequence[str]]] = None,
when: Optional["Spec"] = None,
) -> List[DependencySpec]: ) -> List[DependencySpec]:
"""Selects a list of edges and returns them. """Selects a list of edges and returns them.
@ -1046,6 +1047,7 @@ def select(
child: name of the child package child: name of the child package
depflag: allowed dependency types in flag form depflag: allowed dependency types in flag form
virtuals: list of virtuals or specific virtual on the edge virtuals: list of virtuals or specific virtual on the edge
when: condition on conditional dependency, or Spec() for unconditional dependency only
""" """
if not depflag: if not depflag:
return [] return []
@ -1071,6 +1073,9 @@ def select(
else: else:
selected = (dep for dep in selected if any(v in dep.virtuals for v in virtuals)) selected = (dep for dep in selected if any(v in dep.virtuals for v in virtuals))
if when is not None:
selected = (dep for dep in selected if dep.when == when)
return list(selected) return list(selected)
def clear(self): def clear(self):
@ -1618,6 +1623,7 @@ def edges_to_dependencies(
depflag: dt.DepFlag = dt.ALL, depflag: dt.DepFlag = dt.ALL,
*, *,
virtuals: Optional[Union[str, Sequence[str]]] = None, virtuals: Optional[Union[str, Sequence[str]]] = None,
when: Optional["Spec"] = None,
) -> List[DependencySpec]: ) -> List[DependencySpec]:
"""Returns a list of edges connecting this node in the DAG to children. """Returns a list of edges connecting this node in the DAG to children.
@ -1625,9 +1631,13 @@ def edges_to_dependencies(
name: filter dependencies by package name name: filter dependencies by package name
depflag: allowed dependency types depflag: allowed dependency types
virtuals: allowed virtuals virtuals: allowed virtuals
when: condition on conditional dependencies (or Spec() for unconditional)
""" """
return [ return [
d for d in self._dependencies.select(child=name, depflag=depflag, virtuals=virtuals) d
for d in self._dependencies.select(
child=name, depflag=depflag, virtuals=virtuals, when=when
)
] ]
@property @property
@ -1666,6 +1676,7 @@ def dependencies(
deptype: Union[dt.DepTypes, dt.DepFlag] = dt.ALL, deptype: Union[dt.DepTypes, dt.DepFlag] = dt.ALL,
*, *,
virtuals: Optional[Union[str, Sequence[str]]] = None, virtuals: Optional[Union[str, Sequence[str]]] = None,
when: Optional["Spec"] = None,
) -> List["Spec"]: ) -> List["Spec"]:
"""Returns a list of direct dependencies (nodes in the DAG) """Returns a list of direct dependencies (nodes in the DAG)
@ -1673,11 +1684,15 @@ def dependencies(
name: filter dependencies by package name name: filter dependencies by package name
deptype: allowed dependency types deptype: allowed dependency types
virtuals: allowed virtuals virtuals: allowed virtuals
when: condition on conditional dependency or Spec() for unconditional
""" """
if not isinstance(deptype, dt.DepFlag): if not isinstance(deptype, dt.DepFlag):
deptype = dt.canonicalize(deptype) deptype = dt.canonicalize(deptype)
return [ return [
d.spec for d in self.edges_to_dependencies(name, depflag=deptype, virtuals=virtuals) d.spec
for d in self.edges_to_dependencies(
name, depflag=deptype, virtuals=virtuals, when=when
)
] ]
def dependents( def dependents(