summaryrefslogtreecommitdiff
path: root/bin/mako/exceptions.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/mako/exceptions.py')
-rwxr-xr-xbin/mako/exceptions.py256
1 files changed, 0 insertions, 256 deletions
diff --git a/bin/mako/exceptions.py b/bin/mako/exceptions.py
deleted file mode 100755
index b2a708892dc..00000000000
--- a/bin/mako/exceptions.py
+++ /dev/null
@@ -1,256 +0,0 @@
-# -*- coding: utf-8 -*-
-# exceptions.py
-# Copyright (C) 2006, 2007, 2008 Michael Bayer mike_mp@zzzcomputing.com
-#
-# This module is part of Mako and is released under
-# the MIT License: http://www.opensource.org/licenses/mit-license.php
-
-"""exception classes"""
-
-import traceback, sys, re
-from mako import util
-
-class MakoException(Exception):
- pass
-
-class RuntimeException(MakoException):
- pass
-
-def _format_filepos(lineno, pos, filename):
- if filename is None:
- return " at line: %d char: %d" % (lineno, pos)
- else:
- return " in file '%s' at line: %d char: %d" % (filename, lineno, pos)
-class CompileException(MakoException):
- def __init__(self, message, source, lineno, pos, filename):
- MakoException.__init__(self, message + _format_filepos(lineno, pos, filename))
- self.lineno =lineno
- self.pos = pos
- self.filename = filename
- self.source = source
-
-class SyntaxException(MakoException):
- def __init__(self, message, source, lineno, pos, filename):
- MakoException.__init__(self, message + _format_filepos(lineno, pos, filename))
- self.lineno =lineno
- self.pos = pos
- self.filename = filename
- self.source = source
-
-class TemplateLookupException(MakoException):
- pass
-
-class TopLevelLookupException(TemplateLookupException):
- pass
-
-class RichTraceback(object):
- """pulls the current exception from the sys traceback and extracts Mako-specific
- template information.
-
- Usage:
-
- RichTraceback()
-
- Properties:
-
- error - the exception instance.
- source - source code of the file where the error occured. if the error occured within a compiled template,
- this is the template source.
- lineno - line number where the error occured. if the error occured within a compiled template, the line number
- is adjusted to that of the template source
- records - a list of 8-tuples containing the original python traceback elements, plus the
- filename, line number, source line, and full template source for the traceline mapped back to its originating source
- template, if any for that traceline (else the fields are None).
- reverse_records - the list of records in reverse
- traceback - a list of 4-tuples, in the same format as a regular python traceback, with template-corresponding
- traceback records replacing the originals
- reverse_traceback - the traceback list in reverse
-
- """
- def __init__(self, traceback=None):
- (self.source, self.lineno) = ("", 0)
- (t, self.error, self.records) = self._init(traceback)
- if self.error is None:
- self.error = t
- if isinstance(self.error, CompileException) or isinstance(self.error, SyntaxException):
- import mako.template
- self.source = self.error.source
- self.lineno = self.error.lineno
- self._has_source = True
- self.reverse_records = [r for r in self.records]
- self.reverse_records.reverse()
- def _get_reformatted_records(self, records):
- for rec in records:
- if rec[6] is not None:
- yield (rec[4], rec[5], rec[2], rec[6])
- else:
- yield tuple(rec[0:4])
- traceback = property(lambda self:self._get_reformatted_records(self.records), doc="""
- return a list of 4-tuple traceback records (i.e. normal python format)
- with template-corresponding lines remapped to the originating template
- """)
- reverse_traceback = property(lambda self:self._get_reformatted_records(self.reverse_records), doc="""
- return the same data as traceback, except in reverse order
- """)
- def _init(self, trcback):
- """format a traceback from sys.exc_info() into 7-item tuples, containing
- the regular four traceback tuple items, plus the original template
- filename, the line number adjusted relative to the template source, and
- code line from that line number of the template."""
- import mako.template
- mods = {}
- if not trcback:
- (type, value, trcback) = sys.exc_info()
- rawrecords = traceback.extract_tb(trcback)
- new_trcback = []
- for filename, lineno, function, line in rawrecords:
- try:
- (line_map, template_lines) = mods[filename]
- except KeyError:
- try:
- info = mako.template._get_module_info(filename)
- module_source = info.code
- template_source = info.source
- template_filename = info.template_filename or filename
- except KeyError:
- new_trcback.append((filename, lineno, function, line, None, None, None, None))
- continue
-
- template_ln = module_ln = 1
- line_map = {}
- for line in module_source.split("\n"):
- match = re.match(r'\s*# SOURCE LINE (\d+)', line)
- if match:
- template_ln = int(match.group(1))
- else:
- template_ln += 1
- module_ln += 1
- line_map[module_ln] = template_ln
- template_lines = [line for line in template_source.split("\n")]
- mods[filename] = (line_map, template_lines)
-
- template_ln = line_map[lineno]
- if template_ln <= len(template_lines):
- template_line = template_lines[template_ln - 1]
- else:
- template_line = None
- new_trcback.append((filename, lineno, function, line, template_filename, template_ln, template_line, template_source))
- if not self.source:
- for l in range(len(new_trcback)-1, 0, -1):
- if new_trcback[l][5]:
- self.source = new_trcback[l][7]
- self.lineno = new_trcback[l][5]
- break
- else:
- try:
- # A normal .py file (not a Template)
- fp = open(new_trcback[-1][0])
- encoding = util.parse_encoding(fp)
- fp.seek(0)
- self.source = fp.read()
- fp.close()
- if encoding:
- self.source = self.source.decode(encoding)
- except IOError:
- self.source = ''
- self.lineno = new_trcback[-1][1]
- return (type, value, new_trcback)
-
-
-def text_error_template(lookup=None):
- """provides a template that renders a stack trace in a similar format to the Python interpreter,
- substituting source template filenames, line numbers and code for that of the originating
- source template, as applicable."""
- import mako.template
- return mako.template.Template(r"""
-<%page args="traceback=None"/>
-<%!
- from mako.exceptions import RichTraceback
-%>\
-<%
- tback = RichTraceback(traceback=traceback)
-%>\
-Traceback (most recent call last):
-% for (filename, lineno, function, line) in tback.traceback:
- File "${filename}", line ${lineno}, in ${function or '?'}
- ${line | unicode.strip}
-% endfor
-${str(tback.error.__class__.__name__)}: ${str(tback.error)}
-""")
-
-def html_error_template():
- """provides a template that renders a stack trace in an HTML format, providing an excerpt of
- code as well as substituting source template filenames, line numbers and code
- for that of the originating source template, as applicable.
-
- the template's default encoding_errors value is 'htmlentityreplace'. the template has
- two options:
-
- with the full option disabled, only a section of an HTML document is returned.
- with the css option disabled, the default stylesheet won't be included."""
- import mako.template
- return mako.template.Template(r"""
-<%!
- from mako.exceptions import RichTraceback
-%>
-<%page args="full=True, css=True, traceback=None"/>
-% if full:
-<html>
-<head>
- <title>Mako Runtime Error</title>
-% endif
-% if css:
- <style>
- body { font-family:verdana; margin:10px 30px 10px 30px;}
- .stacktrace { margin:5px 5px 5px 5px; }
- .highlight { padding:0px 10px 0px 10px; background-color:#9F9FDF; }
- .nonhighlight { padding:0px; background-color:#DFDFDF; }
- .sample { padding:10px; margin:10px 10px 10px 10px; font-family:monospace; }
- .sampleline { padding:0px 10px 0px 10px; }
- .sourceline { margin:5px 5px 10px 5px; font-family:monospace;}
- .location { font-size:80%; }
- </style>
-% endif
-% if full:
-</head>
-<body>
-% endif
-
-<h2>Error !</h2>
-<%
- tback = RichTraceback(traceback=traceback)
- src = tback.source
- line = tback.lineno
- if src:
- lines = src.split('\n')
- else:
- lines = None
-%>
-<h3>${str(tback.error.__class__.__name__)}: ${str(tback.error)}</h3>
-
-% if lines:
- <div class="sample">
- <div class="nonhighlight">
-% for index in range(max(0, line-4),min(len(lines), line+5)):
- % if index + 1 == line:
-<div class="highlight">${index + 1} ${lines[index] | h}</div>
- % else:
-<div class="sampleline">${index + 1} ${lines[index] | h}</div>
- % endif
-% endfor
- </div>
- </div>
-% endif
-
-<div class="stacktrace">
-% for (filename, lineno, function, line) in tback.reverse_traceback:
- <div class="location">${filename}, line ${lineno}:</div>
- <div class="sourceline">${line | h}</div>
-% endfor
-</div>
-
-% if full:
-</body>
-</html>
-% endif
-""", output_encoding=sys.getdefaultencoding(), encoding_errors='htmlentityreplace')