Fix string representation of template result wrappers (#42494)

This commit is contained in:
Paulus Schoutsen 2020-10-28 09:11:08 +01:00 committed by GitHub
parent ce51286c53
commit e21e28e49f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 12 deletions

View file

@ -39,7 +39,6 @@ import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import async_generate_entity_id
from homeassistant.helpers.reload import async_setup_reload_service
from homeassistant.helpers.script import Script
from homeassistant.helpers.template import ResultWrapper
from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS
from .template_entity import TemplateEntity
@ -259,9 +258,6 @@ class CoverTemplate(TemplateEntity, CoverEntity):
self._position = None
return
if isinstance(result, ResultWrapper):
state = result.render_result.lower()
else:
state = str(result).lower()
if state in _VALID_STATES:

View file

@ -34,7 +34,6 @@ import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import async_generate_entity_id
from homeassistant.helpers.reload import async_setup_reload_service
from homeassistant.helpers.script import Script
from homeassistant.helpers.template import ResultWrapper
from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS
from .template_entity import TemplateEntity
@ -368,9 +367,6 @@ class TemplateFan(TemplateEntity, FanEntity):
@callback
def _update_speed(self, speed):
# Validate speed
if isinstance(speed, ResultWrapper):
speed = speed.render_result
else:
speed = str(speed)
if speed in self._speed_list:

View file

@ -33,7 +33,6 @@ from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
from homeassistant.helpers.entity import async_generate_entity_id
from homeassistant.helpers.reload import async_setup_reload_service
from homeassistant.helpers.script import Script
from homeassistant.helpers.template import ResultWrapper
from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS
from .template_entity import TemplateEntity
@ -406,7 +405,7 @@ class LightTemplate(TemplateEntity, LightEntity):
def _update_state(self, result):
"""Update the state from the template."""
if isinstance(result, (TemplateError, ResultWrapper)):
if isinstance(result, TemplateError):
# This behavior is legacy
self._state = False
if not self._availability_template:

View file

@ -140,6 +140,16 @@ def gen_result_wrapper(kls):
super().__init__(*args)
self.render_result = render_result
def __str__(self) -> str:
if self.render_result is None:
# Can't get set repr to work
if kls is set:
return str(set(self))
return kls.__str__(self)
return self.render_result
return Wrapper
@ -160,6 +170,13 @@ class TupleWrapper(tuple, ResultWrapper):
"""Initialize a new tuple class."""
self.render_result = render_result
def __str__(self) -> str:
"""Return string representation."""
if self.render_result is None:
return super().__str__()
return self.render_result
RESULT_WRAPPERS: Dict[Type, Type] = {
kls: gen_result_wrapper(kls) for kls in (list, dict, set)

View file

@ -2698,6 +2698,12 @@ async def test_result_wrappers(hass):
assert result == native
assert result.render_result == text
schema(result) # should not raise
# Result with render text stringifies to original text
assert str(result) == text
# Result without render text stringifies same as original type
assert str(template.RESULT_WRAPPERS[orig_type](native)) == str(
orig_type(native)
)
async def test_parse_result(hass):