package: add spack.package.possible_dependencies method

- this version allows getting possible dependencies of multiple packages
  or specs at once.

- New method handles calling `PackageBase.possible_dependencies` multiple
  times and passing `visited` dict around.
This commit is contained in:
Todd Gamblin 2019-07-05 23:26:42 -07:00
parent a3799b2c7b
commit 81b147cc0a
2 changed files with 53 additions and 4 deletions

View File

@ -2663,6 +2663,34 @@ def dump_packages(spec, path):
spack.repo.path.dump_provenance(node, dest_pkg_dir)
def possible_dependencies(*pkg_or_spec, **kwargs):
"""Get the possible dependencies of a number of packages.
See ``PackageBase.possible_dependencies`` for details.
"""
transitive = kwargs.get('transitive', True)
expand_virtuals = kwargs.get('expand_virtuals', True)
deptype = kwargs.get('deptype', 'all')
packages = []
for pos in pkg_or_spec:
if isinstance(pos, PackageMeta):
pkg = pos
elif isinstance(pos, spack.spec.Spec):
pkg = pos.package
else:
pkg = spack.spec.Spec(pos).package
packages.append(pkg)
visited = {}
for pkg in packages:
pkg.possible_dependencies(
transitive, expand_virtuals, deptype, visited)
return visited
def print_pkg(message):
"""Outputs a message with a package icon."""
from llnl.util.tty.color import cwrite

View File

@ -10,14 +10,14 @@
static DSL metadata for packages.
"""
import pytest
import spack.repo
def test_possible_dependencies(mock_packages):
mpileaks = spack.repo.get('mpileaks')
@pytest.fixture
def mpileaks_possible_deps(mock_packages):
mpi_names = [spec.name for spec in spack.repo.path.providers_for('mpi')]
assert mpileaks.possible_dependencies(expand_virtuals=True) == {
possible = {
'callpath': set(['dyninst'] + mpi_names),
'dyninst': set(['libdwarf', 'libelf']),
'fake': set(),
@ -29,6 +29,13 @@ def test_possible_dependencies(mock_packages):
'multi-provider-mpi': set(),
'zmpi': set(['fake']),
}
return possible
def test_possible_dependencies(mock_packages, mpileaks_possible_deps):
mpileaks = spack.repo.get('mpileaks')
assert (mpileaks.possible_dependencies(expand_virtuals=True) ==
mpileaks_possible_deps)
assert mpileaks.possible_dependencies(expand_virtuals=False) == {
'callpath': set(['dyninst']),
@ -59,3 +66,17 @@ def test_possible_dependencies_with_deptypes(mock_packages):
'dtbuild1': set(['dtlink2']),
'dtlink2': set(),
}
def test_possible_dependencies_with_multiple_classes(
mock_packages, mpileaks_possible_deps):
pkgs = ['dt-diamond', 'mpileaks']
expected = mpileaks_possible_deps.copy()
expected.update({
'dt-diamond': set(['dt-diamond-left', 'dt-diamond-right']),
'dt-diamond-left': set(['dt-diamond-bottom']),
'dt-diamond-right': set(['dt-diamond-bottom']),
'dt-diamond-bottom': set(),
})
assert spack.package.possible_dependencies(*pkgs) == expected