Add override decorators

Cross checked with mypy's explicit-override optional error code enabled.
This commit is contained in:
Ville Skyttä 2025-07-27 09:58:51 +03:00
parent 427e5d81df
commit 942cbc6051
9 changed files with 67 additions and 5 deletions

View File

@ -3,7 +3,7 @@
from __future__ import annotations
import logging
from typing import Any
from typing import Any, override
from huawei_lte_api.enums.cradle import ConnectionStatusEnum
@ -59,9 +59,11 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit
_raw_state: str | None = None
@property
@override
def _device_unique_id(self) -> str:
return f"{self.key}.{self.item}"
@override
async def async_added_to_hass(self) -> None:
"""Subscribe to needed data on add."""
await super().async_added_to_hass()
@ -69,6 +71,7 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit
f"{BINARY_SENSOR_DOMAIN}/{self.item}"
)
@override
async def async_will_remove_from_hass(self) -> None:
"""Unsubscribe from needed data on remove."""
await super().async_will_remove_from_hass()
@ -76,6 +79,7 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit
f"{BINARY_SENSOR_DOMAIN}/{self.item}"
)
@override
async def async_update(self) -> None:
"""Update state."""
try:
@ -111,6 +115,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor):
item = "ConnectionStatus"
@property
@override
def is_on(self) -> bool:
"""Return whether the binary sensor is on."""
return bool(
@ -120,6 +125,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor):
)
@property
@override
def assumed_state(self) -> bool:
"""Return True if real state is assumed, not known."""
return not self._raw_state or int(self._raw_state) not in (
@ -129,6 +135,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor):
)
@property
@override
def extra_state_attributes(self) -> dict[str, Any] | None:
"""Get additional attributes related to connection status."""
attributes = {}
@ -145,11 +152,13 @@ class HuaweiLteBaseWifiStatusBinarySensor(HuaweiLteBaseBinarySensor):
_attr_device_class = BinarySensorDeviceClass.CONNECTIVITY
@property
@override
def is_on(self) -> bool:
"""Return whether the binary sensor is on."""
return self._raw_state is not None and int(self._raw_state) == 1
@property
@override
def assumed_state(self) -> bool:
"""Return True if real state is assumed, not known."""
return self._raw_state is None
@ -191,11 +200,13 @@ class HuaweiLteSmsStorageFullBinarySensor(HuaweiLteBaseBinarySensor):
item = "SmsStorageFull"
@property
@override
def is_on(self) -> bool:
"""Return whether the binary sensor is on."""
return self._raw_state is not None and int(self._raw_state) != 0
@property
@override
def assumed_state(self) -> bool:
"""Return True if real state is assumed, not known."""
return self._raw_state is None

View File

@ -3,6 +3,7 @@
from __future__ import annotations
import logging
from typing import override
from huawei_lte_api.enums.device import ControlModeEnum
@ -40,13 +41,16 @@ class BaseButton(HuaweiLteBaseEntityWithDevice, ButtonEntity):
"""Huawei LTE button base class."""
@property
@override
def _device_unique_id(self) -> str:
"""Return unique ID for entity within a router."""
return f"button-{self.entity_description.key}"
@override
async def async_update(self) -> None:
"""Update is not necessary for button entities."""
@override
def press(self) -> None:
"""Press button."""
if self.router.suspended:
@ -74,6 +78,7 @@ class ClearTrafficStatisticsButton(BaseButton):
entity_category=EntityCategory.CONFIG,
)
@override
def _press(self) -> str:
"""Call clear traffic statistics endpoint."""
return self.router.client.monitoring.set_clear_traffic()
@ -92,6 +97,7 @@ class RestartButton(BaseButton):
entity_category=EntityCategory.CONFIG,
)
@override
def _press(self) -> str:
"""Call restart endpoint."""
return self.router.client.device.set_control(ControlModeEnum.REBOOT)

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Mapping
import logging
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING, Any, override
from urllib.parse import urlparse
from huawei_lte_api.Client import Client
@ -75,6 +75,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
@staticmethod
@callback
@override
def async_get_options_flow(
config_entry: ConfigEntry,
) -> HuaweiLteOptionsFlow:
@ -194,6 +195,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
except Exception:
_LOGGER.exception("Disconnect error")
@override
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
@ -272,6 +274,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
return self.async_create_entry(title=title, data=user_input)
@override
async def async_step_ssdp(
self, discovery_info: SsdpServiceInfo
) -> ConfigFlowResult:

