""" * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ from jinja2 import nodes from jinja2.ext import Extension from jinja2.exceptions import TemplateRuntimeError # --------------------------------------------------- ## Custom tag to support raising exceptions from Jinja templates class RaiseExtension(Extension): tags = set(['raise']) def parse(self, parser): # the first token is the token that started the tag. In our case we # only listen to "raise" so this will be a name token with # "raise" as value. We get the line number so that we can give # that line number to the nodes we insert. lineno = next(parser.stream).lineno # Extract the message from the template message_node = parser.parse_expression() return nodes.CallBlock( self.call_method('_raise', [message_node], lineno=lineno), [], [], [], lineno=lineno ) def _raise(self, msg, caller): raise TemplateRuntimeError(msg)