mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Permit event trackers to accept an empty list of entities or domains (#41857)
This commit is contained in:
parent
0a4298322c
commit
53a1d92f2b
@ -236,6 +236,9 @@ def async_track_state_change_event(
|
|||||||
care about the state change events so we can
|
care about the state change events so we can
|
||||||
do a fast dict lookup to route events.
|
do a fast dict lookup to route events.
|
||||||
"""
|
"""
|
||||||
|
entity_ids = _async_string_to_lower_list(entity_ids)
|
||||||
|
if not entity_ids:
|
||||||
|
return _remove_empty_listener
|
||||||
|
|
||||||
entity_callbacks = hass.data.setdefault(TRACK_STATE_CHANGE_CALLBACKS, {})
|
entity_callbacks = hass.data.setdefault(TRACK_STATE_CHANGE_CALLBACKS, {})
|
||||||
|
|
||||||
@ -263,8 +266,6 @@ def async_track_state_change_event(
|
|||||||
|
|
||||||
job = HassJob(action)
|
job = HassJob(action)
|
||||||
|
|
||||||
entity_ids = _async_string_to_lower_list(entity_ids)
|
|
||||||
|
|
||||||
for entity_id in entity_ids:
|
for entity_id in entity_ids:
|
||||||
entity_callbacks.setdefault(entity_id, []).append(job)
|
entity_callbacks.setdefault(entity_id, []).append(job)
|
||||||
|
|
||||||
@ -282,6 +283,11 @@ def async_track_state_change_event(
|
|||||||
return remove_listener
|
return remove_listener
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _remove_empty_listener() -> None:
|
||||||
|
"""Remove a listener that does nothing."""
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_remove_indexed_listeners(
|
def _async_remove_indexed_listeners(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
@ -314,6 +320,9 @@ def async_track_entity_registry_updated_event(
|
|||||||
|
|
||||||
Similar to async_track_state_change_event.
|
Similar to async_track_state_change_event.
|
||||||
"""
|
"""
|
||||||
|
entity_ids = _async_string_to_lower_list(entity_ids)
|
||||||
|
if not entity_ids:
|
||||||
|
return _remove_empty_listener
|
||||||
|
|
||||||
entity_callbacks = hass.data.setdefault(TRACK_ENTITY_REGISTRY_UPDATED_CALLBACKS, {})
|
entity_callbacks = hass.data.setdefault(TRACK_ENTITY_REGISTRY_UPDATED_CALLBACKS, {})
|
||||||
|
|
||||||
@ -342,8 +351,6 @@ def async_track_entity_registry_updated_event(
|
|||||||
|
|
||||||
job = HassJob(action)
|
job = HassJob(action)
|
||||||
|
|
||||||
entity_ids = _async_string_to_lower_list(entity_ids)
|
|
||||||
|
|
||||||
for entity_id in entity_ids:
|
for entity_id in entity_ids:
|
||||||
entity_callbacks.setdefault(entity_id, []).append(job)
|
entity_callbacks.setdefault(entity_id, []).append(job)
|
||||||
|
|
||||||
@ -388,6 +395,9 @@ def async_track_state_added_domain(
|
|||||||
action: Callable[[Event], Any],
|
action: Callable[[Event], Any],
|
||||||
) -> Callable[[], None]:
|
) -> Callable[[], None]:
|
||||||
"""Track state change events when an entity is added to domains."""
|
"""Track state change events when an entity is added to domains."""
|
||||||
|
domains = _async_string_to_lower_list(domains)
|
||||||
|
if not domains:
|
||||||
|
return _remove_empty_listener
|
||||||
|
|
||||||
domain_callbacks = hass.data.setdefault(TRACK_STATE_ADDED_DOMAIN_CALLBACKS, {})
|
domain_callbacks = hass.data.setdefault(TRACK_STATE_ADDED_DOMAIN_CALLBACKS, {})
|
||||||
|
|
||||||
@ -407,8 +417,6 @@ def async_track_state_added_domain(
|
|||||||
|
|
||||||
job = HassJob(action)
|
job = HassJob(action)
|
||||||
|
|
||||||
domains = _async_string_to_lower_list(domains)
|
|
||||||
|
|
||||||
for domain in domains:
|
for domain in domains:
|
||||||
domain_callbacks.setdefault(domain, []).append(job)
|
domain_callbacks.setdefault(domain, []).append(job)
|
||||||
|
|
||||||
@ -433,6 +441,9 @@ def async_track_state_removed_domain(
|
|||||||
action: Callable[[Event], Any],
|
action: Callable[[Event], Any],
|
||||||
) -> Callable[[], None]:
|
) -> Callable[[], None]:
|
||||||
"""Track state change events when an entity is removed from domains."""
|
"""Track state change events when an entity is removed from domains."""
|
||||||
|
domains = _async_string_to_lower_list(domains)
|
||||||
|
if not domains:
|
||||||
|
return _remove_empty_listener
|
||||||
|
|
||||||
domain_callbacks = hass.data.setdefault(TRACK_STATE_REMOVED_DOMAIN_CALLBACKS, {})
|
domain_callbacks = hass.data.setdefault(TRACK_STATE_REMOVED_DOMAIN_CALLBACKS, {})
|
||||||
|
|
||||||
@ -452,8 +463,6 @@ def async_track_state_removed_domain(
|
|||||||
|
|
||||||
job = HassJob(action)
|
job = HassJob(action)
|
||||||
|
|
||||||
domains = _async_string_to_lower_list(domains)
|
|
||||||
|
|
||||||
for domain in domains:
|
for domain in domains:
|
||||||
domain_callbacks.setdefault(domain, []).append(job)
|
domain_callbacks.setdefault(domain, []).append(job)
|
||||||
|
|
||||||
|
@ -486,6 +486,19 @@ async def test_async_track_state_change_event(hass):
|
|||||||
unsub_throws()
|
unsub_throws()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_track_state_change_event_with_empty_list(hass):
|
||||||
|
"""Test async_track_state_change_event passing an empty list of entities."""
|
||||||
|
unsub_single = async_track_state_change_event(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
unsub_single2 = async_track_state_change_event(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
|
||||||
|
unsub_single2()
|
||||||
|
unsub_single()
|
||||||
|
|
||||||
|
|
||||||
async def test_async_track_state_added_domain(hass):
|
async def test_async_track_state_added_domain(hass):
|
||||||
"""Test async_track_state_added_domain."""
|
"""Test async_track_state_added_domain."""
|
||||||
single_entity_id_tracker = []
|
single_entity_id_tracker = []
|
||||||
@ -568,6 +581,32 @@ async def test_async_track_state_added_domain(hass):
|
|||||||
unsub_throws()
|
unsub_throws()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_track_state_added_domain_with_empty_list(hass):
|
||||||
|
"""Test async_track_state_added_domain passing an empty list of domains."""
|
||||||
|
unsub_single = async_track_state_added_domain(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
unsub_single2 = async_track_state_added_domain(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
|
||||||
|
unsub_single2()
|
||||||
|
unsub_single()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_track_state_removed_domain_with_empty_list(hass):
|
||||||
|
"""Test async_track_state_removed_domain passing an empty list of domains."""
|
||||||
|
unsub_single = async_track_state_removed_domain(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
unsub_single2 = async_track_state_removed_domain(
|
||||||
|
hass, [], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
|
||||||
|
unsub_single2()
|
||||||
|
unsub_single()
|
||||||
|
|
||||||
|
|
||||||
async def test_async_track_state_removed_domain(hass):
|
async def test_async_track_state_removed_domain(hass):
|
||||||
"""Test async_track_state_removed_domain."""
|
"""Test async_track_state_removed_domain."""
|
||||||
single_entity_id_tracker = []
|
single_entity_id_tracker = []
|
||||||
@ -2876,3 +2915,16 @@ async def test_async_track_entity_registry_updated_event_with_a_callback_that_th
|
|||||||
unsub2()
|
unsub2()
|
||||||
|
|
||||||
assert event_data[0] == {"action": "create", "entity_id": "switch.puppy_feeder"}
|
assert event_data[0] == {"action": "create", "entity_id": "switch.puppy_feeder"}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_track_entity_registry_updated_event_with_empty_list(hass):
|
||||||
|
"""Test async_track_entity_registry_updated_event passing an empty list of entities."""
|
||||||
|
unsub_single = hass.helpers.event.async_track_entity_registry_updated_event(
|
||||||
|
[], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
unsub_single2 = hass.helpers.event.async_track_entity_registry_updated_event(
|
||||||
|
[], ha.callback(lambda event: None)
|
||||||
|
)
|
||||||
|
|
||||||
|
unsub_single2()
|
||||||
|
unsub_single()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user