# HG changeset patch # User cmlenz # Date 1175522050 0 # Node ID 85ae2dee949b3f6af2ac296dda2ea103673651a6 # Parent 7800a61eae43a1def633778549a27ef1e7453548 Raise syntax error on empty value for `py:replace` directive. diff --git a/genshi/template/directives.py b/genshi/template/directives.py --- a/genshi/template/directives.py +++ b/genshi/template/directives.py @@ -443,6 +443,9 @@ __slots__ = [] def attach(cls, template, stream, value, namespaces, pos): + if not value: + raise TemplateSyntaxError('missing value for "replace" directive', + template.filepath, *pos[1:]) expr = cls._parse_expr(value, template.filepath, *pos[1:]) return None, [(EXPR, expr, pos)] attach = classmethod(attach) 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 @@ -16,7 +16,7 @@ import unittest from genshi.template import directives, MarkupTemplate, TextTemplate, \ - TemplateRuntimeError + TemplateRuntimeError, TemplateSyntaxError class AttrsDirectiveTestCase(unittest.TestCase): @@ -462,6 +462,7 @@ """, filename='test.html') 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): @@ -837,6 +838,25 @@ # """, str(tmpl.generate())) +class ReplaceDirectiveTestCase(unittest.TestCase): + """Tests for the `py:replace` template directive.""" + + def test_replace_with_empty_value(self): + """ + Verify that the directive raises an apprioriate exception when an empty + expression is supplied. + """ + try: + tmpl = MarkupTemplate(""" + Foo + """, filename='test.html') + self.fail('Expected TemplateSyntaxError') + except TemplateSyntaxError, e: + self.assertEqual('test.html', e.filename) + if sys.version_info[:2] >= (2, 4): + self.assertEqual(2, e.lineno) + + class StripDirectiveTestCase(unittest.TestCase): """Tests for the `py:strip` template directive.""" @@ -951,6 +971,7 @@ suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test')) suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test')) suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test')) + suite.addTest(unittest.makeSuite(ReplaceDirectiveTestCase, 'test')) suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test')) suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test')) return suite