From a70dae0843994451b3b35e332816c55d241f58ff Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 6 Jul 2021 15:06:32 +0200 Subject: [PATCH] Enable strict typing for Fritz (#50668) Co-authored-by: Ruslan Sayfutdinov --- .strict-typing | 1 + homeassistant/components/fritz/common.py | 6 ++++- .../components/fritz/device_tracker.py | 4 +-- homeassistant/components/fritz/sensor.py | 26 +++++++++---------- homeassistant/components/fritz/switch.py | 2 +- mypy.ini | 11 ++++++++ 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/.strict-typing b/.strict-typing index 959aa702672..77d00928edd 100644 --- a/.strict-typing +++ b/.strict-typing @@ -36,6 +36,7 @@ homeassistant.components.fitbit.* homeassistant.components.forecast_solar.* homeassistant.components.fritzbox.* homeassistant.components.frontend.* +homeassistant.components.fritz.* homeassistant.components.geo_location.* homeassistant.components.gios.* homeassistant.components.group.* diff --git a/homeassistant/components/fritz/common.py b/homeassistant/components/fritz/common.py index 776c7a7a22e..cfa04338db1 100644 --- a/homeassistant/components/fritz/common.py +++ b/homeassistant/components/fritz/common.py @@ -111,6 +111,10 @@ class FritzBoxTools: timeout=60.0, ) + if not self.connection: + _LOGGER.error("Unable to establish a connection with %s", self.host) + return + self.fritz_status = FritzStatus(fc=self.connection) info = self.connection.call_action("DeviceInfo:1", "GetInfo") if not self._unique_id: @@ -189,7 +193,7 @@ class FritzBoxTools: def _update_info(self) -> list[HostInfo]: """Retrieve latest information from the FRITZ!Box.""" - return self.fritz_hosts.get_hosts_info() + return self.fritz_hosts.get_hosts_info() # type: ignore [no-any-return] def scan_devices(self, now: datetime | None = None) -> None: """Scan for new devices and return a list of found device ids.""" diff --git a/homeassistant/components/fritz/device_tracker.py b/homeassistant/components/fritz/device_tracker.py index d4ff1dbd161..db6cfadcf5d 100644 --- a/homeassistant/components/fritz/device_tracker.py +++ b/homeassistant/components/fritz/device_tracker.py @@ -145,7 +145,7 @@ class FritzBoxTracker(ScannerEntity): def ip_address(self) -> str | None: """Return the primary ip address of the device.""" if self._mac: - return self._router.devices[self._mac].ip_address + return self._router.devices[self._mac].ip_address # type: ignore[no-any-return] return None @property @@ -157,7 +157,7 @@ class FritzBoxTracker(ScannerEntity): def hostname(self) -> str | None: """Return hostname of the device.""" if self._mac: - return self._router.devices[self._mac].hostname + return self._router.devices[self._mac].hostname # type: ignore[no-any-return] return None @property diff --git a/homeassistant/components/fritz/sensor.py b/homeassistant/components/fritz/sensor.py index 042ec069864..5801bc752fe 100644 --- a/homeassistant/components/fritz/sensor.py +++ b/homeassistant/components/fritz/sensor.py @@ -39,37 +39,37 @@ def _retrieve_uptime_state(status: FritzStatus, last_value: str) -> str: def _retrieve_external_ip_state(status: FritzStatus, last_value: str) -> str: """Return external ip from device.""" - return status.external_ip + return status.external_ip # type: ignore[no-any-return] -def _retrieve_kib_s_sent_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_kib_s_sent_state(status: FritzStatus, last_value: str) -> float: """Return upload transmission rate.""" - return round(status.transmission_rate[0] * 8 / 1024, 1) + return round(status.transmission_rate[0] * 8 / 1024, 1) # type: ignore[no-any-return] -def _retrieve_kib_s_received_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_kib_s_received_state(status: FritzStatus, last_value: str) -> float: """Return download transmission rate.""" - return round(status.transmission_rate[1] * 8 / 1024, 1) + return round(status.transmission_rate[1] * 8 / 1024, 1) # type: ignore[no-any-return] -def _retrieve_max_kib_s_sent_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_max_kib_s_sent_state(status: FritzStatus, last_value: str) -> float: """Return upload max transmission rate.""" - return round(status.max_bit_rate[0] / 1024, 1) + return round(status.max_bit_rate[0] / 1024, 1) # type: ignore[no-any-return] -def _retrieve_max_kib_s_received_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_max_kib_s_received_state(status: FritzStatus, last_value: str) -> float: """Return download max transmission rate.""" - return round(status.max_bit_rate[1] / 1024, 1) + return round(status.max_bit_rate[1] / 1024, 1) # type: ignore[no-any-return] -def _retrieve_gb_sent_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_gb_sent_state(status: FritzStatus, last_value: str) -> float: """Return upload total data.""" - return round(status.bytes_sent * 8 / 1024 / 1024 / 1024, 1) + return round(status.bytes_sent * 8 / 1024 / 1024 / 1024, 1) # type: ignore[no-any-return] -def _retrieve_gb_received_state(status: FritzStatus, last_value: str) -> str: +def _retrieve_gb_received_state(status: FritzStatus, last_value: str) -> float: """Return download total data.""" - return round(status.bytes_received * 8 / 1024 / 1024 / 1024, 1) + return round(status.bytes_received * 8 / 1024 / 1024 / 1024, 1) # type: ignore[no-any-return] class SensorData(TypedDict, total=False): diff --git a/homeassistant/components/fritz/switch.py b/homeassistant/components/fritz/switch.py index d9690b64069..50e18302c9d 100644 --- a/homeassistant/components/fritz/switch.py +++ b/homeassistant/components/fritz/switch.py @@ -69,7 +69,7 @@ def service_call_action( return None try: - return fritzbox_tools.connection.call_action( + return fritzbox_tools.connection.call_action( # type: ignore[no-any-return] f"{service_name}:{service_suffix}", action_name, **kwargs, diff --git a/mypy.ini b/mypy.ini index a3c856f546c..cb3bf6ec698 100644 --- a/mypy.ini +++ b/mypy.ini @@ -407,6 +407,17 @@ no_implicit_optional = true warn_return_any = true warn_unreachable = true +[mypy-homeassistant.components.fritz.*] +check_untyped_defs = true +disallow_incomplete_defs = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_decorators = true +disallow_untyped_defs = true +no_implicit_optional = true +warn_return_any = true +warn_unreachable = true + [mypy-homeassistant.components.geo_location.*] check_untyped_defs = true disallow_incomplete_defs = true