From 199a274c8034196f2e5645a6963b61a4006ab34c Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Wed, 23 Apr 2025 17:24:25 +0200 Subject: [PATCH] Remove deprecated `hass.helpers` (#143514) --- homeassistant/core.py | 4 -- homeassistant/loader.py | 31 ---------- .../components/flexit_bacnet/test_climate.py | 6 +- tests/test_loader.py | 57 +------------------ 4 files changed, 4 insertions(+), 94 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 2fd9e582561..65f3b7502a5 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -427,9 +427,6 @@ class HomeAssistant: def __init__(self, config_dir: str) -> None: """Initialize new Home Assistant object.""" - # pylint: disable-next=import-outside-toplevel - from . import loader - # pylint: disable-next=import-outside-toplevel from .core_config import Config @@ -443,7 +440,6 @@ class HomeAssistant: self.states = StateMachine(self.bus, self.loop) self.config = Config(self, config_dir) self.config.async_initialize() - self.helpers = loader.Helpers(self) self.state: CoreState = CoreState.not_running self.exit_code: int = 0 # If not None, use to signal end-of-loop diff --git a/homeassistant/loader.py b/homeassistant/loader.py index d649db3c752..0980a6f2ba9 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -1710,37 +1710,6 @@ class ModuleWrapper: return value -class Helpers: - """Helper to load helpers.""" - - def __init__(self, hass: HomeAssistant) -> None: - """Initialize the Helpers class.""" - self._hass = hass - - def __getattr__(self, helper_name: str) -> ModuleWrapper: - """Fetch a helper.""" - helper = importlib.import_module(f"homeassistant.helpers.{helper_name}") - - # Local import to avoid circular dependencies - # pylint: disable-next=import-outside-toplevel - from .helpers.frame import ReportBehavior, report_usage - - report_usage( - ( - f"accesses hass.helpers.{helper_name}, which" - f" should be updated to import functions used from {helper_name} directly" - ), - core_behavior=ReportBehavior.IGNORE, - core_integration_behavior=ReportBehavior.IGNORE, - custom_integration_behavior=ReportBehavior.LOG, - breaks_in_ha_version="2025.5", - ) - - wrapped = ModuleWrapper(self._hass, helper) - setattr(self, helper_name, wrapped) - return wrapped - - def bind_hass[_CallableT: Callable[..., Any]](func: _CallableT) -> _CallableT: """Decorate function to indicate that first argument is hass. diff --git a/tests/components/flexit_bacnet/test_climate.py b/tests/components/flexit_bacnet/test_climate.py index be361541c39..e3c04a1a48f 100644 --- a/tests/components/flexit_bacnet/test_climate.py +++ b/tests/components/flexit_bacnet/test_climate.py @@ -27,7 +27,7 @@ from homeassistant.components.flexit_bacnet.const import PRESET_TO_VENTILATION_M from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE, Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import entity_registry as er +from homeassistant.helpers import entity_component, entity_registry as er from . import setup_with_selected_platforms @@ -156,14 +156,14 @@ async def test_hvac_action( # Simulate electric heater being ON mock_flexit_bacnet.electric_heater = True - await hass.helpers.entity_component.async_update_entity(ENTITY_ID) + await entity_component.async_update_entity(hass, ENTITY_ID) state = hass.states.get(ENTITY_ID) assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.HEATING # Simulate electric heater being OFF mock_flexit_bacnet.electric_heater = False - await hass.helpers.entity_component.async_update_entity(ENTITY_ID) + await entity_component.async_update_entity(hass, ENTITY_ID) state = hass.states.get(ENTITY_ID) assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.FAN diff --git a/tests/test_loader.py b/tests/test_loader.py index 7ae02d3717e..16515cbd4e6 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -14,7 +14,7 @@ import pytest from homeassistant import loader from homeassistant.components import hue from homeassistant.components.hue import light as hue_light -from homeassistant.core import HomeAssistant, callback +from homeassistant.core import HomeAssistant from homeassistant.helpers.json import json_dumps from homeassistant.util.json import json_loads @@ -114,25 +114,6 @@ async def test_nonexistent_component_dependencies(hass: HomeAssistant) -> None: assert result == {} -async def test_helpers_wrapper(hass: HomeAssistant) -> None: - """Test helpers wrapper.""" - helpers = loader.Helpers(hass) - - result = [] - - @callback - def discovery_callback(service, discovered): - """Handle discovery callback.""" - result.append(discovered) - - helpers.discovery.async_listen("service_name", discovery_callback) - - await helpers.discovery.async_discover("service_name", "hello", None, {}) - await hass.async_block_till_done() - - assert result == ["hello"] - - @pytest.mark.usefixtures("enable_custom_integrations") async def test_custom_component_name(hass: HomeAssistant) -> None: """Test the name attribute of custom components.""" @@ -1981,42 +1962,6 @@ async def test_has_services(hass: HomeAssistant) -> None: assert integration.has_services is True -@pytest.mark.parametrize( - ("integration_frame_path", "expected"), - [ - pytest.param( - "custom_components/test_integration_frame", True, id="custom integration" - ), - pytest.param( - "homeassistant/components/test_integration_frame", - False, - id="core integration", - ), - pytest.param("homeassistant/test_integration_frame", False, id="core"), - ], -) -@pytest.mark.usefixtures("mock_integration_frame") -async def test_hass_helpers_use_reported( - hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, - expected: bool, -) -> None: - """Test whether use of hass.helpers is reported.""" - with ( - patch( - "homeassistant.helpers.aiohttp_client.async_get_clientsession", - return_value=None, - ), - ): - hass.helpers.aiohttp_client.async_get_clientsession() - - reported = ( - "Detected that custom integration 'test_integration_frame' " - "accesses hass.helpers.aiohttp_client, which should be updated" - ) in caplog.text - assert reported == expected - - async def test_manifest_json_fragment_round_trip(hass: HomeAssistant) -> None: """Test json_fragment roundtrip.""" integration = await loader.async_get_integration(hass, "hue")