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.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP, Platform from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP, Platform
from homeassistant.core import Event, HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
from .const import DOMAIN
if TYPE_CHECKING:
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import Event, HomeAssistant
_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,19 +12,13 @@ from homeassistant.components.media_player import (
MediaPlayerEntityFeature, MediaPlayerEntityFeature,
MediaPlayerState, MediaPlayerState,
) )
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util.dt import utcnow from homeassistant.util.dt import utcnow
from .const import DOMAIN from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity from .entity import KaleidescapeEntity
if TYPE_CHECKING:
from datetime import datetime
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
KALEIDESCAPE_PLAYING_STATES = [ KALEIDESCAPE_PLAYING_STATES = [
kaleidescape_const.PLAY_STATUS_PLAYING, kaleidescape_const.PLAY_STATUS_PLAYING,
kaleidescape_const.PLAY_STATUS_FORWARD, kaleidescape_const.PLAY_STATUS_FORWARD,
@ -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.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import DOMAIN from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity 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.helpers.entity_platform import AddConfigEntryEntitiesCallback
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 collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import TYPE_CHECKING
from kaleidescape import Device as KaleidescapeDevice
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.const import PERCENTAGE, EntityCategory from homeassistant.const import PERCENTAGE, EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType
from .const import DOMAIN from . import KaleidescapeConfigEntry
from .entity import KaleidescapeEntity from .entity import KaleidescapeEntity
if TYPE_CHECKING:
from collections.abc import Callable
from kaleidescape import Device as KaleidescapeDevice
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType
@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(