comparison piecrust/templating/jinjaengine.py @ 524:4bca25f99463

serve: Improve Jinja rendering error reporting. Some errors in Jinja are not wrapped in `TemplateSyntaxError` exceptions, so we have to wrap them ourselves to at least say what file it happened in.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 28 Jul 2015 21:25:08 -0700
parents 6ca1b6fb9964
children cf3218766fe2
comparison
equal deleted inserted replaced
523:b22e69ff54f4 524:4bca25f99463
51 51
52 try: 52 try:
53 return tpl.render(data) 53 return tpl.render(data)
54 except TemplateSyntaxError as tse: 54 except TemplateSyntaxError as tse:
55 raise self._getTemplatingError(tse) 55 raise self._getTemplatingError(tse)
56 except Exception as ex:
57 msg = "Error rendering Jinja markup"
58 rel_path = os.path.relpath(path, self.app.root_dir)
59 raise TemplatingError(msg, rel_path) from ex
56 60
57 def renderFile(self, paths, data): 61 def renderFile(self, paths, data):
58 self._ensureLoaded() 62 self._ensureLoaded()
59 tpl = None 63 tpl = None
60 logger.debug("Looking for template: %s" % paths) 64 logger.debug("Looking for template: %s" % paths)
65 rendered_path = None
61 for p in paths: 66 for p in paths:
62 try: 67 try:
63 tpl = self.env.get_template(p) 68 tpl = self.env.get_template(p)
69 rendered_path = p
64 break 70 break
65 except TemplateSyntaxError as tse: 71 except TemplateSyntaxError as tse:
66 raise self._getTemplatingError(tse) 72 raise self._getTemplatingError(tse)
67 except TemplateNotFound: 73 except TemplateNotFound:
68 pass 74 pass
72 78
73 try: 79 try:
74 return tpl.render(data) 80 return tpl.render(data)
75 except TemplateSyntaxError as tse: 81 except TemplateSyntaxError as tse:
76 raise self._getTemplatingError(tse) 82 raise self._getTemplatingError(tse)
83 except Exception as ex:
84 msg = "Error rendering Jinja markup"
85 rel_path = os.path.relpath(rendered_path, self.app.root_dir)
86 raise TemplatingError(msg, rel_path) from ex
77 87
78 def _getTemplatingError(self, tse, filename=None): 88 def _getTemplatingError(self, tse, filename=None):
79 filename = tse.filename or filename 89 filename = tse.filename or filename
80 if filename and os.path.isabs(filename): 90 if filename and os.path.isabs(filename):
81 filename = os.path.relpath(filename, self.env.app.root_dir) 91 filename = os.path.relpath(filename, self.env.app.root_dir)