diff --git a/.coveragerc b/.coveragerc index a2474b96aa2..148db05756a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -464,8 +464,7 @@ omit = homeassistant/components/freebox/camera.py homeassistant/components/freebox/home_base.py homeassistant/components/freebox/switch.py - homeassistant/components/fritz/common.py - homeassistant/components/fritz/device_tracker.py + homeassistant/components/fritz/coordinator.py homeassistant/components/fritz/services.py homeassistant/components/fritz/switch.py homeassistant/components/fritzbox_callmonitor/__init__.py diff --git a/homeassistant/components/fritz/__init__.py b/homeassistant/components/fritz/__init__.py index bab97569eda..1e1830ca1c1 100644 --- a/homeassistant/components/fritz/__init__.py +++ b/homeassistant/components/fritz/__init__.py @@ -13,7 +13,6 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady -from .common import AvmWrapper, FritzData from .const import ( DATA_FRITZ, DEFAULT_SSL, @@ -22,6 +21,7 @@ from .const import ( FRITZ_EXCEPTIONS, PLATFORMS, ) +from .coordinator import AvmWrapper, FritzData from .services import async_setup_services, async_unload_services _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/binary_sensor.py b/homeassistant/components/fritz/binary_sensor.py index adca977e179..486d2e914a0 100644 --- a/homeassistant/components/fritz/binary_sensor.py +++ b/homeassistant/components/fritz/binary_sensor.py @@ -16,13 +16,13 @@ from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .common import ( +from .const import DOMAIN +from .coordinator import ( AvmWrapper, ConnectionInfo, FritzBoxBaseCoordinatorEntity, FritzEntityDescription, ) -from .const import DOMAIN _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/button.py b/homeassistant/components/fritz/button.py index cfd0e09412d..8838694334c 100644 --- a/homeassistant/components/fritz/button.py +++ b/homeassistant/components/fritz/button.py @@ -19,8 +19,14 @@ from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, Device from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .common import AvmWrapper, FritzData, FritzDevice, FritzDeviceBase, _is_tracked from .const import BUTTON_TYPE_WOL, CONNECTION_TYPE_LAN, DATA_FRITZ, DOMAIN, MeshRoles +from .coordinator import ( + AvmWrapper, + FritzData, + FritzDevice, + FritzDeviceBase, + _is_tracked, +) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/common.py b/homeassistant/components/fritz/coordinator.py similarity index 98% rename from homeassistant/components/fritz/common.py rename to homeassistant/components/fritz/coordinator.py index f71639c7e09..51a67a118ed 100644 --- a/homeassistant/components/fritz/common.py +++ b/homeassistant/components/fritz/coordinator.py @@ -32,15 +32,16 @@ from homeassistant.components.switch import DOMAIN as DEVICE_SWITCH_DOMAIN from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import ( - device_registry as dr, - entity_registry as er, - update_coordinator, -) +from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.typing import StateType +from homeassistant.helpers.update_coordinator import ( + CoordinatorEntity, + DataUpdateCoordinator, + UpdateFailed, +) from homeassistant.util import dt as dt_util from .const import ( @@ -175,9 +176,7 @@ class UpdateCoordinatorDataType(TypedDict): entity_states: dict[str, StateType | bool] -class FritzBoxTools( - update_coordinator.DataUpdateCoordinator[UpdateCoordinatorDataType] -): # pylint: disable=hass-enforce-coordinator-module +class FritzBoxTools(DataUpdateCoordinator[UpdateCoordinatorDataType]): """FritzBoxTools class.""" def __init__( @@ -342,7 +341,7 @@ class FritzBoxTools( "call_deflections" ] = await self.async_update_call_deflections() except FRITZ_EXCEPTIONS as ex: - raise update_coordinator.UpdateFailed(ex) from ex + raise UpdateFailed(ex) from ex _LOGGER.debug("enity_data: %s", entity_data) return entity_data @@ -779,7 +778,7 @@ class FritzBoxTools( ) from ex -class AvmWrapper(FritzBoxTools): # pylint: disable=hass-enforce-coordinator-module +class AvmWrapper(FritzBoxTools): """Setup AVM wrapper for API calls.""" async def _async_service_call( @@ -961,7 +960,7 @@ class FritzData: wol_buttons: dict = field(default_factory=dict) -class FritzDeviceBase(update_coordinator.CoordinatorEntity[AvmWrapper]): +class FritzDeviceBase(CoordinatorEntity[AvmWrapper]): """Entity base class for a device connected to a FRITZ!Box device.""" def __init__(self, avm_wrapper: AvmWrapper, device: FritzDevice) -> None: @@ -1142,7 +1141,7 @@ class FritzEntityDescription(EntityDescription, FritzRequireKeysMixin): """Fritz entity base description.""" -class FritzBoxBaseCoordinatorEntity(update_coordinator.CoordinatorEntity[AvmWrapper]): +class FritzBoxBaseCoordinatorEntity(CoordinatorEntity[AvmWrapper]): """Fritz host coordinator entity base class.""" entity_description: FritzEntityDescription diff --git a/homeassistant/components/fritz/device_tracker.py b/homeassistant/components/fritz/device_tracker.py index 89ba6c1cad8..bd5b88ab94b 100644 --- a/homeassistant/components/fritz/device_tracker.py +++ b/homeassistant/components/fritz/device_tracker.py @@ -11,14 +11,14 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .common import ( +from .const import DATA_FRITZ, DOMAIN +from .coordinator import ( AvmWrapper, FritzData, FritzDevice, FritzDeviceBase, device_filter_out_from_trackers, ) -from .const import DATA_FRITZ, DOMAIN _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/diagnostics.py b/homeassistant/components/fritz/diagnostics.py index c4725b99e43..8823d55baa9 100644 --- a/homeassistant/components/fritz/diagnostics.py +++ b/homeassistant/components/fritz/diagnostics.py @@ -9,8 +9,8 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant -from .common import AvmWrapper from .const import DOMAIN +from .coordinator import AvmWrapper TO_REDACT = {CONF_USERNAME, CONF_PASSWORD} diff --git a/homeassistant/components/fritz/image.py b/homeassistant/components/fritz/image.py index aa1ede5a185..cd8a287c637 100644 --- a/homeassistant/components/fritz/image.py +++ b/homeassistant/components/fritz/image.py @@ -14,8 +14,8 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util import dt as dt_util, slugify -from .common import AvmWrapper, FritzBoxBaseEntity from .const import DOMAIN +from .coordinator import AvmWrapper, FritzBoxBaseEntity _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/sensor.py b/homeassistant/components/fritz/sensor.py index aa9c410a545..6da728ff930 100644 --- a/homeassistant/components/fritz/sensor.py +++ b/homeassistant/components/fritz/sensor.py @@ -27,13 +27,13 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType from homeassistant.util.dt import utcnow -from .common import ( +from .const import DOMAIN, DSL_CONNECTION, UPTIME_DEVIATION +from .coordinator import ( AvmWrapper, ConnectionInfo, FritzBoxBaseCoordinatorEntity, FritzEntityDescription, ) -from .const import DOMAIN, DSL_CONNECTION, UPTIME_DEVIATION _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/services.py b/homeassistant/components/fritz/services.py index f0131c6bae2..bd1f3136b01 100644 --- a/homeassistant/components/fritz/services.py +++ b/homeassistant/components/fritz/services.py @@ -11,7 +11,6 @@ from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.service import async_extract_config_entry_ids -from .common import AvmWrapper from .const import ( DOMAIN, FRITZ_SERVICES, @@ -20,6 +19,7 @@ from .const import ( SERVICE_RECONNECT, SERVICE_SET_GUEST_WIFI_PW, ) +from .coordinator import AvmWrapper _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/switch.py b/homeassistant/components/fritz/switch.py index 913d0165247..a19af3702d0 100644 --- a/homeassistant/components/fritz/switch.py +++ b/homeassistant/components/fritz/switch.py @@ -17,15 +17,6 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.util import slugify -from .common import ( - AvmWrapper, - FritzBoxBaseEntity, - FritzData, - FritzDevice, - FritzDeviceBase, - SwitchInfo, - device_filter_out_from_trackers, -) from .const import ( DATA_FRITZ, DOMAIN, @@ -36,6 +27,15 @@ from .const import ( WIFI_STANDARD, MeshRoles, ) +from .coordinator import ( + AvmWrapper, + FritzBoxBaseEntity, + FritzData, + FritzDevice, + FritzDeviceBase, + SwitchInfo, + device_filter_out_from_trackers, +) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/fritz/update.py b/homeassistant/components/fritz/update.py index 1a24a8dd152..0e896caa5cd 100644 --- a/homeassistant/components/fritz/update.py +++ b/homeassistant/components/fritz/update.py @@ -16,8 +16,12 @@ from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .common import AvmWrapper, FritzBoxBaseCoordinatorEntity, FritzEntityDescription from .const import DOMAIN +from .coordinator import ( + AvmWrapper, + FritzBoxBaseCoordinatorEntity, + FritzEntityDescription, +) _LOGGER = logging.getLogger(__name__) diff --git a/tests/components/fritz/conftest.py b/tests/components/fritz/conftest.py index acf6b0e98cd..bb049f067b4 100644 --- a/tests/components/fritz/conftest.py +++ b/tests/components/fritz/conftest.py @@ -84,7 +84,7 @@ def fc_data_mock(): def fc_class_mock(fc_data): """Fixture that sets up a mocked FritzConnection class.""" with patch( - "homeassistant.components.fritz.common.FritzConnection", autospec=True + "homeassistant.components.fritz.coordinator.FritzConnection", autospec=True ) as result: result.return_value = FritzConnectionMock(fc_data) yield result @@ -94,7 +94,7 @@ def fc_class_mock(fc_data): def fh_class_mock(): """Fixture that sets up a mocked FritzHosts class.""" with patch( - "homeassistant.components.fritz.common.FritzHosts", + "homeassistant.components.fritz.coordinator.FritzHosts", new=FritzHosts, ) as result: result.get_mesh_topology = MagicMock(return_value=MOCK_MESH_DATA) diff --git a/tests/components/fritz/test_button.py b/tests/components/fritz/test_button.py index 14aa46f30a7..94bf752ffe7 100644 --- a/tests/components/fritz/test_button.py +++ b/tests/components/fritz/test_button.py @@ -63,7 +63,7 @@ async def test_buttons( assert button assert button.state == STATE_UNKNOWN with patch( - f"homeassistant.components.fritz.common.AvmWrapper.{wrapper_method}" + f"homeassistant.components.fritz.coordinator.AvmWrapper.{wrapper_method}" ) as mock_press_action: await hass.services.async_call( BUTTON_DOMAIN, @@ -97,7 +97,7 @@ async def test_wol_button( assert button assert button.state == STATE_UNKNOWN with patch( - "homeassistant.components.fritz.common.AvmWrapper.async_wake_on_lan" + "homeassistant.components.fritz.coordinator.AvmWrapper.async_wake_on_lan" ) as mock_press_action: await hass.services.async_call( BUTTON_DOMAIN, diff --git a/tests/components/fritz/test_config_flow.py b/tests/components/fritz/test_config_flow.py index f87fbe722cd..fd95c2870f8 100644 --- a/tests/components/fritz/test_config_flow.py +++ b/tests/components/fritz/test_config_flow.py @@ -105,7 +105,7 @@ async def test_user( side_effect=fc_class_mock, ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch("homeassistant.components.fritz.async_setup_entry") as mock_setup_entry, @@ -172,7 +172,7 @@ async def test_user_already_configured( side_effect=fc_class_mock, ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch( @@ -323,7 +323,7 @@ async def test_reauth_successful( side_effect=fc_class_mock, ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch( @@ -459,7 +459,7 @@ async def test_reconfigure_successful( side_effect=fc_class_mock, ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch( @@ -522,7 +522,7 @@ async def test_reconfigure_not_successful( side_effect=[FritzConnectionException, fc_class_mock], ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch( @@ -699,7 +699,7 @@ async def test_ssdp(hass: HomeAssistant, fc_class_mock, mock_get_source_ip) -> N side_effect=fc_class_mock, ), patch( - "homeassistant.components.fritz.common.FritzBoxTools._update_device_info", + "homeassistant.components.fritz.coordinator.FritzBoxTools._update_device_info", return_value=MOCK_FIRMWARE_INFO, ), patch("homeassistant.components.fritz.async_setup_entry") as mock_setup_entry, diff --git a/tests/components/fritz/test_diagnostics.py b/tests/components/fritz/test_diagnostics.py index 35d50ff4572..55196eb6988 100644 --- a/tests/components/fritz/test_diagnostics.py +++ b/tests/components/fritz/test_diagnostics.py @@ -3,8 +3,8 @@ from __future__ import annotations from homeassistant.components.diagnostics import REDACTED -from homeassistant.components.fritz.common import AvmWrapper from homeassistant.components.fritz.const import DOMAIN +from homeassistant.components.fritz.coordinator import AvmWrapper from homeassistant.components.fritz.diagnostics import TO_REDACT from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant diff --git a/tests/components/fritz/test_init.py b/tests/components/fritz/test_init.py index be45698e160..41638ba4697 100644 --- a/tests/components/fritz/test_init.py +++ b/tests/components/fritz/test_init.py @@ -76,7 +76,7 @@ async def test_setup_auth_fail(hass: HomeAssistant, error) -> None: entry.add_to_hass(hass) with patch( - "homeassistant.components.fritz.common.FritzConnection", + "homeassistant.components.fritz.coordinator.FritzConnection", side_effect=error, ): await hass.config_entries.async_setup(entry.entry_id) @@ -96,7 +96,7 @@ async def test_setup_fail(hass: HomeAssistant, error) -> None: entry.add_to_hass(hass) with patch( - "homeassistant.components.fritz.common.FritzConnection", + "homeassistant.components.fritz.coordinator.FritzConnection", side_effect=error, ): await hass.config_entries.async_setup(entry.entry_id) diff --git a/tests/components/fritz/test_update.py b/tests/components/fritz/test_update.py index c39dd24de02..5d7ef852d4c 100644 --- a/tests/components/fritz/test_update.py +++ b/tests/components/fritz/test_update.py @@ -104,7 +104,7 @@ async def test_available_update_can_be_installed( fc_class_mock().override_services({**MOCK_FB_SERVICES, **AVAILABLE_UPDATE}) with patch( - "homeassistant.components.fritz.common.FritzBoxTools.async_trigger_firmware_update", + "homeassistant.components.fritz.coordinator.FritzBoxTools.async_trigger_firmware_update", return_value=True, ) as mocked_update_call: entry = MockConfigEntry(domain=DOMAIN, data=MOCK_USER_DATA)