# HG changeset patch # User cmlenz # Date 1190132843 0 # Node ID 0e278535c67c40afded7ea30c47bf18b705134c1 # Parent b0cdc457dde91a1668fe5f67cfe23a5c9e446fae Don't mask errors in `py:for`. diff --git a/genshi/template/directives.py b/genshi/template/directives.py --- 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__ diff --git a/genshi/template/tests/directives.py b/genshi/template/tests/directives.py --- 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("", + 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):