Add template functions: md5, sha1, sha256, sha512 (#140192)

This commit is contained in:
Franck Nijhof 2025-03-09 15:15:27 +01:00 committed by GitHub
parent 1a46edffaa
commit e8069e1c07
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 81 additions and 0 deletions

View File

@ -12,6 +12,7 @@ from contextvars import ContextVar
from copy import deepcopy from copy import deepcopy
from datetime import date, datetime, time, timedelta from datetime import date, datetime, time, timedelta
from functools import cache, lru_cache, partial, wraps from functools import cache, lru_cache, partial, wraps
import hashlib
import json import json
import logging import logging
import math import math
@ -2784,6 +2785,26 @@ def flatten(value: Iterable[Any], levels: int | None = None) -> list[Any]:
return flattened return flattened
def md5(value: str) -> str:
"""Generate md5 hash from a string."""
return hashlib.md5(value.encode()).hexdigest()
def sha1(value: str) -> str:
"""Generate sha1 hash from a string."""
return hashlib.sha1(value.encode()).hexdigest()
def sha256(value: str) -> str:
"""Generate sha256 hash from a string."""
return hashlib.sha256(value.encode()).hexdigest()
def sha512(value: str) -> str:
"""Generate sha512 hash from a string."""
return hashlib.sha512(value.encode()).hexdigest()
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."""
@ -2987,6 +3008,10 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
self.filters["shuffle"] = shuffle self.filters["shuffle"] = shuffle
self.filters["typeof"] = typeof self.filters["typeof"] = typeof
self.filters["flatten"] = flatten self.filters["flatten"] = flatten
self.filters["md5"] = md5
self.filters["sha1"] = sha1
self.filters["sha256"] = sha256
self.filters["sha512"] = sha512
self.globals["log"] = logarithm self.globals["log"] = logarithm
self.globals["sin"] = sine self.globals["sin"] = sine
self.globals["cos"] = cosine self.globals["cos"] = cosine
@ -3027,6 +3052,10 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
self.globals["shuffle"] = shuffle self.globals["shuffle"] = shuffle
self.globals["typeof"] = typeof self.globals["typeof"] = typeof
self.globals["flatten"] = flatten self.globals["flatten"] = flatten
self.globals["md5"] = md5
self.globals["sha1"] = sha1
self.globals["sha256"] = sha256
self.globals["sha512"] = sha512
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

View File

@ -6788,3 +6788,55 @@ def test_flatten(hass: HomeAssistant) -> None:
with pytest.raises(TemplateError): with pytest.raises(TemplateError):
template.Template("{{ flatten() }}", hass).async_render() template.Template("{{ flatten() }}", hass).async_render()
def test_md5(hass: HomeAssistant) -> None:
"""Test the md5 function and filter."""
assert (
template.Template("{{ md5('Home Assistant') }}", hass).async_render()
== "3d15e5c102c3413d0337393c3287e006"
)
assert (
template.Template("{{ 'Home Assistant' | md5 }}", hass).async_render()
== "3d15e5c102c3413d0337393c3287e006"
)
def test_sha1(hass: HomeAssistant) -> None:
"""Test the sha1 function and filter."""
assert (
template.Template("{{ sha1('Home Assistant') }}", hass).async_render()
== "c8fd3bb19b94312664faa619af7729bdbf6e9f8a"
)
assert (
template.Template("{{ 'Home Assistant' | sha1 }}", hass).async_render()
== "c8fd3bb19b94312664faa619af7729bdbf6e9f8a"
)
def test_sha256(hass: HomeAssistant) -> None:
"""Test the sha256 function and filter."""
assert (
template.Template("{{ sha256('Home Assistant') }}", hass).async_render()
== "2a366abb0cd47f51f3725bf0fb7ebcb4fefa6e20f4971e25fe2bb8da8145ce2b"
)
assert (
template.Template("{{ 'Home Assistant' | sha256 }}", hass).async_render()
== "2a366abb0cd47f51f3725bf0fb7ebcb4fefa6e20f4971e25fe2bb8da8145ce2b"
)
def test_sha512(hass: HomeAssistant) -> None:
"""Test the sha512 function and filter."""
assert (
template.Template("{{ sha512('Home Assistant') }}", hass).async_render()
== "9e3c2cdd1fbab0037378d37e1baf8a3a4bf92c54b56ad1d459deee30ccbb2acbebd7a3614552ea08992ad27dedeb7b4c5473525ba90cb73dbe8b9ec5f69295bb"
)
assert (
template.Template("{{ 'Home Assistant' | sha512 }}", hass).async_render()
== "9e3c2cdd1fbab0037378d37e1baf8a3a4bf92c54b56ad1d459deee30ccbb2acbebd7a3614552ea08992ad27dedeb7b4c5473525ba90cb73dbe8b9ec5f69295bb"
)