mirror of
https://github.com/home-assistant/core
synced 2024-10-15 08:46:04 +00:00
Remove file/line annotations after config has been validated (#107139)
This commit is contained in:
parent
7fc3f8e473
commit
5e79cd8715
|
@ -14,7 +14,7 @@ from pathlib import Path
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING, Any, TypeVar
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from awesomeversion import AwesomeVersion
|
from awesomeversion import AwesomeVersion
|
||||||
|
@ -67,6 +67,7 @@ from .requirements import RequirementsNotFound, async_get_integration_with_requi
|
||||||
from .util.package import is_docker_env
|
from .util.package import is_docker_env
|
||||||
from .util.unit_system import get_unit_system, validate_unit_system
|
from .util.unit_system import get_unit_system, validate_unit_system
|
||||||
from .util.yaml import SECRET_YAML, Secrets, YamlTypeError, load_yaml_dict
|
from .util.yaml import SECRET_YAML, Secrets, YamlTypeError, load_yaml_dict
|
||||||
|
from .util.yaml.objects import NodeStrClass
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -146,6 +147,9 @@ class ConfigExceptionInfo:
|
||||||
integration_link: str | None
|
integration_link: str | None
|
||||||
|
|
||||||
|
|
||||||
|
_T = TypeVar("_T")
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class IntegrationConfigInfo:
|
class IntegrationConfigInfo:
|
||||||
"""Configuration for an integration and exception information."""
|
"""Configuration for an integration and exception information."""
|
||||||
|
@ -1221,9 +1225,45 @@ async def async_process_component_and_handle_errors(
|
||||||
integration_config_info = await async_process_component_config(
|
integration_config_info = await async_process_component_config(
|
||||||
hass, config, integration
|
hass, config, integration
|
||||||
)
|
)
|
||||||
return async_handle_component_errors(
|
async_handle_component_errors(
|
||||||
hass, integration_config_info, integration, raise_on_failure
|
hass, integration_config_info, integration, raise_on_failure
|
||||||
)
|
)
|
||||||
|
return async_drop_config_annotations(integration_config_info, integration)
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def async_drop_config_annotations(
|
||||||
|
integration_config_info: IntegrationConfigInfo,
|
||||||
|
integration: Integration,
|
||||||
|
) -> ConfigType | None:
|
||||||
|
"""Remove file and line annotations from str items in component configuration."""
|
||||||
|
if (config := integration_config_info.config) is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def drop_config_annotations_rec(node: Any) -> Any:
|
||||||
|
if isinstance(node, dict):
|
||||||
|
# Some integrations store metadata in custom dict classes, preserve those
|
||||||
|
tmp = dict(node)
|
||||||
|
node.clear()
|
||||||
|
node.update(
|
||||||
|
(drop_config_annotations_rec(k), drop_config_annotations_rec(v))
|
||||||
|
for k, v in tmp.items()
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
if isinstance(node, list):
|
||||||
|
return [drop_config_annotations_rec(v) for v in node]
|
||||||
|
|
||||||
|
if isinstance(node, NodeStrClass):
|
||||||
|
return str(node)
|
||||||
|
|
||||||
|
return node
|
||||||
|
|
||||||
|
# Don't drop annotations from the homeassistant integration because it may
|
||||||
|
# have configuration for other integrations as packages.
|
||||||
|
if integration.domain in config and integration.domain != CONF_CORE:
|
||||||
|
drop_config_annotations_rec(config[integration.domain])
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
|
@ -1232,18 +1272,16 @@ def async_handle_component_errors(
|
||||||
integration_config_info: IntegrationConfigInfo,
|
integration_config_info: IntegrationConfigInfo,
|
||||||
integration: Integration,
|
integration: Integration,
|
||||||
raise_on_failure: bool = False,
|
raise_on_failure: bool = False,
|
||||||
) -> ConfigType | None:
|
) -> None:
|
||||||
"""Handle component configuration errors from async_process_component_config.
|
"""Handle component configuration errors from async_process_component_config.
|
||||||
|
|
||||||
In case of errors:
|
In case of errors:
|
||||||
- Print the error messages to the log.
|
- Print the error messages to the log.
|
||||||
- Raise a ConfigValidationError if raise_on_failure is set.
|
- Raise a ConfigValidationError if raise_on_failure is set.
|
||||||
|
|
||||||
Returns the integration config or `None`.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not (config_exception_info := integration_config_info.exception_info_list):
|
if not (config_exception_info := integration_config_info.exception_info_list):
|
||||||
return integration_config_info.config
|
return
|
||||||
|
|
||||||
platform_exception: ConfigExceptionInfo
|
platform_exception: ConfigExceptionInfo
|
||||||
domain = integration.domain
|
domain = integration.domain
|
||||||
|
@ -1261,7 +1299,7 @@ def async_handle_component_errors(
|
||||||
)
|
)
|
||||||
|
|
||||||
if not raise_on_failure:
|
if not raise_on_failure:
|
||||||
return integration_config_info.config
|
return
|
||||||
|
|
||||||
if len(config_exception_info) == 1:
|
if len(config_exception_info) == 1:
|
||||||
translation_key = platform_exception.translation_key
|
translation_key = platform_exception.translation_key
|
||||||
|
|
|
@ -256,8 +256,9 @@ async def _async_setup_component(
|
||||||
integration_config_info = await conf_util.async_process_component_config(
|
integration_config_info = await conf_util.async_process_component_config(
|
||||||
hass, config, integration
|
hass, config, integration
|
||||||
)
|
)
|
||||||
processed_config = conf_util.async_handle_component_errors(
|
conf_util.async_handle_component_errors(hass, integration_config_info, integration)
|
||||||
hass, integration_config_info, integration
|
processed_config = conf_util.async_drop_config_annotations(
|
||||||
|
integration_config_info, integration
|
||||||
)
|
)
|
||||||
for platform_exception in integration_config_info.exception_info_list:
|
for platform_exception in integration_config_info.exception_info_list:
|
||||||
if platform_exception.translation_key not in NOTIFY_FOR_TRANSLATION_KEYS:
|
if platform_exception.translation_key not in NOTIFY_FOR_TRANSLATION_KEYS:
|
||||||
|
|
Loading…
Reference in a new issue