diff --git a/homeassistant/components/accuweather/weather.py b/homeassistant/components/accuweather/weather.py index 4d248a06ac3..576b77ee0cb 100644 --- a/homeassistant/components/accuweather/weather.py +++ b/homeassistant/components/accuweather/weather.py @@ -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.""" diff --git a/homeassistant/components/metoffice/weather.py b/homeassistant/components/metoffice/weather.py index 33fec874611..5eeddee8dd4 100644 --- a/homeassistant/components/metoffice/weather.py +++ b/homeassistant/components/metoffice/weather.py @@ -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.""" diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index c017d579c3a..f25998f1504 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -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 diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index c92c5d232ba..048e969b238 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -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__(