Compare commits

...

1 Commits

Author SHA1 Message Date
Erik
4fcebddf23 Make attributes of area registry items immutable 2025-11-24 11:05:24 +01:00

View File

@@ -76,12 +76,12 @@ class EventAreaRegistryUpdatedData(TypedDict):
class AreaEntry(NormalizedNameBaseRegistryEntry): class AreaEntry(NormalizedNameBaseRegistryEntry):
"""Area Registry Entry.""" """Area Registry Entry."""
aliases: set[str] aliases: frozenset[str]
floor_id: str | None floor_id: str | None
humidity_entity_id: str | None humidity_entity_id: str | None
icon: str | None icon: str | None
id: str id: str
labels: set[str] = field(default_factory=set) labels: frozenset[str] = field(default_factory=frozenset)
picture: str | None picture: str | None
temperature_entity_id: str | None temperature_entity_id: str | None
_cache: dict[str, Any] = field(default_factory=dict, compare=False, init=False) _cache: dict[str, Any] = field(default_factory=dict, compare=False, init=False)
@@ -295,12 +295,12 @@ class AreaRegistry(BaseRegistry[AreasRegistryStoreData]):
_validate_temperature_entity(self.hass, temperature_entity_id) _validate_temperature_entity(self.hass, temperature_entity_id)
area = AreaEntry( area = AreaEntry(
aliases=aliases or set(), aliases=frozenset(aliases) if aliases else frozenset(),
floor_id=floor_id, floor_id=floor_id,
humidity_entity_id=humidity_entity_id, humidity_entity_id=humidity_entity_id,
icon=icon, icon=icon,
id=self._generate_id(name), id=self._generate_id(name),
labels=labels or set(), labels=frozenset(labels) if labels else frozenset(),
name=name, name=name,
picture=picture, picture=picture,
temperature_entity_id=temperature_entity_id, temperature_entity_id=temperature_entity_id,
@@ -338,11 +338,11 @@ class AreaRegistry(BaseRegistry[AreasRegistryStoreData]):
self, self,
area_id: str, area_id: str,
*, *,
aliases: set[str] | UndefinedType = UNDEFINED, aliases: frozenset[str] | set[str] | UndefinedType = UNDEFINED,
floor_id: str | None | UndefinedType = UNDEFINED, floor_id: str | None | UndefinedType = UNDEFINED,
humidity_entity_id: str | None | UndefinedType = UNDEFINED, humidity_entity_id: str | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED, icon: str | None | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED, labels: frozenset[str] | set[str] | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED, name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED, picture: str | None | UndefinedType = UNDEFINED,
temperature_entity_id: str | None | UndefinedType = UNDEFINED, temperature_entity_id: str | None | UndefinedType = UNDEFINED,
@@ -374,11 +374,11 @@ class AreaRegistry(BaseRegistry[AreasRegistryStoreData]):
self, self,
area_id: str, area_id: str,
*, *,
aliases: set[str] | UndefinedType = UNDEFINED, aliases: frozenset[str] | set[str] | UndefinedType = UNDEFINED,
floor_id: str | None | UndefinedType = UNDEFINED, floor_id: str | None | UndefinedType = UNDEFINED,
humidity_entity_id: str | None | UndefinedType = UNDEFINED, humidity_entity_id: str | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED, icon: str | None | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED, labels: frozenset[str] | set[str] | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED, name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED, picture: str | None | UndefinedType = UNDEFINED,
temperature_entity_id: str | None | UndefinedType = UNDEFINED, temperature_entity_id: str | None | UndefinedType = UNDEFINED,
@@ -389,17 +389,23 @@ class AreaRegistry(BaseRegistry[AreasRegistryStoreData]):
new_values: dict[str, Any] = { new_values: dict[str, Any] = {
attr_name: value attr_name: value
for attr_name, value in ( for attr_name, value in (
("aliases", aliases),
("floor_id", floor_id), ("floor_id", floor_id),
("humidity_entity_id", humidity_entity_id), ("humidity_entity_id", humidity_entity_id),
("icon", icon), ("icon", icon),
("labels", labels),
("picture", picture), ("picture", picture),
("temperature_entity_id", temperature_entity_id), ("temperature_entity_id", temperature_entity_id),
) )
if value is not UNDEFINED and value != getattr(old, attr_name) if value is not UNDEFINED and value != getattr(old, attr_name)
} }
for attr_name, value in (
("aliases", aliases),
("labels", labels),
):
if value is UNDEFINED or value == getattr(old, attr_name):
continue
new_values[attr_name] = frozenset(value)
if "humidity_entity_id" in new_values and humidity_entity_id is not None: if "humidity_entity_id" in new_values and humidity_entity_id is not None:
_validate_humidity_entity(self.hass, new_values["humidity_entity_id"]) _validate_humidity_entity(self.hass, new_values["humidity_entity_id"])
@@ -432,12 +438,12 @@ class AreaRegistry(BaseRegistry[AreasRegistryStoreData]):
for area in data["areas"]: for area in data["areas"]:
assert area["name"] is not None and area["id"] is not None assert area["name"] is not None and area["id"] is not None
areas[area["id"]] = AreaEntry( areas[area["id"]] = AreaEntry(
aliases=set(area["aliases"]), aliases=frozenset(area["aliases"]),
floor_id=area["floor_id"], floor_id=area["floor_id"],
humidity_entity_id=area["humidity_entity_id"], humidity_entity_id=area["humidity_entity_id"],
icon=area["icon"], icon=area["icon"],
id=area["id"], id=area["id"],
labels=set(area["labels"]), labels=frozenset(area["labels"]),
name=area["name"], name=area["name"],
picture=area["picture"], picture=area["picture"],
temperature_entity_id=area["temperature_entity_id"], temperature_entity_id=area["temperature_entity_id"],