104 lines
2.6 KiB
Python
104 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
werkzeug.debug.render
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Render the traceback debugging page.
|
|
|
|
:copyright: (c) 2010 by the Werkzeug Team, see AUTHORS for more details.
|
|
:license: BSD, see LICENSE for more details.
|
|
"""
|
|
import pprint
|
|
from os.path import dirname, join
|
|
|
|
from werkzeug.templates import Template
|
|
|
|
|
|
def get_template(name):
|
|
return Template.from_file(join(dirname(__file__), 'shared', name),
|
|
unicode_mode=False, errors='ignore')
|
|
|
|
|
|
def load_resource(res):
|
|
try:
|
|
f = file(join(dirname(__file__), 'shared', res))
|
|
except IOError:
|
|
return ''
|
|
try:
|
|
return f.read()
|
|
finally:
|
|
f.close()
|
|
|
|
|
|
t_body = get_template('body.tmpl')
|
|
t_codetable = get_template('codetable.tmpl')
|
|
t_vartable = get_template('vartable.tmpl')
|
|
|
|
|
|
def code_table(frame):
|
|
from werkzeug.debug.util import Namespace
|
|
lines = []
|
|
lineno = frame['context_lineno']
|
|
if lineno is not None:
|
|
lineno += 1
|
|
for l in frame['pre_context']:
|
|
lines.append(Namespace(mode='pre', lineno=lineno, code=l))
|
|
lineno += 1
|
|
lines.append(Namespace(mode='cur', lineno=lineno,
|
|
code=frame['context_line']))
|
|
lineno += 1
|
|
for l in frame['post_context']:
|
|
lines.append(Namespace(mode='post', lineno=lineno, code=l))
|
|
lineno += 1
|
|
else:
|
|
lines.append(Namespace(mode='cur', lineno=1,
|
|
code='Sourcecode not available'))
|
|
|
|
return t_codetable.render(lines=lines)
|
|
|
|
|
|
def var_table(var):
|
|
def safe_pformat(x):
|
|
try:
|
|
lines = pprint.pformat(x).splitlines()
|
|
except Exception:
|
|
return '?'
|
|
tmp = []
|
|
for line in lines:
|
|
if len(line) > 79:
|
|
line = line[:79] + '...'
|
|
tmp.append(line)
|
|
return '\n'.join(tmp)
|
|
|
|
# dicts
|
|
if isinstance(var, dict) or hasattr(var, 'items'):
|
|
value = var.items()
|
|
if not value:
|
|
typ = 'empty'
|
|
else:
|
|
typ = 'dict'
|
|
value.sort()
|
|
value = [(repr(key), safe_pformat(val)) for key, val in value]
|
|
|
|
# lists
|
|
elif isinstance(var, list):
|
|
if not var:
|
|
typ = 'empty'
|
|
else:
|
|
typ = 'list'
|
|
value = [safe_pformat(item) for item in var]
|
|
|
|
# others
|
|
else:
|
|
typ = 'simple'
|
|
value = repr(var)
|
|
|
|
return t_vartable.render(type=typ, value=value)
|
|
|
|
|
|
def debug_page(context):
|
|
tc = context.to_dict()
|
|
tc['var_table'] = var_table
|
|
tc['code_table'] = code_table
|
|
return t_body.render(tc)
|