Mercurial > genshi > mirror
annotate markup/tests/template.py @ 190:769d945ac030 trunk
Improvements for the `py:with` directive:
* One assignment in the same directive can now refer to an earlier assignment.
* Semicolons used in string literals inside the expression are no longer treated as statement separators, and they don't need to be escaped then either.
* Trailing semicolons are now ignored
Many thanks to Oliver Cope for reporting these problems, and providing unit tests and a patch!
author | cmlenz |
---|---|
date | Wed, 23 Aug 2006 14:33:37 +0000 |
parents | 95c3813a00de |
children | 3289055a8c32 |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
66
59eb24184e9c
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
59eb24184e9c
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
59eb24184e9c
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
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
15 import os |
1 | 16 import unittest |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
17 import shutil |
1 | 18 import sys |
152
cdb2a1f930e2
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
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
22 from markup.template import BadDirectiveError, Template, TemplateLoader, \ |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
23 TemplateSyntaxError |
1 | 24 |
25 | |
50
d3842cd76e92
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): |
d3842cd76e92
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.""" |
d3842cd76e92
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 |
d3842cd76e92
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): |
d3842cd76e92
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 """ |
d3842cd76e92
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. |
d3842cd76e92
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
d3842cd76e92
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"/> |
d3842cd76e92
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>""") |
d3842cd76e92
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'}] |
d3842cd76e92
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> |
d3842cd76e92
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
537f819c547b
`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
d3842cd76e92
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
d3842cd76e92
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
512eb72dbb19
* 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): |
512eb72dbb19
* 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 |
512eb72dbb19
* 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`.""" |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
69 |
512eb72dbb19
* 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): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
71 """ |
512eb72dbb19
* 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 |
512eb72dbb19
* 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. |
512eb72dbb19
* 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
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
83 |
512eb72dbb19
* 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
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
92 |
512eb72dbb19
* 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): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
94 """ |
512eb72dbb19
* 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: |
512eb72dbb19
* 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
512eb72dbb19
* 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"> |
512eb72dbb19
* 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"> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
112 |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
113 def test_when_with_strip(self): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
114 """ |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
115 Verify that a when directive with a strip directive actually strips of |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
116 the outer element. |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
117 """ |
61 | 118 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
119 <div py:choose="" py:strip=""> |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
120 <span py:otherwise="">foo</span> |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
121 </div> |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
122 </doc>""") |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
123 self.assertEqual("""<doc> |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
124 <span>foo</span> |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
125 </doc>""", str(tmpl.generate())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
126 |
166
d43f50402cf2
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
|
127 def test_when_outside_choose(self): |
d43f50402cf2
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
|
128 """ |
d43f50402cf2
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
|
129 Verify that a `when` directive outside of a `choose` directive is |
d43f50402cf2
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
|
130 reported as an error. |
d43f50402cf2
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
|
131 """ |
d43f50402cf2
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
|
132 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
d43f50402cf2
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
|
133 <div py:when="xy" /> |
d43f50402cf2
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
|
134 </doc>""") |
d43f50402cf2
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
|
135 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
d43f50402cf2
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
|
136 |
181
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
137 def test_otherwise_outside_choose(self): |
166
d43f50402cf2
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
|
138 """ |
d43f50402cf2
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
|
139 Verify that an `otherwise` directive outside of a `choose` directive is |
d43f50402cf2
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
|
140 reported as an error. |
d43f50402cf2
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
|
141 """ |
d43f50402cf2
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
|
142 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
d43f50402cf2
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
|
143 <div py:otherwise="" /> |
d43f50402cf2
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
|
144 </doc>""") |
d43f50402cf2
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
|
145 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
d43f50402cf2
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
|
146 |
181
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
147 def test_when_without_test(self): |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
148 """ |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
149 Verify that an `when` directive that doesn't have a `test` attribute |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
150 is reported as an error. |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
151 """ |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
152 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
153 <div py:choose="" py:strip=""> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
154 <py:when>foo</py:when> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
155 </div> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
156 </doc>""") |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
157 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
158 |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
159 def test_otherwise_without_test(self): |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
160 """ |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
161 Verify that an `otherwise` directive can be used without a `test` |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
162 attribute. |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
163 """ |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
164 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
165 <div py:choose="" py:strip=""> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
166 <py:otherwise>foo</py:otherwise> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
167 </div> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
168 </doc>""") |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
169 self.assertEqual("""<doc> |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
170 foo |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
171 </doc>""", str(tmpl.generate())) |
e103b75a96ce
Some error message improvements for template directives. Thanks to Christian Boos for the patch!
cmlenz
parents:
179
diff
changeset
|
172 |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
173 def test_as_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
174 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
175 Verify that the directive can also be used as an element. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
176 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
177 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
178 <py:choose> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
179 <py:when test="1 == 1">1</py:when> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
180 <py:when test="2 == 2">2</py:when> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
181 <py:when test="3 == 3">3</py:when> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
182 </py:choose> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
183 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
184 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
185 1 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
186 </doc>""", str(tmpl.generate())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
187 |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
188 |
50
d3842cd76e92
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
|
189 class DefDirectiveTestCase(unittest.TestCase): |
d3842cd76e92
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
|
190 """Tests for the `py:def` template directive.""" |
d3842cd76e92
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
|
191 |
d3842cd76e92
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
|
192 def test_function_with_strip(self): |
d3842cd76e92
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
|
193 """ |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
194 Verify that a named template function with a strip directive actually |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
195 strips of the outer element. |
50
d3842cd76e92
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
|
196 """ |
61 | 197 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
d3842cd76e92
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
|
198 <div py:def="echo(what)" py:strip=""> |
d3842cd76e92
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
|
199 <b>${what}</b> |
d3842cd76e92
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
|
200 </div> |
d3842cd76e92
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
|
201 ${echo('foo')} |
d3842cd76e92
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
|
202 </doc>""") |
d3842cd76e92
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
|
203 self.assertEqual("""<doc> |
d3842cd76e92
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
|
204 <b>foo</b> |
d3842cd76e92
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
|
205 </doc>""", str(tmpl.generate())) |
d3842cd76e92
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
|
206 |
90
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
207 def test_exec_in_replace(self): |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
208 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
209 <p py:def="echo(greeting, name='world')" class="message"> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
210 ${greeting}, ${name}! |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
211 </p> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
212 <div py:replace="echo('hello')"></div> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
213 </div>""") |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
214 self.assertEqual("""<div> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
215 <p class="message"> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
216 hello, world! |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
217 </p> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
218 </div>""", str(tmpl.generate())) |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
219 |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
220 def test_as_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
221 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
222 Verify that the directive can also be used as an element. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
223 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
224 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
225 <py:def function="echo(what)"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
226 <b>${what}</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
227 </py:def> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
228 ${echo('foo')} |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
229 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
230 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
231 <b>foo</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
232 </doc>""", str(tmpl.generate())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
233 |
154
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
234 def test_nested_defs(self): |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
235 """ |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
236 Verify that a template function defined inside a conditional block can |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
237 be called from outside that block. |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
238 """ |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
239 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
240 <py:if test="semantic"> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
241 <strong py:def="echo(what)">${what}</strong> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
242 </py:if> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
243 <py:if test="not semantic"> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
244 <b py:def="echo(what)">${what}</b> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
245 </py:if> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
246 ${echo('foo')} |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
247 </doc>""") |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
248 self.assertEqual("""<doc> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
249 <strong>foo</strong> |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
250 </doc>""", str(tmpl.generate(semantic=True))) |
8bd5c8cd33e0
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
251 |
165
54a4be707664
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
|
252 def test_function_with_default_arg(self): |
54a4be707664
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
|
253 """ |
54a4be707664
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
|
254 Verify that keyword arguments work with `py:def` directives. |
54a4be707664
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
|
255 """ |
54a4be707664
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
|
256 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54a4be707664
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
|
257 <b py:def="echo(what, bold=False)" py:strip="not bold">${what}</b> |
54a4be707664
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
|
258 ${echo('foo')} |
54a4be707664
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
|
259 </doc>""") |
54a4be707664
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
|
260 self.assertEqual("""<doc> |
54a4be707664
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
|
261 foo |
54a4be707664
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
|
262 </doc>""", str(tmpl.generate())) |
54a4be707664
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
|
263 |
185
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
264 def test_invocation_in_attribute(self): |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
265 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
266 <py:def function="echo(what)">${what or 'something'}</py:def> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
267 <p class="${echo('foo')}">bar</p> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
268 </doc>""") |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
269 self.assertEqual("""<doc> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
270 <p class="foo">bar</p> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
271 </doc>""", str(tmpl.generate())) |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
272 |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
273 def test_invocation_in_attribute_none(self): |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
274 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
275 <py:def function="echo()">${None}</py:def> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
276 <p class="${echo()}">bar</p> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
277 </doc>""") |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
278 self.assertEqual("""<doc> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
279 <p>bar</p> |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
280 </doc>""", str(tmpl.generate())) |
95c3813a00de
Fix for #34: `py:def` macros can now be invoked from within expressions in attribute values.
cmlenz
parents:
184
diff
changeset
|
281 |
50
d3842cd76e92
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
|
282 |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
283 class ForDirectiveTestCase(unittest.TestCase): |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
284 """Tests for the `py:for` template directive.""" |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
285 |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
286 def test_loop_with_strip(self): |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
287 """ |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
288 Verify that the combining the `py:for` directive with `py:strip` works |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
289 correctly. |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
290 """ |
61 | 291 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
292 <div py:for="item in items" py:strip=""> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
293 <b>${item}</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
294 </div> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
295 </doc>""") |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
296 self.assertEqual("""<doc> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
297 <b>1</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
298 <b>2</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
299 <b>3</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
300 <b>4</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
301 <b>5</b> |
149
537f819c547b
`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
|
302 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
303 |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
304 def test_as_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
305 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
306 Verify that the directive can also be used as an element. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
307 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
308 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
309 <py:for each="item in items"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
310 <b>${item}</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
311 </py:for> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
312 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
313 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
314 <b>1</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
315 <b>2</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
316 <b>3</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
317 <b>4</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
318 <b>5</b> |
149
537f819c547b
`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
|
319 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
320 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
321 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
322 class IfDirectiveTestCase(unittest.TestCase): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
323 """Tests for the `py:if` template directive.""" |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
324 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
325 def test_loop_with_strip(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
326 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
327 Verify that the combining the `py:if` directive with `py:strip` works |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
328 correctly. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
329 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
330 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
331 <b py:if="foo" py:strip="">${bar}</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
332 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
333 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
334 Hello |
149
537f819c547b
`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
|
335 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
336 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
337 def test_as_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
338 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
339 Verify that the directive can also be used as an element. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
340 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
341 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
342 <py:if test="foo">${bar}</py:if> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
343 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
344 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
345 Hello |
149
537f819c547b
`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
|
346 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
347 |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
348 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
349 class MatchDirectiveTestCase(unittest.TestCase): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
350 """Tests for the `py:match` template directive.""" |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
351 |
50
d3842cd76e92
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
|
352 def test_with_strip(self): |
d3842cd76e92
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
|
353 """ |
d3842cd76e92
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
|
354 Verify that a match template can produce the same kind of element that |
d3842cd76e92
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
|
355 it matched without entering an infinite recursion. |
d3842cd76e92
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
|
356 """ |
61 | 357 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
d3842cd76e92
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
|
358 <elem py:match="elem" py:strip=""> |
d3842cd76e92
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
|
359 <div class="elem">${select('*/text()')}</div> |
d3842cd76e92
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
|
360 </elem> |
d3842cd76e92
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
|
361 <elem>Hey Joe</elem> |
d3842cd76e92
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
|
362 </doc>""") |
d3842cd76e92
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
|
363 self.assertEqual("""<doc> |
d3842cd76e92
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
|
364 <div class="elem">Hey Joe</div> |
d3842cd76e92
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
|
365 </doc>""", str(tmpl.generate())) |
d3842cd76e92
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
|
366 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
367 def test_without_strip(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
368 """ |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
369 Verify that a match template can produce the same kind of element that |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
370 it matched without entering an infinite recursion. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
371 """ |
61 | 372 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
373 <elem py:match="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
374 <div class="elem">${select('*/text()')}</div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
375 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
376 <elem>Hey Joe</elem> |
37
37557b8fb925
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
|
377 </doc>""") |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
378 self.assertEqual("""<doc> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
379 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
380 <div class="elem">Hey Joe</div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
381 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
382 </doc>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
383 |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
384 def test_as_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
385 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
386 Verify that the directive can also be used as an element. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
387 """ |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
388 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
389 <py:match path="elem"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
390 <div class="elem">${select('*/text()')}</div> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
391 </py:match> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
392 <elem>Hey Joe</elem> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
393 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
394 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
395 <div class="elem">Hey Joe</div> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
396 </doc>""", str(tmpl.generate())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
397 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
398 def test_recursive_match_1(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
399 """ |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
400 Match directives are applied recursively, meaning that they are also |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
401 applied to any content they may have produced themselves: |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
402 """ |
61 | 403 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
404 <elem py:match="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
405 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
406 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
407 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
408 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
409 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
410 <subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
411 <elem/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
412 </subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
413 </elem> |
37
37557b8fb925
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
|
414 </doc>""") |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
415 self.assertEqual("""<doc> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
416 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
417 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
418 <subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
419 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
420 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
421 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
422 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
423 </subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
424 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
425 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
426 </doc>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
427 |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
428 def test_recursive_match_2(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
429 """ |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
430 When two or more match templates match the same element and also |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
431 themselves output the element they match, avoiding recursion is even |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
432 more complex, but should work. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
433 """ |
61 | 434 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
435 <body py:match="body"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
436 <div id="header"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
437 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
438 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
439 <body py:match="body"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
440 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
441 <div id="footer"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
442 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
443 <body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
444 <h1>Foo</h1> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
445 </body> |
37
37557b8fb925
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
|
446 </html>""") |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
447 self.assertEqual("""<html> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
448 <body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
449 <div id="header"/><h1>Foo</h1> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
450 <div id="footer"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
451 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
452 </html>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
453 |
77
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
454 def test_select_all_attrs(self): |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
455 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
456 <div py:match="elem" py:attrs="select('@*')"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
457 ${select('*/text()')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
458 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
459 <elem id="joe">Hey Joe</elem> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
460 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
461 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
462 <div id="joe"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
463 Hey Joe |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
464 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
465 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
466 |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
467 def test_select_all_attrs_empty(self): |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
468 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
469 <div py:match="elem" py:attrs="select('@*')"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
470 ${select('*/text()')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
471 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
472 <elem>Hey Joe</elem> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
473 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
474 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
475 <div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
476 Hey Joe |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
477 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
478 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
479 |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
480 def test_select_all_attrs_in_body(self): |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
481 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
482 <div py:match="elem"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
483 Hey ${select('text()')} ${select('@*')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
484 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
485 <elem title="Cool">Joe</elem> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
486 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
487 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
488 <div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
489 Hey Joe Cool |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
490 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
491 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
492 |
172
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
493 def test_def_in_match(self): |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
494 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
495 <py:def function="maketitle(test)"><b py:replace="test" /></py:def> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
496 <head py:match="head">${select('*')}</head> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
497 <head><title>${maketitle(True)}</title></head> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
498 </doc>""") |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
499 self.assertEqual("""<doc> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
500 <head><title>True</title></head> |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
501 </doc>""", str(tmpl.generate())) |
ff4f0d89eef7
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
502 |
179
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
503 def test_match_with_xpath_variable(self): |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
504 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
505 <span py:match="*[name()=$tagname]"> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
506 Hello ${select('@name')} |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
507 </span> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
508 <greeting name="Dude"/> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
509 </div>""") |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
510 self.assertEqual("""<div> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
511 <span> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
512 Hello Dude |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
513 </span> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
514 </div>""", str(tmpl.generate(tagname='greeting'))) |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
515 self.assertEqual("""<div> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
516 <greeting name="Dude"/> |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
517 </div>""", str(tmpl.generate(tagname='sayhello'))) |
13909179e5e1
Implemented support for XPath variables in predicates (#31).
cmlenz
parents:
175
diff
changeset
|
518 |
184
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
519 # FIXME |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
520 #def test_match_after_step(self): |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
521 # tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
522 # <span py:match="div/greeting"> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
523 # Hello ${select('@name')} |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
524 # </span> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
525 # <greeting name="Dude" /> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
526 # </div>""") |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
527 # self.assertEqual("""<div> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
528 # <span> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
529 # Hello Dude |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
530 # </span> |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
531 # </div>""", str(tmpl.generate())) |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
532 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
533 |
37
37557b8fb925
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
|
534 class StripDirectiveTestCase(unittest.TestCase): |
37557b8fb925
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
|
535 """Tests for the `py:strip` template directive.""" |
37557b8fb925
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
|
536 |
37557b8fb925
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
|
537 def test_strip_false(self): |
61 | 538 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
37557b8fb925
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
|
539 <div py:strip="False"><b>foo</b></div> |
37557b8fb925
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
|
540 </div>""") |
37557b8fb925
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
|
541 self.assertEqual("""<div> |
37557b8fb925
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
|
542 <div><b>foo</b></div> |
37557b8fb925
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
|
543 </div>""", str(tmpl.generate())) |
37557b8fb925
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
|
544 |
37557b8fb925
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
|
545 def test_strip_empty(self): |
61 | 546 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
37557b8fb925
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
|
547 <div py:strip=""><b>foo</b></div> |
37557b8fb925
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
|
548 </div>""") |
37557b8fb925
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
|
549 self.assertEqual("""<div> |
37557b8fb925
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
|
550 <b>foo</b> |
37557b8fb925
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
|
551 </div>""", str(tmpl.generate())) |
37557b8fb925
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
|
552 |
37557b8fb925
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
|
553 |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
554 class WithDirectiveTestCase(unittest.TestCase): |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
555 """Tests for the `py:with` template directive.""" |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
556 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
557 def test_shadowing(self): |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
558 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
559 ${x} |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
560 <span py:with="x = x * 2" py:replace="x"/> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
561 ${x} |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
562 </div>""") |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
563 self.assertEqual("""<div> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
564 42 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
565 84 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
566 42 |
149
537f819c547b
`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
|
567 </div>""", str(tmpl.generate(x=42))) |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
568 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
569 def test_as_element(self): |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
570 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
571 <py:with vars="x = x * 2">${x}</py:with> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
572 </div>""") |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
573 self.assertEqual("""<div> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
574 84 |
149
537f819c547b
`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
|
575 </div>""", str(tmpl.generate(x=42))) |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
576 |
190 | 577 def test_multiple_vars_same_name(self): |
578 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
579 <py:with vars=" | |
580 foo = 'bar'; | |
581 foo = foo.replace('r', 'z') | |
582 "> | |
583 $foo | |
584 </py:with> | |
585 </div>""") | |
586 self.assertEqual("""<div> | |
587 baz | |
588 </div>""", str(tmpl.generate(x=42))) | |
589 | |
590 def test_multiple_vars_single_assignment(self): | |
591 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
592 <py:with vars="x = y = z = 1">${x} ${y} ${z}</py:with> | |
593 </div>""") | |
594 self.assertEqual("""<div> | |
595 1 1 1 | |
596 </div>""", str(tmpl.generate(x=42))) | |
597 | |
598 def test_multiple_vars_trailing_semicolon(self): | |
599 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
600 <py:with vars="x = x * 2; y = x / 2;">${x} ${y}</py:with> | |
601 </div>""") | |
602 self.assertEqual("""<div> | |
603 84 42 | |
604 </div>""", str(tmpl.generate(x=42))) | |
605 | |
606 def test_semicolon_escape(self): | |
607 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | |
608 <py:with vars="x = 'here is a semicolon: ;'; y = 'here are two semicolons: ;;' ;"> | |
609 ${x} | |
610 ${y} | |
611 </py:with> | |
612 </div>""") | |
613 self.assertEqual("""<div> | |
614 here is a semicolon: ; | |
615 here are two semicolons: ;; | |
616 </div>""", str(tmpl.generate())) | |
617 | |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
618 |
1 | 619 class TemplateTestCase(unittest.TestCase): |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
620 """Tests for basic template processing, expression evaluation and error |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
621 reporting. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
622 """ |
1 | 623 |
624 def test_interpolate_string(self): | |
625 parts = list(Template._interpolate('bla')) | |
626 self.assertEqual(1, len(parts)) | |
627 self.assertEqual(Stream.TEXT, parts[0][0]) | |
628 self.assertEqual('bla', parts[0][1]) | |
629 | |
630 def test_interpolate_simple(self): | |
631 parts = list(Template._interpolate('${bla}')) | |
632 self.assertEqual(1, len(parts)) | |
10
f77f7a91aa46
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
633 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 634 self.assertEqual('bla', parts[0][1].source) |
635 | |
636 def test_interpolate_escaped(self): | |
637 parts = list(Template._interpolate('$${bla}')) | |
638 self.assertEqual(1, len(parts)) | |
639 self.assertEqual(Stream.TEXT, parts[0][0]) | |
640 self.assertEqual('${bla}', parts[0][1]) | |
641 | |
642 def test_interpolate_short(self): | |
643 parts = list(Template._interpolate('$bla')) | |
644 self.assertEqual(1, len(parts)) | |
10
f77f7a91aa46
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
645 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 646 self.assertEqual('bla', parts[0][1].source) |
647 | |
648 def test_interpolate_mixed1(self): | |
649 parts = list(Template._interpolate('$foo bar $baz')) | |
650 self.assertEqual(3, len(parts)) | |
10
f77f7a91aa46
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
651 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 652 self.assertEqual('foo', parts[0][1].source) |
653 self.assertEqual(Stream.TEXT, parts[1][0]) | |
654 self.assertEqual(' bar ', parts[1][1]) | |
10
f77f7a91aa46
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
655 self.assertEqual(Template.EXPR, parts[2][0]) |
1 | 656 self.assertEqual('baz', parts[2][1].source) |
657 | |
658 def test_interpolate_mixed2(self): | |
659 parts = list(Template._interpolate('foo $bar baz')) | |
660 self.assertEqual(3, len(parts)) | |
661 self.assertEqual(Stream.TEXT, parts[0][0]) | |
662 self.assertEqual('foo ', parts[0][1]) | |
10
f77f7a91aa46
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
663 self.assertEqual(Template.EXPR, parts[1][0]) |
1 | 664 self.assertEqual('bar', parts[1][1].source) |
665 self.assertEqual(Stream.TEXT, parts[2][0]) | |
666 self.assertEqual(' baz', parts[2][1]) | |
667 | |
74
d54b5fd60b52
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
668 def test_interpolate_mixed3(self): |
d54b5fd60b52
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
669 tmpl = Template('<root> ${var} $var</root>') |
149
537f819c547b
`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
|
670 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) |
74
d54b5fd60b52
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
671 |
184
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
672 def test_interpolate_multiline(self): |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
673 tmpl = Template("""<root>${dict( |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
674 bar = 'baz' |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
675 )[foo]}</root>""") |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
676 self.assertEqual('<root>baz</root>', str(tmpl.generate(foo='bar'))) |
181d292eafa2
Interpolate multiline expressions in templates. Thanks to Christian Boos for reporting the problem and providing the fix.
cmlenz
parents:
181
diff
changeset
|
677 |
48
a5d585dd38c4
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
678 def test_interpolate_non_string_attrs(self): |
a5d585dd38c4
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
679 tmpl = Template('<root attr="${1}"/>') |
75
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
680 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
681 |
145
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
682 def test_interpolate_list_result(self): |
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
683 tmpl = Template('<root>$foo</root>') |
149
537f819c547b
`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
|
684 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',)))) |
145
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
685 |
75
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
686 def test_empty_attr(self): |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
687 tmpl = Template('<root attr=""/>') |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
688 self.assertEqual('<root attr=""/>', str(tmpl.generate())) |
48
a5d585dd38c4
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
689 |
1 | 690 def test_bad_directive_error(self): |
61 | 691 xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />' |
1 | 692 try: |
21
b4d17897d053
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
10
diff
changeset
|
693 tmpl = Template(xml, filename='test.html') |
1 | 694 except BadDirectiveError, e: |
695 self.assertEqual('test.html', e.filename) | |
696 if sys.version_info[:2] >= (2, 4): | |
697 self.assertEqual(1, e.lineno) | |
698 | |
699 def test_directive_value_syntax_error(self): | |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
700 xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />""" |
1 | 701 try: |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
702 tmpl = Template(xml, filename='test.html') |
1 | 703 self.fail('Expected SyntaxError') |
704 except TemplateSyntaxError, e: | |
705 self.assertEqual('test.html', e.filename) | |
706 if sys.version_info[:2] >= (2, 4): | |
707 self.assertEqual(1, e.lineno) | |
708 | |
709 def test_expression_syntax_error(self): | |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
710 xml = """<p> |
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
711 Foo <em>${bar"}</em> |
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
712 </p>""" |
1 | 713 try: |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
714 tmpl = Template(xml, filename='test.html') |
1 | 715 self.fail('Expected SyntaxError') |
716 except TemplateSyntaxError, e: | |
717 self.assertEqual('test.html', e.filename) | |
718 if sys.version_info[:2] >= (2, 4): | |
719 self.assertEqual(2, e.lineno) | |
720 | |
134
d681d2c3cd8d
* 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
|
721 def test_expression_syntax_error_multi_line(self): |
d681d2c3cd8d
* 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
|
722 xml = """<p><em></em> |
d681d2c3cd8d
* 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
|
723 |
d681d2c3cd8d
* 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
|
724 ${bar"} |
d681d2c3cd8d
* 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
|
725 |
d681d2c3cd8d
* 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
|
726 </p>""" |
d681d2c3cd8d
* 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
|
727 try: |
d681d2c3cd8d
* 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
|
728 tmpl = Template(xml, filename='test.html') |
d681d2c3cd8d
* 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
|
729 self.fail('Expected SyntaxError') |
d681d2c3cd8d
* 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
|
730 except TemplateSyntaxError, e: |
d681d2c3cd8d
* 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
|
731 self.assertEqual('test.html', e.filename) |
d681d2c3cd8d
* 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
|
732 if sys.version_info[:2] >= (2, 4): |
d681d2c3cd8d
* 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
|
733 self.assertEqual(3, e.lineno) |
d681d2c3cd8d
* 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
|
734 |
54 | 735 def test_markup_noescape(self): |
736 """ | |
737 Verify that outputting context data that is a `Markup` instance is not | |
738 escaped. | |
739 """ | |
61 | 740 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 741 $myvar |
742 </div>""") | |
743 self.assertEqual("""<div> | |
744 <b>foo</b> | |
149
537f819c547b
`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
|
745 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>')))) |
54 | 746 |
747 def test_text_noescape_quotes(self): | |
748 """ | |
749 Verify that outputting context data in text nodes doesn't escape quotes. | |
750 """ | |
61 | 751 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 752 $myvar |
753 </div>""") | |
754 self.assertEqual("""<div> | |
755 "foo" | |
149
537f819c547b
`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
|
756 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 757 |
758 def test_attr_escape_quotes(self): | |
759 """ | |
760 Verify that outputting context data in attribtes escapes quotes. | |
761 """ | |
61 | 762 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 763 <elem class="$myvar"/> |
764 </div>""") | |
765 self.assertEqual("""<div> | |
766 <elem class=""foo""/> | |
149
537f819c547b
`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
|
767 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 768 |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
769 def test_directive_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
770 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
771 <py:if test="myvar">bar</py:if> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
772 </div>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
773 self.assertEqual("""<div> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
774 bar |
149
537f819c547b
`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
|
775 </div>""", str(tmpl.generate(myvar='"foo"'))) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
776 |
89
80386d62814f
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
|
777 def test_normal_comment(self): |
80386d62814f
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
|
778 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
80386d62814f
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
|
779 <!-- foo bar --> |
80386d62814f
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
|
780 </div>""") |
80386d62814f
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
|
781 self.assertEqual("""<div> |
80386d62814f
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
|
782 <!-- foo bar --> |
80386d62814f
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
|
783 </div>""", str(tmpl.generate())) |
80386d62814f
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
|
784 |
80386d62814f
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
|
785 def test_template_comment(self): |
80386d62814f
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
|
786 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
80386d62814f
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
|
787 <!-- !foo --> |
80386d62814f
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
|
788 <!--!bar--> |
80386d62814f
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
|
789 </div>""") |
80386d62814f
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
|
790 self.assertEqual("""<div> |
80386d62814f
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
|
791 </div>""", str(tmpl.generate())) |
80386d62814f
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
|
792 |
1 | 793 |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
794 class TemplateLoaderTestCase(unittest.TestCase): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
795 """Tests for the template loader.""" |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
796 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
797 def setUp(self): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
798 self.dirname = tempfile.mkdtemp(suffix='markup_test') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
799 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
800 def tearDown(self): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
801 shutil.rmtree(self.dirname) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
802 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
803 def test_relative_include_samedir(self): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
804 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
805 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
806 file1.write("""<div>Included</div>""") |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
807 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
808 file1.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
809 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
810 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
811 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
812 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
813 <xi:include href="tmpl1.html" /> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
814 </html>""") |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
815 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
816 file2.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
817 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
818 loader = TemplateLoader([self.dirname]) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
819 tmpl = loader.load('tmpl2.html') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
820 self.assertEqual("""<html> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
821 <div>Included</div> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
822 </html>""", tmpl.generate().render()) |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
823 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
824 def test_relative_include_subdir(self): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
825 os.mkdir(os.path.join(self.dirname, 'sub')) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
826 file1 = open(os.path.join(self.dirname, 'sub', 'tmpl1.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
827 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
828 file1.write("""<div>Included</div>""") |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
829 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
830 file1.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
831 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
832 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
833 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
834 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
835 <xi:include href="sub/tmpl1.html" /> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
836 </html>""") |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
837 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
838 file2.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
839 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
840 loader = TemplateLoader([self.dirname]) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
841 tmpl = loader.load('tmpl2.html') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
842 self.assertEqual("""<html> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
843 <div>Included</div> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
844 </html>""", tmpl.generate().render()) |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
845 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
846 def test_relative_include_parentdir(self): |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
847 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
848 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
849 file1.write("""<div>Included</div>""") |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
850 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
851 file1.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
852 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
853 os.mkdir(os.path.join(self.dirname, 'sub')) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
854 file2 = open(os.path.join(self.dirname, 'sub', 'tmpl2.html'), 'w') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
855 try: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
856 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
857 <xi:include href="../tmpl1.html" /> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
858 </html>""") |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
859 finally: |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
860 file2.close() |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
861 |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
862 loader = TemplateLoader([self.dirname]) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
863 tmpl = loader.load('sub/tmpl2.html') |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
864 self.assertEqual("""<html> |
158
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
865 <div>Included</div> |
3f23fafeef99
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
866 </html>""", tmpl.generate().render()) |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
867 |
174 | 868 def test_relative_include_without_search_path(self): |
869 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') | |
870 try: | |
871 file1.write("""<div>Included</div>""") | |
872 finally: | |
873 file1.close() | |
874 | |
875 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') | |
876 try: | |
877 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> | |
878 <xi:include href="tmpl1.html" /> | |
879 </html>""") | |
880 finally: | |
881 file2.close() | |
882 | |
883 loader = TemplateLoader() | |
175 | 884 tmpl = loader.load(os.path.join(self.dirname, 'tmpl2.html')) |
174 | 885 self.assertEqual("""<html> |
886 <div>Included</div> | |
887 </html>""", tmpl.generate().render()) | |
888 | |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
889 |
1 | 890 def suite(): |
891 suite = unittest.TestSuite() | |
892 suite.addTest(doctest.DocTestSuite(Template.__module__)) | |
50
d3842cd76e92
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
|
893 suite.addTest(unittest.makeSuite(AttrsDirectiveTestCase, 'test')) |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
894 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) |
50
d3842cd76e92
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
|
895 suite.addTest(unittest.makeSuite(DefDirectiveTestCase, 'test')) |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
896 suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test')) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
897 suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test')) |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
898 suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test')) |
37
37557b8fb925
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
|
899 suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test')) |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
900 suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test')) |
152
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
901 suite.addTest(unittest.makeSuite(TemplateTestCase, 'test')) |
cdb2a1f930e2
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
902 suite.addTest(unittest.makeSuite(TemplateLoaderTestCase, 'test')) |
1 | 903 return suite |
904 | |
905 if __name__ == '__main__': | |
906 unittest.main(defaultTest='suite') |