Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 12 additions & 16 deletions homeassistant/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
TYPE_CHECKING,
Any,
Generic,
NamedTuple,
ParamSpec,
TypeVar,
cast,
Expand Down Expand Up @@ -964,21 +963,20 @@ def __repr__(self) -> str:
return f"<Event {self.event_type}[{str(self.origin)[0]}]>"


class _FilterableJob(NamedTuple):
"""Event listener job to be executed with optional filter."""

job: HassJob[[Event], Coroutine[Any, Any, None] | None]
event_filter: Callable[[Event], bool] | None
run_immediately: bool
_FilterableJobType = tuple[
HassJob[[Event], Coroutine[Any, Any, None] | None], # job
Callable[[Event], bool] | None, # event_filter
bool, # run_immediately
]


class EventBus:
"""Allow the firing of and listening for events."""

def __init__(self, hass: HomeAssistant) -> None:
"""Initialize a new event bus."""
self._listeners: dict[str, list[_FilterableJob]] = {}
self._match_all_listeners: list[_FilterableJob] = []
self._listeners: dict[str, list[_FilterableJobType]] = {}
self._match_all_listeners: list[_FilterableJobType] = []
self._listeners[MATCH_ALL] = self._match_all_listeners
self._hass = hass

Expand Down Expand Up @@ -1105,14 +1103,12 @@ def async_listen(
raise HomeAssistantError(f"Event listener {listener} is not a callback")
return self._async_listen_filterable_job(
event_type,
_FilterableJob(
HassJob(listener, f"listen {event_type}"), event_filter, run_immediately
),
(HassJob(listener, f"listen {event_type}"), event_filter, run_immediately),
)

@callback
def _async_listen_filterable_job(
self, event_type: str, filterable_job: _FilterableJob
self, event_type: str, filterable_job: _FilterableJobType
) -> CALLBACK_TYPE:
self._listeners.setdefault(event_type, []).append(filterable_job)

Expand Down Expand Up @@ -1159,7 +1155,7 @@ def async_listen_once(

This method must be run in the event loop.
"""
filterable_job: _FilterableJob | None = None
filterable_job: _FilterableJobType | None = None

@callback
def _onetime_listener(event: Event) -> None:
Expand All @@ -1181,7 +1177,7 @@ def _onetime_listener(event: Event) -> None:
_onetime_listener, listener, ("__name__", "__qualname__", "__module__"), []
)

filterable_job = _FilterableJob(
filterable_job = (
HassJob(_onetime_listener, f"onetime listen {event_type} {listener}"),
None,
False,
Expand All @@ -1191,7 +1187,7 @@ def _onetime_listener(event: Event) -> None:

@callback
def _async_remove_listener(
self, event_type: str, filterable_job: _FilterableJob
self, event_type: str, filterable_job: _FilterableJobType
) -> None:
"""Remove a listener of a specific event_type.

Expand Down