changeset 640:0e278535c67c

Don't mask errors in `py:for`.
author cmlenz
date Tue, 18 Sep 2007 16:27:23 +0000
parents b0cdc457dde9
children 84420a886808 523a706d171e
files genshi/template/directives.py genshi/template/tests/directives.py
diffstat 2 files changed, 21 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/directives.py
+++ b/genshi/template/directives.py
@@ -348,10 +348,10 @@
                                       template.filepath, lineno, offset)
         assign, value = value.split(' in ', 1)
         ast = _parse(assign, 'exec')
+        value = 'iter(%s)' % value.strip()
         self.assign = _assignment(ast.node.nodes[0].expr)
         self.filename = template.filepath
-        Directive.__init__(self, value.strip(), template, namespaces, lineno,
-                           offset)
+        Directive.__init__(self, value, template, namespaces, lineno, offset)
 
     def attach(cls, template, stream, value, namespaces, pos):
         if type(value) is dict:
@@ -368,16 +368,12 @@
         assign = self.assign
         scope = {}
         stream = list(stream)
-        try:
-            iterator = iter(iterable)
-            for item in iterator:
-                assign(scope, item)
-                ctxt.push(scope)
-                for event in _apply_directives(stream, ctxt, directives):
-                    yield event
-                ctxt.pop()
-        except TypeError, e:
-            raise TemplateRuntimeError(str(e), self.filename, *stream[0][2][1:])
+        for item in iterable:
+            assign(scope, item)
+            ctxt.push(scope)
+            for event in _apply_directives(stream, ctxt, directives):
+                yield event
+            ctxt.pop()
 
     def __repr__(self):
         return '<%s>' % self.__class__.__name__
--- a/genshi/template/tests/directives.py
+++ b/genshi/template/tests/directives.py
@@ -483,10 +483,19 @@
         try:
             list(tmpl.generate(foo=12))
             self.fail('Expected TemplateRuntimeError')
-        except TemplateRuntimeError, e:
-            self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(2, e.lineno)
+        except TypeError, e:
+            self.assertEqual('iteration over non-sequence', str(e))
+            exc_type, exc_value, exc_traceback = sys.exc_info()
+            frame = exc_traceback.tb_next
+            frames = []
+            while frame.tb_next:
+                frame = frame.tb_next
+                frames.append(frame)
+            self.assertEqual("<Expression u'iter(foo)'>",
+                             frames[-1].tb_frame.f_code.co_name)
+            self.assertEqual('test.html',
+                             frames[-1].tb_frame.f_code.co_filename)
+            self.assertEqual(2, frames[-1].tb_lineno)
 
 
 class IfDirectiveTestCase(unittest.TestCase):
Copyright (C) 2012-2017 Edgewall Software