Parse template result in async_render_with_possible_json_value (#99670)

* Optionally parse templates rendered with possible json

* Remove duplicate strip

* Add tests for parsing template result
This commit is contained in:
Daniel 2024-01-24 12:12:28 +01:00 committed by GitHub
parent 1d7e0e7fe4
commit a67113a95a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 1 deletions

View File

@ -727,6 +727,7 @@ class Template:
value: Any,
error_value: Any = _SENTINEL,
variables: dict[str, Any] | None = None,
parse_result: bool = False,
) -> Any:
"""Render template with value exposed.
@ -748,7 +749,9 @@ class Template:
variables["value_json"] = json_loads(value)
try:
return _render_with_context(self.template, compiled, **variables).strip()
render_result = _render_with_context(
self.template, compiled, **variables
).strip()
except jinja2.TemplateError as ex:
if error_value is _SENTINEL:
_LOGGER.error(
@ -759,6 +762,11 @@ class Template:
)
return value if error_value is _SENTINEL else error_value
if not parse_result or self.hass and self.hass.config.legacy_templates:
return render_result
return self._parse_result(render_result)
def _ensure_compiled(
self,
limited: bool = False,

View File

@ -1728,6 +1728,26 @@ def test_render_with_possible_json_value_non_string_value(hass: HomeAssistant) -
assert tpl.async_render_with_possible_json_value(value) == expected
def test_render_with_possible_json_value_and_parse_result(hass: HomeAssistant) -> None:
"""Render with possible JSON value with valid JSON."""
tpl = template.Template("{{ value_json.hello }}", hass)
result = tpl.async_render_with_possible_json_value(
"""{"hello": {"world": "value1"}}""", parse_result=True
)
assert isinstance(result, dict)
def test_render_with_possible_json_value_and_dont_parse_result(
hass: HomeAssistant,
) -> None:
"""Render with possible JSON value with valid JSON."""
tpl = template.Template("{{ value_json.hello }}", hass)
result = tpl.async_render_with_possible_json_value(
"""{"hello": {"world": "value1"}}""", parse_result=False
)
assert isinstance(result, str)
def test_if_state_exists(hass: HomeAssistant) -> None:
"""Test if state exists works."""
hass.states.async_set("test.object", "available")