Use PEP 695 for decorator typing (2) (#117639)

This commit is contained in:
Marc Mueller 2024-05-17 16:31:01 +02:00 committed by GitHub
parent 25d1ca747b
commit c41962455e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 39 additions and 85 deletions

View File

@ -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."""

View File

@ -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."""

View File

@ -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.

View File

@ -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]],

View File

@ -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],

View File

@ -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.

View File

@ -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."""

View File

@ -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."""

View File

@ -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.

View File

@ -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."""

View File

@ -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)

View File

@ -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."""

View File

@ -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."""

View File

@ -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)

View File

@ -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.