Mercurial > genshi > genshi-test
annotate markup/tests/template.py @ 174:19c669eadc2b
Added test case for includes without a search path.
author | cmlenz |
---|---|
date | Sun, 20 Aug 2006 11:41:58 +0000 |
parents | 4b4e80b2b0b5 |
children | f0cdfcdaa092 |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
3 # Copyright (C) 2006 Edgewall Software |
1 | 4 # All rights reserved. |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
8 # are also available at http://markup.edgewall.org/wiki/License. |
1 | 9 # |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
12 # history and logs, available at http://markup.edgewall.org/log/. |
1 | 13 |
14 import doctest | |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
15 import os |
1 | 16 import unittest |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
17 import shutil |
1 | 18 import sys |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
19 import tempfile |
1 | 20 |
54 | 21 from markup.core import Markup, Stream |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
22 from markup.template import BadDirectiveError, Template, TemplateLoader, \ |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
23 TemplateSyntaxError |
1 | 24 |
25 | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
26 class AttrsDirectiveTestCase(unittest.TestCase): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
27 """Tests for the `py:attrs` template directive.""" |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
28 |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
29 def test_combined_with_loop(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
30 """ |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
31 Verify that the directive has access to the loop variables. |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
32 """ |
61 | 33 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
34 <elem py:for="item in items" py:attrs="item"/> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
35 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
36 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
37 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
38 <elem id="1" class="foo"/><elem id="2" class="bar"/> |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
39 </doc>""", str(tmpl.generate(items=items))) |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
40 |
54 | 41 def test_update_existing_attr(self): |
42 """ | |
43 Verify that an attribute value that evaluates to `None` removes an | |
44 existing attribute of that name. | |
45 """ | |
61 | 46 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 47 <elem class="foo" py:attrs="{'class': 'bar'}"/> |
48 </doc>""") | |
49 self.assertEqual("""<doc> | |
50 <elem class="bar"/> | |
51 </doc>""", str(tmpl.generate())) | |
52 | |
53 def test_remove_existing_attr(self): | |
54 """ | |
55 Verify that an attribute value that evaluates to `None` removes an | |
56 existing attribute of that name. | |
57 """ | |
61 | 58 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 59 <elem class="foo" py:attrs="{'class': None}"/> |
60 </doc>""") | |
61 self.assertEqual("""<doc> | |
62 <elem/> | |
63 </doc>""", str(tmpl.generate())) | |
64 | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
65 |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
66 class ChooseDirectiveTestCase(unittest.TestCase): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
67 """Tests for the `py:choose` template directive and the complementary |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
68 directives `py:when` and `py:otherwise`.""" |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
69 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
70 def test_multiple_true_whens(self): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
71 """ |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
72 Verify that, if multiple `py:when` bodies match, only the first is |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
73 output. |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
74 """ |
61 | 75 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
76 <span py:when="1 == 1">1</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
77 <span py:when="2 == 2">2</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
78 <span py:when="3 == 3">3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
79 </div>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
80 self.assertEqual("""<div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
81 <span>1</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
82 </div>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
83 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
84 def test_otherwise(self): |
61 | 85 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
86 <span py:when="False">hidden</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
87 <span py:otherwise="">hello</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
88 </div>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
89 self.assertEqual("""<div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
90 <span>hello</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
91 </div>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
92 |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
93 def test_nesting(self): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
94 """ |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
95 Verify that `py:choose` blocks can be nested: |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
96 """ |
61 | 97 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
98 <div py:choose="1"> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
99 <div py:when="1" py:choose="3"> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
100 <span py:when="2">2</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
101 <span py:when="3">3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
102 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
103 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
104 </doc>""") |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
105 self.assertEqual("""<doc> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
106 <div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
107 <div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
108 <span>3</span> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
109 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
110 </div> |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
111 </doc>""", str(tmpl.generate())) |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
112 |
60f1a556690e
* 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): |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
114 """ |
60f1a556690e
* 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 |
60f1a556690e
* 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. |
60f1a556690e
* 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
60f1a556690e
* 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=""> |
60f1a556690e
* 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> |
60f1a556690e
* 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> |
60f1a556690e
* 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>""") |
60f1a556690e
* 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> |
60f1a556690e
* 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> |
60f1a556690e
* 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())) |
60f1a556690e
* 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
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
127 def test_when_outside_choose(self): |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
128 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
129 Verify that a `when` directive outside of a `choose` directive is |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
130 reported as an error. |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
131 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
132 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
133 <div py:when="xy" /> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
134 </doc>""") |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
135 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
136 |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
137 def test_when_outside_choose(self): |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
138 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
139 Verify that an `otherwise` directive outside of a `choose` directive is |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
140 reported as an error. |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
141 """ |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
142 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
143 <div py:otherwise="" /> |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
144 </doc>""") |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
145 self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) |
718cba809cea
Better error reporting for errors in directive expressions, and when `py:otherwise`/`py:when` are used outside a `py:choose` directive. Thanks to Christian Boos for the initial patch.
cmlenz
parents:
165
diff
changeset
|
146 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
147 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
148 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
149 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
150 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
151 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
152 <py:choose> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
153 <py:when test="1 == 1">1</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
154 <py:when test="2 == 2">2</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
155 <py:when test="3 == 3">3</py:when> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
156 </py:choose> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
157 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
158 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
159 1 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
160 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
161 |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
162 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
163 class DefDirectiveTestCase(unittest.TestCase): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
164 """Tests for the `py:def` template directive.""" |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
165 |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
166 def test_function_with_strip(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
167 """ |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
168 Verify that a named template function with a strip directive actually |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
169 strips of the outer element. |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
170 """ |
61 | 171 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
172 <div py:def="echo(what)" py:strip=""> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
173 <b>${what}</b> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
174 </div> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
175 ${echo('foo')} |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
176 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
177 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
178 <b>foo</b> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
179 </doc>""", str(tmpl.generate())) |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
180 |
90
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
181 def test_exec_in_replace(self): |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
182 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
183 <p py:def="echo(greeting, name='world')" class="message"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
184 ${greeting}, ${name}! |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
185 </p> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
186 <div py:replace="echo('hello')"></div> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
187 </div>""") |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
188 self.assertEqual("""<div> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
189 <p class="message"> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
190 hello, world! |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
191 </p> |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
192 </div>""", str(tmpl.generate())) |
242610137d1f
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
193 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
194 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
195 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
196 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
197 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
198 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
199 <py:def function="echo(what)"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
200 <b>${what}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
201 </py:def> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
202 ${echo('foo')} |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
203 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
204 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
205 <b>foo</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
206 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
207 |
154
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
208 def test_nested_defs(self): |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
209 """ |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
210 Verify that a template function defined inside a conditional block can |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
211 be called from outside that block. |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
212 """ |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
213 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
214 <py:if test="semantic"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
215 <strong py:def="echo(what)">${what}</strong> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
216 </py:if> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
217 <py:if test="not semantic"> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
218 <b py:def="echo(what)">${what}</b> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
219 </py:if> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
220 ${echo('foo')} |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
221 </doc>""") |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
222 self.assertEqual("""<doc> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
223 <strong>foo</strong> |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
224 </doc>""", str(tmpl.generate(semantic=True))) |
1c404be518d1
* Make sure `py:def` macros don't go out of scope if they are defined inside another directive.
cmlenz
parents:
152
diff
changeset
|
225 |
165
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
226 def test_function_with_default_arg(self): |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
227 """ |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
228 Verify that keyword arguments work with `py:def` directives. |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
229 """ |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
230 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
231 <b py:def="echo(what, bold=False)" py:strip="not bold">${what}</b> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
232 ${echo('foo')} |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
233 </doc>""") |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
234 self.assertEqual("""<doc> |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
235 foo |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
236 </doc>""", str(tmpl.generate())) |
4ed68a904235
Fix handling of keyword arguments in `py:def` directive. Thanks to Christian Boos for reporting the problem and providing the basic patch for this change.
cmlenz
parents:
158
diff
changeset
|
237 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
238 |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
239 class ForDirectiveTestCase(unittest.TestCase): |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
240 """Tests for the `py:for` template directive.""" |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
241 |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
242 def test_loop_with_strip(self): |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
243 """ |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
244 Verify that the combining the `py:for` directive with `py:strip` works |
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
245 correctly. |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
246 """ |
61 | 247 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
248 <div py:for="item in items" py:strip=""> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
249 <b>${item}</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
250 </div> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
251 </doc>""") |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
252 self.assertEqual("""<doc> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
253 <b>1</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
254 <b>2</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
255 <b>3</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
256 <b>4</b> |
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
257 <b>5</b> |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
258 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
259 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
260 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
261 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
262 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
263 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
264 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
265 <py:for each="item in items"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
266 <b>${item}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
267 </py:for> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
268 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
269 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
270 <b>1</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
271 <b>2</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
272 <b>3</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
273 <b>4</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
274 <b>5</b> |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
275 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
276 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
277 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
278 class IfDirectiveTestCase(unittest.TestCase): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
279 """Tests for the `py:if` template directive.""" |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
280 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
281 def test_loop_with_strip(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
282 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
283 Verify that the combining the `py:if` directive with `py:strip` works |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
284 correctly. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
285 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
286 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
287 <b py:if="foo" py:strip="">${bar}</b> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
288 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
289 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
290 Hello |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
291 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
292 |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
293 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
294 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
295 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
296 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
297 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
298 <py:if test="foo">${bar}</py:if> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
299 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
300 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
301 Hello |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
302 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
303 |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
304 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
305 class MatchDirectiveTestCase(unittest.TestCase): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
306 """Tests for the `py:match` template directive.""" |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
307 |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
308 def test_with_strip(self): |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
309 """ |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
310 Verify that a match template can produce the same kind of element that |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
311 it matched without entering an infinite recursion. |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
312 """ |
61 | 313 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
314 <elem py:match="elem" py:strip=""> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
315 <div class="elem">${select('*/text()')}</div> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
316 </elem> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
317 <elem>Hey Joe</elem> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
318 </doc>""") |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
319 self.assertEqual("""<doc> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
320 <div class="elem">Hey Joe</div> |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
321 </doc>""", str(tmpl.generate())) |
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
322 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
323 def test_without_strip(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
324 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
325 Verify that a match template can produce the same kind of element that |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
326 it matched without entering an infinite recursion. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
327 """ |
61 | 328 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
329 <elem py:match="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
330 <div class="elem">${select('*/text()')}</div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
331 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
332 <elem>Hey Joe</elem> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
333 </doc>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
334 self.assertEqual("""<doc> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
335 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
336 <div class="elem">Hey Joe</div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
337 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
338 </doc>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
339 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
340 def test_as_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
341 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
342 Verify that the directive can also be used as an element. |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
343 """ |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
344 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
345 <py:match path="elem"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
346 <div class="elem">${select('*/text()')}</div> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
347 </py:match> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
348 <elem>Hey Joe</elem> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
349 </doc>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
350 self.assertEqual("""<doc> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
351 <div class="elem">Hey Joe</div> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
352 </doc>""", str(tmpl.generate())) |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
353 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
354 def test_recursive_match_1(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
355 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
356 Match directives are applied recursively, meaning that they are also |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
357 applied to any content they may have produced themselves: |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
358 """ |
61 | 359 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
360 <elem py:match="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
361 <div class="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
362 ${select('*/*')} |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
363 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
364 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
365 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
366 <subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
367 <elem/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
368 </subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
369 </elem> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
370 </doc>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
371 self.assertEqual("""<doc> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
372 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
373 <div class="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
374 <subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
375 <elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
376 <div class="elem"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
377 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
378 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
379 </subelem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
380 </div> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
381 </elem> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
382 </doc>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
383 |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
384 def test_recursive_match_2(self): |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
385 """ |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
386 When two or more match templates match the same element and also |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
387 themselves output the element they match, avoiding recursion is even |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
388 more complex, but should work. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
389 """ |
61 | 390 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
391 <body py:match="body"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
392 <div id="header"/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
393 ${select('*/*')} |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
394 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
395 <body py:match="body"> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
396 ${select('*/*')} |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
397 <div id="footer"/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
398 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
399 <body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
400 <h1>Foo</h1> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
401 </body> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
402 </html>""") |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
403 self.assertEqual("""<html> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
404 <body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
405 <div id="header"/><h1>Foo</h1> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
406 <div id="footer"/> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
407 </body> |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
408 </html>""", str(tmpl.generate())) |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
409 |
77
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
410 def test_select_all_attrs(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
411 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
412 <div py:match="elem" py:attrs="select('@*')"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
413 ${select('*/text()')} |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
414 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
415 <elem id="joe">Hey Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
416 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
417 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
418 <div id="joe"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
419 Hey Joe |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
420 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
421 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
422 |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
423 def test_select_all_attrs_empty(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
424 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
425 <div py:match="elem" py:attrs="select('@*')"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
426 ${select('*/text()')} |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
427 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
428 <elem>Hey Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
429 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
430 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
431 <div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
432 Hey Joe |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
433 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
434 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
435 |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
436 def test_select_all_attrs_in_body(self): |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
437 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
438 <div py:match="elem"> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
439 Hey ${select('text()')} ${select('@*')} |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
440 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
441 <elem title="Cool">Joe</elem> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
442 </doc>""") |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
443 self.assertEqual("""<doc> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
444 <div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
445 Hey Joe Cool |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
446 </div> |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
447 </doc>""", str(tmpl.generate())) |
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
448 |
172
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
449 def test_def_in_match(self): |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
450 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
451 <py:def function="maketitle(test)"><b py:replace="test" /></py:def> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
452 <head py:match="head">${select('*')}</head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
453 <head><title>${maketitle(True)}</title></head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
454 </doc>""") |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
455 self.assertEqual("""<doc> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
456 <head><title>True</title></head> |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
457 </doc>""", str(tmpl.generate())) |
4b4e80b2b0b5
Fix for #30 (trouble using `py:def`inside a match template)
cmlenz
parents:
166
diff
changeset
|
458 |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
459 |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
460 class StripDirectiveTestCase(unittest.TestCase): |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
461 """Tests for the `py:strip` template directive.""" |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
462 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
463 def test_strip_false(self): |
61 | 464 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
465 <div py:strip="False"><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
466 </div>""") |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
467 self.assertEqual("""<div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
468 <div><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
469 </div>""", str(tmpl.generate())) |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
470 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
471 def test_strip_empty(self): |
61 | 472 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
473 <div py:strip=""><b>foo</b></div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
474 </div>""") |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
475 self.assertEqual("""<div> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
476 <b>foo</b> |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
477 </div>""", str(tmpl.generate())) |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
478 |
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
479 |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
480 class WithDirectiveTestCase(unittest.TestCase): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
481 """Tests for the `py:with` template directive.""" |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
482 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
483 def test_shadowing(self): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
484 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
485 ${x} |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
486 <span py:with="x = x * 2" py:replace="x"/> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
487 ${x} |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
488 </div>""") |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
489 self.assertEqual("""<div> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
490 42 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
491 84 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
492 42 |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
493 </div>""", str(tmpl.generate(x=42))) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
494 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
495 def test_as_element(self): |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
496 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
497 <py:with vars="x = x * 2">${x}</py:with> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
498 </div>""") |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
499 self.assertEqual("""<div> |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
500 84 |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
501 </div>""", str(tmpl.generate(x=42))) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
502 |
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
503 |
1 | 504 class TemplateTestCase(unittest.TestCase): |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
505 """Tests for basic template processing, expression evaluation and error |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
506 reporting. |
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
507 """ |
1 | 508 |
509 def test_interpolate_string(self): | |
510 parts = list(Template._interpolate('bla')) | |
511 self.assertEqual(1, len(parts)) | |
512 self.assertEqual(Stream.TEXT, parts[0][0]) | |
513 self.assertEqual('bla', parts[0][1]) | |
514 | |
515 def test_interpolate_simple(self): | |
516 parts = list(Template._interpolate('${bla}')) | |
517 self.assertEqual(1, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
518 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 519 self.assertEqual('bla', parts[0][1].source) |
520 | |
521 def test_interpolate_escaped(self): | |
522 parts = list(Template._interpolate('$${bla}')) | |
523 self.assertEqual(1, len(parts)) | |
524 self.assertEqual(Stream.TEXT, parts[0][0]) | |
525 self.assertEqual('${bla}', parts[0][1]) | |
526 | |
527 def test_interpolate_short(self): | |
528 parts = list(Template._interpolate('$bla')) | |
529 self.assertEqual(1, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
530 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 531 self.assertEqual('bla', parts[0][1].source) |
532 | |
533 def test_interpolate_mixed1(self): | |
534 parts = list(Template._interpolate('$foo bar $baz')) | |
535 self.assertEqual(3, len(parts)) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
536 self.assertEqual(Template.EXPR, parts[0][0]) |
1 | 537 self.assertEqual('foo', parts[0][1].source) |
538 self.assertEqual(Stream.TEXT, parts[1][0]) | |
539 self.assertEqual(' bar ', parts[1][1]) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
540 self.assertEqual(Template.EXPR, parts[2][0]) |
1 | 541 self.assertEqual('baz', parts[2][1].source) |
542 | |
543 def test_interpolate_mixed2(self): | |
544 parts = list(Template._interpolate('foo $bar baz')) | |
545 self.assertEqual(3, len(parts)) | |
546 self.assertEqual(Stream.TEXT, parts[0][0]) | |
547 self.assertEqual('foo ', parts[0][1]) | |
10
c5890ef863ba
Moved the template-specific stream event kinds into the template module.
cmlenz
parents:
1
diff
changeset
|
548 self.assertEqual(Template.EXPR, parts[1][0]) |
1 | 549 self.assertEqual('bar', parts[1][1].source) |
550 self.assertEqual(Stream.TEXT, parts[2][0]) | |
551 self.assertEqual(' baz', parts[2][1]) | |
552 | |
74
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
553 def test_interpolate_mixed3(self): |
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
554 tmpl = Template('<root> ${var} $var</root>') |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
555 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) |
74
3c271699c398
Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents:
66
diff
changeset
|
556 |
48
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
557 def test_interpolate_non_string_attrs(self): |
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
558 tmpl = Template('<root attr="${1}"/>') |
75
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
559 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
560 |
145
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
561 def test_interpolate_list_result(self): |
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
562 tmpl = Template('<root>$foo</root>') |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
563 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',)))) |
145
56d534eb53f9
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
564 |
75
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
565 def test_empty_attr(self): |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
566 tmpl = Template('<root attr=""/>') |
c3c26300a46d
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
567 self.assertEqual('<root attr=""/>', str(tmpl.generate())) |
48
06c642ba2b08
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
568 |
1 | 569 def test_bad_directive_error(self): |
61 | 570 xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />' |
1 | 571 try: |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
10
diff
changeset
|
572 tmpl = Template(xml, filename='test.html') |
1 | 573 except BadDirectiveError, e: |
574 self.assertEqual('test.html', e.filename) | |
575 if sys.version_info[:2] >= (2, 4): | |
576 self.assertEqual(1, e.lineno) | |
577 | |
578 def test_directive_value_syntax_error(self): | |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
579 xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />""" |
1 | 580 try: |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
581 tmpl = Template(xml, filename='test.html') |
1 | 582 self.fail('Expected SyntaxError') |
583 except TemplateSyntaxError, e: | |
584 self.assertEqual('test.html', e.filename) | |
585 if sys.version_info[:2] >= (2, 4): | |
586 self.assertEqual(1, e.lineno) | |
587 | |
588 def test_expression_syntax_error(self): | |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
589 xml = """<p> |
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
590 Foo <em>${bar"}</em> |
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
591 </p>""" |
1 | 592 try: |
81
cc034182061e
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
593 tmpl = Template(xml, filename='test.html') |
1 | 594 self.fail('Expected SyntaxError') |
595 except TemplateSyntaxError, e: | |
596 self.assertEqual('test.html', e.filename) | |
597 if sys.version_info[:2] >= (2, 4): | |
598 self.assertEqual(2, e.lineno) | |
599 | |
134
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
600 def test_expression_syntax_error_multi_line(self): |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
601 xml = """<p><em></em> |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
602 |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
603 ${bar"} |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
604 |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
605 </p>""" |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
606 try: |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
607 tmpl = Template(xml, filename='test.html') |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
608 self.fail('Expected SyntaxError') |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
609 except TemplateSyntaxError, e: |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
610 self.assertEqual('test.html', e.filename) |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
611 if sys.version_info[:2] >= (2, 4): |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
612 self.assertEqual(3, e.lineno) |
df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
613 |
54 | 614 def test_markup_noescape(self): |
615 """ | |
616 Verify that outputting context data that is a `Markup` instance is not | |
617 escaped. | |
618 """ | |
61 | 619 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 620 $myvar |
621 </div>""") | |
622 self.assertEqual("""<div> | |
623 <b>foo</b> | |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
624 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>')))) |
54 | 625 |
626 def test_text_noescape_quotes(self): | |
627 """ | |
628 Verify that outputting context data in text nodes doesn't escape quotes. | |
629 """ | |
61 | 630 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 631 $myvar |
632 </div>""") | |
633 self.assertEqual("""<div> | |
634 "foo" | |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
635 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 636 |
637 def test_attr_escape_quotes(self): | |
638 """ | |
639 Verify that outputting context data in attribtes escapes quotes. | |
640 """ | |
61 | 641 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 642 <elem class="$myvar"/> |
643 </div>""") | |
644 self.assertEqual("""<div> | |
645 <elem class=""foo""/> | |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
646 </div>""", str(tmpl.generate(myvar='"foo"'))) |
54 | 647 |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
648 def test_directive_element(self): |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
649 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
650 <py:if test="myvar">bar</py:if> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
651 </div>""") |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
652 self.assertEqual("""<div> |
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
653 bar |
149
7306bf730ff3
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
cmlenz
parents:
145
diff
changeset
|
654 </div>""", str(tmpl.generate(myvar='"foo"'))) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
655 |
89
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
656 def test_normal_comment(self): |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
657 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
658 <!-- foo bar --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
659 </div>""") |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
660 self.assertEqual("""<div> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
661 <!-- foo bar --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
662 </div>""", str(tmpl.generate())) |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
663 |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
664 def test_template_comment(self): |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
665 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
666 <!-- !foo --> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
667 <!--!bar--> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
668 </div>""") |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
669 self.assertEqual("""<div> |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
670 </div>""", str(tmpl.generate())) |
d4c7617900e3
Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents:
81
diff
changeset
|
671 |
1 | 672 |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
673 class TemplateLoaderTestCase(unittest.TestCase): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
674 """Tests for the template loader.""" |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
675 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
676 def setUp(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
677 self.dirname = tempfile.mkdtemp(suffix='markup_test') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
678 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
679 def tearDown(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
680 shutil.rmtree(self.dirname) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
681 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
682 def test_relative_include_samedir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
683 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
684 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
685 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
686 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
687 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
688 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
689 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
690 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
691 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
692 <xi:include href="tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
693 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
694 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
695 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
696 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
697 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
698 tmpl = loader.load('tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
699 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
700 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
701 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
702 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
703 def test_relative_include_subdir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
704 os.mkdir(os.path.join(self.dirname, 'sub')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
705 file1 = open(os.path.join(self.dirname, 'sub', 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
706 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
707 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
708 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
709 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
710 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
711 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
712 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
713 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
714 <xi:include href="sub/tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
715 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
716 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
717 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
718 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
719 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
720 tmpl = loader.load('tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
721 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
722 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
723 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
724 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
725 def test_relative_include_parentdir(self): |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
726 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
727 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
728 file1.write("""<div>Included</div>""") |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
729 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
730 file1.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
731 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
732 os.mkdir(os.path.join(self.dirname, 'sub')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
733 file2 = open(os.path.join(self.dirname, 'sub', 'tmpl2.html'), 'w') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
734 try: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
735 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
736 <xi:include href="../tmpl1.html" /> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
737 </html>""") |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
738 finally: |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
739 file2.close() |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
740 |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
741 loader = TemplateLoader([self.dirname]) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
742 tmpl = loader.load('sub/tmpl2.html') |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
743 self.assertEqual("""<html> |
158
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
744 <div>Included</div> |
8e81177059f3
* Add test case for SVG content embedded in an HTML document.
cmlenz
parents:
154
diff
changeset
|
745 </html>""", tmpl.generate().render()) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
746 |
174 | 747 def test_relative_include_without_search_path(self): |
748 file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w') | |
749 try: | |
750 file1.write("""<div>Included</div>""") | |
751 finally: | |
752 file1.close() | |
753 | |
754 file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w') | |
755 try: | |
756 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"> | |
757 <xi:include href="tmpl1.html" /> | |
758 </html>""") | |
759 finally: | |
760 file2.close() | |
761 | |
762 loader = TemplateLoader() | |
763 tmpl = loader.load(os.path.abspath(os.path.join(self.dirname, | |
764 'tmpl2.html'))) | |
765 self.assertEqual("""<html> | |
766 <div>Included</div> | |
767 </html>""", tmpl.generate().render()) | |
768 | |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
769 |
1 | 770 def suite(): |
771 suite = unittest.TestSuite() | |
772 suite.addTest(doctest.DocTestSuite(Template.__module__)) | |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
773 suite.addTest(unittest.makeSuite(AttrsDirectiveTestCase, 'test')) |
53
60f1a556690e
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
774 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) |
50
a053ffb834cb
Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents:
48
diff
changeset
|
775 suite.addTest(unittest.makeSuite(DefDirectiveTestCase, 'test')) |
51
a572b1018b66
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
776 suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test')) |
65
5c024cf58ecb
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
777 suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test')) |
36
57d607f25484
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
778 suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test')) |
37
224b0b41d1da
Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents:
36
diff
changeset
|
779 suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test')) |
104
e9259920db05
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
780 suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test')) |
152
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
781 suite.addTest(unittest.makeSuite(TemplateTestCase, 'test')) |
064ba1078f92
Add some tests for relative template includes (see #27).
cmlenz
parents:
149
diff
changeset
|
782 suite.addTest(unittest.makeSuite(TemplateLoaderTestCase, 'test')) |
1 | 783 return suite |
784 | |
785 if __name__ == '__main__': | |
786 unittest.main(defaultTest='suite') |