Improve CoordinatorWeatherEntity generic typing (#116760)

This commit is contained in:
Marc Mueller 2024-05-04 14:02:23 +02:00 committed by GitHub
parent 8238cd9f22
commit f9d95efac0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 34 deletions

View File

@ -31,7 +31,6 @@ from homeassistant.const import (
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import TimestampDataUpdateCoordinator
from homeassistant.util.dt import utc_from_timestamp
from . import AccuWeatherData
@ -65,8 +64,6 @@ class AccuWeatherEntity(
CoordinatorWeatherEntity[
AccuWeatherObservationDataUpdateCoordinator,
AccuWeatherDailyForecastDataUpdateCoordinator,
TimestampDataUpdateCoordinator,
TimestampDataUpdateCoordinator,
]
):
"""Define an AccuWeather entity."""

View File

@ -91,8 +91,6 @@ class MetOfficeWeather(
CoordinatorWeatherEntity[
TimestampDataUpdateCoordinator[MetOfficeData],
TimestampDataUpdateCoordinator[MetOfficeData],
TimestampDataUpdateCoordinator[MetOfficeData],
TimestampDataUpdateCoordinator[MetOfficeData], # Can be removed in Python 3.12
]
):
"""Implementation of a Met Office weather condition."""

View File

@ -35,6 +35,7 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import TimestampDataUpdateCoordinator
from homeassistant.util.unit_conversion import SpeedConverter, TemperatureConverter
from . import NWSData, base_unique_id, device_info
@ -110,7 +111,7 @@ def _calculate_unique_id(entry_data: MappingProxyType[str, Any], mode: str) -> s
return f"{base_unique_id(latitude, longitude)}_{mode}"
class NWSWeather(CoordinatorWeatherEntity):
class NWSWeather(CoordinatorWeatherEntity[TimestampDataUpdateCoordinator[None]]):
"""Representation of a weather condition."""
_attr_attribution = ATTRIBUTION

View File

@ -8,18 +8,9 @@ from contextlib import suppress
from datetime import timedelta
from functools import cached_property, partial
import logging
from typing import (
Any,
Final,
Generic,
Literal,
Required,
TypedDict,
TypeVar,
cast,
final,
)
from typing import Any, Final, Generic, Literal, Required, TypedDict, cast, final
from typing_extensions import TypeVar
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry
@ -137,21 +128,25 @@ LEGACY_SERVICE_GET_FORECAST: Final = "get_forecast"
SERVICE_GET_FORECASTS: Final = "get_forecasts"
_ObservationUpdateCoordinatorT = TypeVar(
"_ObservationUpdateCoordinatorT", bound="DataUpdateCoordinator[Any]"
"_ObservationUpdateCoordinatorT",
bound=DataUpdateCoordinator[Any],
default=DataUpdateCoordinator[dict[str, Any]],
)
# Note:
# Mypy bug https://github.com/python/mypy/issues/9424 prevents us from making the
# forecast cooordinators optional, bound=TimestampDataUpdateCoordinator[Any] | None
_DailyForecastUpdateCoordinatorT = TypeVar(
"_DailyForecastUpdateCoordinatorT", bound="TimestampDataUpdateCoordinator[Any]"
"_DailyForecastUpdateCoordinatorT",
bound=TimestampDataUpdateCoordinator[Any],
default=TimestampDataUpdateCoordinator[None],
)
_HourlyForecastUpdateCoordinatorT = TypeVar(
"_HourlyForecastUpdateCoordinatorT", bound="TimestampDataUpdateCoordinator[Any]"
"_HourlyForecastUpdateCoordinatorT",
bound=TimestampDataUpdateCoordinator[Any],
default=_DailyForecastUpdateCoordinatorT,
)
_TwiceDailyForecastUpdateCoordinatorT = TypeVar(
"_TwiceDailyForecastUpdateCoordinatorT", bound="TimestampDataUpdateCoordinator[Any]"
"_TwiceDailyForecastUpdateCoordinatorT",
bound=TimestampDataUpdateCoordinator[Any],
default=_DailyForecastUpdateCoordinatorT,
)
# mypy: disallow-any-generics
@ -1244,19 +1239,12 @@ class CoordinatorWeatherEntity(
class SingleCoordinatorWeatherEntity(
CoordinatorWeatherEntity[
_ObservationUpdateCoordinatorT,
TimestampDataUpdateCoordinator[None],
TimestampDataUpdateCoordinator[None],
TimestampDataUpdateCoordinator[None],
_ObservationUpdateCoordinatorT, TimestampDataUpdateCoordinator[None]
],
):
"""A class for weather entities using a single DataUpdateCoordinators.
This class is added as a convenience because:
- Deriving from CoordinatorWeatherEntity requires specifying all type parameters
until we upgrade to Python 3.12 which supports defaults
- Mypy bug https://github.com/python/mypy/issues/9424 prevents us from making the
forecast cooordinator type vars optional
This class is added as a convenience.
"""
def __init__(