From a7b4cd3512fc80a65c96dd222553f186484e7113 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 6 Mar 2024 16:10:07 -1000 Subject: [PATCH] Pass job type to event listeners when creating entities (#112551) --- homeassistant/helpers/entity.py | 7 +++++- homeassistant/helpers/event.py | 40 ++++++++++++++++++++------------- tests/helpers/test_event.py | 19 +++++++++++----- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 3517d41314b..9fe4af2c6a6 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -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 diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 0dc3115466a..3c0aa4b9e34 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -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 diff --git a/tests/helpers/test_event.py b/tests/helpers/test_event.py index 0c2c530eb9f..d18014b9f6f 100644 --- a/tests/helpers/test_event.py +++ b/tests/helpers/test_event.py @@ -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}