From 0fdb2aa6bc6165d9adae39ecbe7f6698e7b94715 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Thu, 3 Nov 2022 18:01:25 -0400 Subject: [PATCH] Support case-insensitive matching --- homeassistant/components/usb/__init__.py | 13 +++++++------ tests/components/usb/test_init.py | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/usb/__init__.py b/homeassistant/components/usb/__init__.py index 7c0355fa24c..6c57133e77d 100644 --- a/homeassistant/components/usb/__init__.py +++ b/homeassistant/components/usb/__init__.py @@ -6,6 +6,7 @@ import dataclasses import fnmatch import logging import os +import re import sys from typing import TYPE_CHECKING, Any @@ -125,11 +126,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -def _fnmatch_lower(name: str | None, pattern: str) -> bool: - """Match a lowercase version of the name.""" +def _fnmatch_case_insensitive(name: str | None, pattern: str) -> bool: + """Match a name case-insensitively.""" if name is None: return False - return fnmatch.fnmatch(name.lower(), pattern) + return re.match(fnmatch.translate(pattern), name, re.IGNORECASE) is not None def _is_matching(device: USBDevice, matcher: USBMatcher | USBCallbackMatcher) -> bool: @@ -138,15 +139,15 @@ def _is_matching(device: USBDevice, matcher: USBMatcher | USBCallbackMatcher) -> return False if "pid" in matcher and device.pid != matcher["pid"]: return False - if "serial_number" in matcher and not _fnmatch_lower( + if "serial_number" in matcher and not _fnmatch_case_insensitive( device.serial_number, matcher["serial_number"] ): return False - if "manufacturer" in matcher and not _fnmatch_lower( + if "manufacturer" in matcher and not _fnmatch_case_insensitive( device.manufacturer, matcher["manufacturer"] ): return False - if "description" in matcher and not _fnmatch_lower( + if "description" in matcher and not _fnmatch_case_insensitive( device.description, matcher["description"] ): return False diff --git a/tests/components/usb/test_init.py b/tests/components/usb/test_init.py index ca978af75f2..46f1dcc70bf 100644 --- a/tests/components/usb/test_init.py +++ b/tests/components/usb/test_init.py @@ -403,6 +403,7 @@ async def test_discovered_by_websocket_scan_limited_by_manufacturer_matcher( "domain": "test1", "vid": "3039", "pid": "3039", + "description": "*ConBee*", "manufacturer": "dresden elektronik ingenieurtechnik*", } ]