blob: 4fc2cffb7ac4969da02fa86c078d69441a565274 [file] [log] [blame]
Armin Ronacher1cc232c2007-09-07 17:52:41 +02001import os
Armin Ronacher34f30422007-03-30 21:58:15 +02002import sys
Armin Ronacher1cc232c2007-09-07 17:52:41 +02003sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
4
5import jdebug
Christoph Hacke9e43bb2008-04-13 23:35:48 +02006from jinja2 import Environment, DictLoader
7from jinja2.exceptions import TemplateNotFound
Armin Ronacher7977e5c2007-03-12 07:22:17 +01008from wsgiref.simple_server import make_server
Armin Ronacher7977e5c2007-03-12 07:22:17 +01009
Armin Ronacher8ff24c42007-03-21 20:33:45 +010010e = Environment(loader=DictLoader({
11 '/': u'''
12<html>
13 <head>
14 <title>Various Broken Templates</title>
15 <style type="text/css">
16 body {
17 margin: 2em;
18 font-size: 1.5em;
19 font-family: sans-serif
20 }
21 a {
22 color: #d00;
23 }
24 </style>
25 </head>
26 <body>
27 <h1>Various Broken Templates</h1>
28 <p>
29 This small WSGI application serves some Jinja templates that
30 are just broken. It uses the colubrid traceback middleware to
31 render those errors including source code.
32 </p>
33 <ul>
34 <li><a href="syntax_error">syntax error</a></li>
35 <li><a href="runtime_error">runtime error</a></li>
36 <li><a href="nested_syntax_error">nested syntax error</a></li>
37 <li><a href="nested_runtime_error">nested runtime error</a></li>
Armin Ronachera7804ef2007-06-15 18:03:21 +020038 <li><a href="code_runtime_error">runtime error in code</a></li>
Armin Ronacher10dae5b2007-03-31 00:02:32 +020039 <li><a href="syntax_from_string">a syntax error from string</a></li>
40 <li><a href="runtime_from_string">runtime error from a string</a></li>
Armin Ronacher1cc232c2007-09-07 17:52:41 +020041 <li><a href="multiple_templates">multiple templates</a></li>
Armin Ronacher8ff24c42007-03-21 20:33:45 +010042 </ul>
43 </body>
44</html>
45''',
46 '/syntax_error': u'''
47{% for item in foo %}
48 ...
49{% endif %}
50 ''',
51 '/runtime_error': u'''
52{% set foo = 1 / 0 %}
53 ''',
54 '/nested_runtime_error': u'''
55{% include 'runtime_broken' %}
56 ''',
57 '/nested_syntax_error': u'''
58{% include 'syntax_broken' %}
59 ''',
Armin Ronachere39a5d22007-06-23 21:11:53 +020060 '/code_runtime_error': u'''We have a runtime error here:
61 {{ broken() }}''',
Armin Ronacher1cc232c2007-09-07 17:52:41 +020062 '/multiple_templates': '''\
63{{ fire_multiple_broken() }}
64''',
Armin Ronachera7804ef2007-06-15 18:03:21 +020065
Armin Ronacher8ff24c42007-03-21 20:33:45 +010066 'runtime_broken': '''\
67This is an included template
68{% set a = 1 / 0 %}''',
69 'syntax_broken': '''\
70This is an included template
Armin Ronacher1cc232c2007-09-07 17:52:41 +020071{% raw %}just some foo''',
72 'multiple_broken': '''\
73Just some context:
74{% include 'macro_broken' %}
75{{ broken() }}
76''',
77 'macro_broken': '''\
78{% macro broken %}
79 {{ 1 / 0 }}
80{% endmacro %}
81'''
Armin Ronacher8ff24c42007-03-21 20:33:45 +010082}))
Armin Ronacher1cc232c2007-09-07 17:52:41 +020083e.globals['fire_multiple_broken'] = lambda: \
84 e.get_template('multiple_broken').render()
Armin Ronacher8ff24c42007-03-21 20:33:45 +010085
Armin Ronacher10dae5b2007-03-31 00:02:32 +020086FAILING_STRING_TEMPLATE = '{{ 1 / 0 }}'
87BROKEN_STRING_TEMPLATE = '{% if foo %}...{% endfor %}'
88
Armin Ronacher8ff24c42007-03-21 20:33:45 +010089
Armin Ronachera7804ef2007-06-15 18:03:21 +020090def broken():
91 raise RuntimeError("I'm broken")
92
93
Armin Ronacher8ff24c42007-03-21 20:33:45 +010094def test(environ, start_response):
Armin Ronacher10dae5b2007-03-31 00:02:32 +020095 path = environ.get('PATH_INFO' or '/')
Armin Ronacher8ff24c42007-03-21 20:33:45 +010096 try:
Armin Ronacher10dae5b2007-03-31 00:02:32 +020097 tmpl = e.get_template(path)
Armin Ronacher8ff24c42007-03-21 20:33:45 +010098 except TemplateNotFound:
Armin Ronacher10dae5b2007-03-31 00:02:32 +020099 if path == '/syntax_from_string':
100 tmpl = e.from_string(BROKEN_STRING_TEMPLATE)
101 elif path == '/runtime_from_string':
102 tmpl = e.from_string(FAILING_STRING_TEMPLATE)
103 else:
104 start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
105 return ['NOT FOUND']
Armin Ronacher8ff24c42007-03-21 20:33:45 +0100106 start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
Armin Ronachera7804ef2007-06-15 18:03:21 +0200107 return [tmpl.render(broken=broken).encode('utf-8')]
108
Armin Ronacher7977e5c2007-03-12 07:22:17 +0100109
Armin Ronacher34f30422007-03-30 21:58:15 +0200110if __name__ == '__main__':
Armin Ronachera7804ef2007-06-15 18:03:21 +0200111 from werkzeug.debug import DebuggedApplication
Armin Ronacher1cc232c2007-09-07 17:52:41 +0200112 app = DebuggedApplication(test, True)
Armin Ronacher34f30422007-03-30 21:58:15 +0200113 make_server("localhost", 7000, app).serve_forever()