changeset 716:eee7483041dd trunk

fix ticket [209] - make sure py:with is valid, and add a test to make sure empty py:for is invalid
author aflett
date Tue, 08 Apr 2008 22:38:43 +0000
parents b5bd8c109209
children 4bc6741b2811
files genshi/template/eval.py genshi/template/tests/directives.py
diffstat 2 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/eval.py
+++ b/genshi/template/eval.py
@@ -387,11 +387,12 @@
     source = source.strip()
     if mode == 'exec':
         lines = [line.expandtabs() for line in source.splitlines()]
-        first = lines[0]
-        rest = dedent('\n'.join(lines[1:])).rstrip()
-        if first.rstrip().endswith(':') and not rest[0].isspace():
-            rest = '\n'.join(['    %s' % line for line in rest.splitlines()])
-        source = '\n'.join([first, rest])
+        if lines:
+            first = lines[0]
+            rest = dedent('\n'.join(lines[1:])).rstrip()
+            if first.rstrip().endswith(':') and not rest[0].isspace():
+                rest = '\n'.join(['    %s' % line for line in rest.splitlines()])
+            source = '\n'.join([first, rest])
     if isinstance(source, unicode):
         source = '\xef\xbb\xbf' + source.encode('utf-8')
     return parse(source, mode)
@@ -417,7 +418,10 @@
     else:
         gen = ModuleCodeGenerator(tree)
         lines = source.splitlines()
-        extract = lines[0]
+        if not lines:
+            extract = ''
+        else:
+            extract = lines[0]
         if len(lines) > 1:
             extract += ' ...'
         name = '<Suite %r>' % (extract)
--- a/genshi/template/tests/directives.py
+++ b/genshi/template/tests/directives.py
@@ -499,6 +499,22 @@
             if sys.version_info[:2] >= (2, 4):
                 self.assertEqual(2, frames[-1].tb_lineno)
 
+    def test_for_with_empty_value(self):
+        """
+        Verify an empty 'for' value is an error
+        """
+        try:
+            MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/">
+          <py:for each="">
+            empty
+          </py:for>
+        </doc>""", filename='test.html')
+            self.fail('ExpectedTemplateSyntaxError')
+        except TemplateSyntaxError, e:
+            self.assertEqual('test.html', e.filename)
+            if sys.version_info[:2] > (2,4):
+                self.assertEqual(2, e.lineno)
+
 
 class IfDirectiveTestCase(unittest.TestCase):
     """Tests for the `py:if` template directive."""
@@ -1104,6 +1120,16 @@
             一二三四五六日
           </span>
         </div>""", str(tmpl.generate()))
+        
+    def test_with_empty_value(self):
+        """
+        Verify that an empty py:with works (useless, but legal)
+        """
+        tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
+          <span py:with="">Text</span></div>""")
+
+        self.assertEqual("""<div>
+          <span>Text</span></div>""", str(tmpl.generate()))
 
 
 def suite():
Copyright (C) 2012-2017 Edgewall Software