mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
Deprecate relative_time() in favor of time_since() and time_until() (#111177)
* add time_since/time_until. add deprecation of relative_time * fix merge conflicts * Apply suggestions from code review * Update homeassistant/helpers/template.py * Update homeassistant/helpers/template.py * Update homeassistant/helpers/template.py --------- Co-authored-by: Erik Montnemery <erik@montnemery.com>
This commit is contained in:
@@ -31,7 +31,7 @@ from homeassistant.const import (
|
||||
UnitOfTemperature,
|
||||
UnitOfVolume,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.core import DOMAIN as HA_DOMAIN, HomeAssistant
|
||||
from homeassistant.exceptions import TemplateError
|
||||
from homeassistant.helpers import (
|
||||
area_registry as ar,
|
||||
@@ -2240,6 +2240,7 @@ def test_relative_time(mock_is_safe, hass: HomeAssistant) -> None:
|
||||
"""Test relative_time method."""
|
||||
hass.config.set_time_zone("UTC")
|
||||
now = datetime.strptime("2000-01-01 10:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
issue_registry = ir.async_get(hass)
|
||||
relative_time_template = (
|
||||
'{{relative_time(strptime("2000-01-01 09:00:00", "%Y-%m-%d %H:%M:%S"))}}'
|
||||
)
|
||||
@@ -2249,7 +2250,9 @@ def test_relative_time(mock_is_safe, hass: HomeAssistant) -> None:
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour"
|
||||
|
||||
assert issue_registry.async_get_issue(
|
||||
HA_DOMAIN, "template_function_relative_time_deprecated"
|
||||
)
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
@@ -2308,6 +2311,333 @@ def test_relative_time(mock_is_safe, hass: HomeAssistant) -> None:
|
||||
assert info.has_time is True
|
||||
|
||||
|
||||
@patch(
|
||||
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
||||
return_value=True,
|
||||
)
|
||||
def test_time_since(mock_is_safe, hass: HomeAssistant) -> None:
|
||||
"""Test time_since method."""
|
||||
hass.config.set_time_zone("UTC")
|
||||
now = datetime.strptime("2000-01-01 10:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
time_since_template = (
|
||||
'{{time_since(strptime("2000-01-01 09:00:00", "%Y-%m-%d %H:%M:%S"))}}'
|
||||
)
|
||||
with freeze_time(now):
|
||||
result = template.Template(
|
||||
time_since_template,
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 09:00:00 +01:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"'
|
||||
" )"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "2 hours"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 03:00:00 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"'
|
||||
" )"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour"
|
||||
|
||||
result1 = str(
|
||||
template.strptime("2000-01-01 11:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
)
|
||||
result2 = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 11:00:00 +00:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 2"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result1 == result2
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 09:05:00 +01:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision=2"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour 55 minutes"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 02:05:27 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 3"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour 54 minutes 33 seconds"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 02:05:27 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z")'
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "2 hours"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "1999-02-01 02:05:27 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 0"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "11 months 4 days 1 hour 54 minutes 33 seconds"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "1999-02-01 02:05:27 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z")'
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "11 months"
|
||||
result1 = str(
|
||||
template.strptime("2000-01-01 11:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
)
|
||||
result2 = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_since("
|
||||
" strptime("
|
||||
' "2000-01-01 11:00:00 +00:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision=3"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result1 == result2
|
||||
|
||||
result = template.Template(
|
||||
'{{time_since("string")}}',
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "string"
|
||||
|
||||
info = template.Template(time_since_template, hass).async_render_to_info()
|
||||
assert info.has_time is True
|
||||
|
||||
|
||||
@patch(
|
||||
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
||||
return_value=True,
|
||||
)
|
||||
def test_time_until(mock_is_safe, hass: HomeAssistant) -> None:
|
||||
"""Test time_until method."""
|
||||
hass.config.set_time_zone("UTC")
|
||||
now = datetime.strptime("2000-01-01 10:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
time_until_template = (
|
||||
'{{time_until(strptime("2000-01-01 11:00:00", "%Y-%m-%d %H:%M:%S"))}}'
|
||||
)
|
||||
with freeze_time(now):
|
||||
result = template.Template(
|
||||
time_until_template,
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 13:00:00 +01:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"'
|
||||
" )"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "2 hours"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 05:00:00 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"'
|
||||
" )"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour"
|
||||
|
||||
result1 = str(
|
||||
template.strptime("2000-01-01 09:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
)
|
||||
result2 = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 09:00:00 +00:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 2"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result1 == result2
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 12:05:00 +01:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision=2"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour 5 minutes"
|
||||
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 05:54:33 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 3"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 hour 54 minutes 33 seconds"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 05:54:33 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z")'
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "2 hours"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2001-02-01 05:54:33 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 0"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 year 1 month 2 days 1 hour 54 minutes 33 seconds"
|
||||
result = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2001-02-01 05:54:33 -06:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision = 4"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "1 year 1 month 2 days 2 hours"
|
||||
result1 = str(
|
||||
template.strptime("2000-01-01 09:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||
)
|
||||
result2 = template.Template(
|
||||
(
|
||||
"{{"
|
||||
" time_until("
|
||||
" strptime("
|
||||
' "2000-01-01 09:00:00 +00:00",'
|
||||
' "%Y-%m-%d %H:%M:%S %z"),'
|
||||
" precision=3"
|
||||
" )"
|
||||
"}}"
|
||||
),
|
||||
hass,
|
||||
).async_render()
|
||||
assert result1 == result2
|
||||
|
||||
result = template.Template(
|
||||
'{{time_until("string")}}',
|
||||
hass,
|
||||
).async_render()
|
||||
assert result == "string"
|
||||
|
||||
info = template.Template(time_until_template, hass).async_render_to_info()
|
||||
assert info.has_time is True
|
||||
|
||||
|
||||
@patch(
|
||||
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
||||
return_value=True,
|
||||
|
||||
Reference in New Issue
Block a user