Enable strict typing for amberelectric (#106817)

This commit is contained in:
Marc Mueller 2024-01-01 20:35:34 +01:00 committed by GitHub
parent c5c132e1d4
commit 3b0d877b5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 19 deletions

View File

@ -61,6 +61,7 @@ homeassistant.components.alert.*
homeassistant.components.alexa.*
homeassistant.components.alpha_vantage.*
homeassistant.components.amazon_polly.*
homeassistant.components.amberelectric.*
homeassistant.components.ambient_station.*
homeassistant.components.amcrest.*
homeassistant.components.ampio.*

View File

@ -2,7 +2,6 @@
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from homeassistant.components.binary_sensor import (
@ -45,14 +44,14 @@ class AmberPriceGridSensor(
@property
def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
return self.coordinator.data["grid"][self.entity_description.key]
return self.coordinator.data["grid"][self.entity_description.key] # type: ignore[no-any-return]
class AmberPriceSpikeBinarySensor(AmberPriceGridSensor):
"""Sensor to show single grid binary values."""
@property
def icon(self):
def icon(self) -> str:
"""Return the sensor icon."""
status = self.coordinator.data["grid"]["price_spike"]
return PRICE_SPIKE_ICONS[status]
@ -60,10 +59,10 @@ class AmberPriceSpikeBinarySensor(AmberPriceGridSensor):
@property
def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
return self.coordinator.data["grid"]["price_spike"] == "spike"
return self.coordinator.data["grid"]["price_spike"] == "spike" # type: ignore[no-any-return]
@property
def extra_state_attributes(self) -> Mapping[str, Any] | None:
def extra_state_attributes(self) -> dict[str, Any]:
"""Return additional pieces of information about the price spike."""
spike_status = self.coordinator.data["grid"]["price_spike"]
@ -80,10 +79,10 @@ async def async_setup_entry(
"""Set up a config entry."""
coordinator: AmberUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
entities: list = []
price_spike_description = BinarySensorEntityDescription(
key="price_spike",
name=f"{entry.title} - Price Spike",
)
entities.append(AmberPriceSpikeBinarySensor(coordinator, price_spike_description))
async_add_entities(entities)
async_add_entities(
[AmberPriceSpikeBinarySensor(coordinator, price_spike_description)]
)

View File

@ -28,10 +28,10 @@ class AmberElectricConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
def _fetch_sites(self, token: str) -> list[Site] | None:
configuration = amberelectric.Configuration(access_token=token)
api = amber_api.AmberApi.create(configuration)
api: amber_api.AmberApi = amber_api.AmberApi.create(configuration)
try:
sites = api.get_sites()
sites: list[Site] = api.get_sites()
if len(sites) == 0:
self._errors[CONF_API_TOKEN] = "no_site"
return None

View File

@ -30,19 +30,19 @@ def is_forecast(interval: ActualInterval | CurrentInterval | ForecastInterval) -
def is_general(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is on the general channel."""
return interval.channel_type == ChannelType.GENERAL
return interval.channel_type == ChannelType.GENERAL # type: ignore[no-any-return]
def is_controlled_load(
interval: ActualInterval | CurrentInterval | ForecastInterval,
) -> bool:
"""Return true if the supplied interval is on the controlled load channel."""
return interval.channel_type == ChannelType.CONTROLLED_LOAD
return interval.channel_type == ChannelType.CONTROLLED_LOAD # type: ignore[no-any-return]
def is_feed_in(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is on the feed in channel."""
return interval.channel_type == ChannelType.FEED_IN
return interval.channel_type == ChannelType.FEED_IN # type: ignore[no-any-return]
def normalize_descriptor(descriptor: Descriptor) -> str | None:

View File

@ -7,7 +7,6 @@
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from amberelectric.model.channel import ChannelType
@ -86,7 +85,7 @@ class AmberPriceSensor(AmberSensor):
return format_cents_to_dollars(interval.per_kwh)
@property
def extra_state_attributes(self) -> Mapping[str, Any] | None:
def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return additional pieces of information about the price."""
interval = self.coordinator.data[self.entity_description.key][self.channel_type]
@ -133,7 +132,7 @@ class AmberForecastSensor(AmberSensor):
return format_cents_to_dollars(interval.per_kwh)
@property
def extra_state_attributes(self) -> Mapping[str, Any] | None:
def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return additional pieces of information about the price."""
intervals = self.coordinator.data[self.entity_description.key].get(
self.channel_type
@ -177,7 +176,7 @@ class AmberPriceDescriptorSensor(AmberSensor):
@property
def native_value(self) -> str | None:
"""Return the current price descriptor."""
return self.coordinator.data[self.entity_description.key][self.channel_type]
return self.coordinator.data[self.entity_description.key][self.channel_type] # type: ignore[no-any-return]
class AmberGridSensor(CoordinatorEntity[AmberUpdateCoordinator], SensorEntity):
@ -199,7 +198,7 @@ class AmberGridSensor(CoordinatorEntity[AmberUpdateCoordinator], SensorEntity):
@property
def native_value(self) -> str | None:
"""Return the value of the sensor."""
return self.coordinator.data["grid"][self.entity_description.key]
return self.coordinator.data["grid"][self.entity_description.key] # type: ignore[no-any-return]
async def async_setup_entry(
@ -213,7 +212,7 @@ async def async_setup_entry(
current: dict[str, CurrentInterval] = coordinator.data["current"]
forecasts: dict[str, list[ForecastInterval]] = coordinator.data["forecasts"]
entities: list = []
entities: list[SensorEntity] = []
for channel_type in current:
description = SensorEntityDescription(
key="current",

View File

@ -370,6 +370,16 @@ disallow_untyped_defs = true
warn_return_any = true
warn_unreachable = true
[mypy-homeassistant.components.amberelectric.*]
check_untyped_defs = true
disallow_incomplete_defs = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_decorators = true
disallow_untyped_defs = true
warn_return_any = true
warn_unreachable = true
[mypy-homeassistant.components.ambient_station.*]
check_untyped_defs = true
disallow_incomplete_defs = true