View File

@ -4,7 +4,7 @@ from __future__ import annotations
import logging
import re
from typing import Any, cast
from typing import Any, cast, override
from stringcase import snakecase
@ -186,39 +186,47 @@ class HuaweiLteScannerEntity(HuaweiLteBaseEntity, ScannerEntity):
self._mac_address = mac_address
@property
@override
def name(self) -> str:
"""Return the name of the entity."""
return self.hostname or self.mac_address
@property
@override
def _device_unique_id(self) -> str:
return self.mac_address
@property
@override
def ip_address(self) -> str | None:
"""Return the primary ip address of the device."""
return self._ip_address
@property
@override
def mac_address(self) -> str:
"""Return the mac address of the device."""
return self._mac_address
@property
@override
def hostname(self) -> str | None:
"""Return hostname of the device."""
return self._hostname
@property
@override
def is_connected(self) -> bool:
"""Get whether the entity is connected."""
return self._is_connected
@property
@override
def extra_state_attributes(self) -> dict[str, Any]:
"""Get additional attributes related to entity state."""
return self._extra_state_attributes
@override
async def async_update(self) -> None:
"""Update state."""
if (hosts := _get_hosts(self.router)) is None:

View File

@ -3,6 +3,7 @@
from __future__ import annotations
from datetime import timedelta
from typing import override
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -31,11 +32,13 @@ class HuaweiLteBaseEntity(Entity):
raise NotImplementedError
@property
@override
def unique_id(self) -> str:
"""Return unique ID for entity."""
return f"{self.router.config_entry.unique_id}-{self._device_unique_id}"
@property
@override
def available(self) -> bool:
"""Return whether the entity is available."""
return self._available
@ -44,6 +47,7 @@ class HuaweiLteBaseEntity(Entity):
"""Update state."""
raise NotImplementedError
@override
async def async_added_to_hass(self) -> None:
"""Connect to update signals."""
self.async_on_remove(
@ -60,6 +64,7 @@ class HuaweiLteBaseEntityWithDevice(HuaweiLteBaseEntity):
"""Base entity with device info."""
@property
@override
def device_info(self) -> DeviceInfo:
"""Get info for matching with parent router."""
return DeviceInfo(

View File

@ -3,7 +3,7 @@
from __future__ import annotations
import logging
from typing import Any
from typing import Any, override
from huawei_lte_api.exceptions import ResponseErrorException
@ -41,6 +41,7 @@ class HuaweiLteSmsNotificationService(BaseNotificationService):
self.router = router
self.default_targets = default_targets
@override
def send_message(self, message: str = "", **kwargs: Any) -> None:
"""Send message to target numbers."""

View File

@ -6,6 +6,7 @@ from collections.abc import Callable
from dataclasses import dataclass
from functools import partial
import logging
from typing import override
from huawei_lte_api.enums.net import LTEBandEnum, NetworkBandEnum, NetworkModeEnum
@ -100,29 +101,35 @@ class HuaweiLteSelectEntity(HuaweiLteBaseEntityWithDevice, SelectEntity):
name = self.entity_description.name
self._attr_name = name or self.item
@override
def select_option(self, option: str) -> None:
"""Change the selected option."""
self.entity_description.setter_fn(option)
@property
@override
def current_option(self) -> str | None:
"""Return current option."""
return self._raw_state
@property
@override
def _device_unique_id(self) -> str:
return f"{self.key}.{self.item}"
@override
async def async_added_to_hass(self) -> None:
"""Subscribe to needed data on add."""
await super().async_added_to_hass()
self.router.subscriptions[self.key].append(f"{SELECT_DOMAIN}/{self.item}")
@override
async def async_will_remove_from_hass(self) -> None:
"""Unsubscribe from needed data on remove."""
await super().async_will_remove_from_hass()
self.router.subscriptions[self.key].remove(f"{SELECT_DOMAIN}/{self.item}")
@override
async def async_update(self) -> None:
"""Update state."""
try:

View File

@ -8,6 +8,7 @@ from dataclasses import dataclass
from datetime import datetime, timedelta
import logging
import re
from typing import override
from homeassistant.components.sensor import (
DOMAIN as SENSOR_DOMAIN,
@ -790,6 +791,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity):
self.item = item
self.entity_description = entity_description
@override
async def async_added_to_hass(self) -> None:
"""Subscribe to needed data on add."""
await super().async_added_to_hass()
@ -799,6 +801,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity):
f"{SENSOR_DOMAIN}/{self.entity_description.last_reset_item}"
)
@override
async def async_will_remove_from_hass(self) -> None:
"""Unsubscribe from needed data on remove."""
await super().async_will_remove_from_hass()
@ -809,15 +812,18 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity):
)
@property
@override
def _device_unique_id(self) -> str:
return f"{self.key}.{self.item}"
@property
@override
def native_value(self) -> StateType:
"""Return sensor state."""
return self._state
@property
@override
def native_unit_of_measurement(self) -> str | None:
"""Return sensor's unit of measurement."""
return self.entity_description.native_unit_of_measurement or self._unit
@ -830,6 +836,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity):
return super().icon
@property
@override
def device_class(self) -> SensorDeviceClass | None:
"""Return device class for sensor."""
if self.entity_description.device_class_fn:
@ -838,10 +845,12 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity):
return super().device_class
@property
@override
def last_reset(self) -> datetime | None:
"""Return the time when the sensor was last reset, if any."""
return self._last_reset
@override
async def async_update(self) -> None:
"""Update state."""
try:

