diff --git a/homeassistant/components/roku/__init__.py b/homeassistant/components/roku/__init__.py index ac7a9e38565..e76921b945b 100644 --- a/homeassistant/components/roku/__init__.py +++ b/homeassistant/components/roku/__init__.py @@ -1,10 +1,13 @@ """Support for Roku.""" from __future__ import annotations -from collections.abc import Callable +from collections.abc import Awaitable, Callable, Coroutine +from functools import wraps import logging +from typing import Any, TypeVar from rokuecp import RokuConnectionError, RokuError +from typing_extensions import Concatenate, ParamSpec from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, Platform @@ -13,6 +16,7 @@ from homeassistant.helpers import config_validation as cv from .const import DOMAIN from .coordinator import RokuDataUpdateCoordinator +from .entity import RokuEntity CONFIG_SCHEMA = cv.removed(DOMAIN, raise_if_present=False) @@ -24,6 +28,9 @@ PLATFORMS = [ ] _LOGGER = logging.getLogger(__name__) +_T = TypeVar("_T", bound="RokuEntity") +_P = ParamSpec("_P") + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Roku from a config entry.""" @@ -47,10 +54,13 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return unload_ok -def roku_exception_handler(func: Callable) -> Callable: +def roku_exception_handler( + func: Callable[Concatenate[_T, _P], Awaitable[None]] # type: ignore[misc] +) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, None]]: # type: ignore[misc] """Decorate Roku calls to handle Roku exceptions.""" - async def handler(self, *args, **kwargs) -> None: # type: ignore + @wraps(func) + async def wrapper(self: _T, *args: _P.args, **kwargs: _P.kwargs) -> None: try: await func(self, *args, **kwargs) except RokuConnectionError as error: @@ -60,4 +70,4 @@ def roku_exception_handler(func: Callable) -> Callable: if self.available: _LOGGER.error("Invalid response from API: %s", error) - return handler + return wrapper