mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 23:27:37 +00:00
Add template function: flatten (#140157)
This commit is contained in:
parent
62c025fd12
commit
9aa8a786a5
@ -2765,6 +2765,25 @@ def typeof(value: Any) -> Any:
|
|||||||
return value.__class__.__name__
|
return value.__class__.__name__
|
||||||
|
|
||||||
|
|
||||||
|
def flatten(value: Iterable[Any], levels: int | None = None) -> list[Any]:
|
||||||
|
"""Flattens list of lists."""
|
||||||
|
if not isinstance(value, Iterable) or isinstance(value, str):
|
||||||
|
raise TypeError(f"flatten expected a list, got {type(value).__name__}")
|
||||||
|
|
||||||
|
flattened: list[Any] = []
|
||||||
|
for item in value:
|
||||||
|
if isinstance(item, Iterable) and not isinstance(item, str):
|
||||||
|
if levels is None:
|
||||||
|
flattened.extend(flatten(item))
|
||||||
|
elif levels >= 1:
|
||||||
|
flattened.extend(flatten(item, levels=(levels - 1)))
|
||||||
|
else:
|
||||||
|
flattened.append(item)
|
||||||
|
else:
|
||||||
|
flattened.append(item)
|
||||||
|
return flattened
|
||||||
|
|
||||||
|
|
||||||
class TemplateContextManager(AbstractContextManager):
|
class TemplateContextManager(AbstractContextManager):
|
||||||
"""Context manager to store template being parsed or rendered in a ContextVar."""
|
"""Context manager to store template being parsed or rendered in a ContextVar."""
|
||||||
|
|
||||||
@ -2967,6 +2986,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
|
|||||||
self.filters["contains"] = contains
|
self.filters["contains"] = contains
|
||||||
self.filters["shuffle"] = shuffle
|
self.filters["shuffle"] = shuffle
|
||||||
self.filters["typeof"] = typeof
|
self.filters["typeof"] = typeof
|
||||||
|
self.filters["flatten"] = flatten
|
||||||
self.globals["log"] = logarithm
|
self.globals["log"] = logarithm
|
||||||
self.globals["sin"] = sine
|
self.globals["sin"] = sine
|
||||||
self.globals["cos"] = cosine
|
self.globals["cos"] = cosine
|
||||||
@ -3006,6 +3026,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
|
|||||||
self.globals["zip"] = zip
|
self.globals["zip"] = zip
|
||||||
self.globals["shuffle"] = shuffle
|
self.globals["shuffle"] = shuffle
|
||||||
self.globals["typeof"] = typeof
|
self.globals["typeof"] = typeof
|
||||||
|
self.globals["flatten"] = flatten
|
||||||
self.tests["is_number"] = is_number
|
self.tests["is_number"] = is_number
|
||||||
self.tests["list"] = _is_list
|
self.tests["list"] = _is_list
|
||||||
self.tests["set"] = _is_set
|
self.tests["set"] = _is_set
|
||||||
|
@ -6751,3 +6751,40 @@ def test_typeof(hass: HomeAssistant) -> None:
|
|||||||
template.Template("{{ typeof('Home Assistant') }}", hass).async_render()
|
template.Template("{{ typeof('Home Assistant') }}", hass).async_render()
|
||||||
== "str"
|
== "str"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_flatten(hass: HomeAssistant) -> None:
|
||||||
|
"""Test the flatten function and filter."""
|
||||||
|
assert template.Template(
|
||||||
|
"{{ flatten([1, [2, [3]], 4, [5 , 6]]) }}", hass
|
||||||
|
).async_render() == [1, 2, 3, 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template(
|
||||||
|
"{{ [1, [2, [3]], 4, [5 , 6]] | flatten }}", hass
|
||||||
|
).async_render() == [1, 2, 3, 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template(
|
||||||
|
"{{ flatten([1, [2, [3]], 4, [5 , 6]], 1) }}", hass
|
||||||
|
).async_render() == [1, 2, [3], 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template(
|
||||||
|
"{{ flatten([1, [2, [3]], 4, [5 , 6]], levels=1) }}", hass
|
||||||
|
).async_render() == [1, 2, [3], 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template(
|
||||||
|
"{{ [1, [2, [3]], 4, [5 , 6]] | flatten(1) }}", hass
|
||||||
|
).async_render() == [1, 2, [3], 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template(
|
||||||
|
"{{ [1, [2, [3]], 4, [5 , 6]] | flatten(levels=1) }}", hass
|
||||||
|
).async_render() == [1, 2, [3], 4, 5, 6]
|
||||||
|
|
||||||
|
assert template.Template("{{ flatten([]) }}", hass).async_render() == []
|
||||||
|
|
||||||
|
assert template.Template("{{ [] | flatten }}", hass).async_render() == []
|
||||||
|
|
||||||
|
with pytest.raises(TemplateError):
|
||||||
|
template.Template("{{ 'string' | flatten }}", hass).async_render()
|
||||||
|
|
||||||
|
with pytest.raises(TemplateError):
|
||||||
|
template.Template("{{ flatten() }}", hass).async_render()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user