From 627bd827665ae7a28c6772ee2990f3a58972d189 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 17 Oct 2022 11:42:17 +0200 Subject: [PATCH] Simplify parsing of script and automation config (#80465) --- .../components/automation/__init__.py | 64 +++++++++---------- homeassistant/components/script/__init__.py | 55 ++++++++-------- 2 files changed, 57 insertions(+), 62 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index fed941dea1a..234fcc97839 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -53,7 +53,7 @@ from homeassistant.exceptions import ( ServiceNotFound, TemplateError, ) -from homeassistant.helpers import condition, extract_domain_configs +from homeassistant.helpers import condition import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import ToggleEntity from homeassistant.helpers.entity_component import EntityComponent @@ -670,7 +670,6 @@ class AutomationEntityConfig: """Container for prepared automation entity configuration.""" config_block: ConfigType - config_key: str list_no: int raw_blueprint_inputs: ConfigType | None raw_config: ConfigType | None @@ -683,38 +682,37 @@ async def _prepare_automation_config( """Parse configuration and prepare automation entity configuration.""" automation_configs: list[AutomationEntityConfig] = [] - for config_key in extract_domain_configs(config, DOMAIN): - conf: list[ConfigType | blueprint.BlueprintInputs] = config[config_key] + conf: list[ConfigType | blueprint.BlueprintInputs] = config[DOMAIN] - for list_no, config_block in enumerate(conf): - raw_blueprint_inputs = None - raw_config = None - if isinstance(config_block, blueprint.BlueprintInputs): - blueprint_inputs = config_block - raw_blueprint_inputs = blueprint_inputs.config_with_inputs + for list_no, config_block in enumerate(conf): + raw_blueprint_inputs = None + raw_config = None + if isinstance(config_block, blueprint.BlueprintInputs): + blueprint_inputs = config_block + raw_blueprint_inputs = blueprint_inputs.config_with_inputs - try: - raw_config = blueprint_inputs.async_substitute() - config_block = cast( - dict[str, Any], - await async_validate_config_item(hass, raw_config), - ) - except vol.Invalid as err: - LOGGER.error( - "Blueprint %s generated invalid automation with inputs %s: %s", - blueprint_inputs.blueprint.name, - blueprint_inputs.inputs, - humanize_error(config_block, err), - ) - continue - else: - raw_config = cast(AutomationConfig, config_block).raw_config - - automation_configs.append( - AutomationEntityConfig( - config_block, config_key, list_no, raw_blueprint_inputs, raw_config + try: + raw_config = blueprint_inputs.async_substitute() + config_block = cast( + dict[str, Any], + await async_validate_config_item(hass, raw_config), ) + except vol.Invalid as err: + LOGGER.error( + "Blueprint %s generated invalid automation with inputs %s: %s", + blueprint_inputs.blueprint.name, + blueprint_inputs.inputs, + humanize_error(config_block, err), + ) + continue + else: + raw_config = cast(AutomationConfig, config_block).raw_config + + automation_configs.append( + AutomationEntityConfig( + config_block, list_no, raw_blueprint_inputs, raw_config ) + ) return automation_configs @@ -722,9 +720,8 @@ async def _prepare_automation_config( def _automation_name(automation_config: AutomationEntityConfig) -> str: """Return the configured name of an automation.""" config_block = automation_config.config_block - config_key = automation_config.config_key list_no = automation_config.list_no - return config_block.get(CONF_ALIAS) or f"{config_key} {list_no}" + return config_block.get(CONF_ALIAS) or f"{DOMAIN} {list_no}" async def _create_automation_entities( @@ -855,8 +852,7 @@ async def _async_process_config( if idx not in config_matches ] entities = await _create_automation_entities(hass, updated_automation_configs) - if entities: - await component.async_add_entities(entities) + await component.async_add_entities(entities) return diff --git a/homeassistant/components/script/__init__.py b/homeassistant/components/script/__init__.py index 105309268d1..a1c683faba7 100644 --- a/homeassistant/components/script/__init__.py +++ b/homeassistant/components/script/__init__.py @@ -29,7 +29,7 @@ from homeassistant.const import ( STATE_ON, ) from homeassistant.core import HomeAssistant, ServiceCall, callback -from homeassistant.helpers import entity_registry as er, extract_domain_configs +from homeassistant.helpers import entity_registry as er import homeassistant.helpers.config_validation as cv from homeassistant.helpers.config_validation import make_entity_service_schema from homeassistant.helpers.entity import ToggleEntity @@ -238,37 +238,36 @@ async def _async_process_config(hass, config, component) -> None: """ entities = [] - for config_key in extract_domain_configs(config, DOMAIN): - conf: dict[str, dict[str, Any] | BlueprintInputs] = config[config_key] + conf: dict[str, dict[str, Any] | BlueprintInputs] = config[DOMAIN] - for key, config_block in conf.items(): - raw_blueprint_inputs = None - raw_config = None + for key, config_block in conf.items(): + raw_blueprint_inputs = None + raw_config = None - if isinstance(config_block, BlueprintInputs): - blueprint_inputs = config_block - raw_blueprint_inputs = blueprint_inputs.config_with_inputs + if isinstance(config_block, BlueprintInputs): + blueprint_inputs = config_block + raw_blueprint_inputs = blueprint_inputs.config_with_inputs - try: - raw_config = blueprint_inputs.async_substitute() - config_block = cast( - dict[str, Any], - await async_validate_config_item(hass, raw_config), - ) - except vol.Invalid as err: - LOGGER.error( - "Blueprint %s generated invalid script with input %s: %s", - blueprint_inputs.blueprint.name, - blueprint_inputs.inputs, - humanize_error(config_block, err), - ) - continue - else: - raw_config = cast(ScriptConfig, config_block).raw_config + try: + raw_config = blueprint_inputs.async_substitute() + config_block = cast( + dict[str, Any], + await async_validate_config_item(hass, raw_config), + ) + except vol.Invalid as err: + LOGGER.error( + "Blueprint %s generated invalid script with input %s: %s", + blueprint_inputs.blueprint.name, + blueprint_inputs.inputs, + humanize_error(config_block, err), + ) + continue + else: + raw_config = cast(ScriptConfig, config_block).raw_config - entities.append( - ScriptEntity(hass, key, config_block, raw_config, raw_blueprint_inputs) - ) + entities.append( + ScriptEntity(hass, key, config_block, raw_config, raw_blueprint_inputs) + ) await component.async_add_entities(entities)