Skip to content

Commit c1d385a

Browse files
authored
traverse: use overload for return type when depth=True vs depth=False (spack#48482)
1 parent 4643909 commit c1d385a

File tree

5 files changed

+329
-96
lines changed

5 files changed

+329
-96
lines changed

lib/spack/spack/cmd/uninstall.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def is_installed(spec):
144144
record = spack.store.STORE.db.query_local_by_spec_hash(spec.dag_hash())
145145
return record and record.installed
146146

147-
specs = traverse.traverse_nodes(
147+
all_specs = traverse.traverse_nodes(
148148
specs,
149149
root=False,
150150
order="breadth",
@@ -155,7 +155,7 @@ def is_installed(spec):
155155
)
156156

157157
with spack.store.STORE.db.read_transaction():
158-
return [spec for spec in specs if is_installed(spec)]
158+
return [spec for spec in all_specs if is_installed(spec)]
159159

160160

161161
def dependent_environments(

lib/spack/spack/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1330,7 +1330,7 @@ def deprecate(self, spec: "spack.spec.Spec", deprecator: "spack.spec.Spec") -> N
13301330
def installed_relatives(
13311331
self,
13321332
spec: "spack.spec.Spec",
1333-
direction: str = "children",
1333+
direction: tr.DirectionType = "children",
13341334
transitive: bool = True,
13351335
deptype: Union[dt.DepFlag, dt.DepTypes] = dt.ALL,
13361336
) -> Set["spack.spec.Spec"]:

lib/spack/spack/installer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ def dump_packages(spec: "spack.spec.Spec", path: str) -> None:
539539
# Note that we copy them in as they are in the *install* directory
540540
# NOT as they are in the repository, because we want a snapshot of
541541
# how *this* particular build was done.
542-
for node in spec.traverse(deptype=all):
542+
for node in spec.traverse(deptype="all"):
543543
if node is not spec:
544544
# Locate the dependency package in the install tree and find
545545
# its provenance information.

lib/spack/spack/spec.py

Lines changed: 131 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,21 @@
5858
import re
5959
import socket
6060
import warnings
61-
from typing import Any, Callable, Dict, Iterable, List, Match, Optional, Set, Tuple, Union
61+
from typing import (
62+
Any,
63+
Callable,
64+
Dict,
65+
Iterable,
66+
List,
67+
Match,
68+
Optional,
69+
Set,
70+
Tuple,
71+
Union,
72+
overload,
73+
)
74+
75+
from typing_extensions import Literal
6276

6377
import archspec.cpu
6478

@@ -83,7 +97,7 @@
8397
import spack.solver
8498
import spack.spec_parser
8599
import spack.store
86-
import spack.traverse as traverse
100+
import spack.traverse
87101
import spack.util.executable
88102
import spack.util.hash
89103
import spack.util.module_cmd as md
@@ -1339,16 +1353,16 @@ def tree(
13391353
depth: bool = False,
13401354
hashes: bool = False,
13411355
hashlen: Optional[int] = None,
1342-
cover: str = "nodes",
1356+
cover: spack.traverse.CoverType = "nodes",
13431357
indent: int = 0,
13441358
format: str = DEFAULT_FORMAT,
1345-
deptypes: Union[Tuple[str, ...], str] = "all",
1359+
deptypes: Union[dt.DepFlag, dt.DepTypes] = dt.ALL,
13461360
show_types: bool = False,
13471361
depth_first: bool = False,
13481362
recurse_dependencies: bool = True,
13491363
status_fn: Optional[Callable[["Spec"], InstallStatus]] = None,
13501364
prefix: Optional[Callable[["Spec"], str]] = None,
1351-
key=id,
1365+
key: Callable[["Spec"], Any] = id,
13521366
) -> str:
13531367
"""Prints out specs and their dependencies, tree-formatted with indentation.
13541368
@@ -1380,11 +1394,16 @@ def tree(
13801394
# reduce deptypes over all in-edges when covering nodes
13811395
if show_types and cover == "nodes":
13821396
deptype_lookup: Dict[str, dt.DepFlag] = collections.defaultdict(dt.DepFlag)
1383-
for edge in traverse.traverse_edges(specs, cover="edges", deptype=deptypes, root=False):
1397+
for edge in spack.traverse.traverse_edges(
1398+
specs, cover="edges", deptype=deptypes, root=False
1399+
):
13841400
deptype_lookup[edge.spec.dag_hash()] |= edge.depflag
13851401

1386-
for d, dep_spec in traverse.traverse_tree(
1387-
sorted(specs), cover=cover, deptype=deptypes, depth_first=depth_first, key=key
1402+
# SupportsRichComparisonT issue with List[Spec]
1403+
sorted_specs: List["Spec"] = sorted(specs) # type: ignore[type-var]
1404+
1405+
for d, dep_spec in spack.traverse.traverse_tree(
1406+
sorted_specs, cover=cover, deptype=deptypes, depth_first=depth_first, key=key
13881407
):
13891408
node = dep_spec.spec
13901409

@@ -1927,13 +1946,111 @@ def installed_upstream(self):
19271946
upstream, _ = spack.store.STORE.db.query_by_spec_hash(self.dag_hash())
19281947
return upstream
19291948

1930-
def traverse(self, **kwargs):
1949+
@overload
1950+
def traverse(
1951+
self,
1952+
*,
1953+
root: bool = ...,
1954+
order: spack.traverse.OrderType = ...,
1955+
cover: spack.traverse.CoverType = ...,
1956+
direction: spack.traverse.DirectionType = ...,
1957+
deptype: Union[dt.DepFlag, dt.DepTypes] = ...,
1958+
depth: Literal[False] = False,
1959+
key: Callable[["Spec"], Any] = ...,
1960+
visited: Optional[Set[Any]] = ...,
1961+
) -> Iterable["Spec"]: ...
1962+
1963+
@overload
1964+
def traverse(
1965+
self,
1966+
*,
1967+
root: bool = ...,
1968+
order: spack.traverse.OrderType = ...,
1969+
cover: spack.traverse.CoverType = ...,
1970+
direction: spack.traverse.DirectionType = ...,
1971+
deptype: Union[dt.DepFlag, dt.DepTypes] = ...,
1972+
depth: Literal[True],
1973+
key: Callable[["Spec"], Any] = ...,
1974+
visited: Optional[Set[Any]] = ...,
1975+
) -> Iterable[Tuple[int, "Spec"]]: ...
1976+
1977+
def traverse(
1978+
self,
1979+
*,
1980+
root: bool = True,
1981+
order: spack.traverse.OrderType = "pre",
1982+
cover: spack.traverse.CoverType = "nodes",
1983+
direction: spack.traverse.DirectionType = "children",
1984+
deptype: Union[dt.DepFlag, dt.DepTypes] = "all",
1985+
depth: bool = False,
1986+
key: Callable[["Spec"], Any] = id,
1987+
visited: Optional[Set[Any]] = None,
1988+
) -> Iterable[Union["Spec", Tuple[int, "Spec"]]]:
19311989
"""Shorthand for :meth:`~spack.traverse.traverse_nodes`"""
1932-
return traverse.traverse_nodes([self], **kwargs)
1990+
return spack.traverse.traverse_nodes(
1991+
[self],
1992+
root=root,
1993+
order=order,
1994+
cover=cover,
1995+
direction=direction,
1996+
deptype=deptype,
1997+
depth=depth,
1998+
key=key,
1999+
visited=visited,
2000+
)
19332001

1934-
def traverse_edges(self, **kwargs):
2002+
@overload
2003+
def traverse_edges(
2004+
self,
2005+
*,
2006+
root: bool = ...,
2007+
order: spack.traverse.OrderType = ...,
2008+
cover: spack.traverse.CoverType = ...,
2009+
direction: spack.traverse.DirectionType = ...,
2010+
deptype: Union[dt.DepFlag, dt.DepTypes] = ...,
2011+
depth: Literal[False] = False,
2012+
key: Callable[["Spec"], Any] = ...,
2013+
visited: Optional[Set[Any]] = ...,
2014+
) -> Iterable[DependencySpec]: ...
2015+
2016+
@overload
2017+
def traverse_edges(
2018+
self,
2019+
*,
2020+
root: bool = ...,
2021+
order: spack.traverse.OrderType = ...,
2022+
cover: spack.traverse.CoverType = ...,
2023+
direction: spack.traverse.DirectionType = ...,
2024+
deptype: Union[dt.DepFlag, dt.DepTypes] = ...,
2025+
depth: Literal[True],
2026+
key: Callable[["Spec"], Any] = ...,
2027+
visited: Optional[Set[Any]] = ...,
2028+
) -> Iterable[Tuple[int, DependencySpec]]: ...
2029+
2030+
def traverse_edges(
2031+
self,
2032+
*,
2033+
root: bool = True,
2034+
order: spack.traverse.OrderType = "pre",
2035+
cover: spack.traverse.CoverType = "nodes",
2036+
direction: spack.traverse.DirectionType = "children",
2037+
deptype: Union[dt.DepFlag, dt.DepTypes] = "all",
2038+
depth: bool = False,
2039+
key: Callable[["Spec"], Any] = id,
2040+
visited: Optional[Set[Any]] = None,
2041+
) -> Iterable[Union[DependencySpec, Tuple[int, DependencySpec]]]:
19352042
"""Shorthand for :meth:`~spack.traverse.traverse_edges`"""
1936-
return traverse.traverse_edges([self], **kwargs)
2043+
return spack.traverse.traverse_edges(
2044+
[self],
2045+
root=root,
2046+
order=order,
2047+
cover=cover,
2048+
direction=direction,
2049+
deptype=deptype,
2050+
depth=depth,
2051+
key=key,
2052+
visited=visited,
2053+
)
19372054

19382055
@property
19392056
def short_spec(self):
@@ -4105,10 +4222,10 @@ def tree(
41054222
depth: bool = False,
41064223
hashes: bool = False,
41074224
hashlen: Optional[int] = None,
4108-
cover: str = "nodes",
4225+
cover: spack.traverse.CoverType = "nodes",
41094226
indent: int = 0,
41104227
format: str = DEFAULT_FORMAT,
4111-
deptypes: Union[Tuple[str, ...], str] = "all",
4228+
deptypes: Union[dt.DepTypes, dt.DepFlag] = dt.ALL,
41124229
show_types: bool = False,
41134230
depth_first: bool = False,
41144231
recurse_dependencies: bool = True,

0 commit comments

Comments
 (0)