From 8fb9b45e422df75b3c54a4373e1e809af01a2604 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:26:24 +0200 Subject: [PATCH] Remove input_datetime from mypy ignore list (#74447) * Remove input_datetime from mypy ignore list * Use assert * Use cast * Use common logic for initial parsing --- .../components/input_datetime/__init__.py | 41 +++++++++---------- mypy.ini | 3 -- script/hassfest/mypy_config.py | 1 - 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/homeassistant/components/input_datetime/__init__.py b/homeassistant/components/input_datetime/__init__.py index fe034a8edb5..2a64c8d3b89 100644 --- a/homeassistant/components/input_datetime/__init__.py +++ b/homeassistant/components/input_datetime/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations import datetime as py_datetime import logging +from typing import Any import voluptuous as vol @@ -84,23 +85,32 @@ def has_date_or_time(conf): raise vol.Invalid("Entity needs at least a date or a time") -def valid_initial(conf): +def valid_initial(conf: dict[str, Any]) -> dict[str, Any]: """Check the initial value is valid.""" - if not (initial := conf.get(CONF_INITIAL)): + if not (conf.get(CONF_INITIAL)): return conf + # Ensure we can parse the initial value, raise vol.Invalid on failure + parse_initial_datetime(conf) + return conf + + +def parse_initial_datetime(conf: dict[str, Any]) -> py_datetime.datetime: + """Check the initial value is valid.""" + initial: str = conf[CONF_INITIAL] + if conf[CONF_HAS_DATE] and conf[CONF_HAS_TIME]: - if dt_util.parse_datetime(initial) is not None: - return conf + if (datetime := dt_util.parse_datetime(initial)) is not None: + return datetime raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a datetime") if conf[CONF_HAS_DATE]: - if dt_util.parse_date(initial) is not None: - return conf + if (date := dt_util.parse_date(initial)) is not None: + return py_datetime.datetime.combine(date, DEFAULT_TIME) raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a date") - if dt_util.parse_time(initial) is not None: - return conf + if (time := dt_util.parse_time(initial)) is not None: + return py_datetime.datetime.combine(py_datetime.date.today(), time) raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a time") @@ -230,21 +240,10 @@ class InputDatetime(RestoreEntity): self.editable = True self._current_datetime = None - if not (initial := config.get(CONF_INITIAL)): + if not config.get(CONF_INITIAL): return - if self.has_date and self.has_time: - current_datetime = dt_util.parse_datetime(initial) - - elif self.has_date: - date = dt_util.parse_date(initial) - current_datetime = py_datetime.datetime.combine(date, DEFAULT_TIME) - - else: - time = dt_util.parse_time(initial) - current_datetime = py_datetime.datetime.combine( - py_datetime.date.today(), time - ) + current_datetime = parse_initial_datetime(config) # If the user passed in an initial value with a timezone, convert it to right tz if current_datetime.tzinfo is not None: diff --git a/mypy.ini b/mypy.ini index 08cd36dfaea..38cb7d4c7f0 100644 --- a/mypy.ini +++ b/mypy.ini @@ -2716,9 +2716,6 @@ ignore_errors = true [mypy-homeassistant.components.influxdb] ignore_errors = true -[mypy-homeassistant.components.input_datetime] -ignore_errors = true - [mypy-homeassistant.components.izone.climate] ignore_errors = true diff --git a/script/hassfest/mypy_config.py b/script/hassfest/mypy_config.py index 69e9d8fafa4..d540ed61cd8 100644 --- a/script/hassfest/mypy_config.py +++ b/script/hassfest/mypy_config.py @@ -47,7 +47,6 @@ IGNORED_MODULES: Final[list[str]] = [ "homeassistant.components.icloud.device_tracker", "homeassistant.components.icloud.sensor", "homeassistant.components.influxdb", - "homeassistant.components.input_datetime", "homeassistant.components.izone.climate", "homeassistant.components.konnected", "homeassistant.components.konnected.config_flow",