[svn] checked in changes regarding variable length iteration
authorArmin Ronacher <armin.ronacher@active-4.com>
Mon, 21 May 2007 21:41:36 +0000 (23:41 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Mon, 21 May 2007 21:41:36 +0000 (23:41 +0200)
--HG--
branch : trunk

CHANGES
jinja/datastructure.py
tests/test_forloop.py

diff --git a/CHANGES b/CHANGES
index bda176c08384ac63dbebbde719315f72c4b9fb8a..dd45ed0b6a31d274ea479f19ed883a555b657fd4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -99,6 +99,10 @@ Version 1.1
   be an expression. As soon as you specify an expression as second argument
   the closing tag has to be omitted.
 
+- It's now possible to iterate over iterators additionally to sequences.
+  If the iterator is inifite it will crash however, so makes sure you don't
+  pass something like that to a template!
+
 
 Version 1.0
 -----------
index daa2e27ad6c7c0fd255d9605db7a2d0a168e2d18..22864b52bec51fb7f81ff8e19d8e0b400e4c460e 100644 (file)
@@ -326,10 +326,17 @@ class LoopContext(object):
         """
         if seq in (Undefined, None):
             seq = ()
+            length = 0
+        else:
+            try:
+                length = len(seq)
+            except TypeError:
+                seq = list(seq)
+                length = len(seq)
         self._stack.append({
             'index':            -1,
             'seq':              seq,
-            'length':           len(seq)
+            'length':           length
         })
         return self
 
index af8afce3186211f7931455aeb153b424c2f20d1a..ca5002061f1a1f784422de414d4dc13e04babee7 100644 (file)
@@ -17,6 +17,7 @@ CONTEXTVARS = '''{% for item in seq %}\
 CYCLING = '''{% for item in seq %}{% cycle '<1>', '<2>' %}{% endfor %}\
 {% for item in seq %}{% cycle through %}{% endfor %}'''
 SCOPE = '''{% for item in seq %}{% endfor %}{{ item }}'''
+VARLEN = '''{% for item in iter %}{{ item }}{% endfor %}'''
 
 
 def test_simple(env):
@@ -63,3 +64,12 @@ def test_scope(env):
     tmpl = env.from_string(SCOPE)
     output = tmpl.render(seq=range(10))
     assert not output
+
+
+def test_varlen(env):
+    def inner():
+        for item in range(5):
+            yield item
+    tmpl = env.from_string(VARLEN)
+    output = tmpl.render(iter=inner())
+    assert output == '01234'