Merge pull request #734 from balloob/template-errors
Catch exceptions when errors rendering templatepull/732/head
commit
ded99d7480
|
@ -14,3 +14,10 @@ class InvalidEntityFormatError(HomeAssistantError):
|
|||
class NoEntitySpecifiedError(HomeAssistantError):
|
||||
""" When no entity is specified. """
|
||||
pass
|
||||
|
||||
|
||||
class TemplateError(HomeAssistantError):
|
||||
""" Error during template rendering. """
|
||||
def __init__(self, exception):
|
||||
super().__init__('{}: {}'.format(exception.__class__.__name__,
|
||||
exception))
|
||||
|
|
|
@ -6,10 +6,17 @@ Template utility methods for rendering strings with HA data.
|
|||
"""
|
||||
# pylint: disable=too-few-public-methods
|
||||
import json
|
||||
import logging
|
||||
import jinja2
|
||||
from jinja2.sandbox import ImmutableSandboxedEnvironment
|
||||
from homeassistant.exceptions import TemplateError
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
_SENTINEL = object()
|
||||
|
||||
|
||||
def render_with_possible_json_value(hass, template, value):
|
||||
def render_with_possible_json_value(hass, template, value,
|
||||
error_value=_SENTINEL):
|
||||
""" Renders template with value exposed.
|
||||
If valid JSON will expose value_json too. """
|
||||
variables = {
|
||||
|
@ -20,7 +27,11 @@ def render_with_possible_json_value(hass, template, value):
|
|||
except ValueError:
|
||||
pass
|
||||
|
||||
return render(hass, template, variables)
|
||||
try:
|
||||
return render(hass, template, variables)
|
||||
except TemplateError:
|
||||
_LOGGER.exception('Error parsing value')
|
||||
return value if error_value is _SENTINEL else error_value
|
||||
|
||||
|
||||
def render(hass, template, variables=None, **kwargs):
|
||||
|
@ -28,9 +39,12 @@ def render(hass, template, variables=None, **kwargs):
|
|||
if variables is not None:
|
||||
kwargs.update(variables)
|
||||
|
||||
return ENV.from_string(template, {
|
||||
'states': AllStates(hass)
|
||||
}).render(kwargs)
|
||||
try:
|
||||
return ENV.from_string(template, {
|
||||
'states': AllStates(hass)
|
||||
}).render(kwargs)
|
||||
except jinja2.TemplateError as err:
|
||||
raise TemplateError(err)
|
||||
|
||||
|
||||
class AllStates(object):
|
||||
|
|
|
@ -7,7 +7,7 @@ Tests Home Assistant util methods.
|
|||
# pylint: disable=too-many-public-methods
|
||||
import unittest
|
||||
import homeassistant.core as ha
|
||||
|
||||
from homeassistant.exceptions import TemplateError
|
||||
from homeassistant.util import template
|
||||
|
||||
|
||||
|
@ -84,3 +84,19 @@ class TestUtilTemplate(unittest.TestCase):
|
|||
'',
|
||||
template.render_with_possible_json_value(
|
||||
self.hass, '{{ value_json }}', '{ I AM NOT JSON }'))
|
||||
|
||||
def test_render_with_possible_json_value_with_template_error(self):
|
||||
self.assertEqual(
|
||||
'hello',
|
||||
template.render_with_possible_json_value(
|
||||
self.hass, '{{ value_json', 'hello'))
|
||||
|
||||
def test_render_with_possible_json_value_with_template_error_error_value(self):
|
||||
self.assertEqual(
|
||||
'-',
|
||||
template.render_with_possible_json_value(
|
||||
self.hass, '{{ value_json', 'hello', '-'))
|
||||
|
||||
def test_raise_exception_on_error(self):
|
||||
with self.assertRaises(TemplateError):
|
||||
template.render(self.hass, '{{ invalid_syntax')
|
||||
|
|
Loading…
Reference in New Issue