Add type hints to DependencySpec (#35021)

* DependencySpec: add type hints

* DependencySpec: make deptypes a keyword only argument
This commit is contained in:
Massimiliano Culpo 2023-01-20 09:53:57 +01:00 committed by GitHub
parent fb7c8d1768
commit 8f8394a829
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 16 deletions

View File

@ -233,7 +233,7 @@ def _packages_needed_to_bootstrap_compiler(compiler, architecture, pkgs):
dep.concretize() dep.concretize()
# mark compiler as depended-on by the packages that use it # mark compiler as depended-on by the packages that use it
for pkg in pkgs: for pkg in pkgs:
dep._dependents.add(spack.spec.DependencySpec(pkg.spec, dep, ("build",))) dep._dependents.add(spack.spec.DependencySpec(pkg.spec, dep, deptypes=("build",)))
packages = [(s.package, False) for s in dep.traverse(order="post", root=False)] packages = [(s.package, False) for s in dep.traverse(order="post", root=False)]
packages.append((dep.package, True)) packages.append((dep.package, True))

View File

@ -56,6 +56,7 @@
import re import re
import sys import sys
import warnings import warnings
from typing import Tuple
import ruamel.yaml as yaml import ruamel.yaml as yaml
@ -653,8 +654,9 @@ def __repr__(self):
@lang.lazy_lexicographic_ordering @lang.lazy_lexicographic_ordering
class DependencySpec(object): class DependencySpec:
"""DependencySpecs connect two nodes in the DAG, and contain deptypes. """DependencySpecs represent an edge in the DAG, and contain dependency types
and information on the virtuals being provided.
Dependencies can be one (or more) of several types: Dependencies can be one (or more) of several types:
@ -662,20 +664,20 @@ class DependencySpec(object):
- link: is linked to and added to compiler flags. - link: is linked to and added to compiler flags.
- run: needs to be in the PATH for the package to run. - run: needs to be in the PATH for the package to run.
Fields: Args:
- spec: Spec depended on by parent. parent: starting node of the edge
- parent: Spec that depends on `spec`. spec: ending node of the edge.
- deptypes: list of strings, representing dependency relationships. deptypes: list of strings, representing dependency relationships.
""" """
__slots__ = "parent", "spec", "deptypes" __slots__ = "parent", "spec", "deptypes"
def __init__(self, parent, spec, deptypes): def __init__(self, parent: "Spec", spec: "Spec", *, deptypes: dp.DependencyArgument):
self.parent = parent self.parent = parent
self.spec = spec self.spec = spec
self.deptypes = dp.canonical_deptype(deptypes) self.deptypes = dp.canonical_deptype(deptypes)
def update_deptypes(self, deptypes): def update_deptypes(self, deptypes: dp.DependencyArgument) -> bool:
deptypes = set(deptypes) deptypes = set(deptypes)
deptypes.update(self.deptypes) deptypes.update(self.deptypes)
deptypes = tuple(sorted(deptypes)) deptypes = tuple(sorted(deptypes))
@ -684,10 +686,10 @@ def update_deptypes(self, deptypes):
self.deptypes = deptypes self.deptypes = deptypes
return changed return changed
def copy(self): def copy(self) -> "DependencySpec":
return DependencySpec(self.parent, self.spec, self.deptypes) return DependencySpec(self.parent, self.spec, deptypes=self.deptypes)
def add_type(self, type): def add_type(self, type: dp.DependencyArgument):
self.deptypes = dp.canonical_deptype(self.deptypes + dp.canonical_deptype(type)) self.deptypes = dp.canonical_deptype(self.deptypes + dp.canonical_deptype(type))
def _cmp_iter(self): def _cmp_iter(self):
@ -695,17 +697,17 @@ def _cmp_iter(self):
yield self.spec.name if self.spec else None yield self.spec.name if self.spec else None
yield self.deptypes yield self.deptypes
def __str__(self): def __str__(self) -> str:
return "%s %s--> %s" % ( return "%s %s--> %s" % (
self.parent.name if self.parent else None, self.parent.name if self.parent else None,
self.deptypes, self.deptypes,
self.spec.name if self.spec else None, self.spec.name if self.spec else None,
) )
def canonical(self): def canonical(self) -> Tuple[str, str, Tuple[str, ...]]:
return self.parent.dag_hash(), self.spec.dag_hash(), self.deptypes return self.parent.dag_hash(), self.spec.dag_hash(), self.deptypes
def flip(self): def flip(self) -> "DependencySpec":
return DependencySpec(parent=self.spec, spec=self.parent, deptypes=self.deptypes) return DependencySpec(parent=self.spec, spec=self.parent, deptypes=self.deptypes)
@ -1575,7 +1577,7 @@ def add_dependency_edge(self, dependency_spec, deptype):
edge.add_type(deptype) edge.add_type(deptype)
return return
edge = DependencySpec(self, dependency_spec, deptype) edge = DependencySpec(self, dependency_spec, deptypes=deptype)
self._dependencies.add(edge) self._dependencies.add(edge)
dependency_spec._dependents.add(edge) dependency_spec._dependents.add(edge)