Mercurial > piecrust2
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) |