diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/test/packages.py | 4 | ||||
-rw-r--r-- | lib/spack/spack/util/package_hash.py | 15 |
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index c811f9040e..299c56481e 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -98,6 +98,10 @@ class TestPackage(object): assert spec1.package.content_hash(content=content1) != \ spec2.package.content_hash(content=content2) + def test_parse_dynamic_function_call(self): + spec = Spec("hash-test4").concretized() + spec.package.content_hash() + # Below tests target direct imports of spack packages from the # spack.pkg namespace def test_import_package(self): diff --git a/lib/spack/spack/util/package_hash.py b/lib/spack/spack/util/package_hash.py index f689aa9710..adea1a498b 100644 --- a/lib/spack/spack/util/package_hash.py +++ b/lib/spack/spack/util/package_hash.py @@ -41,8 +41,23 @@ class RemoveDirectives(ast.NodeTransformer): self.spec = spec def is_directive(self, node): + """Check to determine if the node is a valid directive + + Directives are assumed to be represented in the AST as a named function + call expression. This means that they will NOT be represented by a + named function call within a function call expression (e.g., as + callbacks are sometimes represented). + + Args: + node (AST): the AST node being checked + + Returns: + (bool): ``True`` if the node represents a known directive, + ``False`` otherwise + """ return (isinstance(node, ast.Expr) and node.value and isinstance(node.value, ast.Call) and + isinstance(node.value.func, ast.Name) and node.value.func.id in spack.directives.__all__) def is_spack_attr(self, node): |