From 0dcfd55c84ad020e905cf5359ba1c035c3dbd27f Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 16 Nov 2021 19:03:50 +0100 Subject: [PATCH] Adjust async_step_usb signature for strict typing (#59773) Co-authored-by: epenet --- .../components/modem_callerid/config_flow.py | 2 +- homeassistant/components/usb/__init__.py | 21 ++++++++++++++++++- .../components/zwave_js/config_flow.py | 4 ++-- homeassistant/config_entries.py | 5 +++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/modem_callerid/config_flow.py b/homeassistant/components/modem_callerid/config_flow.py index 51671dcbe16..70fd3969e02 100644 --- a/homeassistant/components/modem_callerid/config_flow.py +++ b/homeassistant/components/modem_callerid/config_flow.py @@ -30,7 +30,7 @@ class PhoneModemFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Set up flow instance.""" self._device: str | None = None - async def async_step_usb(self, discovery_info: dict[str, str]) -> FlowResult: + async def async_step_usb(self, discovery_info: usb.UsbServiceInfo) -> FlowResult: """Handle USB Discovery.""" device = discovery_info["device"] diff --git a/homeassistant/components/usb/__init__.py b/homeassistant/components/usb/__init__.py index 80d01417ea7..355b60906b3 100644 --- a/homeassistant/components/usb/__init__.py +++ b/homeassistant/components/usb/__init__.py @@ -6,6 +6,7 @@ import fnmatch import logging import os import sys +from typing import TypedDict from serial.tools.list_ports import comports from serial.tools.list_ports_common import ListPortInfo @@ -30,6 +31,17 @@ _LOGGER = logging.getLogger(__name__) REQUEST_SCAN_COOLDOWN = 60 # 1 minute cooldown +class UsbServiceInfo(TypedDict): + """Prepared info from usb entries.""" + + device: str + vid: str + pid: str + serial_number: str | None + manufacturer: str | None + description: str | None + + def human_readable_device_name( device: str, serial_number: str | None, @@ -193,7 +205,14 @@ class USBDiscovery: self.hass, matcher["domain"], {"source": config_entries.SOURCE_USB}, - dataclasses.asdict(device), + UsbServiceInfo( + device=device.device, + vid=device.vid, + pid=device.pid, + serial_number=device.serial_number, + manufacturer=device.manufacturer, + description=device.description, + ), ) @callback diff --git a/homeassistant/components/zwave_js/config_flow.py b/homeassistant/components/zwave_js/config_flow.py index 37e6b7c9320..86107cd52f8 100644 --- a/homeassistant/components/zwave_js/config_flow.py +++ b/homeassistant/components/zwave_js/config_flow.py @@ -336,7 +336,7 @@ class ConfigFlow(BaseZwaveJSFlow, config_entries.ConfigFlow, domain=DOMAIN): return await self.async_step_manual() - async def async_step_usb(self, discovery_info: dict[str, str]) -> FlowResult: + async def async_step_usb(self, discovery_info: usb.UsbServiceInfo) -> FlowResult: """Handle USB Discovery.""" if not is_hassio(self.hass): return self.async_abort(reason="discovery_requires_supervisor") @@ -352,7 +352,7 @@ class ConfigFlow(BaseZwaveJSFlow, config_entries.ConfigFlow, domain=DOMAIN): manufacturer = discovery_info["manufacturer"] description = discovery_info["description"] # Zooz uses this vid/pid, but so do 2652 sticks - if vid == "10C4" and pid == "EA60" and "2652" in description: + if vid == "10C4" and pid == "EA60" and description and "2652" in description: return self.async_abort(reason="not_zwave_device") addon_info = await self._async_get_addon_info() diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index e1e4c103dc4..9a6709820ff 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -34,6 +34,7 @@ import homeassistant.util.uuid as uuid_util if TYPE_CHECKING: from homeassistant.components.dhcp import DhcpServiceInfo from homeassistant.components.mqtt.discovery import MqttServiceInfo + from homeassistant.components.usb import UsbServiceInfo from homeassistant.components.zeroconf import ZeroconfServiceInfo _LOGGER = logging.getLogger(__name__) @@ -1386,10 +1387,10 @@ class ConfigFlow(data_entry_flow.FlowHandler): return await self.async_step_discovery(cast(dict, discovery_info)) async def async_step_usb( - self, discovery_info: DiscoveryInfoType + self, discovery_info: UsbServiceInfo ) -> data_entry_flow.FlowResult: """Handle a flow initialized by USB discovery.""" - return await self.async_step_discovery(discovery_info) + return await self.async_step_discovery(cast(dict, discovery_info)) @callback def async_create_entry( # pylint: disable=arguments-differ