From 3b0d984959beef06a29a620815de4f3e810c73e5 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 23 Nov 2021 09:01:40 +0100 Subject: [PATCH] Use dataclass for MqttServiceInfo (#60191) * Use dataclass for MqttServiceInfo * Drop test exception Co-authored-by: epenet --- homeassistant/components/mqtt/discovery.py | 25 ++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index 7aec80b2e9c..8ccfca96c26 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -1,13 +1,14 @@ """Support for MQTT discovery.""" import asyncio from collections import deque +from dataclasses import dataclass import datetime as dt import functools import json import logging import re import time -from typing import TypedDict +from typing import Any from homeassistant.const import CONF_DEVICE, CONF_PLATFORM from homeassistant.core import HomeAssistant @@ -17,6 +18,7 @@ from homeassistant.helpers.dispatcher import ( async_dispatcher_connect, async_dispatcher_send, ) +from homeassistant.helpers.frame import report from homeassistant.loader import async_get_mqtt from .. import mqtt @@ -89,7 +91,8 @@ class MQTTConfig(dict): """Dummy class to allow adding attributes.""" -class MqttServiceInfo(TypedDict): +@dataclass +class MqttServiceInfo: """Prepared info from mqtt entries.""" topic: str @@ -99,6 +102,24 @@ class MqttServiceInfo(TypedDict): subscribed_topic: str timestamp: dt.datetime + # Used to prevent log flooding. To be removed in 2022.6 + _warning_logged: bool = False + + def __getitem__(self, name: str) -> Any: + """ + Allow property access by name for compatibility reason. + + Deprecated, and will be removed in version 2022.6. + """ + if not self._warning_logged: + report( + f"accessed discovery_info['{name}'] instead of discovery_info.{name}; this will fail in version 2022.6", + exclude_integrations={"mqtt"}, + error_if_core=False, + ) + self._warning_logged = True + return getattr(self, name) + async def async_start( # noqa: C901 hass: HomeAssistant, discovery_topic, config_entry=None