Improve synology_dsm generic typing (#84649)

This commit is contained in:
Marc Mueller 2022-12-27 21:49:47 +01:00 committed by GitHub
parent 572af57ffe
commit 1624cb1046
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 50 additions and 36 deletions

View File

@ -2,7 +2,6 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any
from synology_dsm.api.core.security import SynoCoreSecurity from synology_dsm.api.core.security import SynoCoreSecurity
from synology_dsm.api.storage.storage import SynoStorage from synology_dsm.api.storage.storage import SynoStorage
@ -17,10 +16,10 @@ from homeassistant.const import CONF_DISKS
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import SynoApi from . import SynoApi
from .const import DOMAIN from .const import DOMAIN
from .coordinator import SynologyDSMCentralUpdateCoordinator
from .entity import ( from .entity import (
SynologyDSMBaseEntity, SynologyDSMBaseEntity,
SynologyDSMDeviceEntity, SynologyDSMDeviceEntity,
@ -89,7 +88,9 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class SynoDSMBinarySensor(SynologyDSMBaseEntity, BinarySensorEntity): class SynoDSMBinarySensor(
SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], BinarySensorEntity
):
"""Mixin for binary sensor specific attributes.""" """Mixin for binary sensor specific attributes."""
entity_description: SynologyDSMBinarySensorEntityDescription entity_description: SynologyDSMBinarySensorEntityDescription
@ -97,7 +98,7 @@ class SynoDSMBinarySensor(SynologyDSMBaseEntity, BinarySensorEntity):
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMBinarySensorEntityDescription, description: SynologyDSMBinarySensorEntityDescription,
) -> None: ) -> None:
"""Initialize the Synology DSM binary_sensor entity.""" """Initialize the Synology DSM binary_sensor entity."""
@ -131,7 +132,7 @@ class SynoDSMStorageBinarySensor(SynologyDSMDeviceEntity, SynoDSMBinarySensor):
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMBinarySensorEntityDescription, description: SynologyDSMBinarySensorEntityDescription,
device_id: str | None = None, device_id: str | None = None,
) -> None: ) -> None:

View File

