|
58 | 58 | import re |
59 | 59 | import socket |
60 | 60 | 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 |
62 | 76 |
|
63 | 77 | import archspec.cpu |
64 | 78 |
|
|
83 | 97 | import spack.solver |
84 | 98 | import spack.spec_parser |
85 | 99 | import spack.store |
86 | | -import spack.traverse as traverse |
| 100 | +import spack.traverse |
87 | 101 | import spack.util.executable |
88 | 102 | import spack.util.hash |
89 | 103 | import spack.util.module_cmd as md |
@@ -1339,16 +1353,16 @@ def tree( |
1339 | 1353 | depth: bool = False, |
1340 | 1354 | hashes: bool = False, |
1341 | 1355 | hashlen: Optional[int] = None, |
1342 | | - cover: str = "nodes", |
| 1356 | + cover: spack.traverse.CoverType = "nodes", |
1343 | 1357 | indent: int = 0, |
1344 | 1358 | format: str = DEFAULT_FORMAT, |
1345 | | - deptypes: Union[Tuple[str, ...], str] = "all", |
| 1359 | + deptypes: Union[dt.DepFlag, dt.DepTypes] = dt.ALL, |
1346 | 1360 | show_types: bool = False, |
1347 | 1361 | depth_first: bool = False, |
1348 | 1362 | recurse_dependencies: bool = True, |
1349 | 1363 | status_fn: Optional[Callable[["Spec"], InstallStatus]] = None, |
1350 | 1364 | prefix: Optional[Callable[["Spec"], str]] = None, |
1351 | | - key=id, |
| 1365 | + key: Callable[["Spec"], Any] = id, |
1352 | 1366 | ) -> str: |
1353 | 1367 | """Prints out specs and their dependencies, tree-formatted with indentation. |
1354 | 1368 |
|
@@ -1380,11 +1394,16 @@ def tree( |
1380 | 1394 | # reduce deptypes over all in-edges when covering nodes |
1381 | 1395 | if show_types and cover == "nodes": |
1382 | 1396 | 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 | + ): |
1384 | 1400 | deptype_lookup[edge.spec.dag_hash()] |= edge.depflag |
1385 | 1401 |
|
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 |
1388 | 1407 | ): |
1389 | 1408 | node = dep_spec.spec |
1390 | 1409 |
|
@@ -1927,13 +1946,111 @@ def installed_upstream(self): |
1927 | 1946 | upstream, _ = spack.store.STORE.db.query_by_spec_hash(self.dag_hash()) |
1928 | 1947 | return upstream |
1929 | 1948 |
|
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"]]]: |
1931 | 1989 | """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 | + ) |
1933 | 2001 |
|
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]]]: |
1935 | 2042 | """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 | + ) |
1937 | 2054 |
|
1938 | 2055 | @property |
1939 | 2056 | def short_spec(self): |
@@ -4105,10 +4222,10 @@ def tree( |
4105 | 4222 | depth: bool = False, |
4106 | 4223 | hashes: bool = False, |
4107 | 4224 | hashlen: Optional[int] = None, |
4108 | | - cover: str = "nodes", |
| 4225 | + cover: spack.traverse.CoverType = "nodes", |
4109 | 4226 | indent: int = 0, |
4110 | 4227 | format: str = DEFAULT_FORMAT, |
4111 | | - deptypes: Union[Tuple[str, ...], str] = "all", |
| 4228 | + deptypes: Union[dt.DepTypes, dt.DepFlag] = dt.ALL, |
4112 | 4229 | show_types: bool = False, |
4113 | 4230 | depth_first: bool = False, |
4114 | 4231 | recurse_dependencies: bool = True, |
|
0 commit comments