From 956f6056f9a22ea900f8e4e5f4d84756634842b4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 12 Mar 2016 23:53:58 -0800 Subject: [PATCH] Remove support for old deprecated automation config --- .../components/automation/__init__.py | 68 +----- tests/components/automation/test_event.py | 44 ---- tests/components/automation/test_init.py | 65 ------ tests/components/automation/test_mqtt.py | 44 ---- tests/components/automation/test_state.py | 137 ------------ tests/components/automation/test_time.py | 203 ------------------ 6 files changed, 11 insertions(+), 550 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 31cac543b6c..7a3f635bc49 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -9,8 +9,9 @@ import logging from homeassistant.bootstrap import prepare_setup_platform from homeassistant.const import CONF_PLATFORM from homeassistant.components import logbook -from homeassistant.helpers.service import call_from_config -from homeassistant.helpers.service import validate_service_call +from homeassistant.helpers import extract_domain_configs +from homeassistant.helpers.service import (call_from_config, + validate_service_call) DOMAIN = 'automation' @@ -35,30 +36,17 @@ _LOGGER = logging.getLogger(__name__) def setup(hass, config): """Setup the automation.""" - config_key = DOMAIN - found = 1 + for config_key in extract_domain_configs(config, DOMAIN): + conf = config[config_key] - while config_key in config: - # Check for one block syntax - if isinstance(config[config_key], dict): - config_block = _migrate_old_config(config[config_key]) - name = config_block.get(CONF_ALIAS, config_key) + if not isinstance(conf, list): + conf = [conf] + + for list_no, config_block in enumerate(conf): + name = config_block.get(CONF_ALIAS, "{}, {}".format(config_key, + list_no)) _setup_automation(hass, config_block, name, config) - # Check for multiple block syntax - elif isinstance(config[config_key], list): - for list_no, config_block in enumerate(config[config_key]): - name = config_block.get(CONF_ALIAS, - "{}, {}".format(config_key, list_no)) - _setup_automation(hass, config_block, name, config) - - # Any scalar value is incorrect - else: - _LOGGER.error('Error in config in section %s.', config_key) - - found += 1 - config_key = "{} {}".format(DOMAIN, found) - return True @@ -97,40 +85,6 @@ def _get_action(hass, config, name): return action -def _migrate_old_config(config): - """Migrate old configuration to new.""" - if CONF_PLATFORM not in config: - return config - - _LOGGER.warning( - 'You are using an old configuration format. Please upgrade: ' - 'https://home-assistant.io/components/automation/') - - new_conf = { - CONF_TRIGGER: dict(config), - CONF_CONDITION: config.get('if', []), - CONF_ACTION: dict(config), - } - - for cat, key, new_key in (('trigger', 'mqtt_topic', 'topic'), - ('trigger', 'mqtt_payload', 'payload'), - ('trigger', 'state_entity_id', 'entity_id'), - ('trigger', 'state_before', 'before'), - ('trigger', 'state_after', 'after'), - ('trigger', 'state_to', 'to'), - ('trigger', 'state_from', 'from'), - ('trigger', 'state_hours', 'hours'), - ('trigger', 'state_minutes', 'minutes'), - ('trigger', 'state_seconds', 'seconds'), - ('action', 'execute_service', 'service'), - ('action', 'service_entity_id', 'entity_id'), - ('action', 'service_data', 'data')): - if key in new_conf[cat]: - new_conf[cat][new_key] = new_conf[cat].pop(key) - - return new_conf - - def _process_if(hass, config, p_config, action): """Process if checks.""" cond_type = p_config.get(CONF_CONDITION_TYPE, diff --git a/tests/components/automation/test_event.py b/tests/components/automation/test_event.py index e67402820a6..7d8c6a64ab1 100644 --- a/tests/components/automation/test_event.py +++ b/tests/components/automation/test_event.py @@ -24,50 +24,6 @@ class TestAutomationEvent(unittest.TestCase): """"Stop everything that was started.""" self.hass.stop() - def test_old_config_if_fires_on_event(self): - """.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation' - } - })) - - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_on_event_with_data(self): - """Test old configuration .""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'event_data': {'some_attr': 'some_value'}, - 'execute_service': 'test.automation' - } - })) - - self.hass.bus.fire('test_event', {'some_attr': 'some_value'}) - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_not_fires_if_event_data_not_matches(self): - """test old configuration.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'event_data': {'some_attr': 'some_value'}, - 'execute_service': 'test.automation' - } - })) - - self.hass.bus.fire('test_event', {'some_attr': 'some_other_value'}) - self.hass.pool.block_till_done() - self.assertEqual(0, len(self.calls)) - def test_if_fires_on_event(self): """Test the firing of events.""" self.assertTrue(automation.setup(self.hass, { diff --git a/tests/components/automation/test_init.py b/tests/components/automation/test_init.py index 14cbf025a56..cb996d5a227 100644 --- a/tests/components/automation/test_init.py +++ b/tests/components/automation/test_init.py @@ -24,71 +24,6 @@ class TestAutomation(unittest.TestCase): """Stop everything that was started.""" self.hass.stop() - def test_old_config_service_data_not_a_dict(self): - """Test old configuration service data.""" - automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation', - 'service_data': 100 - } - }) - - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_service_specify_data(self): - """Test old configuration service data.""" - automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation', - 'service_data': {'some': 'data'} - } - }) - - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - self.assertEqual('data', self.calls[0].data['some']) - - def test_old_config_service_specify_entity_id(self): - """Test old configuration service data.""" - automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation', - 'service_entity_id': 'hello.world' - } - }) - - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - self.assertEqual(['hello.world'], - self.calls[0].data.get(ATTR_ENTITY_ID)) - - def test_old_config_service_specify_entity_id_list(self): - """Test old configuration service data.""" - automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation', - 'service_entity_id': ['hello.world', 'hello.world2'] - } - }) - - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - self.assertEqual(['hello.world', 'hello.world2'], - self.calls[0].data.get(ATTR_ENTITY_ID)) - def test_service_data_not_a_dict(self): """Test service data not dict.""" automation.setup(self.hass, { diff --git a/tests/components/automation/test_mqtt.py b/tests/components/automation/test_mqtt.py index bb90d66a61f..482becab937 100644 --- a/tests/components/automation/test_mqtt.py +++ b/tests/components/automation/test_mqtt.py @@ -24,50 +24,6 @@ class TestAutomationMQTT(unittest.TestCase): """Stop everything that was started.""" self.hass.stop() - def test_old_config_if_fires_on_topic_match(self): - """Test if message is fired on topic match.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'mqtt', - 'mqtt_topic': 'test-topic', - 'execute_service': 'test.automation' - } - })) - - fire_mqtt_message(self.hass, 'test-topic', '') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_on_topic_and_payload_match(self): - """Test if message is fired on topic and payload match.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'mqtt', - 'mqtt_topic': 'test-topic', - 'mqtt_payload': 'hello', - 'execute_service': 'test.automation' - } - })) - - fire_mqtt_message(self.hass, 'test-topic', 'hello') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_not_fires_on_topic_but_no_payload_match(self): - """Test if message is not fired on topic but no payload.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'mqtt', - 'mqtt_topic': 'test-topic', - 'mqtt_payload': 'hello', - 'execute_service': 'test.automation' - } - })) - - fire_mqtt_message(self.hass, 'test-topic', 'no-hello') - self.hass.pool.block_till_done() - self.assertEqual(0, len(self.calls)) - def test_if_fires_on_topic_match(self): """Test if message is fired on topic match.""" self.assertTrue(automation.setup(self.hass, { diff --git a/tests/components/automation/test_state.py b/tests/components/automation/test_state.py index 17b5f52ebfa..3ccfcaeaeef 100644 --- a/tests/components/automation/test_state.py +++ b/tests/components/automation/test_state.py @@ -28,143 +28,6 @@ class TestAutomationState(unittest.TestCase): """Stop everything that was started.""" self.hass.stop() - def test_old_config_if_fires_on_entity_change(self): - """Test for firing if entity change .""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_on_entity_change_with_from_filter(self): - """Test for firing on entity change with filter.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'state_from': 'hello', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_on_entity_change_with_to_filter(self): - """Test for firing on entity change no filter.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'state_to': 'world', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_on_entity_change_with_both_filters(self): - """Test for firing on entity change with both filters.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'state_from': 'hello', - 'state_to': 'world', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_not_fires_if_to_filter_not_match(self): - """Test for not firing if no match.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'state_from': 'hello', - 'state_to': 'world', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'moon') - self.hass.pool.block_till_done() - self.assertEqual(0, len(self.calls)) - - def test_old_config_if_not_fires_if_from_filter_not_match(self): - """Test for no firing if no match.""" - self.hass.states.set('test.entity', 'bye') - - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.entity', - 'state_from': 'hello', - 'state_to': 'world', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(0, len(self.calls)) - - def test_old_config_if_not_fires_if_entity_not_match(self): - """Test for not firing if no match.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'state', - 'state_entity_id': 'test.another_entity', - 'execute_service': 'test.automation' - } - })) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(0, len(self.calls)) - - def test_old_config_if_action(self): - """Test for if action.""" - entity_id = 'domain.test_entity' - test_state = 'new_state' - automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'event', - 'event_type': 'test_event', - 'execute_service': 'test.automation', - 'if': [{ - 'platform': 'state', - 'entity_id': entity_id, - 'state': test_state, - }] - } - }) - - self.hass.states.set(entity_id, test_state) - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - self.hass.states.set(entity_id, test_state + 'something') - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - def test_if_fires_on_entity_change(self): """Test for firing on entity change.""" self.assertTrue(automation.setup(self.hass, { diff --git a/tests/components/automation/test_time.py b/tests/components/automation/test_time.py index 824d611f4fb..ee5ed04340a 100644 --- a/tests/components/automation/test_time.py +++ b/tests/components/automation/test_time.py @@ -5,8 +5,6 @@ from unittest.mock import patch import homeassistant.util.dt as dt_util import homeassistant.components.automation as automation -from homeassistant.components.automation import time, event -from homeassistant.const import CONF_PLATFORM from tests.common import fire_time_changed, get_test_home_assistant @@ -28,207 +26,6 @@ class TestAutomationTime(unittest.TestCase): """Stop everything that was started.""" self.hass.stop() - def test_old_config_if_fires_when_hour_matches(self): - """Test for firing if hours are matching.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'time', - time.CONF_HOURS: 0, - 'execute_service': 'test.automation' - } - })) - - fire_time_changed(self.hass, dt_util.utcnow().replace(hour=0)) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_when_minute_matches(self): - """Test for firing if minutes are matching.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'time', - time.CONF_MINUTES: 0, - 'execute_service': 'test.automation' - } - })) - - fire_time_changed(self.hass, dt_util.utcnow().replace(minute=0)) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_when_second_matches(self): - """Test for firing if seconds are matching.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - 'platform': 'time', - time.CONF_SECONDS: 0, - 'execute_service': 'test.automation' - } - })) - - fire_time_changed(self.hass, dt_util.utcnow().replace(second=0)) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_fires_when_all_matches(self): - """Test for firing if everything matches.""" - self.assertTrue(automation.setup(self.hass, { - automation.DOMAIN: { - CONF_PLATFORM: 'time', - time.CONF_HOURS: 0, - time.CONF_MINUTES: 0, - time.CONF_SECONDS: 0, - 'execute_service': 'test.automation' - } - })) - - fire_time_changed(self.hass, dt_util.utcnow().replace( - hour=0, minute=0, second=0)) - - self.hass.states.set('test.entity', 'world') - self.hass.pool.block_till_done() - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_action_before(self): - """Test for action before.""" - automation.setup(self.hass, { - automation.DOMAIN: { - CONF_PLATFORM: 'event', - event.CONF_EVENT_TYPE: 'test_event', - 'execute_service': 'test.automation', - 'if': { - CONF_PLATFORM: 'time', - time.CONF_BEFORE: '10:00' - } - } - }) - - before_10 = dt_util.now().replace(hour=8) - after_10 = dt_util.now().replace(hour=14) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=before_10): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=after_10): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_action_after(self): - """Test for action after.""" - automation.setup(self.hass, { - automation.DOMAIN: { - CONF_PLATFORM: 'event', - event.CONF_EVENT_TYPE: 'test_event', - 'execute_service': 'test.automation', - 'if': { - CONF_PLATFORM: 'time', - time.CONF_AFTER: '10:00' - } - } - }) - - before_10 = dt_util.now().replace(hour=8) - after_10 = dt_util.now().replace(hour=14) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=before_10): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(0, len(self.calls)) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=after_10): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_action_one_weekday(self): - """Test for action with one weekday.""" - automation.setup(self.hass, { - automation.DOMAIN: { - CONF_PLATFORM: 'event', - event.CONF_EVENT_TYPE: 'test_event', - 'execute_service': 'test.automation', - 'if': { - CONF_PLATFORM: 'time', - time.CONF_WEEKDAY: 'mon', - } - } - }) - - days_past_monday = dt_util.now().weekday() - monday = dt_util.now() - timedelta(days=days_past_monday) - tuesday = monday + timedelta(days=1) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=monday): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=tuesday): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - def test_old_config_if_action_list_weekday(self): - """Test for action with a list of weekdays.""" - automation.setup(self.hass, { - automation.DOMAIN: { - CONF_PLATFORM: 'event', - event.CONF_EVENT_TYPE: 'test_event', - 'execute_service': 'test.automation', - 'if': { - CONF_PLATFORM: 'time', - time.CONF_WEEKDAY: ['mon', 'tue'], - } - } - }) - - days_past_monday = dt_util.now().weekday() - monday = dt_util.now() - timedelta(days=days_past_monday) - tuesday = monday + timedelta(days=1) - wednesday = tuesday + timedelta(days=1) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=monday): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(1, len(self.calls)) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=tuesday): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(2, len(self.calls)) - - with patch('homeassistant.components.automation.time.dt_util.now', - return_value=wednesday): - self.hass.bus.fire('test_event') - self.hass.pool.block_till_done() - - self.assertEqual(2, len(self.calls)) - def test_if_fires_when_hour_matches(self): """Test for firing if hour is matching.""" self.assertTrue(automation.setup(self.hass, {