Use PEP 695 TypeVar syntax for ecovacs (#147153)

This commit is contained in:
Marc Mueller 2025-06-20 10:41:25 +02:00 committed by GitHub
parent 96e0d1f5c6
commit 3c91c78383
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 22 additions and 31 deletions

View File

@ -2,9 +2,9 @@
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Generic
from deebot_client.capabilities import CapabilityEvent from deebot_client.capabilities import CapabilityEvent
from deebot_client.events.base import Event
from deebot_client.events.water_info import MopAttachedEvent from deebot_client.events.water_info import MopAttachedEvent
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
@ -16,15 +16,14 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import EcovacsConfigEntry from . import EcovacsConfigEntry
from .entity import EcovacsCapabilityEntityDescription, EcovacsDescriptionEntity, EventT from .entity import EcovacsCapabilityEntityDescription, EcovacsDescriptionEntity
from .util import get_supported_entities from .util import get_supported_entities
@dataclass(kw_only=True, frozen=True) @dataclass(kw_only=True, frozen=True)
class EcovacsBinarySensorEntityDescription( class EcovacsBinarySensorEntityDescription[EventT: Event](
BinarySensorEntityDescription, BinarySensorEntityDescription,
EcovacsCapabilityEntityDescription, EcovacsCapabilityEntityDescription,
Generic[EventT],
): ):
"""Class describing Deebot binary sensor entity.""" """Class describing Deebot binary sensor entity."""
@ -55,7 +54,7 @@ async def async_setup_entry(
) )
class EcovacsBinarySensor( class EcovacsBinarySensor[EventT: Event](
EcovacsDescriptionEntity[CapabilityEvent[EventT]], EcovacsDescriptionEntity[CapabilityEvent[EventT]],
BinarySensorEntity, BinarySensorEntity,
): ):

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Callable, Coroutine from collections.abc import Callable, Coroutine
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Generic, TypeVar from typing import Any
from deebot_client.capabilities import Capabilities from deebot_client.capabilities import Capabilities
from deebot_client.device import Device from deebot_client.device import Device
@ -18,11 +18,8 @@ from homeassistant.helpers.entity import Entity, EntityDescription
from .const import DOMAIN from .const import DOMAIN
CapabilityEntity = TypeVar("CapabilityEntity")
EventT = TypeVar("EventT", bound=Event)
class EcovacsEntity[CapabilityEntityT](Entity):
class EcovacsEntity(Entity, Generic[CapabilityEntity]):
"""Ecovacs entity.""" """Ecovacs entity."""
_attr_should_poll = False _attr_should_poll = False
@ -32,7 +29,7 @@ class EcovacsEntity(Entity, Generic[CapabilityEntity]):
def __init__( def __init__(
self, self,
device: Device, device: Device,
capability: CapabilityEntity, capability: CapabilityEntityT,
**kwargs: Any, **kwargs: Any,
) -> None: ) -> None:
"""Initialize entity.""" """Initialize entity."""
@ -80,7 +77,7 @@ class EcovacsEntity(Entity, Generic[CapabilityEntity]):
self._subscribe(AvailabilityEvent, on_available) self._subscribe(AvailabilityEvent, on_available)
def _subscribe( def _subscribe[EventT: Event](
self, self,
event_type: type[EventT], event_type: type[EventT],
callback: Callable[[EventT], Coroutine[Any, Any, None]], callback: Callable[[EventT], Coroutine[Any, Any, None]],
@ -98,13 +95,13 @@ class EcovacsEntity(Entity, Generic[CapabilityEntity]):
self._device.events.request_refresh(event_type) self._device.events.request_refresh(event_type)
class EcovacsDescriptionEntity(EcovacsEntity[CapabilityEntity]): class EcovacsDescriptionEntity[CapabilityEntityT](EcovacsEntity[CapabilityEntityT]):
"""Ecovacs entity.""" """Ecovacs entity."""
def __init__( def __init__(
self, self,
device: Device, device: Device,
capability: CapabilityEntity, capability: CapabilityEntityT,
entity_description: EntityDescription, entity_description: EntityDescription,
**kwargs: Any, **kwargs: Any,
) -> None: ) -> None:
@ -114,13 +111,12 @@ class EcovacsDescriptionEntity(EcovacsEntity[CapabilityEntity]):
@dataclass(kw_only=True, frozen=True) @dataclass(kw_only=True, frozen=True)
class EcovacsCapabilityEntityDescription( class EcovacsCapabilityEntityDescription[CapabilityEntityT](
EntityDescription, EntityDescription,
Generic[CapabilityEntity],
): ):
"""Ecovacs entity description.""" """Ecovacs entity description."""
capability_fn: Callable[[Capabilities], CapabilityEntity | None] capability_fn: Callable[[Capabilities], CapabilityEntityT | None]
class EcovacsLegacyEntity(Entity): class EcovacsLegacyEntity(Entity):

View File

@ -4,10 +4,10 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Generic
from deebot_client.capabilities import CapabilitySet from deebot_client.capabilities import CapabilitySet
from deebot_client.events import CleanCountEvent, CutDirectionEvent, VolumeEvent from deebot_client.events import CleanCountEvent, CutDirectionEvent, VolumeEvent
from deebot_client.events.base import Event
from homeassistant.components.number import ( from homeassistant.components.number import (
NumberEntity, NumberEntity,
@ -23,16 +23,14 @@ from .entity import (
EcovacsCapabilityEntityDescription, EcovacsCapabilityEntityDescription,
EcovacsDescriptionEntity, EcovacsDescriptionEntity,
EcovacsEntity, EcovacsEntity,
EventT,
) )
from .util import get_supported_entities from .util import get_supported_entities
@dataclass(kw_only=True, frozen=True) @dataclass(kw_only=True, frozen=True)
class EcovacsNumberEntityDescription( class EcovacsNumberEntityDescription[EventT: Event](
NumberEntityDescription, NumberEntityDescription,
EcovacsCapabilityEntityDescription, EcovacsCapabilityEntityDescription,
Generic[EventT],
): ):
"""Ecovacs number entity description.""" """Ecovacs number entity description."""
@ -94,7 +92,7 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class EcovacsNumberEntity( class EcovacsNumberEntity[EventT: Event](
EcovacsDescriptionEntity[CapabilitySet[EventT, [int]]], EcovacsDescriptionEntity[CapabilitySet[EventT, [int]]],
NumberEntity, NumberEntity,
): ):

View File

@ -2,11 +2,12 @@
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Generic from typing import Any
from deebot_client.capabilities import CapabilitySetTypes from deebot_client.capabilities import CapabilitySetTypes
from deebot_client.device import Device from deebot_client.device import Device
from deebot_client.events import WorkModeEvent from deebot_client.events import WorkModeEvent
from deebot_client.events.base import Event
from deebot_client.events.water_info import WaterAmountEvent from deebot_client.events.water_info import WaterAmountEvent
from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.components.select import SelectEntity, SelectEntityDescription
@ -15,15 +16,14 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import EcovacsConfigEntry from . import EcovacsConfigEntry
from .entity import EcovacsCapabilityEntityDescription, EcovacsDescriptionEntity, EventT from .entity import EcovacsCapabilityEntityDescription, EcovacsDescriptionEntity
from .util import get_name_key, get_supported_entities from .util import get_name_key, get_supported_entities
@dataclass(kw_only=True, frozen=True) @dataclass(kw_only=True, frozen=True)
class EcovacsSelectEntityDescription( class EcovacsSelectEntityDescription[EventT: Event](
SelectEntityDescription, SelectEntityDescription,
EcovacsCapabilityEntityDescription, EcovacsCapabilityEntityDescription,
Generic[EventT],
): ):
"""Ecovacs select entity description.""" """Ecovacs select entity description."""
@ -66,7 +66,7 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class EcovacsSelectEntity( class EcovacsSelectEntity[EventT: Event](
EcovacsDescriptionEntity[CapabilitySetTypes[EventT, [str], str]], EcovacsDescriptionEntity[CapabilitySetTypes[EventT, [str], str]],
SelectEntity, SelectEntity,
): ):

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Generic from typing import Any
from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan, DeviceType from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan, DeviceType
from deebot_client.device import Device from deebot_client.device import Device
@ -46,16 +46,14 @@ from .entity import (
EcovacsDescriptionEntity, EcovacsDescriptionEntity,
EcovacsEntity, EcovacsEntity,
EcovacsLegacyEntity, EcovacsLegacyEntity,
EventT,
) )
from .util import get_name_key, get_options, get_supported_entities from .util import get_name_key, get_options, get_supported_entities
@dataclass(kw_only=True, frozen=True) @dataclass(kw_only=True, frozen=True)
class EcovacsSensorEntityDescription( class EcovacsSensorEntityDescription[EventT: Event](
EcovacsCapabilityEntityDescription, EcovacsCapabilityEntityDescription,
SensorEntityDescription, SensorEntityDescription,
Generic[EventT],
): ):
"""Ecovacs sensor entity description.""" """Ecovacs sensor entity description."""