diff --git a/homeassistant/core.py b/homeassistant/core.py index 047f46afdf5..6e8d45bd0bd 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -22,6 +22,7 @@ from dataclasses import dataclass import datetime import enum import functools +import inspect import logging import os import pathlib @@ -1158,7 +1159,7 @@ class _OneTimeListener: remove: CALLBACK_TYPE | None = None @callback - def async_call(self, event: Event) -> None: + def __call__(self, event: Event) -> None: """Remove listener from event bus and then fire listener.""" if not self.remove: # If the listener was already removed, we don't need to do anything @@ -1167,6 +1168,13 @@ class _OneTimeListener: self.remove = None self.hass.async_run_job(self.listener, event) + def __repr__(self) -> str: + """Return the representation of the listener and source module.""" + module = inspect.getmodule(self.listener) + if module: + return f"<_OneTimeListener {module.__name__}:{self.listener}>" + return f"<_OneTimeListener {self.listener}>" + class EventBus: """Allow the firing of and listening for events.""" @@ -1364,7 +1372,7 @@ class EventBus: event_type, ( HassJob( - one_time_listener.async_call, + one_time_listener, f"onetime listen {event_type} {listener}", job_type=HassJobType.Callback, ), diff --git a/tests/test_core.py b/tests/test_core.py index eb1e6418476..466d4578c7e 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -2818,3 +2818,16 @@ def test_deprecated_constants( ) -> None: """Test deprecated constants.""" import_and_test_deprecated_constant_enum(caplog, ha, enum, "SOURCE_", "2025.1") + + +def test_one_time_listener_repr(hass: HomeAssistant) -> None: + """Test one time listener repr.""" + + def _listener(event: ha.Event): + """Test listener.""" + + one_time_listener = ha._OneTimeListener(hass, _listener) + repr_str = repr(one_time_listener) + assert "OneTimeListener" in repr_str + assert "test_core" in repr_str + assert "_listener" in repr_str