def test_exec_in_match(self): xml = ("""<html xmlns:py="http://genshi.edgewall.org/"> <py:match path="body/p"> <?python title="wakka wakka wakka" ?> ${title} </py:match> <body><p>moot text</p></body> </html>""") tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=True) self.assertEqual("""<html> <body> wakka wakka wakka </body> </html>""", tmpl.generate().render(encoding=None))
def test_allow_exec_false(self): xml = ("""<?python title = "A Genshi Template" ?> <html xmlns:py="http://genshi.edgewall.org/"> <head> <title py:content="title">This is replaced.</title> </head> </html>""") try: tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=False) self.fail('Expected SyntaxError') except TemplateSyntaxError as e: pass
def test_with_in_match(self): xml = ("""<html xmlns:py="http://genshi.edgewall.org/"> <py:match path="body/p"> <h1>${select('text()')}</h1> ${select('.')} </py:match> <body><p py:with="foo='bar'">${foo}</p></body> </html>""") tmpl = MarkupTemplate(xml, filename='test.html') self.assertEqual("""<html> <body> <h1>bar</h1> <p>bar</p> </body> </html>""", tmpl.generate().render(encoding=None))
def test_relative_include_from_inmemory_template(self): file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') try: file1.write("""<div>Included</div>""") finally: file1.close() loader = TemplateLoader([self.dirname]) tmpl2 = MarkupTemplate("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="../tmpl1.html" /> </html>""", filename='subdir/tmpl2.html', loader=loader) self.assertEqual("""<html> <div>Included</div> </html>""", tmpl2.generate().render(encoding=None))
def test_namespace_on_removed_elem(self): """ Verify that a namespace declaration on an element that is removed from the generated stream does not get pushed up to the next non-stripped element (see ticket #107). """ tmpl = MarkupTemplate("""<?xml version="1.0"?> <Test xmlns:py="http://genshi.edgewall.org/"> <Size py:if="0" xmlns:t="test">Size</Size> <Item/> </Test>""") self.assertEqual("""<?xml version="1.0"?>\n<Test> <Item/> </Test>""", str(tmpl.generate()))
def test_match_without_select(self): # See <http://genshi.edgewall.org/ticket/243> xml = ("""<html xmlns:py="http://genshi.edgewall.org/"> <py:match path="body" buffer="false"> <body> This replaces the other text. </body> </py:match> <body> This gets replaced. </body> </html>""") tmpl = MarkupTemplate(xml, filename='test.html') self.assertEqual("""<html> <body> This replaces the other text. </body> </html>""", tmpl.generate().render(encoding=None))
def test_nested_matches_without_buffering(self): xml = ("""<html xmlns:py="http://genshi.edgewall.org/"> <py:match path="body" once="true" buffer="false"> <body> ${select('*|text')} And some other stuff... </body> </py:match> <body> <span py:match="span">Foo</span> <span>Bar</span> </body> </html>""") tmpl = MarkupTemplate(xml, filename='test.html') self.assertEqual("""<html> <body> <span>Foo</span> And some other stuff... </body> </html>""", tmpl.generate().render(encoding=None))
def test_relative_include_without_loader_relative(self): file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') try: file1.write("""<div>Included</div>""") finally: file1.close() file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') try: file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="tmpl1.html" /> </html>""") finally: file2.close() tmpl = MarkupTemplate("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="tmpl1.html" /> </html>""", filename=os.path.join(self.dirname, 'tmpl2.html')) self.assertEqual("""<html> <div>Included</div> </html>""", tmpl.generate().render(encoding=None))
def test_match_tail_handling(self): # See <http://genshi.edgewall.org/ticket/399> xml = ("""<rhyme xmlns:py="http://genshi.edgewall.org/"> <py:match path="*[@type]"> ${select('.')} </py:match> <lines> <first type="one">fish</first> <second type="two">fish</second> <third type="red">fish</third> <fourth type="blue">fish</fourth> </lines> </rhyme>""") tmpl = MarkupTemplate(xml, filename='test.html') self.assertEqual("""<rhyme> <lines> <first type="one">fish</first> <second type="two">fish</second> <third type="red">fish</third> <fourth type="blue">fish</fourth> </lines> </rhyme>""", tmpl.generate().render(encoding=None))
def test_empty_attr(self): tmpl = MarkupTemplate('<root attr=""/>') self.assertEqual('<root attr=""/>', str(tmpl.generate()))
def test_interpolate_list_result(self): tmpl = MarkupTemplate('<root>$foo</root>') self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',))))
def test_interpolate_non_string_attrs(self): tmpl = MarkupTemplate('<root attr="${1}"/>') self.assertEqual('<root attr="1"/>', str(tmpl.generate()))
def test_interpolate_leading_trailing_space(self): tmpl = MarkupTemplate('<root>${ foo }</root>') self.assertEqual('<root>bar</root>', str(tmpl.generate(foo='bar')))
def test_interpolate_mixed3(self): tmpl = MarkupTemplate('<root> ${var} $var</root>') self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
def test_parse_stream(self): stream = XML('<root> ${var} $var</root>') tmpl = MarkupTemplate(stream) self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
def test_parse_fileobj(self): fileobj = StringIO('<root> ${var} $var</root>') tmpl = MarkupTemplate(fileobj) self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
def test_empty_attr_interpolated(self): tmpl = MarkupTemplate('<root attr="$attr"/>') self.assertEqual('<root attr=""/>', str(tmpl.generate(attr='')))
def test_interpolate_multiline(self): tmpl = MarkupTemplate("""<root>${dict( bar = 'baz' )[foo]}</root>""") self.assertEqual('<root>baz</root>', str(tmpl.generate(foo='bar')))