Improve entity cached attributes (#128876)

This commit is contained in:
Erik Montnemery 2024-10-21 10:29:01 +02:00 committed by GitHub
parent 827d6d1d2d
commit 0d447c9d50
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 2 deletions

View File

@ -337,7 +337,9 @@ class CachedProperties(type):
Also invalidates the corresponding cached_property by calling
delattr on it.
"""
if getattr(o, private_attr_name, _SENTINEL) == val:
if (
old_val := getattr(o, private_attr_name, _SENTINEL)
) == val and type(old_val) is type(val):
return
setattr(o, private_attr_name, val)
# Invalidate the cache of the cached property

View File

@ -2314,7 +2314,12 @@ async def test_update_capabilities_too_often_cooldown(
@pytest.mark.parametrize(
("property", "default_value", "values"), [("attribution", None, ["abcd", "efgh"])]
("property", "default_value", "values"),
[
("attribution", None, ["abcd", "efgh"]),
("attribution", None, [True, 1]),
("attribution", None, [1.0, 1]),
],
)
async def test_cached_entity_properties(
hass: HomeAssistant, property: str, default_value: Any, values: Any
@ -2323,22 +2328,30 @@ async def test_cached_entity_properties(
ent1 = entity.Entity()
ent2 = entity.Entity()
assert getattr(ent1, property) == default_value
assert type(getattr(ent1, property)) is type(default_value)
assert getattr(ent2, property) == default_value
assert type(getattr(ent2, property)) is type(default_value)
# Test set
setattr(ent1, f"_attr_{property}", values[0])
assert getattr(ent1, property) == values[0]
assert type(getattr(ent1, property)) is type(values[0])
assert getattr(ent2, property) == default_value
assert type(getattr(ent2, property)) is type(default_value)
# Test update
setattr(ent1, f"_attr_{property}", values[1])
assert getattr(ent1, property) == values[1]
assert type(getattr(ent1, property)) is type(values[1])
assert getattr(ent2, property) == default_value
assert type(getattr(ent2, property)) is type(default_value)
# Test delete
delattr(ent1, f"_attr_{property}")
assert getattr(ent1, property) == default_value
assert type(getattr(ent1, property)) is type(default_value)
assert getattr(ent2, property) == default_value
assert type(getattr(ent2, property)) is type(default_value)
async def test_cached_entity_property_delete_attr(hass: HomeAssistant) -> None: