Mercurial > genshi > genshi-test
annotate markup/tests/template.py @ 218:af15e231d972
Updated change log.
author | cmlenz |
---|---|
date | Mon, 04 Sep 2006 23:41:10 +0000 |
parents | d8b195b22a44 |
children | c62dbea15f36 |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
3 # Copyright (C) 2006 Edgewall Software |
1 | 4 # All rights reserved. |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
8 # are also available at http://markup.edgewall.org/wiki/License. |
1 | 9 # |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
12 # history and logs, available at http://markup.edgewall.org/log/. |
1 | 13 |
14 import doctest | |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
15 import os |
1 | 16 import unittest |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
17 import shutil |
1 | 18 import sys |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
19 import tempfile |
1 | 20 |
54 | 21 from markup.core import Markup, Stream |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
22 from markup.template import BadDirectiveError, Template, TemplateLoader, \ |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
23 TemplateSyntaxError |
1 | 24 |
25 | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
26 class AttrsDirectiveTestCase(unittest.TestCase): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
27 """Tests for the `py:attrs` template directive.""" |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
28 |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
29 def test_combined_with_loop(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
30 """ |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
31 Verify that the directive has access to the loop variables. |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
32 """ |
61 | 33 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
34 <elem py:for="item in items" py:attrs="item"/> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
35 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
36 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
37 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
38 <elem id="1" class="foo"/><elem id="2" class="bar"/> |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
39 </doc>""", str(tmpl.generate(items=items))) |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
40 |
54 | 41 def test_update_existing_attr(self): |
42 """ | |
43 Verify that an attribute value that evaluates to `None` removes an | |
44 existing attribute of that name. | |
45 """ | |
61 | 46 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 47 <elem class="foo" py:attrs="{'class': 'bar'}"/> |
48 </doc>""") | |
49 self.assertEqual("""<doc> | |
50 <elem class="bar"/> | |
51 </doc>""", str(tmpl.generate())) | |
52 | |
53 def test_remove_existing_attr(self): | |
54 """ | |
55 Verify that an attribute value that evaluates to `None` removes an | |
56 existing attribute of that name. | |
57 """ | |
61 | 58 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 59 <elem class="foo" py:attrs="{'class': None}"/> |
60 </doc>""") | |
61 self.assertEqual("""<doc> | |
62 <elem/> | |
63 </doc>""", str(tmpl.generate())) | |
64 | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
65 |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
66 class ChooseDirectiveTestCase(unittest.TestCase): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
67 """Tests for the `py:choose` template directive and the complementary |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
68 directives `py:when` and `py:otherwise`.""" |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
69 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
70 def test_multiple_true_whens(self): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
71 """ |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
72 Verify that, if multiple `py:when` bodies match, only the first is |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
73 output. |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
74 """ |
61 | 75 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
76 <span py:when="1 == 1">1</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
77 <span py:when="2 == 2">2</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
78 <span py:when="3 == 3">3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
79 </div>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
80 self.assertEqual("""<div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
81 <span>1</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
82 </div>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
83 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
84 def test_otherwise(self): |
61 | 85 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
86 <span py:when="False">hidden</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
87 <span py:otherwise="">hello</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
88 </div>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
89 self.assertEqual("""<div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
90 <span>hello</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
91 </div>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
92 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
93 def test_nesting(self): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
94 """ |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
95 Verify that `py:choose` blocks can be nested: |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
96 """ |
61 | 97 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
98 <div py:choose="1"> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
99 <div py:when="1" py:choose="3"> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
100 <span py:when="2">2</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
101 <span py:when="3">3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
102 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
103 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
104 </doc>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
105 self.assertEqual("""<doc> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
106 <div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
107 <div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
108 <span>3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
109 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
110 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
111 </doc>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
112 |
202
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
113 def test_complex_nesting(self): |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
114 """ |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
115 Verify more complex nesting. |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
116 """ |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
117 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
118 <div py:choose="1"> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
119 <div py:when="1" py:choose=""> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
120 <span py:when="2">OK</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
121 <span py:when="1">FAIL</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
122 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
123 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
124 </doc>""") |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
125 self.assertEqual("""<doc> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
126 <div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
127 <div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
128 <span>OK</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
129 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
130 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
131 </doc>""", str(tmpl.generate())) |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
132 |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
133 def test_complex_nesting_otherwise(self): |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
134 """ |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
135 Verify more complex nesting using otherwise. |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
136 """ |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
137 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
138 <div py:choose="1"> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
139 <div py:when="1" py:choose="2"> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
140 <span py:when="1">FAIL</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
141 <span py:otherwise="">OK</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
142 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
143 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
144 </doc>""") |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
145 self.assertEqual("""<doc> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
146 <div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
147 <div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
148 <span>OK</span> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
149 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
150 </div> |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
151 </doc>""", str(tmpl.generate())) |
4140bff0d7d2
Remove the (hopefully) last instance where directives store state in instance variables, allowing templates to be cached and reused in a threadsafe manner. Closes #39. Many thanks to Christian Boos for the patch!
cmlenz
parents:
191
diff
changeset
|
152 |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
153 def test_when_with_strip(self): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
154 """ |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
155 Verify that a when directive with a strip directive actually strips of |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
156 the outer element. |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
157 """ |
61 | 158 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
159 <div py:choose="" py:strip=""> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
160 <span py:otherwise="">foo</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
161 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
162 </doc>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
163 self.assertEqual("""<doc> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
164 <span>foo</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
165 </doc>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
166 |
166
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
167 def test_when_outside_choose(self): |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
168 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
169 Verify that a `when` directive outside of a `choose` directive is |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
170 reported as an error. |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
171 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
172 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
173 <div py:when="xy" /> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
174 </doc>""") |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
175 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
176 |
181
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
177 def test_otherwise_outside_choose(self): |
166
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
178 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
179 Verify that an `otherwise` directive outside of a `choose` directive is |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
180 reported as an error. |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
181 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
182 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
183 <div py:otherwise="" /> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
184 </doc>""") |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
185 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
186 |
181
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
187 def test_when_without_test(self): |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
188 """ |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
189 Verify that an `when` directive that doesn't have a `test` attribute |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
190 is reported as an error. |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
191 """ |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
192 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
193 <div py:choose="" py:strip=""> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
194 <py:when>foo</py:when> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
195 </div> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
196 </doc>""") |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
197 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
198 |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
199 def test_otherwise_without_test(self): |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
200 """ |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
201 Verify that an `otherwise` directive can be used without a `test` |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
202 attribute. |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
203 """ |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
204 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
205 <div py:choose="" py:strip=""> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
206 <py:otherwise>foo</py:otherwise> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
207 </div> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
208 </doc>""") |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
209 self.assertEqual("""<doc> |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
210 foo |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
211 </doc>""", str(tmpl.generate())) |
d07ce6c1dbbe
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
212 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
213 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
214 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
215 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
216 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
217 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
218 <py:choose> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
219 <py:when test="1 == 1">1</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
220 <py:when test="2 == 2">2</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
221 <py:when test="3 == 3">3</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
222 </py:choose> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
223 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
224 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
225 1 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
226 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
227 |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
228 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
229 class DefDirectiveTestCase(unittest.TestCase): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
230 """Tests for the `py:def` template directive.""" |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
231 |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
232 def test_function_with_strip(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
233 """ |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
234 Verify that a named template function with a strip directive actually |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
235 strips of the outer element. |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
236 """ |
61 | 237 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
238 <div py:def="echo(what)" py:strip=""> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
239 <b>${what}</b> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
240 </div> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
241 ${echo('foo')} |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
242 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
243 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
244 <b>foo</b> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
245 </doc>""", str(tmpl.generate())) |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
246 |
90
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
247 def test_exec_in_replace(self): |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
248 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
249 <p py:def="echo(greeting, name='world')" class="message"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
250 ${greeting}, ${name}! |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
251 </p> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
252 <div py:replace="echo('hello')"></div> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
253 </div>""") |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
254 self.assertEqual("""<div> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
255 <p class="message"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
256 hello, world! |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
257 </p> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
258 </div>""", str(tmpl.generate())) |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
259 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
260 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
261 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
262 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
263 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
264 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
265 <py:def function="echo(what)"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
266 <b>${what}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
267 </py:def> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
268 ${echo('foo')} |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
269 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
270 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
271 <b>foo</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
272 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
273 |
154
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
274 def test_nested_defs(self): |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
275 """ |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
276 Verify that a template function defined inside a conditional block can |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
277 be called from outside that block. |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
278 """ |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
279 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
280 <py:if test="semantic"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
281 <strong py:def="echo(what)">${what}</strong> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
282 </py:if> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
283 <py:if test="not semantic"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
284 <b py:def="echo(what)">${what}</b> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
285 </py:if> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
286 ${echo('foo')} |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
287 </doc>""") |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
288 self.assertEqual("""<doc> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
289 <strong>foo</strong> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
290 </doc>""", str(tmpl.generate(semantic=True))) |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
291 |
165
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
292 def test_function_with_default_arg(self): |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
293 """ |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
294 Verify that keyword arguments work with `py:def` directives. |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
295 """ |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
296 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
297 <b py:def="echo(what, bold=False)" py:strip="not bold">${what}</b> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
298 ${echo('foo')} |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
299 </doc>""") |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
300 self.assertEqual("""<doc> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
301 foo |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
302 </doc>""", str(tmpl.generate())) |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
303 |
185
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
304 def test_invocation_in_attribute(self): |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
305 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
306 <py:def function="echo(what)">${what or 'something'}</py:def> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
307 <p class="${echo('foo')}">bar</p> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
308 </doc>""") |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
309 self.assertEqual("""<doc> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
310 <p class="foo">bar</p> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
311 </doc>""", str(tmpl.generate())) |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
312 |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
313 def test_invocation_in_attribute_none(self): |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
314 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
315 <py:def function="echo()">${None}</py:def> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
316 <p class="${echo()}">bar</p> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
317 </doc>""") |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
318 self.assertEqual("""<doc> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
319 <p>bar</p> |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
320 </doc>""", str(tmpl.generate())) |
8e5a3048b359
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
321 |
206
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
322 def test_function_raising_typeerror(self): |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
323 def badfunc(): |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
324 raise TypeError |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
325 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
326 <div py:def="dobadfunc()"> |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
327 ${badfunc()} |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
328 </div> |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
329 <div py:content="dobadfunc()"/> |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
330 </html>""") |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
331 self.assertRaises(TypeError, list, tmpl.generate(badfunc=badfunc)) |
d122ff386411
`TypeError`s raised by `py:def` macros (and other expressions producing streams) are no longer silently ignored. Closes #44.
cmlenz
parents:
202
diff
changeset
|
332 |
208
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
333 def test_def_in_matched(self): |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
334 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
335 <head py:match="head">${select('*')}</head> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
336 <head> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
337 <py:def function="maketitle(test)"><b py:replace="test" /></py:def> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
338 <title>${maketitle(True)}</title> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
339 </head> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
340 </doc>""") |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
341 self.assertEqual("""<doc> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
342 <head><title>True</title></head> |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
343 </doc>""", str(tmpl.generate())) |
835203f3b8fd
Cleanup the application of template processing steps (flatten, eval, match) so that they are only performed when necessary. Results in a small performance boost, and also fixes #35.
cmlenz
parents:
206
diff
changeset
|
344 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
345 |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
346 class ForDirectiveTestCase(unittest.TestCase): |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
347 """Tests for the `py:for` template directive.""" |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
348 |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
349 def test_loop_with_strip(self): |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
350 """ |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
351 Verify that the combining the `py:for` directive with `py:strip` works |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
352 correctly. |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
353 """ |
61 | 354 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
355 <div py:for="item in items" py:strip=""> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
356 <b>${item}</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
357 </div> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
358 </doc>""") |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
359 self.assertEqual("""<doc> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
360 <b>1</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
361 <b>2</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
362 <b>3</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
363 <b>4</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
364 <b>5</b> |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
365 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
366 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
367 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
368 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
369 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
370 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
371 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
372 <py:for each="item in items"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
373 <b>${item}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
374 </py:for> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
375 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
376 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
377 <b>1</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
378 <b>2</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
379 <b>3</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
380 <b>4</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
381 <b>5</b> |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
382 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
383 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
384 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
385 class IfDirectiveTestCase(unittest.TestCase): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
386 """Tests for the `py:if` template directive.""" |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
387 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
388 def test_loop_with_strip(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
389 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
390 Verify that the combining the `py:if` directive with `py:strip` works |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
391 correctly. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
392 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
393 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
394 <b py:if="foo" py:strip="">${bar}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
395 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
396 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
397 Hello |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
398 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
399 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
400 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
401 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
402 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
403 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
404 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
405 <py:if test="foo">${bar}</py:if> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
406 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
407 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
408 Hello |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
409 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
410 |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
411 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
412 class MatchDirectiveTestCase(unittest.TestCase): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
413 """Tests for the `py:match` template directive.""" |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
414 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
415 def test_with_strip(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
416 """ |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
417 Verify that a match template can produce the same kind of element that |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
418 it matched without entering an infinite recursion. |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
419 """ |
61 | 420 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
421 <elem py:match="elem" py:strip=""> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
422 <div class="elem">${select('text()')}</div> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
423 </elem> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
424 <elem>Hey Joe</elem> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
425 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
426 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
427 <div class="elem">Hey Joe</div> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
428 </doc>""", str(tmpl.generate())) |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
429 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
430 def test_without_strip(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
431 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
432 Verify that a match template can produce the same kind of element that |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
433 it matched without entering an infinite recursion. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
434 """ |
61 | 435 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
436 <elem py:match="elem"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
437 <div class="elem">${select('text()')}</div> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
438 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
439 <elem>Hey Joe</elem> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
440 </doc>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
441 self.assertEqual("""<doc> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
442 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
443 <div class="elem">Hey Joe</div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
444 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
445 </doc>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
446 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
447 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
448 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
449 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
450 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
451 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
452 <py:match path="elem"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
453 <div class="elem">${select('text()')}</div> |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
454 </py:match> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
455 <elem>Hey Joe</elem> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
456 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
457 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
458 <div class="elem">Hey Joe</div> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
459 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
460 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
461 def test_recursive_match_1(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
462 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
463 Match directives are applied recursively, meaning that they are also |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
464 applied to any content they may have produced themselves: |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
465 """ |
61 | 466 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
467 <elem py:match="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
468 <div class="elem"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
469 ${select('*')} |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
470 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
471 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
472 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
473 <subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
474 <elem/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
475 </subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
476 </elem> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
477 </doc>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
478 self.assertEqual("""<doc> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
479 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
480 <div class="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
481 <subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
482 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
483 <div class="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
484 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
485 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
486 </subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
487 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
488 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
489 </doc>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
490 |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
491 def test_recursive_match_2(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
492 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
493 When two or more match templates match the same element and also |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
494 themselves output the element they match, avoiding recursion is even |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
495 more complex, but should work. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
496 """ |
61 | 497 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
498 <body py:match="body"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
499 <div id="header"/> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
500 ${select('*')} |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
501 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
502 <body py:match="body"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
503 ${select('*')} |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
504 <div id="footer"/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
505 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
506 <body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
507 <h1>Foo</h1> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
508 </body> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
509 </html>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
510 self.assertEqual("""<html> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
511 <body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
512 <div id="header"/><h1>Foo</h1> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
513 <div id="footer"/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
514 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
515 </html>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
516 |
77
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
517 def test_select_all_attrs(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
518 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
519 <div py:match="elem" py:attrs="select('@*')"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
520 ${select('text()')} |
77
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
521 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
522 <elem id="joe">Hey Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
523 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
524 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
525 <div id="joe"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
526 Hey Joe |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
527 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
528 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
529 |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
530 def test_select_all_attrs_empty(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
531 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
532 <div py:match="elem" py:attrs="select('@*')"> |
216
0a01371cecbc
Many fixes to XPath evaluation. Among other things, this should get rid of the bug that attributes were getting ?pulled up? by `py:match` directives using `py:attrs="select('@*')"` (see #50).
cmlenz
parents:
211
diff
changeset
|
533 ${select('text()')} |
77
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
534 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
535 <elem>Hey Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
536 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
537 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
538 <div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
539 Hey Joe |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
540 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
541 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
542 |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
543 def test_select_all_attrs_in_body(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
544 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
545 <div py:match="elem"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
546 Hey ${select('text()')} ${select('@*')} |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
547 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
548 <elem title="Cool">Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
549 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
550 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
551 <div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
552 Hey Joe Cool |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
553 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
554 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
555 |
172
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
556 def test_def_in_match(self): |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
557 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
558 <py:def function="maketitle(test)"><b py:replace="test" /></py:def> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
559 <head py:match="head">${select('*')}</head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
560 <head><title>${maketitle(True)}</title></head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
561 </doc>""") |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
562 self.assertEqual("""<doc> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
563 <head><title>True</title></head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
564 </doc>""", str(tmpl.generate())) |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
565 |
179
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
566 def test_match_with_xpath_variable(self): |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
567 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
568 <span py:match="*[name()=$tagname]"> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
569 Hello ${select('@name')} |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
570 </span> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
571 <greeting name="Dude"/> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
572 </div>""") |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
573 self.assertEqual("""<div> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
574 <span> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
575 Hello Dude |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
576 </span> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
577 </div>""", str(tmpl.generate(tagname='greeting'))) |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
578 self.assertEqual("""<div> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
579 <greeting name="Dude"/> |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
580 </div>""", str(tmpl.generate(tagname='sayhello'))) |
a2e0a7986d19
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
581 |
210
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
582 def test_content_directive_in_match(self): |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
583 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
584 <div py:match="foo">I said <q py:content="select('text()')">something</q>.</div> |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
585 <foo>bar</foo> |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
586 </html>""") |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
587 self.assertEqual("""<html> |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
588 <div>I said <q>bar</q>.</div> |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
589 </html>""", str(tmpl.generate())) |
c0c70dc5bf95
Fix regression introduced in [258]. More fixes needed?
cmlenz
parents:
208
diff
changeset
|
590 |
211
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
591 def test_cascaded_matches(self): |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
592 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
593 <body py:match="body">${select('*')}</body> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
594 <head py:match="head">${select('title')}</head> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
595 <body py:match="body">${select('*')}<hr /></body> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
596 <head><title>Welcome to Markup</title></head> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
597 <body><h2>Are you ready to mark up?</h2></body> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
598 </html>""") |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
599 self.assertEqual("""<html> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
600 <head><title>Welcome to Markup</title></head> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
601 <body><h2>Are you ready to mark up?</h2><hr/></body> |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
602 </html>""", str(tmpl.generate())) |
0a14c2a06be3
Fix another regression introduced in [258]: some kinds of cascaded match templates were broken, for example in the TurboGears example app.
cmlenz
parents:
210
diff
changeset
|
603 |
217
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
604 def test_multiple_matches(self): |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
605 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
606 <input py:match="form//input" py:attrs="select('@*')" |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
607 value="${values[str(select('@name'))]}" /> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
608 <form><p py:for="field in fields"> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
609 <label>${field.capitalize()}</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
610 <input type="text" name="${field}" /> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
611 </p></form> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
612 </html>""") |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
613 fields = ['hello_%s' % i for i in range(5)] |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
614 values = dict([('hello_%s' % i, i) for i in range(5)]) |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
615 self.assertEqual("""<html> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
616 <form><p> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
617 <label>Hello_0</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
618 <input value="0" type="text" name="hello_0"/> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
619 </p><p> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
620 <label>Hello_1</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
621 <input value="1" type="text" name="hello_1"/> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
622 </p><p> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
623 <label>Hello_2</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
624 <input value="2" type="text" name="hello_2"/> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
625 </p><p> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
626 <label>Hello_3</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
627 <input value="3" type="text" name="hello_3"/> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
628 </p><p> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
629 <label>Hello_4</label> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
630 <input value="4" type="text" name="hello_4"/> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
631 </p></form> |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
632 </html>""", str(tmpl.generate(fields=fields, values=values))) |
d8b195b22a44
Fix `py:match` directive which would screw up in some scenarios due to incorrect handling of the substream. Closes #49.
cmlenz
parents:
216
diff
changeset
|
633 |
184
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
634 # FIXME |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
635 #def test_match_after_step(self): |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
636 # tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
637 # <span py:match="div/greeting"> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
638 # Hello ${select('@name')} |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
639 # </span> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
640 # <greeting name="Dude" /> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
641 # </div>""") |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
642 # self.assertEqual("""<div> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
643 # <span> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
644 # Hello Dude |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
645 # </span> |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
646 # </div>""", str(tmpl.generate())) |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
647 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
648 |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
649 class StripDirectiveTestCase(unittest.TestCase): |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
650 """Tests for the `py:strip` template directive.""" |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
651 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
652 def test_strip_false(self): |
61 | 653 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
654 <div py:strip="False"><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
655 </div>""") |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
656 self.assertEqual("""<div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
657 <div><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
658 </div>""", str(tmpl.generate())) |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
659 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
660 def test_strip_empty(self): |
61 | 661 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
662 <div py:strip=""><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
663 </div>""") |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
664 self.assertEqual("""<div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
665 <b>foo</b> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
666 </div>""", str(tmpl.generate())) |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
667 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
668 |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
669 class WithDirectiveTestCase(unittest.TestCase): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
670 """Tests for the `py:with` template directive.""" |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
671 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
672 def test_shadowing(self): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
673 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
674 ${x} |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
675 <span py:with="x = x * 2" py:replace="x"/> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
676 ${x} |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
677 </div>""") |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
678 self.assertEqual("""<div> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
679 42 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
680 84 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
681 42 |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
682 </div>""", str(tmpl.generate(x=42))) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
683 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
684 def test_as_element(self): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
685 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
686 <py:with vars="x = x * 2">${x}</py:with> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
687 </div>""") |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
688 self.assertEqual("""<div> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
689 84 |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
690 </div>""", str(tmpl.generate(x=42))) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
691 |
190 | 692 def test_multiple_vars_same_name(self): |
693 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
694 <py:with vars=" | |
695 foo = 'bar'; | |
696 foo = foo.replace('r', 'z') | |
697 "> | |
698 $foo | |
699 </py:with> | |
700 </div>""") | |
701 self.assertEqual("""<div> | |
702 baz | |
703 </div>""", str(tmpl.generate(x=42))) | |
704 | |
705 def test_multiple_vars_single_assignment(self): | |
706 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
707 <py:with vars="x = y = z = 1">${x} ${y} ${z}</py:with> | |
708 </div>""") | |
709 self.assertEqual("""<div> | |
710 1 1 1 | |
711 </div>""", str(tmpl.generate(x=42))) | |
712 | |
713 def test_multiple_vars_trailing_semicolon(self): | |
714 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
715 <py:with vars="x = x * 2; y = x / 2;">${x} ${y}</py:with> | |
716 </div>""") | |
717 self.assertEqual("""<div> | |
718 84 42 | |
719 </div>""", str(tmpl.generate(x=42))) | |
720 | |
721 def test_semicolon_escape(self): | |
722 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
723 <py:with vars="x = 'here is a semicolon: ;'; y = 'here are two semicolons: ;;' ;"> | |
724 ${x} | |
725 ${y} | |
726 </py:with> | |
727 </div>""") | |
728 self.assertEqual("""<div> | |
729 here is a semicolon: ; | |
730 here are two semicolons: ;; | |
731 </div>""", str(tmpl.generate())) | |
732 | |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
733 |
1 | 734 class TemplateTestCase(unittest.TestCase): |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
735 """Tests for basic template processing, expression evaluation and error |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
736 reporting. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
737 """ |
1 | 738 |
739 def test_interpolate_string(self): | |
740 parts = list(Template._interpolate('bla')) | |
741 self.assertEqual(1, len(parts)) | |
742 self.assertEqual(Stream.TEXT, parts[0][0]) | |
743 self.assertEqual('bla', parts[0][1]) | |
744 | |
745 def test_interpolate_simple(self): | |
746 parts = list(Template._interpolate('${bla}')) | |
747 self.assertEqual(1, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
748 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 749 self.assertEqual('bla', parts[0][1].source) |
750 | |
751 def test_interpolate_escaped(self): | |
752 parts = list(Template._interpolate('$${bla}')) | |
753 self.assertEqual(1, len(parts)) | |
754 self.assertEqual(Stream.TEXT, parts[0][0]) | |
755 self.assertEqual('${bla}', parts[0][1]) | |
756 | |
757 def test_interpolate_short(self): | |
758 parts = list(Template._interpolate('$bla')) | |
759 self.assertEqual(1, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
760 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 761 self.assertEqual('bla', parts[0][1].source) |
762 | |
763 def test_interpolate_mixed1(self): | |
764 parts = list(Template._interpolate('$foo bar $baz')) | |
765 self.assertEqual(3, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
766 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 767 self.assertEqual('foo', parts[0][1].source) |
768 self.assertEqual(Stream.TEXT, parts[1][0]) | |
769 self.assertEqual(' bar ', parts[1][1]) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
770 self.assertEqual(Template.EXPR, parts[2][0]) |
1 | 771 self.assertEqual('baz', parts[2][1].source) |
772 | |
773 def test_interpolate_mixed2(self): | |
774 parts = list(Template._interpolate('foo $bar baz')) | |
775 self.assertEqual(3, len(parts)) | |
776 self.assertEqual(Stream.TEXT, parts[0][0]) | |
777 self.assertEqual('foo ', parts[0][1]) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
778 self.assertEqual(Template.EXPR, parts[1][0]) |
1 | 779 self.assertEqual('bar', parts[1][1].source) |
780 self.assertEqual(Stream.TEXT, parts[2][0]) | |
781 self.assertEqual(' baz', parts[2][1]) | |
782 | |
74
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
783 def test_interpolate_mixed3(self): |
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
784 tmpl = Template('<root> ${var} $var</root>') |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
785 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) |
74
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
786 |
191
929ef2913b87
Allow leading whitespace in expressions. Closes #38. Thanks to Christian Boos for the patch!
cmlenz
parents:
190
diff
changeset
|
787 def test_interpolate_leading_trailing_space(self): |
929ef2913b87
Allow leading whitespace in expressions. Closes #38. Thanks to Christian Boos for the patch!
cmlenz
parents:
190
diff
changeset
|
788 tmpl = Template('<root>${ foo }</root>') |
929ef2913b87
Allow leading whitespace in expressions. Closes #38. Thanks to Christian Boos for the patch!
cmlenz
parents:
190
diff
changeset
|
789 self.assertEqual('<root>bar</root>', str(tmpl.generate(foo='bar'))) |
929ef2913b87
Allow leading whitespace in expressions. Closes #38. Thanks to Christian Boos for the patch!
cmlenz
parents:
190
diff
changeset
|
790 |
184
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
791 def test_interpolate_multiline(self): |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
792 tmpl = Template("""<root>${dict( |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
793 bar = 'baz' |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
794 )[foo]}</root>""") |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
795 self.assertEqual('<root>baz</root>', str(tmpl.generate(foo='bar'))) |
e27a48802987
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
796 |
48
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
797 def test_interpolate_non_string_attrs(self): |
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
798 tmpl = Template('<root attr="${1}"/>') |
75
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
799 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
800 |
145
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
801 def test_interpolate_list_result(self): |
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
802 tmpl = Template('<root>$foo</root>') |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
803 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',)))) |
145
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
804 |
75
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
805 def test_empty_attr(self): |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
806 tmpl = Template('<root attr=""/>') |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
807 self.assertEqual('<root attr=""/>', str(tmpl.generate())) |
48
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
808 |
1 | 809 def test_bad_directive_error(self): |
61 | 810 xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />' |
1 | 811 try: |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
10
diff
changeset
|
812 tmpl = Template(xml, filename='test.html') |
1 | 813 except BadDirectiveError, e: |
814 self.assertEqual('test.html', e.filename) | |
815 if sys.version_info[:2] >= (2, 4): | |
816 self.assertEqual(1, e.lineno) | |
817 | |
818 def test_directive_value_syntax_error(self): | |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
819 xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />""" |
1 | 820 try: |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
821 tmpl = Template(xml, filename='test.html') |
1 | 822 self.fail('Expected SyntaxError') |
823 except TemplateSyntaxError, e: | |
824 self.assertEqual('test.html', e.filename) | |
825 if sys.version_info[:2] >= (2, 4): | |
826 self.assertEqual(1, e.lineno) | |
827 | |
828 def test_expression_syntax_error(self): | |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
829 xml = """<p> |
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
830 Foo <em>${bar"}</em> |
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
831 </p>""" |
1 | 832 try: |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
833 tmpl = Template(xml, filename='test.html') |
1 | 834 self.fail('Expected SyntaxError') |
835 except TemplateSyntaxError, e: | |
836 self.assertEqual('test.html', e.filename) | |
837 if sys.version_info[:2] >= (2, 4): | |
838 self.assertEqual(2, e.lineno) | |
839 | |
134
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
840 def test_expression_syntax_error_multi_line(self): |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
841 xml = """<p><em></em> |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
842 |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
843 ${bar"} |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
844 |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
845 </p>""" |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
846 try: |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
847 tmpl = Template(xml, filename='test.html') |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
848 self.fail('Expected SyntaxError') |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
849 except TemplateSyntaxError, e: |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
850 self.assertEqual('test.html', e.filename) |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
851 if sys.version_info[:2] >= (2, 4): |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
852 self.assertEqual(3, e.lineno) |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
853 |
54 | 854 def test_markup_noescape(self): |
855 """ | |
856 Verify that outputting context data that is a `Markup` instance is not | |
857 escaped. | |
858 """ | |
61 | 859 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 860 $myvar |
861 </div>""") | |
862 self.assertEqual("""<div> | |
863 <b>foo</b> | |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
864 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>')))) |
54 | 865 |
866 def test_text_noescape_quotes(self): | |
867 """ | |
868 Verify that outputting context data in text nodes doesn't escape quotes. | |
869 """ | |
61 | 870 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 871 $myvar |
872 </div>""") | |
873 self.assertEqual("""<div> | |
874 "foo" | |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
875 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 876 |
877 def test_attr_escape_quotes(self): | |
878 """ | |
879 Verify that outputting context data in attribtes escapes quotes. | |
880 """ | |
61 | 881 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 882 <elem class="$myvar"/> |
883 </div>""") | |
884 self.assertEqual("""<div> | |
885 <elem class=""foo""/> | |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
886 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 887 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
888 def test_directive_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
889 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
890 <py:if test="myvar">bar</py:if> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
891 </div>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
892 self.assertEqual("""<div> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
893 bar |
149
7306bf730ff3
`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.
cmlenz
parents:
145
diff
changeset
|
894 </div>""", str(tmpl.generate(myvar='"foo"'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
895 |
89
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
896 def test_normal_comment(self): |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
897 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
898 <!-- foo bar --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
899 </div>""") |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
900 self.assertEqual("""<div> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
901 <!-- foo bar --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
902 </div>""", str(tmpl.generate())) |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
903 |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
904 def test_template_comment(self): |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
905 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
906 <!-- !foo --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
907 <!--!bar--> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
908 </div>""") |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
909 self.assertEqual("""<div> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
910 </div>""", str(tmpl.generate())) |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
911 |
1 | 912 |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
913 class TemplateLoaderTestCase(unittest.TestCase): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
914 """Tests for the template loader.""" |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
915 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
916 def setUp(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
917 self.dirname = tempfile.mkdtemp(suffix='markup_test') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
918 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
919 def tearDown(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
920 shutil.rmtree(self.dirname) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
921 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
922 def test_relative_include_samedir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
923 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
924 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
925 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
926 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
927 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
928 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
929 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
930 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
931 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
932 <xi:include href="tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
933 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
934 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
935 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
936 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
937 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
938 tmpl = loader.load('tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
939 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
940 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
941 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
942 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
943 def test_relative_include_subdir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
944 os.mkdir(os.path.join(self.dirname, 'sub')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
945 file1 = open(os.path.join(self.dirname, 'sub', 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
946 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
947 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
948 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
949 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
950 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
951 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
952 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
953 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
954 <xi:include href="sub/tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
955 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
956 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
957 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
958 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
959 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
960 tmpl = loader.load('tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
961 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
962 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
963 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
964 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
965 def test_relative_include_parentdir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
966 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
967 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
968 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
969 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
970 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
971 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
972 os.mkdir(os.path.join(self.dirname, 'sub')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
973 file2 = open(os.path.join(self.dirname, 'sub', 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
974 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
975 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
976 <xi:include href="../tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
977 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
978 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
979 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
980 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
981 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
982 tmpl = loader.load('sub/tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
983 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
984 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
985 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
986 |
174 | 987 def test_relative_include_without_search_path(self): |
988 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') | |
989 try: | |
990 file1.write("""<div>Included</div>""") | |
991 finally: | |
992 file1.close() | |
993 | |
994 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') | |
995 try: | |
996 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> | |
997 <xi:include href="tmpl1.html" /> | |
998 </html>""") | |
999 finally: | |
1000 file2.close() | |
1001 | |
1002 loader = TemplateLoader() | |
175 | 1003 tmpl = loader.load(os.path.join(self.dirname, 'tmpl2.html')) |
174 | 1004 self.assertEqual("""<html> |
1005 <div>Included</div> | |
1006 </html>""", tmpl.generate().render()) | |
1007 | |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
1008 |
1 | 1009 def suite(): |
1010 suite = unittest.TestSuite() | |
1011 suite.addTest(doctest.DocTestSuite(Template.__module__)) | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
1012 suite.addTest(unittest.makeSuite(AttrsDirectiveTestCase, 'test')) |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
1013 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
1014 suite.addTest(unittest.makeSuite(DefDirectiveTestCase, 'test')) |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
1015 suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test')) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
1016 suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test')) |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
1017 suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test')) |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
1018 suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test')) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
1019 suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test')) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
1020 suite.addTest(unittest.makeSuite(TemplateTestCase, 'test')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
1021 suite.addTest(unittest.makeSuite(TemplateLoaderTestCase, 'test')) |
1 | 1022 return suite |
1023 | |
1024 if __name__ == '__main__': | |
1025 unittest.main(defaultTest='suite') |