From e4c5108c9deb8ecdf296f7c8da5f9dc26789d930 Mon Sep 17 00:00:00 2001 From: Stefan Jonasson Date: Fri, 18 Sep 2015 18:12:27 +0200 Subject: [PATCH 1/4] Implemented configuration loading from --- .../components/automation/__init__.py | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 45859617624..6243a2f50af 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -40,27 +40,47 @@ def setup(hass, config): found = 1 while config_key in config: - p_config = _migrate_old_config(config[config_key]) + # 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) + _setup_automation(hass, config_block, name, config) + + # check for multiple block syntax + elif isinstance(config[config_key], list): + list_no = 0 + for config_block in config[config_key]: + name = config_block.get(CONF_ALIAS, "{}, {}".format(config_key, list_no)) + list_no += 1 + config_block = _migrate_old_config(config_block) + _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) - name = p_config.get(CONF_ALIAS, config_key) - action = _get_action(hass, p_config.get(CONF_ACTION, {}), name) - - if action is None: - continue - - if CONF_CONDITION in p_config or CONF_CONDITION_TYPE in p_config: - action = _process_if(hass, config, p_config, action) - - if action is None: - continue - - _process_trigger(hass, config, p_config.get(CONF_TRIGGER, []), name, - action) - return True +def _setup_automation(hass, config_block, name, config): + """ Setup one instance of automation """ + + action = _get_action(hass, config_block.get(CONF_ACTION, {}), name) + + if action is None: + return False + + if CONF_CONDITION in p_config or CONF_CONDITION_TYPE in p_config: + action = _process_if(hass, config, config_block, action) + + if action is None: + return False + + _process_trigger(hass, config, config_block.get(CONF_TRIGGER, []), name, + action) + return True def _get_action(hass, config, name): """ Return an action based on a config. """ From b9e1b3eb9967ce9e61e31b89e61a7fb4c45f7539 Mon Sep 17 00:00:00 2001 From: Stefan Jonasson Date: Sat, 19 Sep 2015 15:51:50 +0200 Subject: [PATCH 2/4] Fixed var name + flake8 --- homeassistant/components/automation/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 6243a2f50af..e22b02119d8 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -50,7 +50,8 @@ def setup(hass, config): elif isinstance(config[config_key], list): list_no = 0 for config_block in config[config_key]: - name = config_block.get(CONF_ALIAS, "{}, {}".format(config_key, list_no)) + name = config_block.get(CONF_ALIAS, + "{}, {}".format(config_key, list_no)) list_no += 1 config_block = _migrate_old_config(config_block) _setup_automation(hass, config_block, name, config) @@ -64,6 +65,7 @@ def setup(hass, config): return True + def _setup_automation(hass, config_block, name, config): """ Setup one instance of automation """ @@ -72,7 +74,7 @@ def _setup_automation(hass, config_block, name, config): if action is None: return False - if CONF_CONDITION in p_config or CONF_CONDITION_TYPE in p_config: + if CONF_CONDITION in config_block or CONF_CONDITION_TYPE in config_block: action = _process_if(hass, config, config_block, action) if action is None: @@ -82,6 +84,7 @@ def _setup_automation(hass, config_block, name, config): action) return True + def _get_action(hass, config, name): """ Return an action based on a config. """ From 2084976bc25f428e57f417e524d6fdf3bbde1d5f Mon Sep 17 00:00:00 2001 From: Stefan Jonasson Date: Sat, 19 Sep 2015 17:42:21 +0200 Subject: [PATCH 3/4] Fixed suggestions from @balloob --- homeassistant/components/automation/__init__.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index e22b02119d8..4384b6a1848 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -42,17 +42,14 @@ def setup(hass, config): 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) - _setup_automation(hass, config_block, name, config) + name = config[config_key].get(CONF_ALIAS, config_key) + _setup_automation(hass, config[config_key], name, config) # check for multiple block syntax elif isinstance(config[config_key], list): - list_no = 0 - for config_block in config[config_key]: + for list_no, config_block in enumerate(config[config_key]): name = config_block.get(CONF_ALIAS, "{}, {}".format(config_key, list_no)) - list_no += 1 config_block = _migrate_old_config(config_block) _setup_automation(hass, config_block, name, config) From 40651ef2bc5948f3702a7dbee3e597b96dadc5e8 Mon Sep 17 00:00:00 2001 From: Stefan Jonasson Date: Sat, 19 Sep 2015 21:13:09 +0200 Subject: [PATCH 4/4] Fixed old config value conversion Added a new unit test for the config list mode --- .../components/automation/__init__.py | 6 +-- tests/components/automation/test_init.py | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 4384b6a1848..5e35188a33c 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -42,15 +42,15 @@ def setup(hass, config): while config_key in config: # check for one block syntax if isinstance(config[config_key], dict): - name = config[config_key].get(CONF_ALIAS, config_key) - _setup_automation(hass, config[config_key], name, config) + config_block = _migrate_old_config(config[config_key]) + name = config_block.get(CONF_ALIAS, config_key) + _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)) - config_block = _migrate_old_config(config_block) _setup_automation(hass, config_block, name, config) # any scalar value is incorrect diff --git a/tests/components/automation/test_init.py b/tests/components/automation/test_init.py index 6a011a072a5..1df59840aea 100644 --- a/tests/components/automation/test_init.py +++ b/tests/components/automation/test_init.py @@ -322,3 +322,41 @@ class TestAutomationEvent(unittest.TestCase): self.hass.bus.fire('test_event') self.hass.pool.block_till_done() self.assertEqual(1, len(self.calls)) + + def test_automation_list_setting(self): + """ Event is not a valid condition. Will it still work? """ + automation.setup(self.hass, { + automation.DOMAIN: [ + { + 'trigger': [ + { + 'platform': 'event', + 'event_type': 'test_event', + }, + + ], + 'action': { + 'execute_service': 'test.automation', + } + }, + { + 'trigger': [ + { + 'platform': 'event', + 'event_type': 'test_event_2', + }, + ], + 'action': { + 'execute_service': 'test.automation', + } + } + ] + }) + + self.hass.bus.fire('test_event') + self.hass.pool.block_till_done() + self.assertEqual(1, len(self.calls)) + + self.hass.bus.fire('test_event_2') + self.hass.pool.block_till_done() + self.assertEqual(2, len(self.calls))