mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 17:27:10 +00:00
Use PEP 695 for decorator typing (2) (#117639)
This commit is contained in:
parent
25d1ca747b
commit
c41962455e
@ -6,7 +6,7 @@ from collections.abc import Awaitable, Callable, Coroutine
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from iaqualink.client import AqualinkClient
|
from iaqualink.client import AqualinkClient
|
||||||
@ -39,9 +39,6 @@ from homeassistant.helpers.event import async_track_time_interval
|
|||||||
|
|
||||||
from .const import DOMAIN, UPDATE_INTERVAL
|
from .const import DOMAIN, UPDATE_INTERVAL
|
||||||
|
|
||||||
_AqualinkEntityT = TypeVar("_AqualinkEntityT", bound="AqualinkEntity")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
ATTR_CONFIG = "config"
|
ATTR_CONFIG = "config"
|
||||||
@ -182,7 +179,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
return await hass.config_entries.async_unload_platforms(entry, platforms_to_unload)
|
return await hass.config_entries.async_unload_platforms(entry, platforms_to_unload)
|
||||||
|
|
||||||
|
|
||||||
def refresh_system(
|
def refresh_system[_AqualinkEntityT: AqualinkEntity, **_P](
|
||||||
func: Callable[Concatenate[_AqualinkEntityT, _P], Awaitable[Any]],
|
func: Callable[Concatenate[_AqualinkEntityT, _P], Awaitable[Any]],
|
||||||
) -> Callable[Concatenate[_AqualinkEntityT, _P], Coroutine[Any, Any, None]]:
|
) -> Callable[Concatenate[_AqualinkEntityT, _P], Coroutine[Any, Any, None]]:
|
||||||
"""Force update all entities after state change."""
|
"""Force update all entities after state change."""
|
||||||
|
@ -7,7 +7,7 @@ from datetime import timedelta
|
|||||||
from functools import wraps
|
from functools import wraps
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from jsonrpc_base.jsonrpc import ProtocolError, TransportError
|
from jsonrpc_base.jsonrpc import ProtocolError, TransportError
|
||||||
from pykodi import CannotConnectError
|
from pykodi import CannotConnectError
|
||||||
@ -71,9 +71,6 @@ from .const import (
|
|||||||
EVENT_TURN_ON,
|
EVENT_TURN_ON,
|
||||||
)
|
)
|
||||||
|
|
||||||
_KodiEntityT = TypeVar("_KodiEntityT", bound="KodiEntity")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
EVENT_KODI_CALL_METHOD_RESULT = "kodi_call_method_result"
|
EVENT_KODI_CALL_METHOD_RESULT = "kodi_call_method_result"
|
||||||
@ -231,7 +228,7 @@ async def async_setup_entry(
|
|||||||
async_add_entities([entity])
|
async_add_entities([entity])
|
||||||
|
|
||||||
|
|
||||||
def cmd(
|
def cmd[_KodiEntityT: KodiEntity, **_P](
|
||||||
func: Callable[Concatenate[_KodiEntityT, _P], Awaitable[Any]],
|
func: Callable[Concatenate[_KodiEntityT, _P], Awaitable[Any]],
|
||||||
) -> Callable[Concatenate[_KodiEntityT, _P], Coroutine[Any, Any, None]]:
|
) -> Callable[Concatenate[_KodiEntityT, _P], Coroutine[Any, Any, None]]:
|
||||||
"""Catch command exceptions."""
|
"""Catch command exceptions."""
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from demetriek import LaMetricConnectionError, LaMetricError
|
from demetriek import LaMetricConnectionError, LaMetricError
|
||||||
|
|
||||||
@ -15,11 +15,8 @@ from .const import DOMAIN
|
|||||||
from .coordinator import LaMetricDataUpdateCoordinator
|
from .coordinator import LaMetricDataUpdateCoordinator
|
||||||
from .entity import LaMetricEntity
|
from .entity import LaMetricEntity
|
||||||
|
|
||||||
_LaMetricEntityT = TypeVar("_LaMetricEntityT", bound=LaMetricEntity)
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
def lametric_exception_handler[_LaMetricEntityT: LaMetricEntity, **_P](
|
||||||
def lametric_exception_handler(
|
|
||||||
func: Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any, Any]],
|
func: Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any, Any]],
|
||||||
) -> Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any, None]]:
|
) -> Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any, None]]:
|
||||||
"""Decorate LaMetric calls to handle LaMetric exceptions.
|
"""Decorate LaMetric calls to handle LaMetric exceptions.
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar, cast
|
from typing import Any, Concatenate, cast
|
||||||
|
|
||||||
from limitlessled import Color
|
from limitlessled import Color
|
||||||
from limitlessled.bridge import Bridge
|
from limitlessled.bridge import Bridge
|
||||||
@ -40,9 +40,6 @@ from homeassistant.helpers.restore_state import RestoreEntity
|
|||||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||||
from homeassistant.util.color import color_hs_to_RGB, color_temperature_mired_to_kelvin
|
from homeassistant.util.color import color_hs_to_RGB, color_temperature_mired_to_kelvin
|
||||||
|
|
||||||
_LimitlessLEDGroupT = TypeVar("_LimitlessLEDGroupT", bound="LimitlessLEDGroup")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
CONF_BRIDGES = "bridges"
|
CONF_BRIDGES = "bridges"
|
||||||
@ -176,7 +173,7 @@ def setup_platform(
|
|||||||
add_entities(lights)
|
add_entities(lights)
|
||||||
|
|
||||||
|
|
||||||
def state(
|
def state[_LimitlessLEDGroupT: LimitlessLEDGroup, **_P](
|
||||||
new_state: bool,
|
new_state: bool,
|
||||||
) -> Callable[
|
) -> Callable[
|
||||||
[Callable[Concatenate[_LimitlessLEDGroupT, int, Pipeline, _P], Any]],
|
[Callable[Concatenate[_LimitlessLEDGroupT, int, Pipeline, _P], Any]],
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from typing import Any, Concatenate, ParamSpec
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from matter_server.client.models.node import MatterNode
|
from matter_server.client.models.node import MatterNode
|
||||||
from matter_server.common.errors import MatterError
|
from matter_server.common.errors import MatterError
|
||||||
@ -18,8 +18,6 @@ from homeassistant.core import HomeAssistant, callback
|
|||||||
from .adapter import MatterAdapter
|
from .adapter import MatterAdapter
|
||||||
from .helpers import MissingNode, get_matter, node_from_ha_device_id
|
from .helpers import MissingNode, get_matter, node_from_ha_device_id
|
||||||
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
ID = "id"
|
ID = "id"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
DEVICE_ID = "device_id"
|
DEVICE_ID = "device_id"
|
||||||
@ -93,7 +91,7 @@ def async_get_matter_adapter(
|
|||||||
return _get_matter
|
return _get_matter
|
||||||
|
|
||||||
|
|
||||||
def async_handle_failed_command(
|
def async_handle_failed_command[**_P](
|
||||||
func: Callable[
|
func: Callable[
|
||||||
Concatenate[HomeAssistant, ActiveConnection, dict[str, Any], _P],
|
Concatenate[HomeAssistant, ActiveConnection, dict[str, Any], _P],
|
||||||
Coroutine[Any, Any, None],
|
Coroutine[Any, Any, None],
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from aiomodernforms import ModernFormsConnectionError, ModernFormsError
|
from aiomodernforms import ModernFormsConnectionError, ModernFormsError
|
||||||
|
|
||||||
@ -17,11 +17,6 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
from .coordinator import ModernFormsDataUpdateCoordinator
|
from .coordinator import ModernFormsDataUpdateCoordinator
|
||||||
|
|
||||||
_ModernFormsDeviceEntityT = TypeVar(
|
|
||||||
"_ModernFormsDeviceEntityT", bound="ModernFormsDeviceEntity"
|
|
||||||
)
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
Platform.BINARY_SENSOR,
|
Platform.BINARY_SENSOR,
|
||||||
Platform.FAN,
|
Platform.FAN,
|
||||||
@ -61,7 +56,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
return unload_ok
|
return unload_ok
|
||||||
|
|
||||||
|
|
||||||
def modernforms_exception_handler(
|
def modernforms_exception_handler[
|
||||||
|
_ModernFormsDeviceEntityT: ModernFormsDeviceEntity,
|
||||||
|
**_P,
|
||||||
|
](
|
||||||
func: Callable[Concatenate[_ModernFormsDeviceEntityT, _P], Any],
|
func: Callable[Concatenate[_ModernFormsDeviceEntityT, _P], Any],
|
||||||
) -> Callable[Concatenate[_ModernFormsDeviceEntityT, _P], Coroutine[Any, Any, None]]:
|
) -> Callable[Concatenate[_ModernFormsDeviceEntityT, _P], Coroutine[Any, Any, None]]:
|
||||||
"""Decorate Modern Forms calls to handle Modern Forms exceptions.
|
"""Decorate Modern Forms calls to handle Modern Forms exceptions.
|
||||||
|
@ -7,7 +7,7 @@ import dataclasses
|
|||||||
from functools import wraps
|
from functools import wraps
|
||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar, cast
|
from typing import Any, Concatenate, cast
|
||||||
|
|
||||||
import python_otbr_api
|
import python_otbr_api
|
||||||
from python_otbr_api import PENDING_DATASET_DELAY_TIMER, tlv_parser
|
from python_otbr_api import PENDING_DATASET_DELAY_TIMER, tlv_parser
|
||||||
@ -27,9 +27,6 @@ from homeassistant.helpers import issue_registry as ir
|
|||||||
|
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
INFO_URL_SKY_CONNECT = (
|
INFO_URL_SKY_CONNECT = (
|
||||||
@ -61,7 +58,7 @@ def generate_random_pan_id() -> int:
|
|||||||
return random.randint(0, 0xFFFE)
|
return random.randint(0, 0xFFFE)
|
||||||
|
|
||||||
|
|
||||||
def _handle_otbr_error(
|
def _handle_otbr_error[**_P, _R](
|
||||||
func: Callable[Concatenate[OTBRData, _P], Coroutine[Any, Any, _R]],
|
func: Callable[Concatenate[OTBRData, _P], Coroutine[Any, Any, _R]],
|
||||||
) -> Callable[Concatenate[OTBRData, _P], Coroutine[Any, Any, _R]]:
|
) -> Callable[Concatenate[OTBRData, _P], Coroutine[Any, Any, _R]]:
|
||||||
"""Handle OTBR errors."""
|
"""Handle OTBR errors."""
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar, cast
|
from typing import Any, Concatenate, cast
|
||||||
|
|
||||||
import plexapi.exceptions
|
import plexapi.exceptions
|
||||||
import requests.exceptions
|
import requests.exceptions
|
||||||
@ -46,14 +46,10 @@ from .helpers import get_plex_data, get_plex_server
|
|||||||
from .media_browser import browse_media
|
from .media_browser import browse_media
|
||||||
from .services import process_plex_payload
|
from .services import process_plex_payload
|
||||||
|
|
||||||
_PlexMediaPlayerT = TypeVar("_PlexMediaPlayerT", bound="PlexMediaPlayer")
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def needs_session(
|
def needs_session[_PlexMediaPlayerT: PlexMediaPlayer, **_P, _R](
|
||||||
func: Callable[Concatenate[_PlexMediaPlayerT, _P], _R],
|
func: Callable[Concatenate[_PlexMediaPlayerT, _P], _R],
|
||||||
) -> Callable[Concatenate[_PlexMediaPlayerT, _P], _R | None]:
|
) -> Callable[Concatenate[_PlexMediaPlayerT, _P], _R | None]:
|
||||||
"""Ensure session is available for certain attributes."""
|
"""Ensure session is available for certain attributes."""
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Utilities for Plugwise."""
|
"""Utilities for Plugwise."""
|
||||||
|
|
||||||
from collections.abc import Awaitable, Callable, Coroutine
|
from collections.abc import Awaitable, Callable, Coroutine
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from plugwise.exceptions import PlugwiseException
|
from plugwise.exceptions import PlugwiseException
|
||||||
|
|
||||||
@ -9,12 +9,8 @@ from homeassistant.exceptions import HomeAssistantError
|
|||||||
|
|
||||||
from .entity import PlugwiseEntity
|
from .entity import PlugwiseEntity
|
||||||
|
|
||||||
_PlugwiseEntityT = TypeVar("_PlugwiseEntityT", bound=PlugwiseEntity)
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
def plugwise_command[_PlugwiseEntityT: PlugwiseEntity, **_P, _R](
|
||||||
def plugwise_command(
|
|
||||||
func: Callable[Concatenate[_PlugwiseEntityT, _P], Awaitable[_R]],
|
func: Callable[Concatenate[_PlugwiseEntityT, _P], Awaitable[_R]],
|
||||||
) -> Callable[Concatenate[_PlugwiseEntityT, _P], Coroutine[Any, Any, _R]]:
|
) -> Callable[Concatenate[_PlugwiseEntityT, _P], Coroutine[Any, Any, _R]]:
|
||||||
"""Decorate Plugwise calls that send commands/make changes to the device.
|
"""Decorate Plugwise calls that send commands/make changes to the device.
|
||||||
|
@ -6,7 +6,7 @@ import asyncio
|
|||||||
from collections.abc import Awaitable, Callable, Coroutine
|
from collections.abc import Awaitable, Callable, Coroutine
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from regenmaschine.errors import RainMachineError
|
from regenmaschine.errors import RainMachineError
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
@ -110,11 +110,7 @@ VEGETATION_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_T = TypeVar("_T", bound="RainMachineBaseSwitch")
|
def raise_on_request_error[_T: RainMachineBaseSwitch, **_P](
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
|
||||||
def raise_on_request_error(
|
|
||||||
func: Callable[Concatenate[_T, _P], Awaitable[None]],
|
func: Callable[Concatenate[_T, _P], Awaitable[None]],
|
||||||
) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, None]]:
|
) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, None]]:
|
||||||
"""Define a decorator to raise on a request error."""
|
"""Define a decorator to raise on a request error."""
|
||||||
|
@ -8,7 +8,7 @@ from dataclasses import dataclass
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar, cast
|
from typing import Any, Concatenate, cast
|
||||||
|
|
||||||
from renault_api.exceptions import RenaultException
|
from renault_api.exceptions import RenaultException
|
||||||
from renault_api.kamereon import models
|
from renault_api.kamereon import models
|
||||||
@ -22,13 +22,11 @@ from .const import DOMAIN
|
|||||||
from .coordinator import RenaultDataUpdateCoordinator
|
from .coordinator import RenaultDataUpdateCoordinator
|
||||||
|
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
_T = TypeVar("_T")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
|
||||||
def with_error_wrapping(
|
def with_error_wrapping[**_P, _R](
|
||||||
func: Callable[Concatenate[RenaultVehicleProxy, _P], Awaitable[_T]],
|
func: Callable[Concatenate[RenaultVehicleProxy, _P], Awaitable[_R]],
|
||||||
) -> Callable[Concatenate[RenaultVehicleProxy, _P], Coroutine[Any, Any, _T]]:
|
) -> Callable[Concatenate[RenaultVehicleProxy, _P], Coroutine[Any, Any, _R]]:
|
||||||
"""Catch Renault errors."""
|
"""Catch Renault errors."""
|
||||||
|
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
@ -36,7 +34,7 @@ def with_error_wrapping(
|
|||||||
self: RenaultVehicleProxy,
|
self: RenaultVehicleProxy,
|
||||||
*args: _P.args,
|
*args: _P.args,
|
||||||
**kwargs: _P.kwargs,
|
**kwargs: _P.kwargs,
|
||||||
) -> _T:
|
) -> _R:
|
||||||
"""Catch RenaultException errors and raise HomeAssistantError."""
|
"""Catch RenaultException errors and raise HomeAssistantError."""
|
||||||
try:
|
try:
|
||||||
return await func(self, *args, **kwargs)
|
return await func(self, *args, **kwargs)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Base class for Ring entity."""
|
"""Base class for Ring entity."""
|
||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from typing import Any, Concatenate, Generic, ParamSpec, cast
|
from typing import Any, Concatenate, Generic, cast
|
||||||
|
|
||||||
from ring_doorbell import (
|
from ring_doorbell import (
|
||||||
AuthenticationError,
|
AuthenticationError,
|
||||||
@ -26,12 +26,9 @@ _RingCoordinatorT = TypeVar(
|
|||||||
"_RingCoordinatorT",
|
"_RingCoordinatorT",
|
||||||
bound=(RingDataCoordinator | RingNotificationsCoordinator),
|
bound=(RingDataCoordinator | RingNotificationsCoordinator),
|
||||||
)
|
)
|
||||||
_RingBaseEntityT = TypeVar("_RingBaseEntityT", bound="RingBaseEntity[Any, Any]")
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
|
||||||
def exception_wrap(
|
def exception_wrap[_RingBaseEntityT: RingBaseEntity[Any, Any], **_P, _R](
|
||||||
func: Callable[Concatenate[_RingBaseEntityT, _P], _R],
|
func: Callable[Concatenate[_RingBaseEntityT, _P], _R],
|
||||||
) -> Callable[Concatenate[_RingBaseEntityT, _P], _R]:
|
) -> Callable[Concatenate[_RingBaseEntityT, _P], _R]:
|
||||||
"""Define a wrapper to catch exceptions and raise HomeAssistant errors."""
|
"""Define a wrapper to catch exceptions and raise HomeAssistant errors."""
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
from typing import TYPE_CHECKING, Any, Concatenate, ParamSpec, TypeVar
|
from typing import TYPE_CHECKING, Any, Concatenate
|
||||||
|
|
||||||
from pysensibo.model import MotionSensor, SensiboDevice
|
from pysensibo.model import MotionSensor, SensiboDevice
|
||||||
|
|
||||||
@ -15,11 +15,8 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|||||||
from .const import DOMAIN, LOGGER, SENSIBO_ERRORS, TIMEOUT
|
from .const import DOMAIN, LOGGER, SENSIBO_ERRORS, TIMEOUT
|
||||||
from .coordinator import SensiboDataUpdateCoordinator
|
from .coordinator import SensiboDataUpdateCoordinator
|
||||||
|
|
||||||
_T = TypeVar("_T", bound="SensiboDeviceBaseEntity")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
def async_handle_api_call[_T: SensiboDeviceBaseEntity, **_P](
|
||||||
def async_handle_api_call(
|
|
||||||
function: Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]],
|
function: Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]],
|
||||||
) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]]:
|
) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]]:
|
||||||
"""Decorate api calls."""
|
"""Decorate api calls."""
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
from collections.abc import Awaitable, Callable, Coroutine
|
from collections.abc import Awaitable, Callable, Coroutine
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
from sfrbox_api.bridge import SFRBox
|
from sfrbox_api.bridge import SFRBox
|
||||||
from sfrbox_api.exceptions import SFRBoxError
|
from sfrbox_api.exceptions import SFRBoxError
|
||||||
@ -26,13 +26,10 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
from .models import DomainData
|
from .models import DomainData
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
|
def with_error_wrapping[**_P, _R](
|
||||||
def with_error_wrapping(
|
func: Callable[Concatenate[SFRBoxButton, _P], Awaitable[_R]],
|
||||||
func: Callable[Concatenate[SFRBoxButton, _P], Awaitable[_T]],
|
) -> Callable[Concatenate[SFRBoxButton, _P], Coroutine[Any, Any, _R]]:
|
||||||
) -> Callable[Concatenate[SFRBoxButton, _P], Coroutine[Any, Any, _T]]:
|
|
||||||
"""Catch SFR errors."""
|
"""Catch SFR errors."""
|
||||||
|
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
@ -40,7 +37,7 @@ def with_error_wrapping(
|
|||||||
self: SFRBoxButton,
|
self: SFRBoxButton,
|
||||||
*args: _P.args,
|
*args: _P.args,
|
||||||
**kwargs: _P.kwargs,
|
**kwargs: _P.kwargs,
|
||||||
) -> _T:
|
) -> _R:
|
||||||
"""Catch SFRBoxError errors and raise HomeAssistantError."""
|
"""Catch SFRBoxError errors and raise HomeAssistantError."""
|
||||||
try:
|
try:
|
||||||
return await func(self, *args, **kwargs)
|
return await func(self, *args, **kwargs)
|
||||||
|
@ -6,7 +6,7 @@ from asyncio import run_coroutine_threadsafe
|
|||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Concatenate, ParamSpec, TypeVar
|
from typing import Any, Concatenate
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from spotipy import SpotifyException
|
from spotipy import SpotifyException
|
||||||
@ -35,10 +35,6 @@ from .browse_media import async_browse_media_internal
|
|||||||
from .const import DOMAIN, MEDIA_PLAYER_PREFIX, PLAYABLE_MEDIA_TYPES, SPOTIFY_SCOPES
|
from .const import DOMAIN, MEDIA_PLAYER_PREFIX, PLAYABLE_MEDIA_TYPES, SPOTIFY_SCOPES
|
||||||
from .util import fetch_image_url
|
from .util import fetch_image_url
|
||||||
|
|
||||||
_SpotifyMediaPlayerT = TypeVar("_SpotifyMediaPlayerT", bound="SpotifyMediaPlayer")
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
SCAN_INTERVAL = timedelta(seconds=30)
|
SCAN_INTERVAL = timedelta(seconds=30)
|
||||||
@ -86,7 +82,7 @@ async def async_setup_entry(
|
|||||||
async_add_entities([spotify], True)
|
async_add_entities([spotify], True)
|
||||||
|
|
||||||
|
|
||||||
def spotify_exception_handler(
|
def spotify_exception_handler[_SpotifyMediaPlayerT: SpotifyMediaPlayer, **_P, _R](
|
||||||
func: Callable[Concatenate[_SpotifyMediaPlayerT, _P], _R],
|
func: Callable[Concatenate[_SpotifyMediaPlayerT, _P], _R],
|
||||||
) -> Callable[Concatenate[_SpotifyMediaPlayerT, _P], _R | None]:
|
) -> Callable[Concatenate[_SpotifyMediaPlayerT, _P], _R | None]:
|
||||||
"""Decorate Spotify calls to handle Spotify exception.
|
"""Decorate Spotify calls to handle Spotify exception.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user