annotate genshi/template/tests/markup.py @ 935:705727288d7e

Merge r1143 from py3k: add support for python 3 to remaining genshi.template components: * minor changes to track encoding=None API change in core genshi modules. * genshi/template/directives: * slightly odd syntax changes to make the 2to3 .next() fixer pick up *stream.next() * minor test fix for change in behaviour of division (/) in Python 3. * genshi/template/loader: * add 'b' to file modes to ensure it's loaded as bytes in Python 3. * use not isinstance(s, unicode) instead of isinstance(s, str) since the former is correctly converted by 2to3.
author hodgestar
date Fri, 18 Mar 2011 09:17:52 +0000
parents 3c09c8d8a578
children
rev   line source
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
2 #
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
3 # Copyright (C) 2006-2009 Edgewall Software
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
4 # All rights reserved.
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
5 #
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
8 # are also available at http://genshi.edgewall.org/wiki/License.
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
9 #
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://genshi.edgewall.org/log/.
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
13
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
14 import doctest
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
15 import os
715
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
16 import pickle
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
17 import shutil
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
18 import sys
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
19 import tempfile
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
20 import unittest
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
21
935
705727288d7e Merge r1143 from py3k:
hodgestar
parents: 924
diff changeset
22 from genshi.compat import BytesIO, StringIO
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
23 from genshi.core import Markup
374
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
24 from genshi.input import XML
400
8dd0d34a9fb7 Renamed `genshi.template.core` to `genshi.template.base`, mainly to avoid confusion with `genshi.core`.
cmlenz
parents: 381
diff changeset
25 from genshi.template.base import BadDirectiveError, TemplateSyntaxError
590
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
26 from genshi.template.loader import TemplateLoader, TemplateNotFound
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
27 from genshi.template.markup import MarkupTemplate
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
28
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
29
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
30 class MarkupTemplateTestCase(unittest.TestCase):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
31 """Tests for markup template processing."""
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
32
374
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
33 def test_parse_fileobj(self):
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
34 fileobj = StringIO('<root> ${var} $var</root>')
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
35 tmpl = MarkupTemplate(fileobj)
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
36 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
37
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
38 def test_parse_stream(self):
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
39 stream = XML('<root> ${var} $var</root>')
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
40 tmpl = MarkupTemplate(stream)
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
41 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
ca46dc9c7761 `MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
cmlenz
parents: 363
diff changeset
42
715
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
43 def test_pickle(self):
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
44 stream = XML('<root>$var</root>')
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
45 tmpl = MarkupTemplate(stream)
935
705727288d7e Merge r1143 from py3k:
hodgestar
parents: 924
diff changeset
46 buf = BytesIO()
715
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
47 pickle.dump(tmpl, buf, 2)
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
48 buf.seek(0)
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
49 unpickled = pickle.load(buf)
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
50 self.assertEqual('<root>42</root>', str(unpickled.generate(var=42)))
09715f868a73 Enable pickling of `Template` and `Code` objects.
cmlenz
parents: 714
diff changeset
51
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
52 def test_interpolate_mixed3(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
53 tmpl = MarkupTemplate('<root> ${var} $var</root>')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
54 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
55
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
56 def test_interpolate_leading_trailing_space(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
57 tmpl = MarkupTemplate('<root>${ foo }</root>')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
58 self.assertEqual('<root>bar</root>', str(tmpl.generate(foo='bar')))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
59
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
60 def test_interpolate_multiline(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
61 tmpl = MarkupTemplate("""<root>${dict(
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
62 bar = 'baz'
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
63 )[foo]}</root>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
64 self.assertEqual('<root>baz</root>', str(tmpl.generate(foo='bar')))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
65
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
66 def test_interpolate_non_string_attrs(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
67 tmpl = MarkupTemplate('<root attr="${1}"/>')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
68 self.assertEqual('<root attr="1"/>', str(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
69
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
70 def test_interpolate_list_result(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
71 tmpl = MarkupTemplate('<root>$foo</root>')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
72 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',))))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
73
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
74 def test_empty_attr(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
75 tmpl = MarkupTemplate('<root attr=""/>')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
76 self.assertEqual('<root attr=""/>', str(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
77
825
9cf631c0eace Minor simplification and performance improvement to the flattening of dynamic attribute values. Thanks to Christoph Zwerschke for the suggestion (see #295).
cmlenz
parents: 790
diff changeset
78 def test_empty_attr_interpolated(self):
9cf631c0eace Minor simplification and performance improvement to the flattening of dynamic attribute values. Thanks to Christoph Zwerschke for the suggestion (see #295).
cmlenz
parents: 790
diff changeset
79 tmpl = MarkupTemplate('<root attr="$attr"/>')
9cf631c0eace Minor simplification and performance improvement to the flattening of dynamic attribute values. Thanks to Christoph Zwerschke for the suggestion (see #295).
cmlenz
parents: 790
diff changeset
80 self.assertEqual('<root attr=""/>', str(tmpl.generate(attr='')))
9cf631c0eace Minor simplification and performance improvement to the flattening of dynamic attribute values. Thanks to Christoph Zwerschke for the suggestion (see #295).
cmlenz
parents: 790
diff changeset
81
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
82 def test_bad_directive_error(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
83 xml = '<p xmlns:py="http://genshi.edgewall.org/" py:do="nothing" />'
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
84 try:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
85 tmpl = MarkupTemplate(xml, filename='test.html')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
86 except BadDirectiveError, e:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
87 self.assertEqual('test.html', e.filename)
750
d007a0d7ba81 Remove some cruft for supporting Python 2.3.
cmlenz
parents: 715
diff changeset
88 self.assertEqual(1, e.lineno)
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
89
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
90 def test_directive_value_syntax_error(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
91 xml = """<p xmlns:py="http://genshi.edgewall.org/" py:if="bar'" />"""
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
92 try:
790
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
93 tmpl = MarkupTemplate(xml, filename='test.html').generate()
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
94 self.fail('Expected TemplateSyntaxError')
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
95 except TemplateSyntaxError, e:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
96 self.assertEqual('test.html', e.filename)
750
d007a0d7ba81 Remove some cruft for supporting Python 2.3.
cmlenz
parents: 715
diff changeset
97 self.assertEqual(1, e.lineno)
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
98
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
99 def test_expression_syntax_error(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
100 xml = """<p>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
101 Foo <em>${bar"}</em>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
102 </p>"""
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
103 try:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
104 tmpl = MarkupTemplate(xml, filename='test.html')
790
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
105 self.fail('Expected TemplateSyntaxError')
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
106 except TemplateSyntaxError, e:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
107 self.assertEqual('test.html', e.filename)
750
d007a0d7ba81 Remove some cruft for supporting Python 2.3.
cmlenz
parents: 715
diff changeset
108 self.assertEqual(2, e.lineno)
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
109
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
110 def test_expression_syntax_error_multi_line(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
111 xml = """<p><em></em>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
112
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
113 ${bar"}
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
114
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
115 </p>"""
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
116 try:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
117 tmpl = MarkupTemplate(xml, filename='test.html')
790
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
118 self.fail('Expected TemplateSyntaxError')
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
119 except TemplateSyntaxError, e:
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
120 self.assertEqual('test.html', e.filename)
750
d007a0d7ba81 Remove some cruft for supporting Python 2.3.
cmlenz
parents: 715
diff changeset
121 self.assertEqual(3, e.lineno)
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
122
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
123 def test_markup_noescape(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
124 """
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
125 Verify that outputting context data that is a `Markup` instance is not
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
126 escaped.
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
127 """
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
128 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
129 $myvar
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
130 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
131 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
132 <b>foo</b>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
133 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>'))))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
134
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
135 def test_text_noescape_quotes(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
136 """
790
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
137 Verify that outputting context data in text nodes doesn't escape
1b6968d31089 Merged the custom-directives branch back into trunk.
cmlenz
parents: 771
diff changeset
138 quotes.
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
139 """
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
140 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
141 $myvar
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
142 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
143 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
144 "foo"
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
145 </div>""", str(tmpl.generate(myvar='"foo"')))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
146
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
147 def test_attr_escape_quotes(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
148 """
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
149 Verify that outputting context data in attribtes escapes quotes.
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
150 """
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
151 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
152 <elem class="$myvar"/>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
153 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
154 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
155 <elem class="&#34;foo&#34;"/>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
156 </div>""", str(tmpl.generate(myvar='"foo"')))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
157
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
158 def test_directive_element(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
159 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
160 <py:if test="myvar">bar</py:if>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
161 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
162 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
163 bar
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
164 </div>""", str(tmpl.generate(myvar='"foo"')))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
165
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
166 def test_normal_comment(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
167 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
168 <!-- foo bar -->
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
169 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
170 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
171 <!-- foo bar -->
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
172 </div>""", str(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
173
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
174 def test_template_comment(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
175 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
176 <!-- !foo -->
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
177 <!--!bar-->
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
178 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
179 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
180 </div>""", str(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
181
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
182 def test_parse_with_same_namespace_nested(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
183 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
184 <span xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
185 </span>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
186 </div>""")
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
187 self.assertEqual("""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
188 <span>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
189 </span>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
190 </div>""", str(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
191
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
192 def test_latin1_encoded_with_xmldecl(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
193 tmpl = MarkupTemplate(u"""<?xml version="1.0" encoding="iso-8859-1" ?>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
194 <div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
195 \xf6
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
196 </div>""".encode('iso-8859-1'), encoding='iso-8859-1')
460
6b5544bb5a99 Apply patch by Alec Thomas for processing XML declarations (#111). Thanks!
cmlenz
parents: 437
diff changeset
197 self.assertEqual(u"""<?xml version="1.0" encoding="iso-8859-1"?>\n<div>
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
198 \xf6
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
199 </div>""", unicode(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
200
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
201 def test_latin1_encoded_explicit_encoding(self):
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
202 tmpl = MarkupTemplate(u"""<div xmlns:py="http://genshi.edgewall.org/">
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
203 \xf6
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
204 </div>""".encode('iso-8859-1'), encoding='iso-8859-1')
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
205 self.assertEqual(u"""<div>
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
206 \xf6
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
207 </div>""", unicode(tmpl.generate()))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
208
520
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
209 def test_exec_with_trailing_space(self):
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
210 """
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
211 Verify that a code block processing instruction with trailing space
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
212 does not cause a syntax error (see ticket #127).
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
213 """
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
214 MarkupTemplate("""<foo>
520
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
215 <?python
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
216 bar = 42
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
217 ?>
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
218 </foo>""")
ced12be33858 Applied patch by Dale Sedivec to fix #127. Many thanks!
cmlenz
parents: 460
diff changeset
219
405
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
220 def test_exec_import(self):
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
221 tmpl = MarkupTemplate("""<?python from datetime import timedelta ?>
405
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
222 <div xmlns:py="http://genshi.edgewall.org/">
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
223 ${timedelta(days=2)}
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
224 </div>""")
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
225 self.assertEqual("""<div>
405
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
226 2 days, 0:00:00
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
227 </div>""", str(tmpl.generate()))
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
228
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
229 def test_exec_def(self):
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
230 tmpl = MarkupTemplate("""
405
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
231 <?python
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
232 def foo():
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
233 return 42
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
234 ?>
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
235 <div xmlns:py="http://genshi.edgewall.org/">
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
236 ${foo()}
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
237 </div>""")
854
0d9e87c6cf6e More work on reducing the size of the diff produced by 2to3.
cmlenz
parents: 825
diff changeset
238 self.assertEqual("""<div>
405
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
239 42
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
240 </div>""", str(tmpl.generate()))
bd5da099c113 Support for Python code blocks using the `<?python ?>` processing instruction. Closes #84.
cmlenz
parents: 400
diff changeset
241
437
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
242 def test_namespace_on_removed_elem(self):
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
243 """
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
244 Verify that a namespace declaration on an element that is removed from
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
245 the generated stream does not get pushed up to the next non-stripped
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
246 element (see ticket #107).
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
247 """
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
248 tmpl = MarkupTemplate("""<?xml version="1.0"?>
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
249 <Test xmlns:py="http://genshi.edgewall.org/">
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
250 <Size py:if="0" xmlns:t="test">Size</Size>
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
251 <Item/>
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
252 </Test>""")
460
6b5544bb5a99 Apply patch by Alec Thomas for processing XML declarations (#111). Thanks!
cmlenz
parents: 437
diff changeset
253 self.assertEqual("""<?xml version="1.0"?>\n<Test>
437
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
254
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
255 <Item/>
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
256 </Test>""", str(tmpl.generate()))
3d82c5bdbf46 Fix for #107.
cmlenz
parents: 408
diff changeset
257
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
258 def test_include_in_loop(self):
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
259 dirname = tempfile.mkdtemp(suffix='genshi_test')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
260 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
261 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
262 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
263 file1.write("""<div>Included $idx</div>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
264 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
265 file1.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
266
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
267 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
268 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
269 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
270 xmlns:py="http://genshi.edgewall.org/">
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
271 <xi:include href="${name}.html" py:for="idx in range(3)" />
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
272 </html>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
273 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
274 file2.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
275
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
276 loader = TemplateLoader([dirname])
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
277 tmpl = loader.load('tmpl2.html')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
278 self.assertEqual("""<html>
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
279 <div>Included 0</div><div>Included 1</div><div>Included 2</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
280 </html>""", tmpl.generate(name='tmpl1').render(encoding=None))
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
281 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
282 shutil.rmtree(dirname)
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
283
656
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
284 def test_dynamic_include_href(self):
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
285 dirname = tempfile.mkdtemp(suffix='genshi_test')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
286 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
287 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
288 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
289 file1.write("""<div>Included</div>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
290 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
291 file1.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
292
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
293 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
294 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
295 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
296 xmlns:py="http://genshi.edgewall.org/">
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
297 <xi:include href="${name}.html" />
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
298 </html>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
299 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
300 file2.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
301
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
302 loader = TemplateLoader([dirname])
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
303 tmpl = loader.load('tmpl2.html')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
304 self.assertEqual("""<html>
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
305 <div>Included</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
306 </html>""", tmpl.generate(name='tmpl1').render(encoding=None))
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
307 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
308 shutil.rmtree(dirname)
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
309
656
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
310 def test_select_included_elements(self):
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
311 dirname = tempfile.mkdtemp(suffix='genshi_test')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
312 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
313 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
314 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
315 file1.write("""<li>$item</li>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
316 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
317 file1.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
318
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
319 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
320 try:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
321 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
322 xmlns:py="http://genshi.edgewall.org/">
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
323 <ul py:match="ul">${select('li')}</ul>
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
324 <ul py:with="items=(1, 2, 3)">
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
325 <xi:include href="tmpl1.html" py:for="item in items" />
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
326 </ul>
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
327 </html>""")
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
328 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
329 file2.close()
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
330
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
331 loader = TemplateLoader([dirname])
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
332 tmpl = loader.load('tmpl2.html')
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
333 self.assertEqual("""<html>
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
334 <ul><li>1</li><li>2</li><li>3</li></ul>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
335 </html>""", tmpl.generate().render(encoding=None))
363
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
336 finally:
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
337 shutil.rmtree(dirname)
caf7b68ab5dc Parse template includes at parse time to avoid some runtime overhead.
cmlenz
parents: 336
diff changeset
338
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
339 def test_fallback_when_include_found(self):
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
340 dirname = tempfile.mkdtemp(suffix='genshi_test')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
341 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
342 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
343 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
344 file1.write("""<div>Included</div>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
345 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
346 file1.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
347
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
348 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
349 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
350 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
351 <xi:include href="tmpl1.html"><xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
352 Missing</xi:fallback></xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
353 </html>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
354 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
355 file2.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
356
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
357 loader = TemplateLoader([dirname])
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
358 tmpl = loader.load('tmpl2.html')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
359 self.assertEqual("""<html>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
360 <div>Included</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
361 </html>""", tmpl.generate().render(encoding=None))
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
362 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
363 shutil.rmtree(dirname)
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
364
590
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
365 def test_error_when_include_not_found(self):
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
366 dirname = tempfile.mkdtemp(suffix='genshi_test')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
367 try:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
368 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
369 try:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
370 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
371 <xi:include href="tmpl1.html"/>
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
372 </html>""")
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
373 finally:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
374 file2.close()
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
375
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
376 loader = TemplateLoader([dirname], auto_reload=True)
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
377 tmpl = loader.load('tmpl2.html')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
378 self.assertRaises(TemplateNotFound, tmpl.generate().render)
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
379 finally:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
380 shutil.rmtree(dirname)
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
381
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
382 def test_fallback_when_include_not_found(self):
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
383 dirname = tempfile.mkdtemp(suffix='genshi_test')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
384 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
385 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
386 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
387 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
388 <xi:include href="tmpl1.html"><xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
389 Missing</xi:fallback></xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
390 </html>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
391 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
392 file2.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
393
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
394 loader = TemplateLoader([dirname])
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
395 tmpl = loader.load('tmpl2.html')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
396 self.assertEqual("""<html>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
397 Missing
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
398 </html>""", tmpl.generate().render(encoding=None))
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
399 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
400 shutil.rmtree(dirname)
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
401
639
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
402 def test_fallback_when_auto_reload_true(self):
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
403 dirname = tempfile.mkdtemp(suffix='genshi_test')
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
404 try:
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
405 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
406 try:
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
407 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
408 <xi:include href="tmpl1.html"><xi:fallback>
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
409 Missing</xi:fallback></xi:include>
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
410 </html>""")
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
411 finally:
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
412 file2.close()
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
413
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
414 loader = TemplateLoader([dirname], auto_reload=True)
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
415 tmpl = loader.load('tmpl2.html')
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
416 self.assertEqual("""<html>
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
417 Missing
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
418 </html>""", tmpl.generate().render(encoding=None))
639
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
419 finally:
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
420 shutil.rmtree(dirname)
b0cdc457dde9 Fix for XInclude fallbacks when auto-reloading is enabled. Closes #147. Thanks to rintaro@cpan.org for reporting the issue and providing a patch and test case!
cmlenz
parents: 629
diff changeset
421
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
422 def test_include_in_fallback(self):
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
423 dirname = tempfile.mkdtemp(suffix='genshi_test')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
424 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
425 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
426 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
427 file1.write("""<div>Included</div>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
428 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
429 file1.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
430
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
431 file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
432 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
433 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
434 <xi:include href="tmpl2.html">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
435 <xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
436 <xi:include href="tmpl1.html">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
437 <xi:fallback>Missing</xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
438 </xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
439 </xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
440 </xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
441 </html>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
442 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
443 file2.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
444
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
445 loader = TemplateLoader([dirname])
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
446 tmpl = loader.load('tmpl3.html')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
447 self.assertEqual("""<html>
590
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
448 <div>Included</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
449 </html>""", tmpl.generate().render(encoding=None))
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
450 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
451 shutil.rmtree(dirname)
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
452
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
453 def test_nested_include_fallback(self):
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
454 dirname = tempfile.mkdtemp(suffix='genshi_test')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
455 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
456 file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
457 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
458 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
459 <xi:include href="tmpl2.html">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
460 <xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
461 <xi:include href="tmpl1.html">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
462 <xi:fallback>Missing</xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
463 </xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
464 </xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
465 </xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
466 </html>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
467 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
468 file2.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
469
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
470 loader = TemplateLoader([dirname])
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
471 tmpl = loader.load('tmpl3.html')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
472 self.assertEqual("""<html>
590
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
473 Missing
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
474 </html>""", tmpl.generate().render(encoding=None))
590
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
475 finally:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
476 shutil.rmtree(dirname)
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
477
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
478 def test_nested_include_in_fallback(self):
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
479 dirname = tempfile.mkdtemp(suffix='genshi_test')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
480 try:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
481 file1 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
482 try:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
483 file1.write("""<div>Included</div>""")
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
484 finally:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
485 file1.close()
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
486
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
487 file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
488 try:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
489 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude">
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
490 <xi:include href="tmpl2.html">
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
491 <xi:fallback>
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
492 <xi:include href="tmpl1.html" />
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
493 </xi:fallback>
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
494 </xi:include>
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
495 </html>""")
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
496 finally:
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
497 file2.close()
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
498
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
499 loader = TemplateLoader([dirname])
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
500 tmpl = loader.load('tmpl3.html')
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
501 self.assertEqual("""<html>
880b1a75d046 Fix includes so that they again raise an exception when the included template is not found and no fallback has been provided.
cmlenz
parents: 548
diff changeset
502 <div>Included</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
503 </html>""", tmpl.generate().render(encoding=None))
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
504 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
505 shutil.rmtree(dirname)
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
506
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
507 def test_include_fallback_with_directive(self):
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
508 dirname = tempfile.mkdtemp(suffix='genshi_test')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
509 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
510 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
511 try:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
512 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
513 xmlns:py="http://genshi.edgewall.org/">
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
514 <xi:include href="tmpl1.html"><xi:fallback>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
515 <py:if test="True">tmpl1.html not found</py:if>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
516 </xi:fallback></xi:include>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
517 </html>""")
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
518 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
519 file2.close()
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
520
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
521 loader = TemplateLoader([dirname])
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
522 tmpl = loader.load('tmpl2.html')
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
523 self.assertEqual("""<html>
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
524 tmpl1.html not found
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
525 </html>""", tmpl.generate(debug=True).render(encoding=None))
381
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
526 finally:
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
527 shutil.rmtree(dirname)
a6c2a9cd2e92 Fix for #80: fallback only shown when the template to include wasn't found. In addition, the nesting of includes and fallback content should work correctly, and directives/expressions/etc inside fallback content are processed. Thanks to Christian Boos for the original patch and unit tests.
cmlenz
parents: 374
diff changeset
528
548
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
529 def test_include_inlined(self):
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
530 dirname = tempfile.mkdtemp(suffix='genshi_test')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
531 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
532 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
533 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
534 file1.write("""<div>Included</div>""")
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
535 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
536 file1.close()
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
537
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
538 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
539 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
540 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
541 xmlns:py="http://genshi.edgewall.org/">
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
542 <xi:include href="tmpl1.html" />
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
543 </html>""")
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
544 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
545 file2.close()
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
546
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
547 loader = TemplateLoader([dirname], auto_reload=False)
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
548 tmpl = loader.load('tmpl2.html')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
549 # if not inlined the following would be 5
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
550 self.assertEqual(7, len(tmpl.stream))
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
551 self.assertEqual("""<html>
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
552 <div>Included</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
553 </html>""", tmpl.generate().render(encoding=None))
548
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
554 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
555 shutil.rmtree(dirname)
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
556
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
557 def test_include_inlined_in_loop(self):
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
558 dirname = tempfile.mkdtemp(suffix='genshi_test')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
559 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
560 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
561 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
562 file1.write("""<div>Included $idx</div>""")
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
563 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
564 file1.close()
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
565
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
566 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
567 try:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
568 file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
569 xmlns:py="http://genshi.edgewall.org/">
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
570 <xi:include href="tmpl1.html" py:for="idx in range(3)" />
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
571 </html>""")
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
572 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
573 file2.close()
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
574
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
575 loader = TemplateLoader([dirname], auto_reload=False)
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
576 tmpl = loader.load('tmpl2.html')
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
577 self.assertEqual("""<html>
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
578 <div>Included 0</div><div>Included 1</div><div>Included 2</div>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
579 </html>""", tmpl.generate().render(encoding=None))
548
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
580 finally:
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
581 shutil.rmtree(dirname)
c2e039c7e439 Implement static includes, which improves performance a bit when auto reloading is disabled.
cmlenz
parents: 546
diff changeset
582
545
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
583 def test_allow_exec_false(self):
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
584 xml = ("""<?python
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
585 title = "A Genshi Template"
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
586 ?>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
587 <html xmlns:py="http://genshi.edgewall.org/">
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
588 <head>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
589 <title py:content="title">This is replaced.</title>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
590 </head>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
591 </html>""")
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
592 try:
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
593 tmpl = MarkupTemplate(xml, filename='test.html',
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
594 allow_exec=False)
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
595 self.fail('Expected SyntaxError')
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
596 except TemplateSyntaxError, e:
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
597 pass
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
598
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
599 def test_allow_exec_true(self):
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
600 xml = ("""<?python
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
601 title = "A Genshi Template"
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
602 ?>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
603 <html xmlns:py="http://genshi.edgewall.org/">
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
604 <head>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
605 <title py:content="title">This is replaced.</title>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
606 </head>
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
607 </html>""")
6e21c89d9255 Support for Python code blocks in templates can now be disabled. Closes #123.
cmlenz
parents: 520
diff changeset
608 tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=True)
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
609
650
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
610 def test_exec_in_match(self):
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
611 xml = ("""<html xmlns:py="http://genshi.edgewall.org/">
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
612 <py:match path="body/p">
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
613 <?python title="wakka wakka wakka" ?>
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
614 ${title}
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
615 </py:match>
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
616 <body><p>moot text</p></body>
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
617 </html>""")
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
618 tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=True)
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
619 self.assertEqual("""<html>
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
620 <body>
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
621 wakka wakka wakka
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
622 </body>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
623 </html>""", tmpl.generate().render(encoding=None))
650
0413c8817a3c Code blocks in match templates are now executed. Closes #155. Many thanks to Andrew Sutherland for the patch!
cmlenz
parents: 639
diff changeset
624
700
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
625 def test_with_in_match(self):
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
626 xml = ("""<html xmlns:py="http://genshi.edgewall.org/">
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
627 <py:match path="body/p">
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
628 <h1>${select('text()')}</h1>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
629 ${select('.')}
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
630 </py:match>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
631 <body><p py:with="foo='bar'">${foo}</p></body>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
632 </html>""")
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
633 tmpl = MarkupTemplate(xml, filename='test.html')
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
634 self.assertEqual("""<html>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
635 <body>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
636 <h1>bar</h1>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
637 <p>bar</p>
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
638 </body>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
639 </html>""", tmpl.generate().render(encoding=None))
700
8d079cee6822 Add option for unbuffered match template processing, which could cause excessive memory usage. Closes #190.
cmlenz
parents: 656
diff changeset
640
656
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
641 def test_nested_include_matches(self):
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
642 # See ticket #157
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
643 dirname = tempfile.mkdtemp(suffix='genshi_test')
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
644 try:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
645 file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
646 try:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
647 file1.write("""<html xmlns:py="http://genshi.edgewall.org/" py:strip="">
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
648 <div class="target">Some content.</div>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
649 </html>""")
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
650 finally:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
651 file1.close()
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
652
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
653 file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
654 try:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
655 file2.write("""<html xmlns:py="http://genshi.edgewall.org/"
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
656 xmlns:xi="http://www.w3.org/2001/XInclude">
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
657 <body>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
658 <h1>Some full html document that includes file1.html</h1>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
659 <xi:include href="tmpl1.html" />
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
660 </body>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
661 </html>""")
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
662 finally:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
663 file2.close()
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
664
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
665 file3 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
666 try:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
667 file3.write("""<html xmlns:py="http://genshi.edgewall.org/"
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
668 xmlns:xi="http://www.w3.org/2001/XInclude" py:strip="">
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
669 <div py:match="div[@class='target']" py:attrs="select('@*')">
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
670 Some added stuff.
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
671 ${select('*|text()')}
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
672 </div>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
673 <xi:include href="tmpl2.html" />
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
674 </html>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
675 """)
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
676 finally:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
677 file3.close()
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
678
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
679 loader = TemplateLoader([dirname])
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
680 tmpl = loader.load('tmpl3.html')
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
681 self.assertEqual("""
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
682 <html>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
683 <body>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
684 <h1>Some full html document that includes file1.html</h1>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
685 <div class="target">
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
686 Some added stuff.
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
687 Some content.
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
688 </div>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
689 </body>
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
690 </html>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
691 """, tmpl.generate().render(encoding=None))
656
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
692 finally:
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
693 shutil.rmtree(dirname)
3a3562e40a7e Add unit test for #157, which seems to be working okay in trunk.
cmlenz
parents: 650
diff changeset
694
758
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
695 def test_nested_matches_without_buffering(self):
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
696 xml = ("""<html xmlns:py="http://genshi.edgewall.org/">
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
697 <py:match path="body" once="true" buffer="false">
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
698 <body>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
699 ${select('*|text')}
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
700 And some other stuff...
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
701 </body>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
702 </py:match>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
703 <body>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
704 <span py:match="span">Foo</span>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
705 <span>Bar</span>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
706 </body>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
707 </html>""")
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
708 tmpl = MarkupTemplate(xml, filename='test.html')
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
709 self.assertEqual("""<html>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
710 <body>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
711 <span>Foo</span>
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
712 And some other stuff...
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
713 </body>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
714 </html>""", tmpl.generate().render(encoding=None))
758
0ea32786b624 Fix problem with nested match templates not being applied when buffering on the outer `py:match` is disabled. Thanks to Erik Bray for reporting the problem and providing a test case.
cmlenz
parents: 750
diff changeset
715
771
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
716 def test_match_without_select(self):
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
717 # See <http://genshi.edgewall.org/ticket/243>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
718 xml = ("""<html xmlns:py="http://genshi.edgewall.org/">
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
719 <py:match path="body" buffer="false">
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
720 <body>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
721 This replaces the other text.
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
722 </body>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
723 </py:match>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
724 <body>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
725 This gets replaced.
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
726 </body>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
727 </html>""")
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
728 tmpl = MarkupTemplate(xml, filename='test.html')
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
729 self.assertEqual("""<html>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
730 <body>
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
731 This replaces the other text.
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
732 </body>
865
6638c9db9e8c Also skip the encoding step in the template tests.
cmlenz
parents: 854
diff changeset
733 </html>""", tmpl.generate().render(encoding=None))
771
b4c973fbe6f5 Unbuffered match templates could result in parts of the matched content being included in the output if the match template didn't actually consume it via one or more calls to the `select()` function. Closes #243. Thanks to Felix Schwarz for the report and test case.
cmlenz
parents: 758
diff changeset
734
924
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
735 def test_match_tail_handling(self):
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
736 # See <http://genshi.edgewall.org/ticket/399>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
737 xml = ("""<rhyme xmlns:py="http://genshi.edgewall.org/">
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
738 <py:match path="*[@type]">
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
739 ${select('.')}
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
740 </py:match>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
741
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
742 <lines>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
743 <first type="one">fish</first>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
744 <second type="two">fish</second>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
745 <third type="red">fish</third>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
746 <fourth type="blue">fish</fourth>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
747 </lines>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
748 </rhyme>""")
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
749 tmpl = MarkupTemplate(xml, filename='test.html')
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
750 self.assertEqual("""<rhyme>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
751 <lines>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
752 <first type="one">fish</first>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
753 <second type="two">fish</second>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
754 <third type="red">fish</third>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
755 <fourth type="blue">fish</fourth>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
756 </lines>
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
757 </rhyme>""", tmpl.generate().render(encoding=None))
3c09c8d8a578 Pull up r1146 to trunk.
jruigrok
parents: 865
diff changeset
758
546
f58b52a9fa6e White space.
cmlenz
parents: 545
diff changeset
759
336
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
760 def suite():
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
761 suite = unittest.TestSuite()
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
762 suite.addTest(doctest.DocTestSuite(MarkupTemplate.__module__))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
763 suite.addTest(unittest.makeSuite(MarkupTemplateTestCase, 'test'))
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
764 return suite
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
765
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
766 if __name__ == '__main__':
5f2c7782cd8a Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
cmlenz
parents:
diff changeset
767 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software