From 9af12a06392abd8e3b819cc747be307d0b800698 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Mar 2024 07:48:07 -1000 Subject: [PATCH] Avoid calling async_get_component twice for each component being setup (#112096) We already have the component so we can pass it to async_process_component_config to avoid having to look it up again --- homeassistant/config.py | 26 ++++++++++++++------------ homeassistant/setup.py | 2 +- tests/common.py | 4 ++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/homeassistant/config.py b/homeassistant/config.py index a72bd00ed44..896c9be3653 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -1430,6 +1430,7 @@ async def async_process_component_config( # noqa: C901 hass: HomeAssistant, config: ConfigType, integration: Integration, + component: ComponentProtocol | None = None, ) -> IntegrationConfigInfo: """Check component configuration. @@ -1441,18 +1442,19 @@ async def async_process_component_config( # noqa: C901 integration_docs = integration.documentation config_exceptions: list[ConfigExceptionInfo] = [] - try: - component = await integration.async_get_component() - except LOAD_EXCEPTIONS as exc: - exc_info = ConfigExceptionInfo( - exc, - ConfigErrorTranslationKey.COMPONENT_IMPORT_ERR, - domain, - config, - integration_docs, - ) - config_exceptions.append(exc_info) - return IntegrationConfigInfo(None, config_exceptions) + if not component: + try: + component = await integration.async_get_component() + except LOAD_EXCEPTIONS as exc: + exc_info = ConfigExceptionInfo( + exc, + ConfigErrorTranslationKey.COMPONENT_IMPORT_ERR, + domain, + config, + integration_docs, + ) + config_exceptions.append(exc_info) + return IntegrationConfigInfo(None, config_exceptions) # Check if the integration has a custom config validator config_validator = None diff --git a/homeassistant/setup.py b/homeassistant/setup.py index 0cdbcec3ff3..efbaacac43e 100644 --- a/homeassistant/setup.py +++ b/homeassistant/setup.py @@ -299,7 +299,7 @@ async def _async_setup_component( # noqa: C901 return False integration_config_info = await conf_util.async_process_component_config( - hass, config, integration + hass, config, integration, component ) conf_util.async_handle_component_errors(hass, integration_config_info, integration) processed_config = conf_util.async_drop_config_annotations( diff --git a/tests/common.py b/tests/common.py index 14cacdf5d68..c5b517f78ac 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1075,11 +1075,11 @@ def assert_setup_component(count, domain=None): """ config = {} - async def mock_psc(hass, config_input, integration): + async def mock_psc(hass, config_input, integration, component=None): """Mock the prepare_setup_component to capture config.""" domain_input = integration.domain integration_config_info = await async_process_component_config( - hass, config_input, integration + hass, config_input, integration, component ) res = integration_config_info.config config[domain_input] = None if res is None else res.get(domain_input)