Improve type hints in environment_canada sensors (#136813)

* Use TypeVar

* Use bound for TypeVar

* Remove PEP 695 syntax

* Add type alias to use new TypeVar syntax

---------

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
epenet 2025-01-29 11:31:54 +01:00 committed by GitHub
parent 5e6f4a374e
commit bfa7eaa221
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 11 deletions

View File

@ -19,6 +19,7 @@ from .const import DOMAIN
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type ECConfigEntry = ConfigEntry[ECRuntimeData] type ECConfigEntry = ConfigEntry[ECRuntimeData]
type ECDataType = ECAirQuality | ECRadar | ECWeather
@dataclass @dataclass
@ -30,16 +31,16 @@ class ECRuntimeData:
weather_coordinator: ECDataUpdateCoordinator[ECWeather] weather_coordinator: ECDataUpdateCoordinator[ECWeather]
class ECDataUpdateCoordinator[_ECDataTypeT: ECAirQuality | ECRadar | ECWeather]( class ECDataUpdateCoordinator[DataT: ECDataType](DataUpdateCoordinator[DataT]):
DataUpdateCoordinator[_ECDataTypeT]
):
"""Class to manage fetching EC data.""" """Class to manage fetching EC data."""
config_entry: ECConfigEntry
def __init__( def __init__(
self, self,
hass: HomeAssistant, hass: HomeAssistant,
entry: ECConfigEntry, entry: ECConfigEntry,
ec_data: _ECDataTypeT, ec_data: DataT,
name: str, name: str,
update_interval: timedelta, update_interval: timedelta,
) -> None: ) -> None:
@ -60,7 +61,7 @@ class ECDataUpdateCoordinator[_ECDataTypeT: ECAirQuality | ECRadar | ECWeather](
configuration_url="https://weather.gc.ca/", configuration_url="https://weather.gc.ca/",
) )
async def _async_update_data(self) -> _ECDataTypeT: async def _async_update_data(self) -> DataT:
"""Fetch data from EC.""" """Fetch data from EC."""
try: try:
await self.ec_data.update() await self.ec_data.update()

View File

@ -6,6 +6,8 @@ from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from env_canada import ECWeather
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
SensorDeviceClass, SensorDeviceClass,
SensorEntity, SensorEntity,
@ -27,7 +29,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import ATTR_STATION from .const import ATTR_STATION
from .coordinator import ECConfigEntry from .coordinator import ECConfigEntry, ECDataType, ECDataUpdateCoordinator
ATTR_TIME = "alert time" ATTR_TIME = "alert time"
@ -268,13 +270,19 @@ async def async_setup_entry(
async_add_entities(sensors) async_add_entities(sensors)
class ECBaseSensorEntity(CoordinatorEntity, SensorEntity): class ECBaseSensorEntity[DataT: ECDataType](
CoordinatorEntity[ECDataUpdateCoordinator[DataT]], SensorEntity
):
"""Environment Canada sensor base.""" """Environment Canada sensor base."""
entity_description: ECSensorEntityDescription entity_description: ECSensorEntityDescription
_attr_has_entity_name = True _attr_has_entity_name = True
def __init__(self, coordinator, description): def __init__(
self,
coordinator: ECDataUpdateCoordinator[DataT],
description: ECSensorEntityDescription,
) -> None:
"""Initialize the base sensor.""" """Initialize the base sensor."""
super().__init__(coordinator) super().__init__(coordinator)
self.entity_description = description self.entity_description = description
@ -292,10 +300,14 @@ class ECBaseSensorEntity(CoordinatorEntity, SensorEntity):
return value return value
class ECSensorEntity(ECBaseSensorEntity): class ECSensorEntity[DataT: ECDataType](ECBaseSensorEntity[DataT]):
"""Environment Canada sensor for conditions.""" """Environment Canada sensor for conditions."""
def __init__(self, coordinator, description): def __init__(
self,
coordinator: ECDataUpdateCoordinator[DataT],
description: ECSensorEntityDescription,
) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__(coordinator, description) super().__init__(coordinator, description)
self._attr_extra_state_attributes = { self._attr_extra_state_attributes = {
@ -304,7 +316,7 @@ class ECSensorEntity(ECBaseSensorEntity):
} }
class ECAlertSensorEntity(ECBaseSensorEntity): class ECAlertSensorEntity(ECBaseSensorEntity[ECWeather]):
"""Environment Canada sensor for alerts.""" """Environment Canada sensor for alerts."""
@property @property