xref: /aosp_15_r20/external/libchrome/third_party/jinja2/exceptions.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker# -*- coding: utf-8 -*-
2*635a8641SAndroid Build Coastguard Worker"""
3*635a8641SAndroid Build Coastguard Worker    jinja2.exceptions
4*635a8641SAndroid Build Coastguard Worker    ~~~~~~~~~~~~~~~~~
5*635a8641SAndroid Build Coastguard Worker
6*635a8641SAndroid Build Coastguard Worker    Jinja exceptions.
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker    :copyright: (c) 2017 by the Jinja Team.
9*635a8641SAndroid Build Coastguard Worker    :license: BSD, see LICENSE for more details.
10*635a8641SAndroid Build Coastguard Worker"""
11*635a8641SAndroid Build Coastguard Workerfrom jinja2._compat import imap, text_type, PY2, implements_to_string
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Workerclass TemplateError(Exception):
15*635a8641SAndroid Build Coastguard Worker    """Baseclass for all template errors."""
16*635a8641SAndroid Build Coastguard Worker
17*635a8641SAndroid Build Coastguard Worker    if PY2:
18*635a8641SAndroid Build Coastguard Worker        def __init__(self, message=None):
19*635a8641SAndroid Build Coastguard Worker            if message is not None:
20*635a8641SAndroid Build Coastguard Worker                message = text_type(message).encode('utf-8')
21*635a8641SAndroid Build Coastguard Worker            Exception.__init__(self, message)
22*635a8641SAndroid Build Coastguard Worker
23*635a8641SAndroid Build Coastguard Worker        @property
24*635a8641SAndroid Build Coastguard Worker        def message(self):
25*635a8641SAndroid Build Coastguard Worker            if self.args:
26*635a8641SAndroid Build Coastguard Worker                message = self.args[0]
27*635a8641SAndroid Build Coastguard Worker                if message is not None:
28*635a8641SAndroid Build Coastguard Worker                    return message.decode('utf-8', 'replace')
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker        def __unicode__(self):
31*635a8641SAndroid Build Coastguard Worker            return self.message or u''
32*635a8641SAndroid Build Coastguard Worker    else:
33*635a8641SAndroid Build Coastguard Worker        def __init__(self, message=None):
34*635a8641SAndroid Build Coastguard Worker            Exception.__init__(self, message)
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker        @property
37*635a8641SAndroid Build Coastguard Worker        def message(self):
38*635a8641SAndroid Build Coastguard Worker            if self.args:
39*635a8641SAndroid Build Coastguard Worker                message = self.args[0]
40*635a8641SAndroid Build Coastguard Worker                if message is not None:
41*635a8641SAndroid Build Coastguard Worker                    return message
42*635a8641SAndroid Build Coastguard Worker
43*635a8641SAndroid Build Coastguard Worker
44*635a8641SAndroid Build Coastguard Worker@implements_to_string
45*635a8641SAndroid Build Coastguard Workerclass TemplateNotFound(IOError, LookupError, TemplateError):
46*635a8641SAndroid Build Coastguard Worker    """Raised if a template does not exist."""
47*635a8641SAndroid Build Coastguard Worker
48*635a8641SAndroid Build Coastguard Worker    # looks weird, but removes the warning descriptor that just
49*635a8641SAndroid Build Coastguard Worker    # bogusly warns us about message being deprecated
50*635a8641SAndroid Build Coastguard Worker    message = None
51*635a8641SAndroid Build Coastguard Worker
52*635a8641SAndroid Build Coastguard Worker    def __init__(self, name, message=None):
53*635a8641SAndroid Build Coastguard Worker        IOError.__init__(self)
54*635a8641SAndroid Build Coastguard Worker        if message is None:
55*635a8641SAndroid Build Coastguard Worker            message = name
56*635a8641SAndroid Build Coastguard Worker        self.message = message
57*635a8641SAndroid Build Coastguard Worker        self.name = name
58*635a8641SAndroid Build Coastguard Worker        self.templates = [name]
59*635a8641SAndroid Build Coastguard Worker
60*635a8641SAndroid Build Coastguard Worker    def __str__(self):
61*635a8641SAndroid Build Coastguard Worker        return self.message
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker
64*635a8641SAndroid Build Coastguard Workerclass TemplatesNotFound(TemplateNotFound):
65*635a8641SAndroid Build Coastguard Worker    """Like :class:`TemplateNotFound` but raised if multiple templates
66*635a8641SAndroid Build Coastguard Worker    are selected.  This is a subclass of :class:`TemplateNotFound`
67*635a8641SAndroid Build Coastguard Worker    exception, so just catching the base exception will catch both.
68*635a8641SAndroid Build Coastguard Worker
69*635a8641SAndroid Build Coastguard Worker    .. versionadded:: 2.2
70*635a8641SAndroid Build Coastguard Worker    """
71*635a8641SAndroid Build Coastguard Worker
72*635a8641SAndroid Build Coastguard Worker    def __init__(self, names=(), message=None):
73*635a8641SAndroid Build Coastguard Worker        if message is None:
74*635a8641SAndroid Build Coastguard Worker            message = u'none of the templates given were found: ' + \
75*635a8641SAndroid Build Coastguard Worker                      u', '.join(imap(text_type, names))
76*635a8641SAndroid Build Coastguard Worker        TemplateNotFound.__init__(self, names and names[-1] or None, message)
77*635a8641SAndroid Build Coastguard Worker        self.templates = list(names)
78*635a8641SAndroid Build Coastguard Worker
79*635a8641SAndroid Build Coastguard Worker
80*635a8641SAndroid Build Coastguard Worker@implements_to_string
81*635a8641SAndroid Build Coastguard Workerclass TemplateSyntaxError(TemplateError):
82*635a8641SAndroid Build Coastguard Worker    """Raised to tell the user that there is a problem with the template."""
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Worker    def __init__(self, message, lineno, name=None, filename=None):
85*635a8641SAndroid Build Coastguard Worker        TemplateError.__init__(self, message)
86*635a8641SAndroid Build Coastguard Worker        self.lineno = lineno
87*635a8641SAndroid Build Coastguard Worker        self.name = name
88*635a8641SAndroid Build Coastguard Worker        self.filename = filename
89*635a8641SAndroid Build Coastguard Worker        self.source = None
90*635a8641SAndroid Build Coastguard Worker
91*635a8641SAndroid Build Coastguard Worker        # this is set to True if the debug.translate_syntax_error
92*635a8641SAndroid Build Coastguard Worker        # function translated the syntax error into a new traceback
93*635a8641SAndroid Build Coastguard Worker        self.translated = False
94*635a8641SAndroid Build Coastguard Worker
95*635a8641SAndroid Build Coastguard Worker    def __str__(self):
96*635a8641SAndroid Build Coastguard Worker        # for translated errors we only return the message
97*635a8641SAndroid Build Coastguard Worker        if self.translated:
98*635a8641SAndroid Build Coastguard Worker            return self.message
99*635a8641SAndroid Build Coastguard Worker
100*635a8641SAndroid Build Coastguard Worker        # otherwise attach some stuff
101*635a8641SAndroid Build Coastguard Worker        location = 'line %d' % self.lineno
102*635a8641SAndroid Build Coastguard Worker        name = self.filename or self.name
103*635a8641SAndroid Build Coastguard Worker        if name:
104*635a8641SAndroid Build Coastguard Worker            location = 'File "%s", %s' % (name, location)
105*635a8641SAndroid Build Coastguard Worker        lines = [self.message, '  ' + location]
106*635a8641SAndroid Build Coastguard Worker
107*635a8641SAndroid Build Coastguard Worker        # if the source is set, add the line to the output
108*635a8641SAndroid Build Coastguard Worker        if self.source is not None:
109*635a8641SAndroid Build Coastguard Worker            try:
110*635a8641SAndroid Build Coastguard Worker                line = self.source.splitlines()[self.lineno - 1]
111*635a8641SAndroid Build Coastguard Worker            except IndexError:
112*635a8641SAndroid Build Coastguard Worker                line = None
113*635a8641SAndroid Build Coastguard Worker            if line:
114*635a8641SAndroid Build Coastguard Worker                lines.append('    ' + line.strip())
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Worker        return u'\n'.join(lines)
117*635a8641SAndroid Build Coastguard Worker
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Workerclass TemplateAssertionError(TemplateSyntaxError):
120*635a8641SAndroid Build Coastguard Worker    """Like a template syntax error, but covers cases where something in the
121*635a8641SAndroid Build Coastguard Worker    template caused an error at compile time that wasn't necessarily caused
122*635a8641SAndroid Build Coastguard Worker    by a syntax error.  However it's a direct subclass of
123*635a8641SAndroid Build Coastguard Worker    :exc:`TemplateSyntaxError` and has the same attributes.
124*635a8641SAndroid Build Coastguard Worker    """
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker
127*635a8641SAndroid Build Coastguard Workerclass TemplateRuntimeError(TemplateError):
128*635a8641SAndroid Build Coastguard Worker    """A generic runtime error in the template engine.  Under some situations
129*635a8641SAndroid Build Coastguard Worker    Jinja may raise this exception.
130*635a8641SAndroid Build Coastguard Worker    """
131*635a8641SAndroid Build Coastguard Worker
132*635a8641SAndroid Build Coastguard Worker
133*635a8641SAndroid Build Coastguard Workerclass UndefinedError(TemplateRuntimeError):
134*635a8641SAndroid Build Coastguard Worker    """Raised if a template tries to operate on :class:`Undefined`."""
135*635a8641SAndroid Build Coastguard Worker
136*635a8641SAndroid Build Coastguard Worker
137*635a8641SAndroid Build Coastguard Workerclass SecurityError(TemplateRuntimeError):
138*635a8641SAndroid Build Coastguard Worker    """Raised if a template tries to do something insecure if the
139*635a8641SAndroid Build Coastguard Worker    sandbox is enabled.
140*635a8641SAndroid Build Coastguard Worker    """
141*635a8641SAndroid Build Coastguard Worker
142*635a8641SAndroid Build Coastguard Worker
143*635a8641SAndroid Build Coastguard Workerclass FilterArgumentError(TemplateRuntimeError):
144*635a8641SAndroid Build Coastguard Worker    """This error is raised if a filter was called with inappropriate
145*635a8641SAndroid Build Coastguard Worker    arguments
146*635a8641SAndroid Build Coastguard Worker    """
147