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:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user