From 00e57ab9a4f8660e27019d4c03f989c3277a55c8 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 30 Nov 2023 22:43:34 +0100 Subject: [PATCH] Use deprecated_class decorator in deprecated YAML loader classes (#104835) --- homeassistant/util/yaml/loader.py | 20 +++----------------- tests/util/yaml/test_init.py | 15 +++++++++------ 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/homeassistant/util/yaml/loader.py b/homeassistant/util/yaml/loader.py index e8f4a734bdb..275a51cd760 100644 --- a/homeassistant/util/yaml/loader.py +++ b/homeassistant/util/yaml/loader.py @@ -23,7 +23,7 @@ except ImportError: ) from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers.frame import report +from homeassistant.helpers.deprecation import deprecated_class from .const import SECRET_YAML from .objects import Input, NodeDictClass, NodeListClass, NodeStrClass @@ -137,17 +137,10 @@ class FastSafeLoader(FastestAvailableSafeLoader, _LoaderMixin): self.secrets = secrets +@deprecated_class("FastSafeLoader") class SafeLoader(FastSafeLoader): """Provided for backwards compatibility. Logs when instantiated.""" - def __init__(*args: Any, **kwargs: Any) -> None: - """Log a warning and call super.""" - report( - "uses deprecated 'SafeLoader' instead of 'FastSafeLoader', " - "which will stop working in HA Core 2024.6," - ) - FastSafeLoader.__init__(*args, **kwargs) - class PythonSafeLoader(yaml.SafeLoader, _LoaderMixin): """Python safe loader.""" @@ -158,17 +151,10 @@ class PythonSafeLoader(yaml.SafeLoader, _LoaderMixin): self.secrets = secrets +@deprecated_class("PythonSafeLoader") class SafeLineLoader(PythonSafeLoader): """Provided for backwards compatibility. Logs when instantiated.""" - def __init__(*args: Any, **kwargs: Any) -> None: - """Log a warning and call super.""" - report( - "uses deprecated 'SafeLineLoader' instead of 'PythonSafeLoader', " - "which will stop working in HA Core 2024.6," - ) - PythonSafeLoader.__init__(*args, **kwargs) - LoaderType = FastSafeLoader | PythonSafeLoader diff --git a/tests/util/yaml/test_init.py b/tests/util/yaml/test_init.py index c4e5c58e235..3a2d9b3734d 100644 --- a/tests/util/yaml/test_init.py +++ b/tests/util/yaml/test_init.py @@ -590,7 +590,7 @@ async def test_loading_actual_file_with_syntax_error( def mock_integration_frame() -> Generator[Mock, None, None]: """Mock as if we're calling code from inside an integration.""" correct_frame = Mock( - filename="/home/paulus/homeassistant/components/hue/light.py", + filename="/home/paulus/.homeassistant/custom_components/hue/light.py", lineno="23", line="self.light.is_on", ) @@ -614,12 +614,12 @@ def mock_integration_frame() -> Generator[Mock, None, None]: @pytest.mark.parametrize( - ("loader_class", "message"), + ("loader_class", "new_class"), [ - (yaml.loader.SafeLoader, "'SafeLoader' instead of 'FastSafeLoader'"), + (yaml.loader.SafeLoader, "FastSafeLoader"), ( yaml.loader.SafeLineLoader, - "'SafeLineLoader' instead of 'PythonSafeLoader'", + "PythonSafeLoader", ), ], ) @@ -628,14 +628,17 @@ async def test_deprecated_loaders( mock_integration_frame: Mock, caplog: pytest.LogCaptureFixture, loader_class, - message: str, + new_class: str, ) -> None: """Test instantiating the deprecated yaml loaders logs a warning.""" with pytest.raises(TypeError), patch( "homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set() ): loader_class() - assert (f"Detected that integration 'hue' uses deprecated {message}") in caplog.text + assert ( + f"{loader_class.__name__} was called from hue, this is a deprecated class. " + f"Use {new_class} instead" + ) in caplog.text def test_string_annotated(try_both_loaders) -> None: