From 69f4aeaf425b0717cbd02281e53092d94c130024 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 22 Apr 2022 09:19:35 +0200 Subject: [PATCH] Enable strict typing of deconz_device (#70341) * Enable strict typing of deconz_device completing strict typing of deconz integration --- .strict-typing | 22 +- .../components/deconz/deconz_device.py | 25 +- mypy.ini | 222 +----------------- 3 files changed, 16 insertions(+), 253 deletions(-) diff --git a/.strict-typing b/.strict-typing index ac60defda3f..31f5c12205a 100644 --- a/.strict-typing +++ b/.strict-typing @@ -63,27 +63,7 @@ homeassistant.components.canary.* homeassistant.components.cover.* homeassistant.components.crownstone.* homeassistant.components.cpuspeed.* -homeassistant.components.deconz -homeassistant.components.deconz.alarm_control_panel -homeassistant.components.deconz.binary_sensor -homeassistant.components.deconz.button -homeassistant.components.deconz.climate -homeassistant.components.deconz.config_flow -homeassistant.components.deconz.cover -homeassistant.components.deconz.deconz_event -homeassistant.components.deconz.device_trigger -homeassistant.components.deconz.diagnostics -homeassistant.components.deconz.fan -homeassistant.components.deconz.gateway -homeassistant.components.deconz.light -homeassistant.components.deconz.lock -homeassistant.components.deconz.logbook -homeassistant.components.deconz.number -homeassistant.components.deconz.scene -homeassistant.components.deconz.sensor -homeassistant.components.deconz.services -homeassistant.components.deconz.siren -homeassistant.components.deconz.switch +homeassistant.components.deconz.* homeassistant.components.device_automation.* homeassistant.components.device_tracker.* homeassistant.components.devolo_home_control.* diff --git a/homeassistant/components/deconz/deconz_device.py b/homeassistant/components/deconz/deconz_device.py index 676116374ec..c3fab20f678 100644 --- a/homeassistant/components/deconz/deconz_device.py +++ b/homeassistant/components/deconz/deconz_device.py @@ -20,7 +20,7 @@ class DeconzBase: def __init__( self, - device: DeconzGroup | DeconzLight | DeconzSensor, + device: DeconzGroup | DeconzLight | DeconzSensor | PydeconzScene, gateway: DeconzGateway, ) -> None: """Set up device and add update callback to get data from websocket.""" @@ -30,19 +30,21 @@ class DeconzBase: @property def unique_id(self) -> str: """Return a unique identifier for this device.""" - return self._device.unique_id + assert not isinstance(self._device, PydeconzScene) + return self._device.unique_id # type: ignore[no-any-return] @property def serial(self) -> str | None: """Return a serial number for this device.""" + assert not isinstance(self._device, PydeconzScene) if not self._device.unique_id or self._device.unique_id.count(":") != 7: return None - - return self._device.unique_id.split("-", 1)[0] + return self._device.unique_id.split("-", 1)[0] # type: ignore[no-any-return] @property def device_info(self) -> DeviceInfo | None: """Return a device description for device registry.""" + assert not isinstance(self._device, PydeconzScene) if self.serial is None: return None @@ -66,7 +68,7 @@ class DeconzDevice(DeconzBase, Entity): def __init__( self, - device: DeconzGroup | DeconzLight | DeconzSensor, + device: DeconzGroup | DeconzLight | DeconzSensor | PydeconzScene, gateway: DeconzGateway, ) -> None: """Set up device and add update callback to get data from websocket.""" @@ -109,6 +111,8 @@ class DeconzDevice(DeconzBase, Entity): @property def available(self) -> bool: """Return True if device is available.""" + if isinstance(self._device, PydeconzScene): + return self.gateway.available return self.gateway.available and self._device.reachable @@ -117,7 +121,11 @@ class DeconzSceneMixin(DeconzDevice): _device: PydeconzScene - def __init__(self, device: PydeconzScene, gateway: DeconzGateway) -> None: + def __init__( + self, + device: PydeconzScene, + gateway: DeconzGateway, + ) -> None: """Set up a scene.""" super().__init__(device, gateway) @@ -132,11 +140,6 @@ class DeconzSceneMixin(DeconzDevice): """Describe a unique identifier for group this scene belongs to.""" return f"{self.gateway.bridgeid}-{self._device.group_deconz_id}" - @property - def available(self) -> bool: - """Return True if scene is available.""" - return self.gateway.available - @property def unique_id(self) -> str: """Return a unique identifier for this scene.""" diff --git a/mypy.ini b/mypy.ini index 439f5e326ca..c4b66473342 100644 --- a/mypy.ini +++ b/mypy.ini @@ -495,227 +495,7 @@ no_implicit_optional = true warn_return_any = true warn_unreachable = true -[mypy-homeassistant.components.deconz] -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.deconz.alarm_control_panel] -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.deconz.binary_sensor] -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.deconz.button] -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.deconz.climate] -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.deconz.config_flow] -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.deconz.cover] -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.deconz.deconz_event] -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.deconz.device_trigger] -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.deconz.diagnostics] -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.deconz.fan] -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.deconz.gateway] -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.deconz.light] -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.deconz.lock] -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.deconz.logbook] -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.deconz.number] -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.deconz.scene] -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.deconz.sensor] -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.deconz.services] -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.deconz.siren] -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.deconz.switch] +[mypy-homeassistant.components.deconz.*] check_untyped_defs = true disallow_incomplete_defs = true disallow_subclassing_any = true