fixed a problem with having call blocks in outer scopes that
authorArmin Ronacher <armin.ronacher@active-4.com>
Thu, 14 Jan 2010 00:20:46 +0000 (01:20 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Thu, 14 Jan 2010 00:20:46 +0000 (01:20 +0100)
have an argument that is also used as local variable in an
inner frame [#360].

--HG--
branch : trunk

CHANGES
jinja2/compiler.py
tests/test_old_bugs.py

diff --git a/CHANGES b/CHANGES
index 18bbc3d96c06053571b65c9a616d046b1d74d24b..8a155bedb4752a8e9213f98f1d992e90abc4a03c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,9 @@ Version 2.3
 - include tags are now able to select between multiple templates
   and take the first that exists, if a list of templates is
   given.
+- fixed a problem with having call blocks in outer scopes that
+  have an argument that is also used as local variable in an
+  inner frame [#360].
 
 Version 2.2.1
 -------------
index 36d829abd6027bb63ba5828fd170a8d1a308d4a2..bcb228764445ba3396424a0def796d780d2a65f3 100644 (file)
@@ -327,7 +327,7 @@ class FrameIdentifierVisitor(NodeVisitor):
         self.visit(node.iter)
 
     def visit_CallBlock(self, node):
-        for child in node.iter_child_nodes(exclude=('body',)):
+        for child in node.iter_child_nodes(exclude=('body', 'args')):
             self.visit(child)
 
     def visit_FilterBlock(self, node):
index 110b73759533fb78c41ab239166bfbe857193e92..e3a403bdd5d075c935ab7ba2e969532bbe551a76 100644 (file)
@@ -8,7 +8,7 @@
     :copyright: (c) 2009 by the Jinja Team.
     :license: BSD.
 """
-from jinja2 import Environment, DictLoader, TemplateSyntaxError
+from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError
 
 env = Environment()
 
@@ -101,3 +101,36 @@ def test_stacked_locals_scoping_bug():
 # endif
 ''')
     assert t.render(a=0, b=False, c=42, d=42.0) == '1111C'
+
+
+def test_call_with_args():
+    t = Template("""{% macro dump_users(users) -%}
+    <ul>
+      {%- for user in users -%}
+        <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>
+      {%- endfor -%}
+      </ul>
+    {%- endmacro -%}
+
+    {% call(user) dump_users(list_of_user) -%}
+      <dl>
+        <dl>Realname</dl>
+        <dd>{{ user.realname|e }}</dd>
+        <dl>Description</dl>
+        <dd>{{ user.description }}</dd>
+      </dl>
+    {% endcall %}""")
+
+    assert [x.strip() for x in t.render(list_of_user=[{
+        'username':'apo',
+        'realname':'something else',
+        'description':'test'
+    }]).splitlines()] == [
+        u'<ul><li><p>apo</p><dl>',
+        u'<dl>Realname</dl>',
+        u'<dd>something else</dd>',
+        u'<dl>Description</dl>',
+        u'<dd>test</dd>',
+        u'</dl>',
+        u'</li></ul>'
+    ]