@ -20,7 +20,6 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import SynoApi from . import SynoApi
from .const import ( from .const import (
@ -29,6 +28,7 @@ from .const import (
DOMAIN, DOMAIN,
SIGNAL_CAMERA_SOURCE_CHANGED, SIGNAL_CAMERA_SOURCE_CHANGED,
) )
from .coordinator import SynologyDSMCameraUpdateCoordinator
from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
from .models import SynologyDSMData from .models import SynologyDSMData
@ -54,17 +54,16 @@ async def async_setup_entry(
) )
class SynoDSMCamera(SynologyDSMBaseEntity, Camera): class SynoDSMCamera(SynologyDSMBaseEntity[SynologyDSMCameraUpdateCoordinator], Camera):
"""Representation a Synology camera.""" """Representation a Synology camera."""
_attr_supported_features = CameraEntityFeature.STREAM _attr_supported_features = CameraEntityFeature.STREAM
coordinator: DataUpdateCoordinator[dict[str, dict[str, SynoCamera]]]
entity_description: SynologyDSMCameraEntityDescription entity_description: SynologyDSMCameraEntityDescription
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, SynoCamera]]], coordinator: SynologyDSMCameraUpdateCoordinator,
camera_id: str, camera_id: str,
) -> None: ) -> None:
"""Initialize a Synology camera.""" """Initialize a Synology camera."""

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from datetime import timedelta from datetime import timedelta
import logging import logging
from typing import Any from typing import Any, TypeVar
import async_timeout import async_timeout
from synology_dsm.api.surveillance_station.camera import SynoCamera from synology_dsm.api.surveillance_station.camera import SynoCamera
@ -23,9 +23,10 @@ from .const import (
) )
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
_DataT = TypeVar("_DataT")
class SynologyDSMUpdateCoordinator(DataUpdateCoordinator): class SynologyDSMUpdateCoordinator(DataUpdateCoordinator[_DataT]):
"""DataUpdateCoordinator base class for synology_dsm.""" """DataUpdateCoordinator base class for synology_dsm."""
def __init__( def __init__(
@ -46,7 +47,9 @@ class SynologyDSMUpdateCoordinator(DataUpdateCoordinator):
) )
class SynologyDSMSwitchUpdateCoordinator(SynologyDSMUpdateCoordinator): class SynologyDSMSwitchUpdateCoordinator(
SynologyDSMUpdateCoordinator[dict[str, dict[str, Any]]]
):
"""DataUpdateCoordinator to gather data for a synology_dsm switch devices.""" """DataUpdateCoordinator to gather data for a synology_dsm switch devices."""
def __init__( def __init__(
@ -78,7 +81,7 @@ class SynologyDSMSwitchUpdateCoordinator(SynologyDSMUpdateCoordinator):
} }
class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator): class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator[None]):
"""DataUpdateCoordinator to gather data for a synology_dsm central device.""" """DataUpdateCoordinator to gather data for a synology_dsm central device."""
def __init__( def __init__(
@ -106,7 +109,9 @@ class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator):
return None return None
class SynologyDSMCameraUpdateCoordinator(SynologyDSMUpdateCoordinator): class SynologyDSMCameraUpdateCoordinator(
SynologyDSMUpdateCoordinator[dict[str, dict[str, SynoCamera]]]
):
"""DataUpdateCoordinator to gather data for a synology_dsm cameras.""" """DataUpdateCoordinator to gather data for a synology_dsm cameras."""
def __init__( def __init__(

View File

@ -2,16 +2,19 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any, TypeVar
from homeassistant.helpers.entity import DeviceInfo, EntityDescription from homeassistant.helpers.entity import DeviceInfo, EntityDescription
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import CoordinatorEntity
CoordinatorEntity,
DataUpdateCoordinator,
)
from .common import SynoApi from .common import SynoApi
from .const import ATTRIBUTION, DOMAIN from .const import ATTRIBUTION, DOMAIN
from .coordinator import (
SynologyDSMCentralUpdateCoordinator,
SynologyDSMUpdateCoordinator,
)
_CoordinatorT = TypeVar("_CoordinatorT", bound=SynologyDSMUpdateCoordinator[Any])
@dataclass @dataclass
@ -26,9 +29,7 @@ class SynologyDSMEntityDescription(EntityDescription, SynologyDSMRequiredKeysMix
"""Generic Synology DSM entity description.""" """Generic Synology DSM entity description."""
class SynologyDSMBaseEntity( class SynologyDSMBaseEntity(CoordinatorEntity[_CoordinatorT]):
CoordinatorEntity[DataUpdateCoordinator[dict[str, dict[str, Any]]]]
):
"""Representation of a Synology NAS entry.""" """Representation of a Synology NAS entry."""
entity_description: SynologyDSMEntityDescription entity_description: SynologyDSMEntityDescription
@ -38,7 +39,7 @@ class SynologyDSMBaseEntity(
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: _CoordinatorT,
description: SynologyDSMEntityDescription, description: SynologyDSMEntityDescription,
) -> None: ) -> None:
"""Initialize the Synology DSM entity.""" """Initialize the Synology DSM entity."""
@ -67,13 +68,15 @@ class SynologyDSMBaseEntity(
await super().async_added_to_hass() await super().async_added_to_hass()
class SynologyDSMDeviceEntity(SynologyDSMBaseEntity): class SynologyDSMDeviceEntity(
SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator]
):
"""Representation of a Synology NAS disk or volume entry.""" """Representation of a Synology NAS disk or volume entry."""
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMEntityDescription, description: SynologyDSMEntityDescription,
device_id: str | None = None, device_id: str | None = None,
) -> None: ) -> None:

View File

