blob: 3d2adbdc2a8e5a19bdce762f238df85824ce7f52 [file] [log] [blame]
Armin Ronacher34f30422007-03-30 21:58:15 +02001import jdebug
2import sys
Armin Ronacher8ff24c42007-03-21 20:33:45 +01003from jinja import Environment, DictLoader
4from jinja.exceptions import TemplateNotFound
Armin Ronacher7977e5c2007-03-12 07:22:17 +01005from wsgiref.simple_server import make_server
Armin Ronacher7977e5c2007-03-12 07:22:17 +01006
Armin Ronacher8ff24c42007-03-21 20:33:45 +01007e = Environment(loader=DictLoader({
8 '/': u'''
9<html>
10 <head>
11 <title>Various Broken Templates</title>
12 <style type="text/css">
13 body {
14 margin: 2em;
15 font-size: 1.5em;
16 font-family: sans-serif
17 }
18 a {
19 color: #d00;
20 }
21 </style>
22 </head>
23 <body>
24 <h1>Various Broken Templates</h1>
25 <p>
26 This small WSGI application serves some Jinja templates that
27 are just broken. It uses the colubrid traceback middleware to
28 render those errors including source code.
29 </p>
30 <ul>
31 <li><a href="syntax_error">syntax error</a></li>
32 <li><a href="runtime_error">runtime error</a></li>
33 <li><a href="nested_syntax_error">nested syntax error</a></li>
34 <li><a href="nested_runtime_error">nested runtime error</a></li>
Armin Ronacher10dae5b2007-03-31 00:02:32 +020035 <li><a href="syntax_from_string">a syntax error from string</a></li>
36 <li><a href="runtime_from_string">runtime error from a string</a></li>
Armin Ronacher8ff24c42007-03-21 20:33:45 +010037 </ul>
38 </body>
39</html>
40''',
41 '/syntax_error': u'''
42{% for item in foo %}
43 ...
44{% endif %}
45 ''',
46 '/runtime_error': u'''
47{% set foo = 1 / 0 %}
48 ''',
49 '/nested_runtime_error': u'''
50{% include 'runtime_broken' %}
51 ''',
52 '/nested_syntax_error': u'''
53{% include 'syntax_broken' %}
54 ''',
55
56 'runtime_broken': '''\
57This is an included template
58{% set a = 1 / 0 %}''',
59 'syntax_broken': '''\
60This is an included template
61{% raw %}just some foo'''
62}))
63
Armin Ronacher10dae5b2007-03-31 00:02:32 +020064FAILING_STRING_TEMPLATE = '{{ 1 / 0 }}'
65BROKEN_STRING_TEMPLATE = '{% if foo %}...{% endfor %}'
66
Armin Ronacher8ff24c42007-03-21 20:33:45 +010067
68def test(environ, start_response):
Armin Ronacher10dae5b2007-03-31 00:02:32 +020069 path = environ.get('PATH_INFO' or '/')
Armin Ronacher8ff24c42007-03-21 20:33:45 +010070 try:
Armin Ronacher10dae5b2007-03-31 00:02:32 +020071 tmpl = e.get_template(path)
Armin Ronacher8ff24c42007-03-21 20:33:45 +010072 except TemplateNotFound:
Armin Ronacher10dae5b2007-03-31 00:02:32 +020073 if path == '/syntax_from_string':
74 tmpl = e.from_string(BROKEN_STRING_TEMPLATE)
75 elif path == '/runtime_from_string':
76 tmpl = e.from_string(FAILING_STRING_TEMPLATE)
77 else:
78 start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
79 return ['NOT FOUND']
Armin Ronacher8ff24c42007-03-21 20:33:45 +010080 start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
81 return [tmpl.render().encode('utf-8')]
Armin Ronacher7977e5c2007-03-12 07:22:17 +010082
Armin Ronacher34f30422007-03-30 21:58:15 +020083if __name__ == '__main__':
84 from colubrid.debug import DebuggedApplication
85 app = DebuggedApplication(test)
86 make_server("localhost", 7000, app).serve_forever()