From cba0cf060962d223f1e5b86ecd9a1222f863985e Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Sat, 12 Apr 2025 20:59:59 +0200 Subject: [PATCH] Migrate Syncthru to runtime data (#142775) --- homeassistant/components/syncthru/__init__.py | 14 +++++--------- homeassistant/components/syncthru/binary_sensor.py | 8 +++----- homeassistant/components/syncthru/coordinator.py | 4 +++- homeassistant/components/syncthru/diagnostics.py | 7 +++---- homeassistant/components/syncthru/entity.py | 3 ++- homeassistant/components/syncthru/sensor.py | 8 +++----- tests/components/syncthru/conftest.py | 2 +- 7 files changed, 20 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/syncthru/__init__.py b/homeassistant/components/syncthru/__init__.py index 016d0de7257..f514f538821 100644 --- a/homeassistant/components/syncthru/__init__.py +++ b/homeassistant/components/syncthru/__init__.py @@ -4,22 +4,20 @@ from __future__ import annotations from pysyncthru import SyncThruAPINotSupported -from homeassistant.config_entries import ConfigEntry from homeassistant.const import Platform from homeassistant.core import HomeAssistant -from .const import DOMAIN -from .coordinator import SyncthruCoordinator +from .coordinator import SyncThruConfigEntry, SyncthruCoordinator PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR] -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: HomeAssistant, entry: SyncThruConfigEntry) -> bool: """Set up config entry.""" coordinator = SyncthruCoordinator(hass, entry) await coordinator.async_config_entry_first_refresh() - hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator + entry.runtime_data = coordinator if isinstance(coordinator.last_exception, SyncThruAPINotSupported): # this means that the printer does not support the syncthru JSON API # and the config should simply be discarded @@ -29,8 +27,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return True -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: SyncThruConfigEntry) -> bool: """Unload the config entry.""" - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - hass.data[DOMAIN].pop(entry.entry_id, None) - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/syncthru/binary_sensor.py b/homeassistant/components/syncthru/binary_sensor.py index 45a3e263465..56edff38680 100644 --- a/homeassistant/components/syncthru/binary_sensor.py +++ b/homeassistant/components/syncthru/binary_sensor.py @@ -12,12 +12,10 @@ from homeassistant.components.binary_sensor import ( BinarySensorEntity, BinarySensorEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from . import SyncthruCoordinator -from .const import DOMAIN +from .coordinator import SyncThruConfigEntry from .entity import SyncthruEntity SYNCTHRU_STATE_PROBLEM = { @@ -54,12 +52,12 @@ BINARY_SENSORS: tuple[SyncThruBinarySensorDescription, ...] = ( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: SyncThruConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up from config entry.""" - coordinator: SyncthruCoordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data async_add_entities( SyncThruBinarySensor(coordinator, description) for description in BINARY_SENSORS diff --git a/homeassistant/components/syncthru/coordinator.py b/homeassistant/components/syncthru/coordinator.py index 8bb10e8c861..0b96b354436 100644 --- a/homeassistant/components/syncthru/coordinator.py +++ b/homeassistant/components/syncthru/coordinator.py @@ -16,11 +16,13 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) +type SyncThruConfigEntry = ConfigEntry[SyncthruCoordinator] + class SyncthruCoordinator(DataUpdateCoordinator[SyncThru]): """Class to manage fetching Syncthru data.""" - def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: + def __init__(self, hass: HomeAssistant, entry: SyncThruConfigEntry) -> None: """Initialize the Syncthru coordinator.""" super().__init__( hass, diff --git a/homeassistant/components/syncthru/diagnostics.py b/homeassistant/components/syncthru/diagnostics.py index 5ff860ed41e..169d354ef76 100644 --- a/homeassistant/components/syncthru/diagnostics.py +++ b/homeassistant/components/syncthru/diagnostics.py @@ -4,15 +4,14 @@ from __future__ import annotations from typing import Any -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from .const import DOMAIN +from .coordinator import SyncThruConfigEntry async def async_get_config_entry_diagnostics( - hass: HomeAssistant, entry: ConfigEntry + hass: HomeAssistant, entry: SyncThruConfigEntry ) -> dict[str, Any]: """Return diagnostics for a config entry.""" - return hass.data[DOMAIN][entry.entry_id].data.raw() + return entry.runtime_data.data.raw() diff --git a/homeassistant/components/syncthru/entity.py b/homeassistant/components/syncthru/entity.py index a2feafbc495..3f1aecbf0d4 100644 --- a/homeassistant/components/syncthru/entity.py +++ b/homeassistant/components/syncthru/entity.py @@ -5,7 +5,8 @@ from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import DOMAIN, SyncthruCoordinator +from .const import DOMAIN +from .coordinator import SyncthruCoordinator class SyncthruEntity(CoordinatorEntity[SyncthruCoordinator]): diff --git a/homeassistant/components/syncthru/sensor.py b/homeassistant/components/syncthru/sensor.py index f3fb9d6689e..7896b275f45 100644 --- a/homeassistant/components/syncthru/sensor.py +++ b/homeassistant/components/syncthru/sensor.py @@ -9,13 +9,11 @@ from typing import Any, cast from pysyncthru import SyncThru, SyncthruState from homeassistant.components.sensor import SensorEntity, SensorEntityDescription -from homeassistant.config_entries import ConfigEntry from homeassistant.const import PERCENTAGE from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from . import SyncthruCoordinator -from .const import DOMAIN +from .coordinator import SyncThruConfigEntry from .entity import SyncthruEntity SYNCTHRU_STATE_HUMAN = { @@ -118,12 +116,12 @@ SENSOR_TYPES: tuple[SyncThruSensorDescription, ...] = ( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: SyncThruConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up from config entry.""" - coordinator: SyncthruCoordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data printer = coordinator.data supp_toner = printer.toner_status(filter_supported=True) diff --git a/tests/components/syncthru/conftest.py b/tests/components/syncthru/conftest.py index 1142726d04e..61b91d815a2 100644 --- a/tests/components/syncthru/conftest.py +++ b/tests/components/syncthru/conftest.py @@ -6,7 +6,7 @@ from unittest.mock import AsyncMock, patch from pysyncthru import SyncthruState import pytest -from homeassistant.components.syncthru import DOMAIN +from homeassistant.components.syncthru.const import DOMAIN from homeassistant.const import CONF_NAME, CONF_URL from tests.common import MockConfigEntry, load_json_object_fixture