@ -26,11 +26,11 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.util.dt import utcnow from homeassistant.util.dt import utcnow
from . import SynoApi from . import SynoApi
from .const import CONF_VOLUMES, DOMAIN, ENTITY_UNIT_LOAD from .const import CONF_VOLUMES, DOMAIN, ENTITY_UNIT_LOAD
from .coordinator import SynologyDSMCentralUpdateCoordinator
from .entity import ( from .entity import (
SynologyDSMBaseEntity, SynologyDSMBaseEntity,
SynologyDSMDeviceEntity, SynologyDSMDeviceEntity,
@ -328,7 +328,9 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class SynoDSMSensor(SynologyDSMBaseEntity, SensorEntity): class SynoDSMSensor(
SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], SensorEntity
):
"""Mixin for sensor specific attributes.""" """Mixin for sensor specific attributes."""
entity_description: SynologyDSMSensorEntityDescription entity_description: SynologyDSMSensorEntityDescription
@ -336,7 +338,7 @@ class SynoDSMSensor(SynologyDSMBaseEntity, SensorEntity):
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMSensorEntityDescription, description: SynologyDSMSensorEntityDescription,
) -> None: ) -> None:
"""Initialize the Synology DSM sensor entity.""" """Initialize the Synology DSM sensor entity."""
@ -383,7 +385,7 @@ class SynoDSMStorageSensor(SynologyDSMDeviceEntity, SynoDSMSensor):
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMSensorEntityDescription, description: SynologyDSMSensorEntityDescription,
device_id: str | None = None, device_id: str | None = None,
) -> None: ) -> None:
@ -410,7 +412,7 @@ class SynoDSMInfoSensor(SynoDSMSensor):
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], coordinator: SynologyDSMCentralUpdateCoordinator,
description: SynologyDSMSensorEntityDescription, description: SynologyDSMSensorEntityDescription,
) -> None: ) -> None:
"""Initialize the Synology SynoDSMInfoSensor entity.""" """Initialize the Synology SynoDSMInfoSensor entity."""

View File

@ -12,10 +12,10 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import SynoApi from . import SynoApi
from .const import DOMAIN from .const import DOMAIN
from .coordinator import SynologyDSMSwitchUpdateCoordinator
from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
from .models import SynologyDSMData from .models import SynologyDSMData
@ -54,17 +54,18 @@ async def async_setup_entry(
) )
class SynoDSMSurveillanceHomeModeToggle(SynologyDSMBaseEntity, SwitchEntity): class SynoDSMSurveillanceHomeModeToggle(
SynologyDSMBaseEntity[SynologyDSMSwitchUpdateCoordinator], SwitchEntity
):
"""Representation a Synology Surveillance Station Home Mode toggle.""" """Representation a Synology Surveillance Station Home Mode toggle."""
coordinator: DataUpdateCoordinator[dict[str, dict[str, bool]]]
entity_description: SynologyDSMSwitchEntityDescription entity_description: SynologyDSMSwitchEntityDescription
def __init__( def __init__(
self, self,
api: SynoApi, api: SynoApi,
version: str, version: str,
coordinator: DataUpdateCoordinator[dict[str, dict[str, bool]]], coordinator: SynologyDSMSwitchUpdateCoordinator,
description: SynologyDSMSwitchEntityDescription, description: SynologyDSMSwitchEntityDescription,
) -> None: ) -> None:
"""Initialize a Synology Surveillance Station Home Mode.""" """Initialize a Synology Surveillance Station Home Mode."""
@ -78,7 +79,7 @@ class SynoDSMSurveillanceHomeModeToggle(SynologyDSMBaseEntity, SwitchEntity):
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
"""Return the state.""" """Return the state."""
return self.coordinator.data["switches"][self.entity_description.key] return self.coordinator.data["switches"][self.entity_description.key] # type: ignore[no-any-return]
async def async_turn_on(self, **kwargs: Any) -> None: async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn on Home mode.""" """Turn on Home mode."""

View File

@ -14,6 +14,7 @@ from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN from .const import DOMAIN
from .coordinator import SynologyDSMCentralUpdateCoordinator
from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
from .models import SynologyDSMData from .models import SynologyDSMData
@ -46,7 +47,9 @@ async def async_setup_entry(
) )
class SynoDSMUpdateEntity(SynologyDSMBaseEntity, UpdateEntity): class SynoDSMUpdateEntity(
SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], UpdateEntity
):
"""Mixin for update entity specific attributes.""" """Mixin for update entity specific attributes."""
entity_description: SynologyDSMUpdateEntityEntityDescription entity_description: SynologyDSMUpdateEntityEntityDescription