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