Pass job type to event listeners when creating entities (#112551)

This commit is contained in:
J. Nick Koston 2024-03-06 16:10:07 -10:00 committed by GitHub
parent 84455dbe1d
commit a7b4cd3512
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 22 deletions

View File

@ -46,6 +46,7 @@ from homeassistant.const import (
from homeassistant.core import (
CALLBACK_TYPE,
Context,
HassJobType,
HomeAssistant,
callback,
get_release_channel,
@ -1430,7 +1431,10 @@ class Entity(
self.async_on_remove(
async_track_entity_registry_updated_event(
self.hass, self.entity_id, self._async_registry_updated
self.hass,
self.entity_id,
self._async_registry_updated,
job_type=HassJobType.Callback,
)
)
self._async_subscribe_device_updates()
@ -1545,6 +1549,7 @@ class Entity(
self.hass,
device_id,
self._async_device_registry_updated,
job_type=HassJobType.Callback,
)
if (
not self._on_remove

View File

@ -299,6 +299,7 @@ def async_track_state_change_event(
hass: HomeAssistant,
entity_ids: str | Iterable[str],
action: Callable[[EventType[EventStateChangedData]], Any],
job_type: HassJobType | None = None,
) -> CALLBACK_TYPE:
"""Track specific state change events indexed by entity_id.
@ -313,7 +314,7 @@ def async_track_state_change_event(
"""
if not (entity_ids := _async_string_to_lower_list(entity_ids)):
return _remove_empty_listener
return _async_track_state_change_event(hass, entity_ids, action)
return _async_track_state_change_event(hass, entity_ids, action, job_type)
@callback
@ -361,9 +362,12 @@ def _async_track_state_change_event(
hass: HomeAssistant,
entity_ids: str | Iterable[str],
action: Callable[[EventType[EventStateChangedData]], Any],
job_type: HassJobType | None,
) -> CALLBACK_TYPE:
"""async_track_state_change_event without lowercasing."""
return _async_track_event(_KEYED_TRACK_STATE_CHANGE, hass, entity_ids, action)
return _async_track_event(
_KEYED_TRACK_STATE_CHANGE, hass, entity_ids, action, job_type
)
@callback
@ -397,6 +401,7 @@ def _async_track_event(
hass: HomeAssistant,
keys: str | Iterable[str],
action: Callable[[EventType[_TypedDictT]], None],
job_type: HassJobType | None,
) -> CALLBACK_TYPE:
"""Track an event by a specific key.
@ -429,7 +434,7 @@ def _async_track_event(
run_immediately=tracker.run_immediately,
)
job = HassJob(action, f"track {tracker.event_type} event {keys}")
job = HassJob(action, f"track {tracker.event_type} event {keys}", job_type=job_type)
for key in keys:
if callback_list := callbacks.get(key):
@ -494,6 +499,7 @@ def async_track_entity_registry_updated_event(
hass: HomeAssistant,
entity_ids: str | Iterable[str],
action: Callable[[EventType[EventEntityRegistryUpdatedData]], Any],
job_type: HassJobType | None = None,
) -> CALLBACK_TYPE:
"""Track specific entity registry updated events indexed by entity_id.
@ -502,10 +508,7 @@ def async_track_entity_registry_updated_event(
Similar to async_track_state_change_event.
"""
return _async_track_event(
_KEYED_TRACK_ENTITY_REGISTRY_UPDATED,
hass,
entity_ids,
action,
_KEYED_TRACK_ENTITY_REGISTRY_UPDATED, hass, entity_ids, action, job_type
)
@ -558,16 +561,14 @@ def async_track_device_registry_updated_event(
hass: HomeAssistant,
device_ids: str | Iterable[str],
action: Callable[[EventType[EventDeviceRegistryUpdatedData]], Any],
job_type: HassJobType | None = None,
) -> CALLBACK_TYPE:
"""Track specific device registry updated events indexed by device_id.
Similar to async_track_entity_registry_updated_event.
"""
return _async_track_event(
_KEYED_TRACK_DEVICE_REGISTRY_UPDATED,
hass,
device_ids,
action,
_KEYED_TRACK_DEVICE_REGISTRY_UPDATED, hass, device_ids, action, job_type
)
@ -606,11 +607,12 @@ def async_track_state_added_domain(
hass: HomeAssistant,
domains: str | Iterable[str],
action: Callable[[EventType[EventStateChangedData]], Any],
job_type: HassJobType | None = None,
) -> CALLBACK_TYPE:
"""Track state change events when an entity is added to domains."""
if not (domains := _async_string_to_lower_list(domains)):
return _remove_empty_listener
return _async_track_state_added_domain(hass, domains, action)
return _async_track_state_added_domain(hass, domains, action, job_type)
_KEYED_TRACK_STATE_ADDED_DOMAIN = _KeyedEventTracker(
@ -628,9 +630,12 @@ def _async_track_state_added_domain(
hass: HomeAssistant,
domains: str | Iterable[str],
action: Callable[[EventType[EventStateChangedData]], Any],
job_type: HassJobType | None,
) -> CALLBACK_TYPE:
"""Track state change events when an entity is added to domains."""
return _async_track_event(_KEYED_TRACK_STATE_ADDED_DOMAIN, hass, domains, action)
return _async_track_event(
_KEYED_TRACK_STATE_ADDED_DOMAIN, hass, domains, action, job_type
)
@callback
@ -661,9 +666,12 @@ def async_track_state_removed_domain(
hass: HomeAssistant,
domains: str | Iterable[str],
action: Callable[[EventType[EventStateChangedData]], Any],
job_type: HassJobType | None = None,
) -> CALLBACK_TYPE:
"""Track state change events when an entity is removed from domains."""
return _async_track_event(_KEYED_TRACK_STATE_REMOVED_DOMAIN, hass, domains, action)
return _async_track_event(
_KEYED_TRACK_STATE_REMOVED_DOMAIN, hass, domains, action, job_type
)
@callback
@ -781,7 +789,7 @@ class _TrackStateChangeFiltered:
return
self._listeners[_ENTITIES_LISTENER] = _async_track_state_change_event(
self.hass, entities, self._action
self.hass, entities, self._action, self._action_as_hassjob.job_type
)
@callback
@ -798,7 +806,7 @@ class _TrackStateChangeFiltered:
return
self._listeners[_DOMAINS_LISTENER] = _async_track_state_added_domain(
self.hass, domains, self._state_added
self.hass, domains, self._state_added, HassJobType.Callback
)
@callback

View File

@ -453,7 +453,7 @@ async def test_async_track_state_change_event(hass: HomeAssistant) -> None:
raise ValueError
unsub_single = async_track_state_change_event(
hass, ["light.Bowl"], single_run_callback
hass, ["light.Bowl"], single_run_callback, job_type=ha.HassJobType.Callback
)
unsub_multi = async_track_state_change_event(
hass, ["light.Bowl", "switch.kitchen"], multiple_run_callback
@ -560,7 +560,9 @@ async def test_async_track_state_added_domain(hass: HomeAssistant) -> None:
def callback_that_throws(event):
raise ValueError
unsub_single = async_track_state_added_domain(hass, "light", single_run_callback)
unsub_single = async_track_state_added_domain(
hass, "light", single_run_callback, job_type=ha.HassJobType.Callback
)
unsub_multi = async_track_state_added_domain(
hass, ["light", "switch"], multiple_run_callback
)
@ -672,7 +674,9 @@ async def test_async_track_state_removed_domain(hass: HomeAssistant) -> None:
def callback_that_throws(event):
raise ValueError
unsub_single = async_track_state_removed_domain(hass, "light", single_run_callback)
unsub_single = async_track_state_removed_domain(
hass, "light", single_run_callback, job_type=ha.HassJobType.Callback
)
unsub_multi = async_track_state_removed_domain(
hass, ["light", "switch"], multiple_run_callback
)
@ -4602,7 +4606,9 @@ async def test_async_track_entity_registry_updated_event(hass: HomeAssistant) ->
def run_callback(event):
event_data.append(event.data)
unsub1 = async_track_entity_registry_updated_event(hass, entity_id, run_callback)
unsub1 = async_track_entity_registry_updated_event(
hass, entity_id, run_callback, job_type=ha.HassJobType.Callback
)
unsub2 = async_track_entity_registry_updated_event(
hass, new_entity_id, run_callback
)
@ -4721,7 +4727,10 @@ async def test_async_track_device_registry_updated_event(hass: HomeAssistant) ->
hass, device_id, single_device_id_callback
)
unsub2 = async_track_device_registry_updated_event(
hass, [device_id, device_id2], multiple_device_id_callback
hass,
[device_id, device_id2],
multiple_device_id_callback,
job_type=ha.HassJobType.Callback,
)
hass.bus.async_fire(
EVENT_DEVICE_REGISTRY_UPDATED, {"action": "create", "device_id": device_id}