11"""Base class for Ring entity."""
22
33from collections .abc import Callable
4- from typing import Any , Concatenate , ParamSpec , TypeVar
4+ from typing import Any , Concatenate , Generic , ParamSpec , cast
55
66from ring_doorbell import (
77 AuthenticationError ,
1010 RingGeneric ,
1111 RingTimeout ,
1212)
13+ from typing_extensions import TypeVar
1314
1415from homeassistant .core import callback
1516from homeassistant .exceptions import HomeAssistantError
1920from .const import ATTRIBUTION , DOMAIN
2021from .coordinator import RingDataCoordinator , RingNotificationsCoordinator
2122
23+ RingDeviceT = TypeVar ("RingDeviceT" , bound = RingGeneric , default = RingGeneric )
24+
2225_RingCoordinatorT = TypeVar (
2326 "_RingCoordinatorT" ,
2427 bound = (RingDataCoordinator | RingNotificationsCoordinator ),
2528)
26- _RingBaseEntityT = TypeVar ("_RingBaseEntityT" , bound = "RingBaseEntity[Any]" )
29+ _RingBaseEntityT = TypeVar ("_RingBaseEntityT" , bound = "RingBaseEntity[Any, Any ]" )
2730_R = TypeVar ("_R" )
2831_P = ParamSpec ("_P" )
2932
@@ -53,7 +56,9 @@ def _wrap(self: _RingBaseEntityT, *args: _P.args, **kwargs: _P.kwargs) -> _R:
5356 return _wrap
5457
5558
56- class RingBaseEntity (CoordinatorEntity [_RingCoordinatorT ]):
59+ class RingBaseEntity (
60+ CoordinatorEntity [_RingCoordinatorT ], Generic [_RingCoordinatorT , RingDeviceT ]
61+ ):
5762 """Base implementation for Ring device."""
5863
5964 _attr_attribution = ATTRIBUTION
@@ -62,7 +67,7 @@ class RingBaseEntity(CoordinatorEntity[_RingCoordinatorT]):
6267
6368 def __init__ (
6469 self ,
65- device : RingGeneric ,
70+ device : RingDeviceT ,
6671 coordinator : _RingCoordinatorT ,
6772 ) -> None :
6873 """Initialize a sensor for Ring device."""
@@ -77,15 +82,16 @@ def __init__(
7782 )
7883
7984
80- class RingEntity (RingBaseEntity [RingDataCoordinator ]):
85+ class RingEntity (RingBaseEntity [RingDataCoordinator , RingDeviceT ]):
8186 """Implementation for Ring devices."""
8287
8388 def _get_coordinator_data (self ) -> RingDevices :
8489 return self .coordinator .data
8590
8691 @callback
8792 def _handle_coordinator_update (self ) -> None :
88- self ._device = self ._get_coordinator_data ().get_device (
89- self ._device .device_api_id
93+ self ._device = cast (
94+ RingDeviceT ,
95+ self ._get_coordinator_data ().get_device (self ._device .device_api_id ),
9096 )
9197 super ()._handle_coordinator_update ()
0 commit comments