Merge "Allow for default() filters for jinja variables"

This commit is contained in:
Jenkins 2015-05-29 08:38:14 +00:00 committed by Gerrit Code Review
commit 1c761cfbb4
2 changed files with 22 additions and 8 deletions

View File

@ -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")

View File

@ -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))