Home Assistant Unofficial Reference 2024.12.1
registry.py
Go to the documentation of this file.
1 """Provide a base implementation for registries."""
2 
3 from __future__ import annotations
4 
5 from abc import ABC, abstractmethod
6 from collections import UserDict, defaultdict
7 from collections.abc import Mapping, Sequence, ValuesView
8 from typing import TYPE_CHECKING, Any, Literal
9 
10 from homeassistant.core import CoreState, HomeAssistant, callback
11 
12 if TYPE_CHECKING:
13  from .storage import Store
14 
15 SAVE_DELAY = 10
16 SAVE_DELAY_LONG = 180
17 
18 type RegistryIndexType = defaultdict[str, dict[str, Literal[True]]]
19 
20 
21 class BaseRegistryItems[_DataT](UserDict[str, _DataT], ABC):
22  """Base class for registry items."""
23 
24  data: dict[str, _DataT]
25 
26  def values(self) -> ValuesView[_DataT]:
27  """Return the underlying values to avoid __iter__ overhead."""
28  return self.data.values()
29 
30  @abstractmethod
31  def _index_entry(self, key: str, entry: _DataT) -> None:
32  """Index an entry."""
33 
34  @abstractmethod
35  def _unindex_entry(self, key: str, replacement_entry: _DataT | None = None) -> None:
36  """Unindex an entry."""
37 
38  def __setitem__(self, key: str, entry: _DataT) -> None:
39  """Add an item."""
40  data = self.data
41  if key in data:
42  self._unindex_entry_unindex_entry(key, entry)
43  data[key] = entry
44  self._index_entry_index_entry(key, entry)
45 
47  self, key: str, value: str, index: RegistryIndexType
48  ) -> None:
49  """Unindex an entry value.
50 
51  key is the entry key
52  value is the value to unindex such as config_entry_id or device_id.
53  index is the index to unindex from.
54  """
55  entries = index[value]
56  del entries[key]
57  if not entries:
58  del index[value]
59 
60  def __delitem__(self, key: str) -> None:
61  """Remove an item."""
62  self._unindex_entry_unindex_entry(key)
63  super().__delitem__(key)
64 
65 
66 class BaseRegistry[_StoreDataT: Mapping[str, Any] | Sequence[Any]](ABC):
67  """Class to implement a registry."""
68 
69  hass: HomeAssistant
70  _store: Store[_StoreDataT]
71 
72  @callback
73  def async_schedule_save(self) -> None:
74  """Schedule saving the registry."""
75  # Schedule the save past startup to avoid writing
76  # the file while the system is starting.
77  delay = SAVE_DELAY if self.hass.state is CoreState.running else SAVE_DELAY_LONG
78  self._store.async_delay_save(self._data_to_save, delay)
79 
80  @callback
81  @abstractmethod
82  def _data_to_save(self) -> _StoreDataT:
83  """Return data of registry to store in a file."""
None _unindex_entry(self, str key, _DataT|None replacement_entry=None)
Definition: registry.py:35
None _unindex_entry_value(self, str key, str value, RegistryIndexType index)
Definition: registry.py:48
None __setitem__(self, str key, _DataT entry)
Definition: registry.py:38
None _index_entry(self, str key, _DataT entry)
Definition: registry.py:31
_StoreDataT _data_to_save(self)
Definition: registry.py:82
None async_delay_save(self, Callable[[], _T] data_func, float delay=0)
Definition: storage.py:444