From 3dec394cad4024c17566b0e93fc557bf86c12d93 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 23 Mar 2021 20:35:15 -0700 Subject: [PATCH] Migrate template to register reload service on async_setup (#48273) --- homeassistant/components/template/__init__.py | 21 +- .../template/alarm_control_panel.py | 3 - .../components/template/binary_sensor.py | 4 +- homeassistant/components/template/const.py | 2 - homeassistant/components/template/cover.py | 4 +- homeassistant/components/template/fan.py | 4 +- homeassistant/components/template/light.py | 4 +- homeassistant/components/template/lock.py | 4 +- homeassistant/components/template/sensor.py | 4 +- homeassistant/components/template/switch.py | 4 +- homeassistant/components/template/vacuum.py | 4 +- homeassistant/components/template/weather.py | 3 - .../components/template/test_binary_sensor.py | 242 +++++++++--------- tests/components/template/test_init.py | 3 +- 14 files changed, 132 insertions(+), 174 deletions(-) diff --git a/homeassistant/components/template/__init__.py b/homeassistant/components/template/__init__.py index cc8862afcf4..6292cd40fec 100644 --- a/homeassistant/components/template/__init__.py +++ b/homeassistant/components/template/__init__.py @@ -1,20 +1,11 @@ """The template component.""" -from homeassistant.const import SERVICE_RELOAD -from homeassistant.helpers.reload import async_reload_integration_platforms +from homeassistant.helpers.reload import async_setup_reload_service -from .const import DOMAIN, EVENT_TEMPLATE_RELOADED, PLATFORMS +from .const import DOMAIN, PLATFORMS -async def async_setup_reload_service(hass): - """Create the reload service for the template domain.""" - if hass.services.has_service(DOMAIN, SERVICE_RELOAD): - return +async def async_setup(hass, config): + """Set up the template integration.""" + await async_setup_reload_service(hass, DOMAIN, PLATFORMS) - async def _reload_config(call): - """Reload the template platform config.""" - await async_reload_integration_platforms(hass, DOMAIN, PLATFORMS) - hass.bus.async_fire(EVENT_TEMPLATE_RELOADED, context=call.context) - - hass.helpers.service.async_register_admin_service( - DOMAIN, SERVICE_RELOAD, _reload_config - ) + return True diff --git a/homeassistant/components/template/alarm_control_panel.py b/homeassistant/components/template/alarm_control_panel.py index f56c5b27572..4c72c5094ef 100644 --- a/homeassistant/components/template/alarm_control_panel.py +++ b/homeassistant/components/template/alarm_control_panel.py @@ -32,10 +32,8 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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 .const import DOMAIN, PLATFORMS from .template_entity import TemplateEntity _LOGGER = logging.getLogger(__name__) @@ -113,7 +111,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Template Alarm Control Panels.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/binary_sensor.py b/homeassistant/components/template/binary_sensor.py index b810c7faee1..1088652cd0a 100644 --- a/homeassistant/components/template/binary_sensor.py +++ b/homeassistant/components/template/binary_sensor.py @@ -22,10 +22,9 @@ from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import async_generate_entity_id from homeassistant.helpers.event import async_call_later -from homeassistant.helpers.reload import async_setup_reload_service from homeassistant.helpers.template import result_as_boolean -from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity CONF_DELAY_ON = "delay_on" @@ -97,7 +96,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template binary sensors.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/const.py b/homeassistant/components/template/const.py index 5b38f19eaeb..5d6bf6391df 100644 --- a/homeassistant/components/template/const.py +++ b/homeassistant/components/template/const.py @@ -6,8 +6,6 @@ DOMAIN = "template" PLATFORM_STORAGE_KEY = "template_platforms" -EVENT_TEMPLATE_RELOADED = "event_template_reloaded" - PLATFORMS = [ "alarm_control_panel", "binary_sensor", diff --git a/homeassistant/components/template/cover.py b/homeassistant/components/template/cover.py index 278cd1c80bb..cd552a33e5d 100644 --- a/homeassistant/components/template/cover.py +++ b/homeassistant/components/template/cover.py @@ -38,10 +38,9 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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 .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity _LOGGER = logging.getLogger(__name__) @@ -160,7 +159,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Template cover.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/fan.py b/homeassistant/components/template/fan.py index 51dce0f8d56..87b063583bf 100644 --- a/homeassistant/components/template/fan.py +++ b/homeassistant/components/template/fan.py @@ -36,10 +36,9 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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 .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity _LOGGER = logging.getLogger(__name__) @@ -163,7 +162,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template fans.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/light.py b/homeassistant/components/template/light.py index 0edaacbb5ca..e76ba42289b 100644 --- a/homeassistant/components/template/light.py +++ b/homeassistant/components/template/light.py @@ -31,10 +31,9 @@ from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv 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 .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity _LOGGER = logging.getLogger(__name__) @@ -137,7 +136,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template lights.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/lock.py b/homeassistant/components/template/lock.py index 692f06e28fe..c4a3977a4db 100644 --- a/homeassistant/components/template/lock.py +++ b/homeassistant/components/template/lock.py @@ -13,10 +13,9 @@ from homeassistant.const import ( from homeassistant.core import callback from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.reload import async_setup_reload_service from homeassistant.helpers.script import Script -from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity CONF_LOCK = "lock" @@ -60,7 +59,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template lock.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/sensor.py b/homeassistant/components/template/sensor.py index b587fe3bd82..9a63302044a 100644 --- a/homeassistant/components/template/sensor.py +++ b/homeassistant/components/template/sensor.py @@ -25,9 +25,8 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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 .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity CONF_ATTRIBUTE_TEMPLATES = "attribute_templates" @@ -96,7 +95,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template sensors.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/switch.py b/homeassistant/components/template/switch.py index 412c4507d1f..0e083df13f4 100644 --- a/homeassistant/components/template/switch.py +++ b/homeassistant/components/template/switch.py @@ -22,11 +22,10 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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.restore_state import RestoreEntity from homeassistant.helpers.script import Script -from .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity _VALID_STATES = [STATE_ON, STATE_OFF, "true", "false"] @@ -90,7 +89,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template switches.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/vacuum.py b/homeassistant/components/template/vacuum.py index 171aeb7af92..ed7919d174e 100644 --- a/homeassistant/components/template/vacuum.py +++ b/homeassistant/components/template/vacuum.py @@ -41,10 +41,9 @@ from homeassistant.core import callback from homeassistant.exceptions import TemplateError 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 .const import CONF_AVAILABILITY_TEMPLATE, DOMAIN, PLATFORMS +from .const import CONF_AVAILABILITY_TEMPLATE from .template_entity import TemplateEntity _LOGGER = logging.getLogger(__name__) @@ -147,7 +146,6 @@ async def _async_create_entities(hass, config): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the template vacuums.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) async_add_entities(await _async_create_entities(hass, config)) diff --git a/homeassistant/components/template/weather.py b/homeassistant/components/template/weather.py index 0db94520afe..27980febb56 100644 --- a/homeassistant/components/template/weather.py +++ b/homeassistant/components/template/weather.py @@ -24,9 +24,7 @@ from homeassistant.const import CONF_NAME, CONF_UNIQUE_ID import homeassistant.helpers.config_validation as cv 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 .const import DOMAIN, PLATFORMS from .template_entity import TemplateEntity CONDITION_CLASSES = { @@ -71,7 +69,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Template weather.""" - await async_setup_reload_service(hass, DOMAIN, PLATFORMS) name = config[CONF_NAME] condition_template = config[CONF_CONDITION_TEMPLATE] diff --git a/tests/components/template/test_binary_sensor.py b/tests/components/template/test_binary_sensor.py index 241ac88328e..76602b39433 100644 --- a/tests/components/template/test_binary_sensor.py +++ b/tests/components/template/test_binary_sensor.py @@ -15,7 +15,7 @@ from homeassistant.const import ( from homeassistant.core import CoreState import homeassistant.util.dt as dt_util -from tests.common import assert_setup_component, async_fire_time_changed +from tests.common import async_fire_time_changed async def test_setup(hass): @@ -32,85 +32,79 @@ async def test_setup(hass): }, } } - with assert_setup_component(1): - assert await setup.async_setup_component(hass, binary_sensor.DOMAIN, config) + assert await setup.async_setup_component(hass, binary_sensor.DOMAIN, config) async def test_setup_no_sensors(hass): """Test setup with no sensors.""" - with assert_setup_component(0): - assert await setup.async_setup_component( - hass, binary_sensor.DOMAIN, {"binary_sensor": {"platform": "template"}} - ) + assert await setup.async_setup_component( + hass, binary_sensor.DOMAIN, {"binary_sensor": {"platform": "template"}} + ) async def test_setup_invalid_device(hass): """Test the setup with invalid devices.""" - with assert_setup_component(0): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - {"binary_sensor": {"platform": "template", "sensors": {"foo bar": {}}}}, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + {"binary_sensor": {"platform": "template", "sensors": {"foo bar": {}}}}, + ) async def test_setup_invalid_device_class(hass): """Test setup with invalid sensor class.""" - with assert_setup_component(0): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": { - "test": { - "value_template": "{{ foo }}", - "device_class": "foobarnotreal", - } - }, - } - }, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": { + "test": { + "value_template": "{{ foo }}", + "device_class": "foobarnotreal", + } + }, + } + }, + ) async def test_setup_invalid_missing_template(hass): """Test setup with invalid and missing template.""" - with assert_setup_component(0): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": {"test": {"device_class": "motion"}}, - } - }, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": {"test": {"device_class": "motion"}}, + } + }, + ) async def test_icon_template(hass): """Test icon template.""" - with assert_setup_component(1): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": { - "test_template_sensor": { - "value_template": "{{ states.sensor.xyz.state }}", - "icon_template": "{% if " - "states.binary_sensor.test_state.state == " - "'Works' %}" - "mdi:check" - "{% endif %}", - } - }, - } - }, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": { + "test_template_sensor": { + "value_template": "{{ states.sensor.xyz.state }}", + "icon_template": "{% if " + "states.binary_sensor.test_state.state == " + "'Works' %}" + "mdi:check" + "{% endif %}", + } + }, + } + }, + ) await hass.async_block_till_done() await hass.async_start() @@ -127,26 +121,25 @@ async def test_icon_template(hass): async def test_entity_picture_template(hass): """Test entity_picture template.""" - with assert_setup_component(1): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": { - "test_template_sensor": { - "value_template": "{{ states.sensor.xyz.state }}", - "entity_picture_template": "{% if " - "states.binary_sensor.test_state.state == " - "'Works' %}" - "/local/sensor.png" - "{% endif %}", - } - }, - } - }, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": { + "test_template_sensor": { + "value_template": "{{ states.sensor.xyz.state }}", + "entity_picture_template": "{% if " + "states.binary_sensor.test_state.state == " + "'Works' %}" + "/local/sensor.png" + "{% endif %}", + } + }, + } + }, + ) await hass.async_block_till_done() await hass.async_start() @@ -163,24 +156,23 @@ async def test_entity_picture_template(hass): async def test_attribute_templates(hass): """Test attribute_templates template.""" - with assert_setup_component(1): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": { - "test_template_sensor": { - "value_template": "{{ states.sensor.xyz.state }}", - "attribute_templates": { - "test_attribute": "It {{ states.sensor.test_state.state }}." - }, - } - }, - } - }, - ) + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": { + "test_template_sensor": { + "value_template": "{{ states.sensor.xyz.state }}", + "attribute_templates": { + "test_attribute": "It {{ states.sensor.test_state.state }}." + }, + } + }, + } + }, + ) await hass.async_block_till_done() await hass.async_start() @@ -202,35 +194,34 @@ async def test_match_all(hass): "homeassistant.components.template.binary_sensor." "BinarySensorTemplate._update_state" ) as _update_state: - with assert_setup_component(1): - assert await setup.async_setup_component( - hass, - binary_sensor.DOMAIN, - { - "binary_sensor": { - "platform": "template", - "sensors": { - "match_all_template_sensor": { - "value_template": ( - "{% for state in states %}" - "{% if state.entity_id == 'sensor.humidity' %}" - "{{ state.entity_id }}={{ state.state }}" - "{% endif %}" - "{% endfor %}" - ), - }, + assert await setup.async_setup_component( + hass, + binary_sensor.DOMAIN, + { + "binary_sensor": { + "platform": "template", + "sensors": { + "match_all_template_sensor": { + "value_template": ( + "{% for state in states %}" + "{% if state.entity_id == 'sensor.humidity' %}" + "{{ state.entity_id }}={{ state.state }}" + "{% endif %}" + "{% endfor %}" + ), }, - } - }, - ) + }, + } + }, + ) - await hass.async_start() - await hass.async_block_till_done() - init_calls = len(_update_state.mock_calls) + await hass.async_start() + await hass.async_block_till_done() + init_calls = len(_update_state.mock_calls) - hass.states.async_set("sensor.any_state", "update") - await hass.async_block_till_done() - assert len(_update_state.mock_calls) == init_calls + hass.states.async_set("sensor.any_state", "update") + await hass.async_block_till_done() + assert len(_update_state.mock_calls) == init_calls async def test_event(hass): @@ -247,8 +238,7 @@ async def test_event(hass): }, } } - with assert_setup_component(1): - assert await setup.async_setup_component(hass, binary_sensor.DOMAIN, config) + assert await setup.async_setup_component(hass, binary_sensor.DOMAIN, config) await hass.async_block_till_done() await hass.async_start() diff --git a/tests/components/template/test_init.py b/tests/components/template/test_init.py index 1c932c5af30..107c54c710e 100644 --- a/tests/components/template/test_init.py +++ b/tests/components/template/test_init.py @@ -4,7 +4,8 @@ from os import path from unittest.mock import patch from homeassistant import config -from homeassistant.components.template import DOMAIN, SERVICE_RELOAD +from homeassistant.components.template import DOMAIN +from homeassistant.helpers.reload import SERVICE_RELOAD from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util