Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/jinja2/exceptions.py: 32%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

66 statements  

1import typing as t 

2 

3if t.TYPE_CHECKING: 

4 from .runtime import Undefined 

5 

6 

7class TemplateError(Exception): 

8 """Baseclass for all template errors.""" 

9 

10 def __init__(self, message: t.Optional[str] = None) -> None: 

11 super().__init__(message) 

12 

13 @property 

14 def message(self) -> t.Optional[str]: 

15 return self.args[0] if self.args else None 

16 

17 

18class TemplateNotFound(IOError, LookupError, TemplateError): 

19 """Raised if a template does not exist. 

20 

21 .. versionchanged:: 2.11 

22 If the given name is :class:`Undefined` and no message was 

23 provided, an :exc:`UndefinedError` is raised. 

24 """ 

25 

26 # Silence the Python warning about message being deprecated since 

27 # it's not valid here. 

28 message: t.Optional[str] = None 

29 

30 def __init__( 

31 self, 

32 name: t.Optional[t.Union[str, "Undefined"]], 

33 message: t.Optional[str] = None, 

34 ) -> None: 

35 IOError.__init__(self, name) 

36 

37 if message is None: 

38 from .runtime import Undefined 

39 

40 if isinstance(name, Undefined): 

41 name._fail_with_undefined_error() 

42 

43 message = name 

44 

45 self.message = message 

46 self.name = name 

47 self.templates = [name] 

48 

49 def __str__(self) -> str: 

50 return str(self.message) 

51 

52 

53class TemplatesNotFound(TemplateNotFound): 

54 """Like :class:`TemplateNotFound` but raised if multiple templates 

55 are selected. This is a subclass of :class:`TemplateNotFound` 

56 exception, so just catching the base exception will catch both. 

57 

58 .. versionchanged:: 2.11 

59 If a name in the list of names is :class:`Undefined`, a message 

60 about it being undefined is shown rather than the empty string. 

61 

62 .. versionadded:: 2.2 

63 """ 

64 

65 def __init__( 

66 self, 

67 names: t.Sequence[t.Union[str, "Undefined"]] = (), 

68 message: t.Optional[str] = None, 

69 ) -> None: 

70 if message is None: 

71 from .runtime import Undefined 

72 

73 parts = [] 

74 

75 for name in names: 

76 if isinstance(name, Undefined): 

77 parts.append(name._undefined_message) 

78 else: 

79 parts.append(name) 

80 

81 parts_str = ", ".join(map(str, parts)) 

82 message = f"none of the templates given were found: {parts_str}" 

83 

84 super().__init__(names[-1] if names else None, message) 

85 self.templates = list(names) 

86 

87 

88class TemplateSyntaxError(TemplateError): 

89 """Raised to tell the user that there is a problem with the template.""" 

90 

91 def __init__( 

92 self, 

93 message: str, 

94 lineno: int, 

95 name: t.Optional[str] = None, 

96 filename: t.Optional[str] = None, 

97 ) -> None: 

98 super().__init__(message) 

99 self.lineno = lineno 

100 self.name = name 

101 self.filename = filename 

102 self.source: t.Optional[str] = None 

103 

104 # this is set to True if the debug.translate_syntax_error 

105 # function translated the syntax error into a new traceback 

106 self.translated = False 

107 

108 def __str__(self) -> str: 

109 # for translated errors we only return the message 

110 if self.translated: 

111 return t.cast(str, self.message) 

112 

113 # otherwise attach some stuff 

114 location = f"line {self.lineno}" 

115 name = self.filename or self.name 

116 if name: 

117 location = f'File "{name}", {location}' 

118 lines = [t.cast(str, self.message), " " + location] 

119 

120 # if the source is set, add the line to the output 

121 if self.source is not None: 

122 try: 

123 line = self.source.splitlines()[self.lineno - 1] 

124 except IndexError: 

125 pass 

126 else: 

127 lines.append(" " + line.strip()) 

128 

129 return "\n".join(lines) 

130 

131 def __reduce__(self): # type: ignore 

132 # https://bugs.python.org/issue1692335 Exceptions that take 

133 # multiple required arguments have problems with pickling. 

134 # Without this, raises TypeError: __init__() missing 1 required 

135 # positional argument: 'lineno' 

136 return self.__class__, (self.message, self.lineno, self.name, self.filename) 

137 

138 

139class TemplateAssertionError(TemplateSyntaxError): 

140 """Like a template syntax error, but covers cases where something in the 

141 template caused an error at compile time that wasn't necessarily caused 

142 by a syntax error. However it's a direct subclass of 

143 :exc:`TemplateSyntaxError` and has the same attributes. 

144 """ 

145 

146 

147class TemplateRuntimeError(TemplateError): 

148 """A generic runtime error in the template engine. Under some situations 

149 Jinja may raise this exception. 

150 """ 

151 

152 

153class UndefinedError(TemplateRuntimeError): 

154 """Raised if a template tries to operate on :class:`Undefined`.""" 

155 

156 

157class SecurityError(TemplateRuntimeError): 

158 """Raised if a template tries to do something insecure if the 

159 sandbox is enabled. 

160 """ 

161 

162 

163class FilterArgumentError(TemplateRuntimeError): 

164 """This error is raised if a filter was called with inappropriate 

165 arguments 

166 """