Bug 1384396 - Add a @depends_all utility function; r?nalexander
Often you only want to evaluate a function if all its dependencies
are true. Expressing this in a "when" can be difficult. So let's
add a convenience decorator for it.
The existing code for @depends_if() was refactored to take an
evaluation function as its first argument. This prevents some
duplicate code and turns @depends_if() and @depends_all() into
one-liners.
MozReview-Commit-ID: Jbugvf0lioM
--- a/build/moz.configure/util.configure
+++ b/build/moz.configure/util.configure
@@ -399,33 +399,49 @@ def dependable(obj):
return depends(when=True)(obj)
return depends(when=True)(lambda: obj)
always = dependable(True)
never = dependable(False)
-# Like @depends, but the decorated function is only called if one of the
-# arguments it would be called with has a positive value (bool(value) is True)
+# Create a decorator that will only execute the body of a function
+# if the passed function returns True when passed all positional
+# arguments.
@template
-def depends_if(*args, **kwargs):
+def depends_tmpl(eval_args_fn, *args, **kwargs):
if kwargs:
assert len(kwargs) == 1
when = kwargs['when']
else:
when = None
def decorator(func):
@depends(*args, when=when)
def wrapper(*args):
- if any(arg for arg in args):
+ if eval_args_fn(args):
return func(*args)
return wrapper
return decorator
+
+# Like @depends, but the decorated function is only called if one of the
+# arguments it would be called with has a positive value (bool(value) is True)
+@template
+def depends_if(*args, **kwargs):
+ return depends_tmpl(any, *args, **kwargs)
+
+
+# Like @depends, but the decorated function is only called if all of the
+# arguments it would be called with have a positive value.
+@template
+def depends_all(*args, **kwargs):
+ return depends_tmpl(all, *args, **kwargs)
+
+
# Hacks related to old-configure
# ==============================
@dependable
def old_configure_assignments():
return []
@dependable