From 8dbe293ae28550cd10fb24c201772e9e2448e4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 15 Sep 2022 15:01:40 +0200 Subject: [PATCH] Add version to templates (#78484) --- homeassistant/helpers/template.py | 8 +++++++ tests/helpers/test_template.py | 39 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index ea6b764a75a..3999231eb68 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -23,6 +23,7 @@ from typing import Any, NoReturn, TypeVar, cast, overload from urllib.parse import urlencode as urllib_urlencode import weakref +from awesomeversion import AwesomeVersion import jinja2 from jinja2 import pass_context, pass_environment from jinja2.sandbox import ImmutableSandboxedEnvironment @@ -1529,6 +1530,11 @@ def arc_tangent2(*args, default=_SENTINEL): return default +def version(value): + """Filter and function to get version object of the value.""" + return AwesomeVersion(value) + + def square_root(value, default=_SENTINEL): """Filter and function to get square root of the value.""" try: @@ -2001,6 +2007,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment): self.filters["slugify"] = slugify self.filters["iif"] = iif self.filters["bool"] = forgiving_boolean + self.filters["version"] = version self.globals["log"] = logarithm self.globals["sin"] = sine self.globals["cos"] = cosine @@ -2033,6 +2040,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment): self.globals["slugify"] = slugify self.globals["iif"] = iif self.globals["bool"] = forgiving_boolean + self.globals["version"] = version self.tests["is_number"] = is_number self.tests["match"] = regex_match self.tests["search"] = regex_search diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index 3186c10b20e..fa9ec4e76d6 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -1566,6 +1566,45 @@ def test_timedelta(mock_is_safe, hass): assert result == "15 days" +def test_version(hass): + """Test version filter and function.""" + filter_result = template.Template( + "{{ '2099.9.9' | version}}", + hass, + ).async_render() + function_result = template.Template( + "{{ version('2099.9.9')}}", + hass, + ).async_render() + assert filter_result == function_result == "2099.9.9" + + filter_result = template.Template( + "{{ '2099.9.9' | version < '2099.9.10' }}", + hass, + ).async_render() + function_result = template.Template( + "{{ version('2099.9.9') < '2099.9.10' }}", + hass, + ).async_render() + assert filter_result == function_result is True + + filter_result = template.Template( + "{{ '2099.9.9' | version == '2099.9.9' }}", + hass, + ).async_render() + function_result = template.Template( + "{{ version('2099.9.9') == '2099.9.9' }}", + hass, + ).async_render() + assert filter_result == function_result is True + + with pytest.raises(TemplateError): + template.Template( + "{{ version(None) < '2099.9.10' }}", + hass, + ).async_render() + + def test_regex_match(hass): """Test regex_match method.""" tpl = template.Template(