1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez# -*- coding: utf-8 -*-
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez"""
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    jinja2.exceptions
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    ~~~~~~~~~~~~~~~~~
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    Jinja exceptions.
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    :copyright: (c) 2010 by the Jinja Team.
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    :license: BSD, see LICENSE for more details.
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez"""
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezfrom jinja2._compat import imap, text_type, PY2, implements_to_string
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateError(Exception):
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Baseclass for all template errors."""
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    if PY2:
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        def __init__(self, message=None):
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if message is not None:
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message = text_type(message).encode('utf-8')
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Exception.__init__(self, message)
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @property
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        def message(self):
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if self.args:
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message = self.args[0]
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                if message is not None:
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    return message.decode('utf-8', 'replace')
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        def __unicode__(self):
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return self.message or u''
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    else:
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        def __init__(self, message=None):
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Exception.__init__(self, message)
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @property
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        def message(self):
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if self.args:
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message = self.args[0]
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                if message is not None:
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    return message
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez@implements_to_string
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateNotFound(IOError, LookupError, TemplateError):
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Raised if a template does not exist."""
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    # looks weird, but removes the warning descriptor that just
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    # bogusly warns us about message being deprecated
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    message = None
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    def __init__(self, name, message=None):
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        IOError.__init__(self)
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if message is None:
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            message = name
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.message = message
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.name = name
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.templates = [name]
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    def __str__(self):
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return self.message
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplatesNotFound(TemplateNotFound):
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Like :class:`TemplateNotFound` but raised if multiple templates
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    are selected.  This is a subclass of :class:`TemplateNotFound`
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    exception, so just catching the base exception will catch both.
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    .. versionadded:: 2.2
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    def __init__(self, names=(), message=None):
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if message is None:
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            message = u'none of the templates given were found: ' + \
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                      u', '.join(imap(text_type, names))
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        TemplateNotFound.__init__(self, names and names[-1] or None, message)
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.templates = list(names)
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez@implements_to_string
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateSyntaxError(TemplateError):
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Raised to tell the user that there is a problem with the template."""
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    def __init__(self, message, lineno, name=None, filename=None):
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        TemplateError.__init__(self, message)
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.lineno = lineno
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.name = name
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.filename = filename
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.source = None
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        # this is set to True if the debug.translate_syntax_error
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        # function translated the syntax error into a new traceback
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        self.translated = False
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    def __str__(self):
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        # for translated errors we only return the message
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if self.translated:
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return self.message
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        # otherwise attach some stuff
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        location = 'line %d' % self.lineno
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        name = self.filename or self.name
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if name:
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            location = 'File "%s", %s' % (name, location)
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        lines = [self.message, '  ' + location]
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        # if the source is set, add the line to the output
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if self.source is not None:
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            try:
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                line = self.source.splitlines()[self.lineno - 1]
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            except IndexError:
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                line = None
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if line:
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                lines.append('    ' + line.strip())
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return u'\n'.join(lines)
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateAssertionError(TemplateSyntaxError):
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Like a template syntax error, but covers cases where something in the
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    template caused an error at compile time that wasn't necessarily caused
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    by a syntax error.  However it's a direct subclass of
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    :exc:`TemplateSyntaxError` and has the same attributes.
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TemplateRuntimeError(TemplateError):
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """A generic runtime error in the template engine.  Under some situations
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    Jinja may raise this exception.
130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass UndefinedError(TemplateRuntimeError):
134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Raised if a template tries to operate on :class:`Undefined`."""
135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass SecurityError(TemplateRuntimeError):
138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """Raised if a template tries to do something insecure if the
139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    sandbox is enabled.
140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass FilterArgumentError(TemplateRuntimeError):
144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """This error is raised if a filter was called with inappropriate
145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    arguments
146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    """
147