From ca7daa21fefef70b02c8152081a55ecb505b059a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 23 Dec 2023 00:10:46 -1000 Subject: [PATCH] Add support for attribute caching to the text platform (#106262) --- homeassistant/components/text/__init__.py | 28 +++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index 8e20fdd33af..89fad759f8b 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -6,7 +6,7 @@ from datetime import timedelta from enum import StrEnum import logging import re -from typing import Any, final +from typing import TYPE_CHECKING, Any, final import voluptuous as vol @@ -33,6 +33,11 @@ from .const import ( SERVICE_SET_VALUE, ) +if TYPE_CHECKING: + from functools import cached_property +else: + from homeassistant.backports.functools import cached_property + SCAN_INTERVAL = timedelta(seconds=30) ENTITY_ID_FORMAT = DOMAIN + ".{}" @@ -107,7 +112,16 @@ class TextEntityDescription(EntityDescription, frozen_or_thawed=True): pattern: str | None = None -class TextEntity(Entity): +CACHED_PROPERTIES_WITH_ATTR_ = { + "mode", + "native_value", + "native_min", + "native_max", + "pattern", +} + + +class TextEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_): """Representation of a Text entity.""" _entity_component_unrecorded_attributes = frozenset( @@ -156,7 +170,7 @@ class TextEntity(Entity): ) return self.native_value - @property + @cached_property def mode(self) -> TextMode: """Return the mode of the entity.""" if hasattr(self, "_attr_mode"): @@ -165,7 +179,7 @@ class TextEntity(Entity): return self.entity_description.mode return TextMode.TEXT - @property + @cached_property def native_min(self) -> int: """Return the minimum length of the value.""" if hasattr(self, "_attr_native_min"): @@ -180,7 +194,7 @@ class TextEntity(Entity): """Return the minimum length of the value.""" return max(self.native_min, 0) - @property + @cached_property def native_max(self) -> int: """Return the maximum length of the value.""" if hasattr(self, "_attr_native_max"): @@ -206,7 +220,7 @@ class TextEntity(Entity): self.__pattern_cmp = re.compile(self.pattern) return self.__pattern_cmp - @property + @cached_property def pattern(self) -> str | None: """Return the regex pattern that the value must match.""" if hasattr(self, "_attr_pattern"): @@ -215,7 +229,7 @@ class TextEntity(Entity): return self.entity_description.pattern return None - @property + @cached_property def native_value(self) -> str | None: """Return the value reported by the text.""" return self._attr_native_value