summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2015-02-17 00:21:15 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2015-02-17 00:21:15 -0800
commit67db8ddca8ac7ab9adeb827a7dadd34a385b2b6b (patch)
tree08221a70f67226eeb5e5bead1d6043fb5e24f113
parent06d6b0b205095f849ace216aa51393b907cf821b (diff)
downloadspack-67db8ddca8ac7ab9adeb827a7dadd34a385b2b6b.tar.gz
spack-67db8ddca8ac7ab9adeb827a7dadd34a385b2b6b.tar.bz2
spack-67db8ddca8ac7ab9adeb827a7dadd34a385b2b6b.tar.xz
spack-67db8ddca8ac7ab9adeb827a7dadd34a385b2b6b.zip
Factor ignore logic into a predicate builder.
-rw-r--r--lib/spack/llnl/util/lang.py31
-rw-r--r--var/spack/packages/python/package.py25
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py
index db15da0506..332367f537 100644
--- a/lib/spack/llnl/util/lang.py
+++ b/lib/spack/llnl/util/lang.py
@@ -291,6 +291,37 @@ def check_kwargs(kwargs, fun):
% (next(kwargs.iterkeys()), fun.__name__))
+def match_predicate(*args):
+ """Utility function for making string matching predicates.
+
+ Each arg can be a:
+ - regex
+ - list or tuple of regexes
+ - predicate that takes a string.
+
+ This returns a predicate that is true if:
+ - any arg regex matches
+ - any regex in a list or tuple of regexes matches.
+ - any predicate in args matches.
+ """
+ def match(string):
+ for arg in args:
+ if isinstance(arg, basestring):
+ if re.search(arg, string):
+ return True
+ elif isinstance(arg, list) or isinstance(arg, tuple):
+ if any(re.search(i, string) for i in arg):
+ return True
+ elif callable(arg):
+ if arg(string):
+ return True
+ else:
+ raise ValueError("args to match_predicate must be regex, "
+ "list of regexes, or callable.")
+ return False
+ return match
+
+
class RequiredAttributeError(ValueError):
def __init__(self, message):
super(RequiredAttributeError, self).__init__(message)
diff --git a/var/spack/packages/python/package.py b/var/spack/packages/python/package.py
index 705d002e80..31a12ea653 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/packages/python/package.py
@@ -1,6 +1,7 @@
import os
import re
from contextlib import closing
+from llnl.util.lang import match_predicate
from spack import *
import spack
@@ -85,23 +86,19 @@ class Python(Package):
def python_ignore(self, ext_pkg, args):
"""Add some ignore files to activate/deactivate args."""
- orig_ignore = args.get('ignore', lambda f: False)
+ ignore_arg = args.get('ignore', lambda f: False)
- def ignore(filename):
- # Always ignore easy-install.pth, as it needs to be merged.
- patterns = [r'easy-install\.pth$']
+ # Always ignore easy-install.pth, as it needs to be merged.
+ patterns = [r'easy-install\.pth$']
- # Ignore pieces of setuptools installed by other packages.
- if ext_pkg.name != 'py-setuptools':
- patterns.append(r'/site\.pyc?$')
- patterns.append(r'setuptools\.pth')
- patterns.append(r'bin/easy_install[^/]*$')
- patterns.append(r'setuptools.*egg$')
+ # Ignore pieces of setuptools installed by other packages.
+ if ext_pkg.name != 'py-setuptools':
+ patterns.append(r'/site\.pyc?$')
+ patterns.append(r'setuptools\.pth')
+ patterns.append(r'bin/easy_install[^/]*$')
+ patterns.append(r'setuptools.*egg$')
- return (any(re.search(p, filename) for p in patterns) or
- orig_ignore(filename))
-
- return ignore
+ return match_predicate(ignore_arg, patterns)
def write_easy_install_pth(self, exts):