Migrate kaleidescape to use runtime_data (#147171)

* Migrate kaleidescape to use runtime_data

* Adjust tests
This commit is contained in:
epenet 2025-06-20 12:25:57 +02:00 committed by GitHub
parent 7dfd68f8c0
commit 313eaff14e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 35 additions and 57 deletions

View File

@ -3,26 +3,22 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
import logging
from typing import TYPE_CHECKING
from kaleidescape import Device as KaleidescapeDevice, KaleidescapeError from kaleidescape import Device as KaleidescapeDevice, KaleidescapeError
from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP, Platform
from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
from .const import DOMAIN
if TYPE_CHECKING:
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP, Platform
from homeassistant.core import Event, HomeAssistant from homeassistant.core import Event, HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
_LOGGER = logging.getLogger(__name__)
PLATFORMS = [Platform.MEDIA_PLAYER, Platform.REMOTE, Platform.SENSOR] PLATFORMS = [Platform.MEDIA_PLAYER, Platform.REMOTE, Platform.SENSOR]
type KaleidescapeConfigEntry = ConfigEntry[KaleidescapeDevice]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_setup_entry(
hass: HomeAssistant, entry: KaleidescapeConfigEntry
) -> bool:
"""Set up Kaleidescape from a config entry.""" """Set up Kaleidescape from a config entry."""
device = KaleidescapeDevice( device = KaleidescapeDevice(
entry.data[CONF_HOST], timeout=5, reconnect=True, reconnect_delay=5 entry.data[CONF_HOST], timeout=5, reconnect=True, reconnect_delay=5
@ -36,7 +32,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
f"Unable to connect to {entry.data[CONF_HOST]}: {err}" f"Unable to connect to {entry.data[CONF_HOST]}: {err}"
) from err ) from err
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = device entry.runtime_data = device
async def disconnect(event: Event) -> None: async def disconnect(event: Event) -> None:
await device.disconnect() await device.disconnect()
@ -44,18 +40,18 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
entry.async_on_unload( entry.async_on_unload(
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, disconnect) hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, disconnect)
) )
entry.async_on_unload(device.disconnect)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(
hass: HomeAssistant, entry: KaleidescapeConfigEntry
) -> bool:
"""Unload config entry.""" """Unload config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
await hass.data[DOMAIN][entry.entry_id].disconnect()
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
@dataclass @dataclass

View File

@ -2,8 +2,8 @@
from __future__ import annotations from __future__ import annotations
from datetime import datetime
import logging import logging
from typing import TYPE_CHECKING
from kaleidescape import const as kaleidescape_const from kaleidescape import const as kaleidescape_const
@ -12,18 +12,12 @@ from homeassistant.components.media_player import (
MediaPlayerEntityFeature, MediaPlayerEntityFeature,
MediaPlayerState, MediaPlayerState,
) )
from homeassistant.util.dt import utcnow
from .const import DOMAIN
from .entity import KaleidescapeEntity
if TYPE_CHECKING:
from datetime import datetime
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util.dt import utcnow
from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity
KALEIDESCAPE_PLAYING_STATES = [ KALEIDESCAPE_PLAYING_STATES = [
kaleidescape_const.PLAY_STATUS_PLAYING, kaleidescape_const.PLAY_STATUS_PLAYING,
@ -39,11 +33,11 @@ _LOGGER = logging.getLogger(__name__)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: KaleidescapeConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up the platform from a config entry.""" """Set up the platform from a config entry."""
entities = [KaleidescapeMediaPlayer(hass.data[DOMAIN][entry.entry_id])] entities = [KaleidescapeMediaPlayer(entry.runtime_data)]
async_add_entities(entities) async_add_entities(entities)

View File

@ -2,32 +2,27 @@
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING from collections.abc import Iterable
from typing import Any
from kaleidescape import const as kaleidescape_const from kaleidescape import const as kaleidescape_const
from homeassistant.components.remote import RemoteEntity from homeassistant.components.remote import RemoteEntity
from homeassistant.exceptions import HomeAssistantError
from .const import DOMAIN
from .entity import KaleidescapeEntity
if TYPE_CHECKING:
from collections.abc import Iterable
from typing import Any
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: KaleidescapeConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up the platform from a config entry.""" """Set up the platform from a config entry."""
entities = [KaleidescapeRemote(hass.data[DOMAIN][entry.entry_id])] entities = [KaleidescapeRemote(entry.runtime_data)]
async_add_entities(entities) async_add_entities(entities)

View File

@ -2,25 +2,20 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.const import PERCENTAGE, EntityCategory
from .const import DOMAIN
from .entity import KaleidescapeEntity
if TYPE_CHECKING:
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass
from kaleidescape import Device as KaleidescapeDevice from kaleidescape import Device as KaleidescapeDevice
from homeassistant.config_entries import ConfigEntry from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.const import PERCENTAGE, EntityCategory
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
class KaleidescapeSensorEntityDescription(SensorEntityDescription): class KaleidescapeSensorEntityDescription(SensorEntityDescription):
@ -132,11 +127,11 @@ SENSOR_TYPES: tuple[KaleidescapeSensorEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: KaleidescapeConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up the platform from a config entry.""" """Set up the platform from a config entry."""
device: KaleidescapeDevice = hass.data[DOMAIN][entry.entry_id] device = entry.runtime_data
async_add_entities( async_add_entities(
KaleidescapeSensor(device, description) for description in SENSOR_TYPES KaleidescapeSensor(device, description) for description in SENSOR_TYPES
) )

View File

@ -4,7 +4,6 @@ from unittest.mock import MagicMock
import pytest import pytest
from homeassistant.components.kaleidescape.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
@ -29,7 +28,6 @@ async def test_unload_config_entry(
await hass.async_block_till_done() await hass.async_block_till_done()
assert mock_device.disconnect.call_count == 1 assert mock_device.disconnect.call_count == 1
assert mock_config_entry.entry_id not in hass.data[DOMAIN]
async def test_config_entry_not_ready( async def test_config_entry_not_ready(