Spaces:
Paused
Paused
import typing as t | |
if t.TYPE_CHECKING: | |
from .runtime import Undefined | |
class TemplateError(Exception): | |
"""Baseclass for all template errors.""" | |
def __init__(self, message: t.Optional[str] = None) -> None: | |
super().__init__(message) | |
def message(self) -> t.Optional[str]: | |
return self.args[0] if self.args else None | |
class TemplateNotFound(IOError, LookupError, TemplateError): | |
"""Raised if a template does not exist. | |
.. versionchanged:: 2.11 | |
If the given name is :class:`Undefined` and no message was | |
provided, an :exc:`UndefinedError` is raised. | |
""" | |
# Silence the Python warning about message being deprecated since | |
# it's not valid here. | |
message: t.Optional[str] = None | |
def __init__( | |
self, | |
name: t.Optional[t.Union[str, "Undefined"]], | |
message: t.Optional[str] = None, | |
) -> None: | |
IOError.__init__(self, name) | |
if message is None: | |
from .runtime import Undefined | |
if isinstance(name, Undefined): | |
name._fail_with_undefined_error() | |
message = name | |
self.message = message | |
self.name = name | |
self.templates = [name] | |
def __str__(self) -> str: | |
return str(self.message) | |
class TemplatesNotFound(TemplateNotFound): | |
"""Like :class:`TemplateNotFound` but raised if multiple templates | |
are selected. This is a subclass of :class:`TemplateNotFound` | |
exception, so just catching the base exception will catch both. | |
.. versionchanged:: 2.11 | |
If a name in the list of names is :class:`Undefined`, a message | |
about it being undefined is shown rather than the empty string. | |
.. versionadded:: 2.2 | |
""" | |
def __init__( | |
self, | |
names: t.Sequence[t.Union[str, "Undefined"]] = (), | |
message: t.Optional[str] = None, | |
) -> None: | |
if message is None: | |
from .runtime import Undefined | |
parts = [] | |
for name in names: | |
if isinstance(name, Undefined): | |
parts.append(name._undefined_message) | |
else: | |
parts.append(name) | |
parts_str = ", ".join(map(str, parts)) | |
message = f"none of the templates given were found: {parts_str}" | |
super().__init__(names[-1] if names else None, message) | |
self.templates = list(names) | |
class TemplateSyntaxError(TemplateError): | |
"""Raised to tell the user that there is a problem with the template.""" | |
def __init__( | |
self, | |
message: str, | |
lineno: int, | |
name: t.Optional[str] = None, | |
filename: t.Optional[str] = None, | |
) -> None: | |
super().__init__(message) | |
self.lineno = lineno | |
self.name = name | |
self.filename = filename | |
self.source: t.Optional[str] = None | |
# this is set to True if the debug.translate_syntax_error | |
# function translated the syntax error into a new traceback | |
self.translated = False | |
def __str__(self) -> str: | |
# for translated errors we only return the message | |
if self.translated: | |
return t.cast(str, self.message) | |
# otherwise attach some stuff | |
location = f"line {self.lineno}" | |
name = self.filename or self.name | |
if name: | |
location = f'File "{name}", {location}' | |
lines = [t.cast(str, self.message), " " + location] | |
# if the source is set, add the line to the output | |
if self.source is not None: | |
try: | |
line = self.source.splitlines()[self.lineno - 1] | |
except IndexError: | |
pass | |
else: | |
lines.append(" " + line.strip()) | |
return "\n".join(lines) | |
def __reduce__(self): # type: ignore | |
# https://bugs.python.org/issue1692335 Exceptions that take | |
# multiple required arguments have problems with pickling. | |
# Without this, raises TypeError: __init__() missing 1 required | |
# positional argument: 'lineno' | |
return self.__class__, (self.message, self.lineno, self.name, self.filename) | |
class TemplateAssertionError(TemplateSyntaxError): | |
"""Like a template syntax error, but covers cases where something in the | |
template caused an error at compile time that wasn't necessarily caused | |
by a syntax error. However it's a direct subclass of | |
:exc:`TemplateSyntaxError` and has the same attributes. | |
""" | |
class TemplateRuntimeError(TemplateError): | |
"""A generic runtime error in the template engine. Under some situations | |
Jinja may raise this exception. | |
""" | |
class UndefinedError(TemplateRuntimeError): | |
"""Raised if a template tries to operate on :class:`Undefined`.""" | |
class SecurityError(TemplateRuntimeError): | |
"""Raised if a template tries to do something insecure if the | |
sandbox is enabled. | |
""" | |
class FilterArgumentError(TemplateRuntimeError): | |
"""This error is raised if a filter was called with inappropriate | |
arguments | |
""" | |