comparison markup/tests/template.py @ 149:537f819c547b trunk

`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
author cmlenz
date Tue, 15 Aug 2006 21:59:07 +0000
parents 47bbd9d2a5af
children cdb2a1f930e2
comparison
equal deleted inserted replaced
148:dcc9dc25bc59 149:537f819c547b
14 import doctest 14 import doctest
15 import unittest 15 import unittest
16 import sys 16 import sys
17 17
18 from markup.core import Markup, Stream 18 from markup.core import Markup, Stream
19 from markup.template import BadDirectiveError, Context, Template, \ 19 from markup.template import BadDirectiveError, Template, TemplateSyntaxError
20 TemplateSyntaxError
21 20
22 21
23 class AttrsDirectiveTestCase(unittest.TestCase): 22 class AttrsDirectiveTestCase(unittest.TestCase):
24 """Tests for the `py:attrs` template directive.""" 23 """Tests for the `py:attrs` template directive."""
25 24
31 <elem py:for="item in items" py:attrs="item"/> 30 <elem py:for="item in items" py:attrs="item"/>
32 </doc>""") 31 </doc>""")
33 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] 32 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}]
34 self.assertEqual("""<doc> 33 self.assertEqual("""<doc>
35 <elem id="1" class="foo"/><elem id="2" class="bar"/> 34 <elem id="1" class="foo"/><elem id="2" class="bar"/>
36 </doc>""", str(tmpl.generate(Context(items=items)))) 35 </doc>""", str(tmpl.generate(items=items)))
37 36
38 def test_update_existing_attr(self): 37 def test_update_existing_attr(self):
39 """ 38 """
40 Verify that an attribute value that evaluates to `None` removes an 39 Verify that an attribute value that evaluates to `None` removes an
41 existing attribute of that name. 40 existing attribute of that name.
200 <b>1</b> 199 <b>1</b>
201 <b>2</b> 200 <b>2</b>
202 <b>3</b> 201 <b>3</b>
203 <b>4</b> 202 <b>4</b>
204 <b>5</b> 203 <b>5</b>
205 </doc>""", str(tmpl.generate(Context(items=range(1, 6))))) 204 </doc>""", str(tmpl.generate(items=range(1, 6))))
206 205
207 def test_as_element(self): 206 def test_as_element(self):
208 """ 207 """
209 Verify that the directive can also be used as an element. 208 Verify that the directive can also be used as an element.
210 """ 209 """
217 <b>1</b> 216 <b>1</b>
218 <b>2</b> 217 <b>2</b>
219 <b>3</b> 218 <b>3</b>
220 <b>4</b> 219 <b>4</b>
221 <b>5</b> 220 <b>5</b>
222 </doc>""", str(tmpl.generate(Context(items=range(1, 6))))) 221 </doc>""", str(tmpl.generate(items=range(1, 6))))
223 222
224 223
225 class IfDirectiveTestCase(unittest.TestCase): 224 class IfDirectiveTestCase(unittest.TestCase):
226 """Tests for the `py:if` template directive.""" 225 """Tests for the `py:if` template directive."""
227 226
233 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> 232 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
234 <b py:if="foo" py:strip="">${bar}</b> 233 <b py:if="foo" py:strip="">${bar}</b>
235 </doc>""") 234 </doc>""")
236 self.assertEqual("""<doc> 235 self.assertEqual("""<doc>
237 Hello 236 Hello
238 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello')))) 237 </doc>""", str(tmpl.generate(foo=True, bar='Hello')))
239 238
240 def test_as_element(self): 239 def test_as_element(self):
241 """ 240 """
242 Verify that the directive can also be used as an element. 241 Verify that the directive can also be used as an element.
243 """ 242 """
244 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> 243 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
245 <py:if test="foo">${bar}</py:if> 244 <py:if test="foo">${bar}</py:if>
246 </doc>""") 245 </doc>""")
247 self.assertEqual("""<doc> 246 self.assertEqual("""<doc>
248 Hello 247 Hello
249 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello')))) 248 </doc>""", str(tmpl.generate(foo=True, bar='Hello')))
250 249
251 250
252 class MatchDirectiveTestCase(unittest.TestCase): 251 class MatchDirectiveTestCase(unittest.TestCase):
253 """Tests for the `py:match` template directive.""" 252 """Tests for the `py:match` template directive."""
254 253
425 </div>""") 424 </div>""")
426 self.assertEqual("""<div> 425 self.assertEqual("""<div>
427 42 426 42
428 84 427 84
429 42 428 42
430 </div>""", str(tmpl.generate(Context(x=42)))) 429 </div>""", str(tmpl.generate(x=42)))
431 430
432 def test_as_element(self): 431 def test_as_element(self):
433 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 432 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
434 <py:with vars="x = x * 2">${x}</py:with> 433 <py:with vars="x = x * 2">${x}</py:with>
435 </div>""") 434 </div>""")
436 self.assertEqual("""<div> 435 self.assertEqual("""<div>
437 84 436 84
438 </div>""", str(tmpl.generate(Context(x=42)))) 437 </div>""", str(tmpl.generate(x=42)))
439 438
440 439
441 class TemplateTestCase(unittest.TestCase): 440 class TemplateTestCase(unittest.TestCase):
442 """Tests for basic template processing, expression evaluation and error 441 """Tests for basic template processing, expression evaluation and error
443 reporting. 442 reporting.
486 self.assertEqual('bar', parts[1][1].source) 485 self.assertEqual('bar', parts[1][1].source)
487 self.assertEqual(Stream.TEXT, parts[2][0]) 486 self.assertEqual(Stream.TEXT, parts[2][0])
488 self.assertEqual(' baz', parts[2][1]) 487 self.assertEqual(' baz', parts[2][1])
489 488
490 def test_interpolate_mixed3(self): 489 def test_interpolate_mixed3(self):
491 ctxt = Context(var=42)
492 tmpl = Template('<root> ${var} $var</root>') 490 tmpl = Template('<root> ${var} $var</root>')
493 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(ctxt))) 491 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
494 492
495 def test_interpolate_non_string_attrs(self): 493 def test_interpolate_non_string_attrs(self):
496 tmpl = Template('<root attr="${1}"/>') 494 tmpl = Template('<root attr="${1}"/>')
497 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) 495 self.assertEqual('<root attr="1"/>', str(tmpl.generate()))
498 496
499 def test_interpolate_list_result(self): 497 def test_interpolate_list_result(self):
500 tmpl = Template('<root>$foo</root>') 498 tmpl = Template('<root>$foo</root>')
501 ctxt = Context(foo=('buzz',)) 499 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',))))
502 self.assertEqual('<root>buzz</root>', str(tmpl.generate(ctxt)))
503 500
504 def test_empty_attr(self): 501 def test_empty_attr(self):
505 tmpl = Template('<root attr=""/>') 502 tmpl = Template('<root attr=""/>')
506 self.assertEqual('<root attr=""/>', str(tmpl.generate())) 503 self.assertEqual('<root attr=""/>', str(tmpl.generate()))
507 504
558 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 555 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
559 $myvar 556 $myvar
560 </div>""") 557 </div>""")
561 self.assertEqual("""<div> 558 self.assertEqual("""<div>
562 <b>foo</b> 559 <b>foo</b>
563 </div>""", str(tmpl.generate(Context(myvar=Markup('<b>foo</b>'))))) 560 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>'))))
564 561
565 def test_text_noescape_quotes(self): 562 def test_text_noescape_quotes(self):
566 """ 563 """
567 Verify that outputting context data in text nodes doesn't escape quotes. 564 Verify that outputting context data in text nodes doesn't escape quotes.
568 """ 565 """
569 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 566 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
570 $myvar 567 $myvar
571 </div>""") 568 </div>""")
572 self.assertEqual("""<div> 569 self.assertEqual("""<div>
573 "foo" 570 "foo"
574 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) 571 </div>""", str(tmpl.generate(myvar='"foo"')))
575 572
576 def test_attr_escape_quotes(self): 573 def test_attr_escape_quotes(self):
577 """ 574 """
578 Verify that outputting context data in attribtes escapes quotes. 575 Verify that outputting context data in attribtes escapes quotes.
579 """ 576 """
580 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 577 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
581 <elem class="$myvar"/> 578 <elem class="$myvar"/>
582 </div>""") 579 </div>""")
583 self.assertEqual("""<div> 580 self.assertEqual("""<div>
584 <elem class="&#34;foo&#34;"/> 581 <elem class="&#34;foo&#34;"/>
585 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) 582 </div>""", str(tmpl.generate(myvar='"foo"')))
586 583
587 def test_directive_element(self): 584 def test_directive_element(self):
588 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 585 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
589 <py:if test="myvar">bar</py:if> 586 <py:if test="myvar">bar</py:if>
590 </div>""") 587 </div>""")
591 self.assertEqual("""<div> 588 self.assertEqual("""<div>
592 bar 589 bar
593 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) 590 </div>""", str(tmpl.generate(myvar='"foo"')))
594 591
595 def test_normal_comment(self): 592 def test_normal_comment(self):
596 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> 593 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
597 <!-- foo bar --> 594 <!-- foo bar -->
598 </div>""") 595 </div>""")
Copyright (C) 2012-2017 Edgewall Software