From 16f110658c3b3dc218983acc589d63cd37cd5a6b Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:09:57 +0100 Subject: [PATCH] Enable strict typing for duckdns (#108022) --- .strict-typing | 1 + homeassistant/components/duckdns/__init__.py | 28 +++++++++++++------- mypy.ini | 10 +++++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/.strict-typing b/.strict-typing index 035218d8024..0e7c6a8205d 100644 --- a/.strict-typing +++ b/.strict-typing @@ -146,6 +146,7 @@ homeassistant.components.doorbird.* homeassistant.components.dormakaba_dkey.* homeassistant.components.downloader.* homeassistant.components.dsmr.* +homeassistant.components.duckdns.* homeassistant.components.dunehd.* homeassistant.components.duotecno.* homeassistant.components.easyenergy.* diff --git a/homeassistant/components/duckdns/__init__.py b/homeassistant/components/duckdns/__init__.py index d477bd41a26..c0c3b14566c 100644 --- a/homeassistant/components/duckdns/__init__.py +++ b/homeassistant/components/duckdns/__init__.py @@ -1,9 +1,12 @@ """Integrate with DuckDNS.""" -from collections.abc import Callable, Coroutine +from __future__ import annotations + +from collections.abc import Callable, Coroutine, Sequence from datetime import datetime, timedelta import logging -from typing import Any +from typing import Any, cast +from aiohttp import ClientSession import voluptuous as vol from homeassistant.const import CONF_ACCESS_TOKEN, CONF_DOMAIN @@ -50,11 +53,11 @@ SERVICE_TXT_SCHEMA = vol.Schema({vol.Required(ATTR_TXT): vol.Any(None, cv.string async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Initialize the DuckDNS component.""" - domain = config[DOMAIN][CONF_DOMAIN] - token = config[DOMAIN][CONF_ACCESS_TOKEN] + domain: str = config[DOMAIN][CONF_DOMAIN] + token: str = config[DOMAIN][CONF_ACCESS_TOKEN] session = async_get_clientsession(hass) - async def update_domain_interval(_now): + async def update_domain_interval(_now: datetime) -> bool: """Update the DuckDNS entry.""" return await _update_duckdns(session, domain, token) @@ -81,7 +84,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: _SENTINEL = object() -async def _update_duckdns(session, domain, token, *, txt=_SENTINEL, clear=False): +async def _update_duckdns( + session: ClientSession, + domain: str, + token: str, + *, + txt: str | None | object = _SENTINEL, + clear: bool = False, +) -> bool: """Update DuckDNS.""" params = {"domains": domain, "token": token} @@ -91,7 +101,7 @@ async def _update_duckdns(session, domain, token, *, txt=_SENTINEL, clear=False) params["txt"] = "" clear = True else: - params["txt"] = txt + params["txt"] = cast(str, txt) if clear: params["clear"] = "true" @@ -111,11 +121,9 @@ async def _update_duckdns(session, domain, token, *, txt=_SENTINEL, clear=False) def async_track_time_interval_backoff( hass: HomeAssistant, action: Callable[[datetime], Coroutine[Any, Any, bool]], - intervals, + intervals: Sequence[timedelta], ) -> CALLBACK_TYPE: """Add a listener that fires repetitively at every timedelta interval.""" - if not isinstance(intervals, (list, tuple)): - intervals = (intervals,) remove: CALLBACK_TYPE | None = None failed = 0 diff --git a/mypy.ini b/mypy.ini index 4b74ad0608f..f90dbeffd12 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1221,6 +1221,16 @@ disallow_untyped_defs = true warn_return_any = true warn_unreachable = true +[mypy-homeassistant.components.duckdns.*] +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.dunehd.*] check_untyped_defs = true disallow_incomplete_defs = true