View File

@ -3,7 +3,7 @@
from __future__ import annotations
import logging
from typing import Any
from typing import Any, override
from homeassistant.components.switch import (
DOMAIN as SWITCH_DOMAIN,
@ -55,24 +55,29 @@ class HuaweiLteBaseSwitch(HuaweiLteBaseEntityWithDevice, SwitchEntity):
def _turn(self, state: bool) -> None:
raise NotImplementedError
@override
def turn_on(self, **kwargs: Any) -> None:
"""Turn switch on."""
self._turn(state=True)
@override
def turn_off(self, **kwargs: Any) -> None:
"""Turn switch off."""
self._turn(state=False)
@override
async def async_added_to_hass(self) -> None:
"""Subscribe to needed data on add."""
await super().async_added_to_hass()
self.router.subscriptions[self.key].append(f"{SWITCH_DOMAIN}/{self.item}")
@override
async def async_will_remove_from_hass(self) -> None:
"""Unsubscribe from needed data on remove."""
await super().async_will_remove_from_hass()
self.router.subscriptions[self.key].remove(f"{SWITCH_DOMAIN}/{self.item}")
@override
async def async_update(self) -> None:
"""Update state."""
try:
@ -94,14 +99,17 @@ class HuaweiLteMobileDataSwitch(HuaweiLteBaseSwitch):
item = "dataswitch"
@property
@override
def _device_unique_id(self) -> str:
return f"{self.key}.{self.item}"
@property
@override
def is_on(self) -> bool:
"""Return whether the switch is on."""
return self._raw_state == "1"
@override
def _turn(self, state: bool) -> None:
value = 1 if state else 0
self.router.client.dial_up.set_mobile_dataswitch(dataswitch=value)
@ -118,20 +126,24 @@ class HuaweiLteWifiGuestNetworkSwitch(HuaweiLteBaseSwitch):
item = "WifiEnable"
@property
@override
def _device_unique_id(self) -> str:
return f"{self.key}.{self.item}"
@property
@override
def is_on(self) -> bool:
"""Return whether the switch is on."""
return self._raw_state == "1"
@override
def _turn(self, state: bool) -> None:
self.router.client.wlan.wifi_guest_network_switch(state)
self._raw_state = "1" if state else "0"
self.schedule_update_ha_state()
@property
@override
def extra_state_attributes(self) -> dict[str, str | None]:
"""Return the state attributes."""
return {"ssid": self.router.data[self.key].get("WifiSsid")}