diff --git a/rally/api.py b/rally/api.py index dfd4ebe754..581bfbca97 100644 --- a/rally/api.py +++ b/rally/api.py @@ -112,6 +112,19 @@ class Task(object): :returns: rendered template str """ + def is_really_missing(mis, task_template): + # NOTE(boris-42): Removing variables that have default values from + # missing. Construction that won't be properly + # checked is {% set x = x or 1} + if re.search(mis.join(["{%\s*set\s+", "\s*=\s*", "[^\w]+"]), + task_template): + return False + # NOTE(jlk): Also check for a default filter which can show up as + # a missing variable + if re.search(mis + "\s*\|\s*default\(", task_template): + return False + return True + # NOTE(boris-42): We have to import builtins to get the full list of # builtin functions (e.g. range()). Unfortunately, # __builtins__ doesn't return them (when it is not @@ -122,14 +135,8 @@ class Task(object): required_kwargs = jinja2.meta.find_undeclared_variables(ast) missing = set(required_kwargs) - set(kwargs) - set(dir(builtins)) - # NOTE(boris-42): Removing variables that have default values from - # missing. Construction that won't be properly checked - # is {% set x = x or 1} - real_missing = [] - for mis in missing: - if not re.search(mis.join(["{%\s*set\s+", "\s*=\s*", "[^\w]+"]), - task_template): - real_missing.append(mis) + real_missing = [mis for mis in missing + if is_really_missing(mis, task_template)] if real_missing: multi_msg = _("Please specify next template task arguments: %s") diff --git a/tests/unit/test_api.py b/tests/unit/test_api.py index 2d42dd837f..2c6090e31a 100644 --- a/tests/unit/test_api.py +++ b/tests/unit/test_api.py @@ -87,6 +87,13 @@ class TaskAPITestCase(test.TestCase): self.assertEqual( "5 = 5", api.Task.render_template(template, a=2, b=3, c=5)) + def test_render_template_default_filter(self): + template = "{{ c | default(3) }}" + + self.assertEqual("3", api.Task.render_template(template)) + + self.assertEqual("5", api.Task.render_template(template, c=5)) + def test_render_template_builtin(self): template = "{% for i in range(4) %}{{i}}{% endfor %}" self.assertEqual("0123", api.Task.render_template(template))