mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Use PEP 695 for function annotations (1) (#117658)
This commit is contained in:
parent
900b6211ef
commit
26a599ad11
@ -7,7 +7,7 @@ from collections.abc import Callable, Coroutine, Iterable, ValuesView
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, ParamSpec, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
from aiohttp import ClientError, ClientResponseError
|
from aiohttp import ClientError, ClientResponseError
|
||||||
from yalexs.activity import ActivityTypes
|
from yalexs.activity import ActivityTypes
|
||||||
@ -36,9 +36,6 @@ from .gateway import AugustGateway
|
|||||||
from .subscriber import AugustSubscriberMixin
|
from .subscriber import AugustSubscriberMixin
|
||||||
from .util import async_create_august_clientsession
|
from .util import async_create_august_clientsession
|
||||||
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
API_CACHED_ATTRS = {
|
API_CACHED_ATTRS = {
|
||||||
@ -403,7 +400,7 @@ class AugustData(AugustSubscriberMixin):
|
|||||||
hyper_bridge,
|
hyper_bridge,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _async_call_api_op_requires_bridge(
|
async def _async_call_api_op_requires_bridge[**_P, _R](
|
||||||
self,
|
self,
|
||||||
device_id: str,
|
device_id: str,
|
||||||
func: Callable[_P, Coroutine[Any, Any, _R]],
|
func: Callable[_P, Coroutine[Any, Any, _R]],
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Self, TypeVar
|
from typing import Any, Self
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -23,8 +23,6 @@ from homeassistant.helpers.restore_state import RestoreEntity
|
|||||||
from homeassistant.helpers.storage import Store
|
from homeassistant.helpers.storage import Store
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
ATTR_INITIAL = "initial"
|
ATTR_INITIAL = "initial"
|
||||||
@ -62,7 +60,7 @@ STORAGE_FIELDS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _none_to_empty_dict(value: _T | None) -> _T | dict[str, Any]:
|
def _none_to_empty_dict[_T](value: _T | None) -> _T | dict[str, Any]:
|
||||||
if value is None:
|
if value is None:
|
||||||
return {}
|
return {}
|
||||||
return value
|
return value
|
||||||
|
@ -8,7 +8,7 @@ from enum import IntFlag, StrEnum
|
|||||||
import functools as ft
|
import functools as ft
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, ParamSpec, TypeVar, final
|
from typing import Any, final
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -54,9 +54,6 @@ SCAN_INTERVAL = timedelta(seconds=15)
|
|||||||
|
|
||||||
ENTITY_ID_FORMAT = DOMAIN + ".{}"
|
ENTITY_ID_FORMAT = DOMAIN + ".{}"
|
||||||
|
|
||||||
_P = ParamSpec("_P")
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
|
|
||||||
|
|
||||||
class CoverDeviceClass(StrEnum):
|
class CoverDeviceClass(StrEnum):
|
||||||
"""Device class for cover."""
|
"""Device class for cover."""
|
||||||
@ -477,7 +474,7 @@ class CoverEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||||||
else:
|
else:
|
||||||
await self.async_close_cover_tilt(**kwargs)
|
await self.async_close_cover_tilt(**kwargs)
|
||||||
|
|
||||||
def _get_toggle_function(
|
def _get_toggle_function[**_P, _R](
|
||||||
self, fns: dict[str, Callable[_P, _R]]
|
self, fns: dict[str, Callable[_P, _R]]
|
||||||
) -> Callable[_P, _R]:
|
) -> Callable[_P, _R]:
|
||||||
# If we are opening or closing and we support stopping, then we should stop
|
# If we are opening or closing and we support stopping, then we should stop
|
||||||
|
@ -3,14 +3,12 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Iterable, Mapping
|
from collections.abc import Iterable, Mapping
|
||||||
from typing import Any, TypeVar, cast, overload
|
from typing import Any, cast, overload
|
||||||
|
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
|
|
||||||
from .const import REDACTED
|
from .const import REDACTED
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict: # type: ignore[overload-overlap]
|
def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict: # type: ignore[overload-overlap]
|
||||||
@ -18,11 +16,11 @@ def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict: # type:
|
|||||||
|
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def async_redact_data(data: _T, to_redact: Iterable[Any]) -> _T: ...
|
def async_redact_data[_T](data: _T, to_redact: Iterable[Any]) -> _T: ...
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_redact_data(data: _T, to_redact: Iterable[Any]) -> _T:
|
def async_redact_data[_T](data: _T, to_redact: Iterable[Any]) -> _T:
|
||||||
"""Redact sensitive data in a dict."""
|
"""Redact sensitive data in a dict."""
|
||||||
if not isinstance(data, (Mapping, list)):
|
if not isinstance(data, (Mapping, list)):
|
||||||
return data
|
return data
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, TypeVar, cast
|
from typing import Any, cast
|
||||||
|
|
||||||
from fitbit import Fitbit
|
from fitbit import Fitbit
|
||||||
from fitbit.exceptions import HTTPException, HTTPUnauthorized
|
from fitbit.exceptions import HTTPException, HTTPUnauthorized
|
||||||
@ -24,9 +24,6 @@ CONF_REFRESH_TOKEN = "refresh_token"
|
|||||||
CONF_EXPIRES_AT = "expires_at"
|
CONF_EXPIRES_AT = "expires_at"
|
||||||
|
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
|
|
||||||
class FitbitApi(ABC):
|
class FitbitApi(ABC):
|
||||||
"""Fitbit client library wrapper base class.
|
"""Fitbit client library wrapper base class.
|
||||||
|
|
||||||
@ -129,7 +126,7 @@ class FitbitApi(ABC):
|
|||||||
dated_results: list[dict[str, Any]] = response[key]
|
dated_results: list[dict[str, Any]] = response[key]
|
||||||
return dated_results[-1]
|
return dated_results[-1]
|
||||||
|
|
||||||
async def _run(self, func: Callable[[], _T]) -> _T:
|
async def _run[_T](self, func: Callable[[], _T]) -> _T:
|
||||||
"""Run client command."""
|
"""Run client command."""
|
||||||
try:
|
try:
|
||||||
return await self._hass.async_add_executor_job(func)
|
return await self._hass.async_add_executor_job(func)
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
import asyncio
|
import asyncio
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Final, TypeVar
|
from typing import Final
|
||||||
|
|
||||||
from pyfronius import Fronius, FroniusError
|
from pyfronius import Fronius, FroniusError
|
||||||
|
|
||||||
@ -39,8 +39,6 @@ from .coordinator import (
|
|||||||
_LOGGER: Final = logging.getLogger(__name__)
|
_LOGGER: Final = logging.getLogger(__name__)
|
||||||
PLATFORMS: Final = [Platform.SENSOR]
|
PLATFORMS: Final = [Platform.SENSOR]
|
||||||
|
|
||||||
_FroniusCoordinatorT = TypeVar("_FroniusCoordinatorT", bound=FroniusCoordinatorBase)
|
|
||||||
|
|
||||||
type FroniusConfigEntry = ConfigEntry[FroniusSolarNet]
|
type FroniusConfigEntry = ConfigEntry[FroniusSolarNet]
|
||||||
|
|
||||||
|
|
||||||
@ -255,7 +253,7 @@ class FroniusSolarNet:
|
|||||||
return inverter_infos
|
return inverter_infos
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def _init_optional_coordinator(
|
async def _init_optional_coordinator[_FroniusCoordinatorT: FroniusCoordinatorBase](
|
||||||
coordinator: _FroniusCoordinatorT,
|
coordinator: _FroniusCoordinatorT,
|
||||||
) -> _FroniusCoordinatorT | None:
|
) -> _FroniusCoordinatorT | None:
|
||||||
"""Initialize an update coordinator and return it if devices are found."""
|
"""Initialize an update coordinator and return it if devices are found."""
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
from homeassistant.components import (
|
from homeassistant.components import (
|
||||||
alarm_control_panel,
|
alarm_control_panel,
|
||||||
@ -242,10 +242,8 @@ COVER_VALVE_DOMAINS = {cover.DOMAIN, valve.DOMAIN}
|
|||||||
|
|
||||||
FRIENDLY_DOMAIN = {cover.DOMAIN: "Cover", valve.DOMAIN: "Valve"}
|
FRIENDLY_DOMAIN = {cover.DOMAIN: "Cover", valve.DOMAIN: "Valve"}
|
||||||
|
|
||||||
_TraitT = TypeVar("_TraitT", bound="_Trait")
|
|
||||||
|
|
||||||
|
def register_trait[_TraitT: _Trait](trait: type[_TraitT]) -> type[_TraitT]:
|
||||||
def register_trait(trait: type[_TraitT]) -> type[_TraitT]:
|
|
||||||
"""Decorate a class to register a trait."""
|
"""Decorate a class to register a trait."""
|
||||||
TRAITS.append(trait)
|
TRAITS.append(trait)
|
||||||
return trait
|
return trait
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
import datetime
|
import datetime
|
||||||
from typing import Any, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -55,10 +55,8 @@ UNITS: dict[str, str] = {
|
|||||||
}
|
}
|
||||||
ICON = "mdi:chart-line"
|
ICON = "mdi:chart-line"
|
||||||
|
|
||||||
_T = TypeVar("_T", bound=dict[str, Any])
|
|
||||||
|
|
||||||
|
def exactly_two_period_keys[_T: dict[str, Any]](conf: _T) -> _T:
|
||||||
def exactly_two_period_keys(conf: _T) -> _T:
|
|
||||||
"""Ensure exactly 2 of CONF_PERIOD_KEYS are provided."""
|
"""Ensure exactly 2 of CONF_PERIOD_KEYS are provided."""
|
||||||
if sum(param in conf for param in CONF_PERIOD_KEYS) != 2:
|
if sum(param in conf for param in CONF_PERIOD_KEYS) != 2:
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
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, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -41,10 +41,8 @@ from homeassistant.helpers.event import (
|
|||||||
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
|
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
|
|
||||||
_T = TypeVar("_T", bound=dict[str, Any])
|
|
||||||
|
|
||||||
|
def validate_above_below[_T: dict[str, Any]](value: _T) -> _T:
|
||||||
def validate_above_below(value: _T) -> _T:
|
|
||||||
"""Validate that above and below can co-exist."""
|
"""Validate that above and below can co-exist."""
|
||||||
above = value.get(CONF_ABOVE)
|
above = value.get(CONF_ABOVE)
|
||||||
below = value.get(CONF_BELOW)
|
below = value.get(CONF_BELOW)
|
||||||
|
@ -6,7 +6,7 @@ import asyncio
|
|||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
from bleak import BleakError
|
from bleak import BleakError
|
||||||
from improv_ble_client import (
|
from improv_ble_client import (
|
||||||
@ -30,8 +30,6 @@ from .const import DOMAIN
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
STEP_PROVISION_SCHEMA = vol.Schema(
|
STEP_PROVISION_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required("ssid"): str,
|
vol.Required("ssid"): str,
|
||||||
@ -392,7 +390,7 @@ class ImprovBLEConfigFlow(ConfigFlow, domain=DOMAIN):
|
|||||||
return self.async_show_progress_done(next_step_id="provision")
|
return self.async_show_progress_done(next_step_id="provision")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def _try_call(func: Coroutine[Any, Any, _T]) -> _T:
|
async def _try_call[_T](func: Coroutine[Any, Any, _T]) -> _T:
|
||||||
"""Call the library and abort flow on common errors."""
|
"""Call the library and abort flow on common errors."""
|
||||||
try:
|
try:
|
||||||
return await func
|
return await func
|
||||||
|
@ -6,7 +6,7 @@ from collections.abc import Awaitable, Callable
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
from linear_garage_door import Linear
|
from linear_garage_door import Linear
|
||||||
from linear_garage_door.errors import InvalidLoginError
|
from linear_garage_door.errors import InvalidLoginError
|
||||||
@ -19,8 +19,6 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class LinearDevice:
|
class LinearDevice:
|
||||||
@ -63,7 +61,7 @@ class LinearUpdateCoordinator(DataUpdateCoordinator[dict[str, LinearDevice]]):
|
|||||||
|
|
||||||
return await self.execute(update_data)
|
return await self.execute(update_data)
|
||||||
|
|
||||||
async def execute(self, func: Callable[[Linear], Awaitable[_T]]) -> _T:
|
async def execute[_T](self, func: Callable[[Linear], Awaitable[_T]]) -> _T:
|
||||||
"""Execute an API call."""
|
"""Execute an API call."""
|
||||||
linear = Linear()
|
linear = Linear()
|
||||||
try:
|
try:
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
"""Melnor integration models."""
|
"""Melnor integration models."""
|
||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from typing import TypeVar
|
|
||||||
|
|
||||||
from melnor_bluetooth.device import Device, Valve
|
from melnor_bluetooth.device import Device, Valve
|
||||||
|
|
||||||
@ -77,14 +76,11 @@ class MelnorZoneEntity(MelnorBluetoothEntity):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
T = TypeVar("T", bound=EntityDescription)
|
def get_entities_for_valves[_T: EntityDescription](
|
||||||
|
|
||||||
|
|
||||||
def get_entities_for_valves(
|
|
||||||
coordinator: MelnorDataUpdateCoordinator,
|
coordinator: MelnorDataUpdateCoordinator,
|
||||||
descriptions: list[T],
|
descriptions: list[_T],
|
||||||
function: Callable[
|
function: Callable[
|
||||||
[Valve, T],
|
[Valve, _T],
|
||||||
CoordinatorEntity[MelnorDataUpdateCoordinator],
|
CoordinatorEntity[MelnorDataUpdateCoordinator],
|
||||||
],
|
],
|
||||||
) -> list[CoordinatorEntity[MelnorDataUpdateCoordinator]]:
|
) -> list[CoordinatorEntity[MelnorDataUpdateCoordinator]]:
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Coroutine
|
from collections.abc import Coroutine
|
||||||
from typing import Any, TypeVar
|
from typing import Any
|
||||||
from urllib.error import URLError
|
from urllib.error import URLError
|
||||||
|
|
||||||
from radiotherm.validate import RadiothermTstatError
|
from radiotherm.validate import RadiothermTstatError
|
||||||
@ -20,10 +20,8 @@ from .util import async_set_time
|
|||||||
|
|
||||||
PLATFORMS: list[Platform] = [Platform.CLIMATE, Platform.SWITCH]
|
PLATFORMS: list[Platform] = [Platform.CLIMATE, Platform.SWITCH]
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
|
async def _async_call_or_raise_not_ready[_T](
|
||||||
async def _async_call_or_raise_not_ready(
|
|
||||||
coro: Coroutine[Any, Any, _T], host: str
|
coro: Coroutine[Any, Any, _T], host: str
|
||||||
) -> _T:
|
) -> _T:
|
||||||
"""Call a coro or raise ConfigEntryNotReady."""
|
"""Call a coro or raise ConfigEntryNotReady."""
|
||||||
|
@ -12,7 +12,7 @@ import queue
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
from typing import TYPE_CHECKING, Any, TypeVar, cast
|
from typing import TYPE_CHECKING, Any, cast
|
||||||
|
|
||||||
import psutil_home_assistant as ha_psutil
|
import psutil_home_assistant as ha_psutil
|
||||||
from sqlalchemy import create_engine, event as sqlalchemy_event, exc, select, update
|
from sqlalchemy import create_engine, event as sqlalchemy_event, exc, select, update
|
||||||
@ -138,8 +138,6 @@ from .util import (
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
T = TypeVar("T")
|
|
||||||
|
|
||||||
DEFAULT_URL = "sqlite:///{hass_config_path}"
|
DEFAULT_URL = "sqlite:///{hass_config_path}"
|
||||||
|
|
||||||
# Controls how often we clean up
|
# Controls how often we clean up
|
||||||
@ -366,9 +364,9 @@ class Recorder(threading.Thread):
|
|||||||
self.queue_task(COMMIT_TASK)
|
self.queue_task(COMMIT_TASK)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_add_executor_job(
|
def async_add_executor_job[_T](
|
||||||
self, target: Callable[..., T], *args: Any
|
self, target: Callable[..., _T], *args: Any
|
||||||
) -> asyncio.Future[T]:
|
) -> asyncio.Future[_T]:
|
||||||
"""Add an executor job from within the event loop."""
|
"""Add an executor job from within the event loop."""
|
||||||
return self.hass.loop.run_in_executor(self._db_executor, target, *args)
|
return self.hass.loop.run_in_executor(self._db_executor, target, *args)
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import binascii
|
|||||||
from collections.abc import Callable, Mapping
|
from collections.abc import Callable, Mapping
|
||||||
import copy
|
import copy
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, NamedTuple, TypeVarTuple, cast
|
from typing import Any, NamedTuple, cast
|
||||||
|
|
||||||
import RFXtrx as rfxtrxmod
|
import RFXtrx as rfxtrxmod
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
@ -55,8 +55,6 @@ DEFAULT_OFF_DELAY = 2.0
|
|||||||
SIGNAL_EVENT = f"{DOMAIN}_event"
|
SIGNAL_EVENT = f"{DOMAIN}_event"
|
||||||
CONNECT_TIMEOUT = 30.0
|
CONNECT_TIMEOUT = 30.0
|
||||||
|
|
||||||
_Ts = TypeVarTuple("_Ts")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -573,7 +571,7 @@ class RfxtrxCommandEntity(RfxtrxEntity):
|
|||||||
"""Initialzie a switch or light device."""
|
"""Initialzie a switch or light device."""
|
||||||
super().__init__(device, device_id, event=event)
|
super().__init__(device, device_id, event=event)
|
||||||
|
|
||||||
async def _async_send(
|
async def _async_send[*_Ts](
|
||||||
self, fun: Callable[[rfxtrxmod.PySerialTransport, *_Ts], None], *args: *_Ts
|
self, fun: Callable[[rfxtrxmod.PySerialTransport, *_Ts], None], *args: *_Ts
|
||||||
) -> None:
|
) -> None:
|
||||||
rfx_object: rfxtrxmod.Connect = self.hass.data[DOMAIN][DATA_RFXOBJECT]
|
rfx_object: rfxtrxmod.Connect = self.hass.data[DOMAIN][DATA_RFXOBJECT]
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
from asyncio import TaskGroup
|
from asyncio import TaskGroup
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
import logging
|
import logging
|
||||||
from typing import TypeVar, TypeVarTuple
|
|
||||||
|
|
||||||
from ring_doorbell import AuthenticationError, Ring, RingDevices, RingError, RingTimeout
|
from ring_doorbell import AuthenticationError, Ring, RingDevices, RingError, RingTimeout
|
||||||
|
|
||||||
@ -15,11 +14,8 @@ from .const import NOTIFICATIONS_SCAN_INTERVAL, SCAN_INTERVAL
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
_R = TypeVar("_R")
|
|
||||||
_Ts = TypeVarTuple("_Ts")
|
|
||||||
|
|
||||||
|
async def _call_api[*_Ts, _R](
|
||||||
async def _call_api(
|
|
||||||
hass: HomeAssistant, target: Callable[[*_Ts], _R], *args: *_Ts, msg_suffix: str = ""
|
hass: HomeAssistant, target: Callable[[*_Ts], _R], *args: *_Ts, msg_suffix: str = ""
|
||||||
) -> _R:
|
) -> _R:
|
||||||
try:
|
try:
|
||||||
|
@ -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, TypeVar
|
from typing import Any
|
||||||
|
|
||||||
from api.soma_api import SomaApi
|
from api.soma_api import SomaApi
|
||||||
from requests import RequestException
|
from requests import RequestException
|
||||||
@ -22,8 +22,6 @@ from homeassistant.helpers.typing import ConfigType
|
|||||||
from .const import API, DOMAIN, HOST, PORT
|
from .const import API, DOMAIN, HOST, PORT
|
||||||
from .utils import is_api_response_success
|
from .utils import is_api_response_success
|
||||||
|
|
||||||
_SomaEntityT = TypeVar("_SomaEntityT", bound="SomaEntity")
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEVICES = "devices"
|
DEVICES = "devices"
|
||||||
@ -76,7 +74,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
||||||
|
|
||||||
|
|
||||||
def soma_api_call(
|
def soma_api_call[_SomaEntityT: SomaEntity](
|
||||||
api_call: Callable[[_SomaEntityT], Coroutine[Any, Any, dict]],
|
api_call: Callable[[_SomaEntityT], Coroutine[Any, Any, dict]],
|
||||||
) -> Callable[[_SomaEntityT], Coroutine[Any, Any, dict]]:
|
) -> Callable[[_SomaEntityT], Coroutine[Any, Any, dict]]:
|
||||||
"""Soma api call decorator."""
|
"""Soma api call decorator."""
|
||||||
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
|||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Self, TypeVar
|
from typing import Any, Self
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -29,7 +29,6 @@ from homeassistant.helpers.storage import Store
|
|||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DOMAIN = "timer"
|
DOMAIN = "timer"
|
||||||
@ -82,7 +81,7 @@ def _format_timedelta(delta: timedelta) -> str:
|
|||||||
return f"{int(hours)}:{int(minutes):02}:{int(seconds):02}"
|
return f"{int(hours)}:{int(minutes):02}:{int(seconds):02}"
|
||||||
|
|
||||||
|
|
||||||
def _none_to_empty_dict(value: _T | None) -> _T | dict[Any, Any]:
|
def _none_to_empty_dict[_T](value: _T | None) -> _T | dict[Any, Any]:
|
||||||
if value is None:
|
if value is None:
|
||||||
return {}
|
return {}
|
||||||
return value
|
return value
|
||||||
|
@ -14,7 +14,7 @@ from dataclasses import dataclass
|
|||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from typing import TYPE_CHECKING, Any, TypeVar, overload
|
from typing import TYPE_CHECKING, Any, overload
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
import zigpy.exceptions
|
import zigpy.exceptions
|
||||||
@ -62,7 +62,6 @@ if TYPE_CHECKING:
|
|||||||
from .device import ZHADevice
|
from .device import ZHADevice
|
||||||
from .gateway import ZHAGateway
|
from .gateway import ZHAGateway
|
||||||
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -228,7 +227,7 @@ def async_is_bindable_target(source_zha_device, target_zha_device):
|
|||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_get_zha_config_value(
|
def async_get_zha_config_value[_T](
|
||||||
config_entry: ConfigEntry, section: str, config_key: str, default: _T
|
config_entry: ConfigEntry, section: str, config_key: str, default: _T
|
||||||
) -> _T:
|
) -> _T:
|
||||||
"""Get the value for the specified configuration from the ZHA config entry."""
|
"""Get the value for the specified configuration from the ZHA config entry."""
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, TypeVar, cast
|
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, cast
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
import zigpy.backups
|
import zigpy.backups
|
||||||
@ -118,11 +118,8 @@ IEEE_SERVICE = "ieee_based_service"
|
|||||||
|
|
||||||
IEEE_SCHEMA = vol.All(cv.string, EUI64.convert)
|
IEEE_SCHEMA = vol.All(cv.string, EUI64.convert)
|
||||||
|
|
||||||
# typing typevar
|
|
||||||
_T = TypeVar("_T")
|
|
||||||
|
|
||||||
|
def _ensure_list_if_present[_T](value: _T | None) -> list[_T] | list[Any] | None:
|
||||||
def _ensure_list_if_present(value: _T | None) -> list[_T] | list[Any] | None:
|
|
||||||
"""Wrap value in list if it is provided and not one."""
|
"""Wrap value in list if it is provided and not one."""
|
||||||
if value is None:
|
if value is None:
|
||||||
return None
|
return None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user