Add faa_delays to strict typing (#104720)

This commit is contained in:
Joost Lekkerkerker 2023-11-29 21:41:32 +01:00 committed by GitHub
parent 0a98a648bb
commit bdf4c61a05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 54 additions and 27 deletions

View File

@ -120,6 +120,7 @@ homeassistant.components.energy.*
homeassistant.components.esphome.* homeassistant.components.esphome.*
homeassistant.components.event.* homeassistant.components.event.*
homeassistant.components.evil_genius_labs.* homeassistant.components.evil_genius_labs.*
homeassistant.components.faa_delays.*
homeassistant.components.fan.* homeassistant.components.fan.*
homeassistant.components.fastdotcom.* homeassistant.components.fastdotcom.*
homeassistant.components.feedreader.* homeassistant.components.feedreader.*

View File

@ -1,8 +1,12 @@
"""Platform for FAA Delays sensor component.""" """Platform for FAA Delays sensor component."""
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable, Mapping
from dataclasses import dataclass
from typing import Any from typing import Any
from faadelays import Airport
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
BinarySensorEntity, BinarySensorEntity,
BinarySensorEntityDescription, BinarySensorEntityDescription,
@ -12,33 +16,47 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import FAADataUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
FAA_BINARY_SENSORS: tuple[BinarySensorEntityDescription, ...] = (
BinarySensorEntityDescription( @dataclass(kw_only=True)
class FaaDelaysBinarySensorEntityDescription(BinarySensorEntityDescription):
"""Mixin for required keys."""
is_on_fn: Callable[[Airport], bool | None]
FAA_BINARY_SENSORS: tuple[FaaDelaysBinarySensorEntityDescription, ...] = (
FaaDelaysBinarySensorEntityDescription(
key="GROUND_DELAY", key="GROUND_DELAY",
name="Ground Delay", name="Ground Delay",
icon="mdi:airport", icon="mdi:airport",
is_on_fn=lambda airport: airport.ground_delay.status,
), ),
BinarySensorEntityDescription( FaaDelaysBinarySensorEntityDescription(
key="GROUND_STOP", key="GROUND_STOP",
name="Ground Stop", name="Ground Stop",
icon="mdi:airport", icon="mdi:airport",
is_on_fn=lambda airport: airport.ground_stop.status,
), ),
BinarySensorEntityDescription( FaaDelaysBinarySensorEntityDescription(
key="DEPART_DELAY", key="DEPART_DELAY",
name="Departure Delay", name="Departure Delay",
icon="mdi:airplane-takeoff", icon="mdi:airplane-takeoff",
is_on_fn=lambda airport: airport.depart_delay.status,
), ),
BinarySensorEntityDescription( FaaDelaysBinarySensorEntityDescription(
key="ARRIVE_DELAY", key="ARRIVE_DELAY",
name="Arrival Delay", name="Arrival Delay",
icon="mdi:airplane-landing", icon="mdi:airplane-landing",
is_on_fn=lambda airport: airport.arrive_delay.status,
), ),
BinarySensorEntityDescription( FaaDelaysBinarySensorEntityDescription(
key="CLOSURE", key="CLOSURE",
name="Closure", name="Closure",
icon="mdi:airplane:off", icon="mdi:airplane:off",
is_on_fn=lambda airport: airport.closure.status,
), ),
) )
@ -57,11 +75,16 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class FAABinarySensor(CoordinatorEntity, BinarySensorEntity): class FAABinarySensor(CoordinatorEntity[FAADataUpdateCoordinator], BinarySensorEntity):
"""Define a binary sensor for FAA Delays.""" """Define a binary sensor for FAA Delays."""
entity_description: FaaDelaysBinarySensorEntityDescription
def __init__( def __init__(
self, coordinator, entry_id, description: BinarySensorEntityDescription self,
coordinator: FAADataUpdateCoordinator,
entry_id: str,
description: FaaDelaysBinarySensorEntityDescription,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__(coordinator) super().__init__(coordinator)
@ -75,23 +98,12 @@ class FAABinarySensor(CoordinatorEntity, BinarySensorEntity):
self._attr_unique_id = f"{_id}_{description.key}" self._attr_unique_id = f"{_id}_{description.key}"
@property @property
def is_on(self): def is_on(self) -> bool | None:
"""Return the status of the sensor.""" """Return the status of the sensor."""
sensor_type = self.entity_description.key return self.entity_description.is_on_fn(self.coordinator.data)
if sensor_type == "GROUND_DELAY":
return self.coordinator.data.ground_delay.status
if sensor_type == "GROUND_STOP":
return self.coordinator.data.ground_stop.status
if sensor_type == "DEPART_DELAY":
return self.coordinator.data.depart_delay.status
if sensor_type == "ARRIVE_DELAY":
return self.coordinator.data.arrive_delay.status
if sensor_type == "CLOSURE":
return self.coordinator.data.closure.status
return None
@property @property
def extra_state_attributes(self): def extra_state_attributes(self) -> Mapping[str, Any]:
"""Return attributes for sensor.""" """Return attributes for sensor."""
sensor_type = self.entity_description.key sensor_type = self.entity_description.key
if sensor_type == "GROUND_DELAY": if sensor_type == "GROUND_DELAY":

View File

@ -1,5 +1,6 @@
"""Config flow for FAA Delays integration.""" """Config flow for FAA Delays integration."""
import logging import logging
from typing import Any
from aiohttp import ClientConnectionError from aiohttp import ClientConnectionError
import faadelays import faadelays
@ -7,6 +8,7 @@ import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.const import CONF_ID from homeassistant.const import CONF_ID
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import aiohttp_client from homeassistant.helpers import aiohttp_client
from .const import DOMAIN from .const import DOMAIN
@ -21,7 +23,9 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 1 VERSION = 1
async def async_step_user(self, user_input=None): async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the initial step.""" """Handle the initial step."""
errors = {} errors = {}
if user_input is not None: if user_input is not None:

View File

@ -6,6 +6,7 @@ import logging
from aiohttp import ClientConnectionError from aiohttp import ClientConnectionError
from faadelays import Airport from faadelays import Airport
from homeassistant.core import HomeAssistant
from homeassistant.helpers import aiohttp_client from homeassistant.helpers import aiohttp_client
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@ -14,19 +15,18 @@ from .const import DOMAIN
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
class FAADataUpdateCoordinator(DataUpdateCoordinator): class FAADataUpdateCoordinator(DataUpdateCoordinator[Airport]):
"""Class to manage fetching FAA API data from a single endpoint.""" """Class to manage fetching FAA API data from a single endpoint."""
def __init__(self, hass, code): def __init__(self, hass: HomeAssistant, code: str) -> None:
"""Initialize the coordinator.""" """Initialize the coordinator."""
super().__init__( super().__init__(
hass, _LOGGER, name=DOMAIN, update_interval=timedelta(minutes=1) hass, _LOGGER, name=DOMAIN, update_interval=timedelta(minutes=1)
) )
self.session = aiohttp_client.async_get_clientsession(hass) self.session = aiohttp_client.async_get_clientsession(hass)
self.data = Airport(code, self.session) self.data = Airport(code, self.session)
self.code = code
async def _async_update_data(self): async def _async_update_data(self) -> Airport:
try: try:
async with asyncio.timeout(10): async with asyncio.timeout(10):
await self.data.update() await self.data.update()

View File

@ -961,6 +961,16 @@ disallow_untyped_defs = true
warn_return_any = true warn_return_any = true
warn_unreachable = true warn_unreachable = true
[mypy-homeassistant.components.faa_delays.*]
check_untyped_defs = true
disallow_incomplete_defs = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_decorators = true
disallow_untyped_defs = true
warn_return_any = true
warn_unreachable = true
[mypy-homeassistant.components.fan.*] [mypy-homeassistant.components.fan.*]
check_untyped_defs = true check_untyped_defs = true
disallow_incomplete_defs = true disallow_incomplete_defs = true