From 1e4aacaeb12b11090813cb19f1282b6c46705977 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 18 Apr 2022 19:37:32 +0200 Subject: [PATCH] Replace Alarm Control Panel FORMAT_ constants with CodeFormat enum (#69861) --- .../components/alarm_control_panel/__init__.py | 7 ++++--- .../components/alarm_control_panel/const.py | 12 ++++++++++++ .../components/alarmdecoder/alarm_control_panel.py | 4 ++-- homeassistant/components/alexa/capabilities.py | 4 ++-- .../components/concord232/alarm_control_panel.py | 2 +- .../components/deconz/alarm_control_panel.py | 4 ++-- .../components/elkm1/alarm_control_panel.py | 4 ++-- .../components/envisalink/alarm_control_panel.py | 4 ++-- .../components/ifttt/alarm_control_panel.py | 7 +++---- .../components/manual/alarm_control_panel.py | 4 ++-- .../components/manual_mqtt/alarm_control_panel.py | 4 ++-- .../components/mqtt/alarm_control_panel.py | 4 ++-- .../components/ness_alarm/alarm_control_panel.py | 2 +- .../components/nx584/alarm_control_panel.py | 2 +- .../components/risco/alarm_control_panel.py | 4 ++-- .../components/satel_integra/alarm_control_panel.py | 2 +- .../components/simplisafe/alarm_control_panel.py | 7 +++---- .../components/template/alarm_control_panel.py | 13 ++++++------- .../components/verisure/alarm_control_panel.py | 4 ++-- homeassistant/components/zha/alarm_control_panel.py | 4 ++-- pylint/plugins/hass_imports.py | 8 ++++++++ tests/components/mqtt/test_alarm_control_panel.py | 6 +++--- 22 files changed, 65 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index bb55526736d..d89dbd280ef 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -40,6 +40,7 @@ from .const import ( # noqa: F401 SUPPORT_ALARM_ARM_VACATION, SUPPORT_ALARM_TRIGGER, AlarmControlPanelEntityFeature, + CodeFormat, ) _LOGGER: Final = logging.getLogger(__name__) @@ -129,12 +130,12 @@ class AlarmControlPanelEntity(Entity): entity_description: AlarmControlPanelEntityDescription _attr_changed_by: str | None = None _attr_code_arm_required: bool = True - _attr_code_format: str | None = None + _attr_code_format: CodeFormat | None = None _attr_supported_features: int @property - def code_format(self) -> str | None: - """Regex for code format or None if no code is required.""" + def code_format(self) -> CodeFormat | None: + """Code format or None if no code is required.""" return self._attr_code_format @property diff --git a/homeassistant/components/alarm_control_panel/const.py b/homeassistant/components/alarm_control_panel/const.py index 4b7c729bd19..3a2f2c51551 100644 --- a/homeassistant/components/alarm_control_panel/const.py +++ b/homeassistant/components/alarm_control_panel/const.py @@ -2,11 +2,23 @@ from enum import IntEnum from typing import Final +from homeassistant.backports.enum import StrEnum + DOMAIN: Final = "alarm_control_panel" ATTR_CHANGED_BY: Final = "changed_by" ATTR_CODE_ARM_REQUIRED: Final = "code_arm_required" + +class CodeFormat(StrEnum): + """Code formats for the Alarm Control Panel.""" + + TEXT = "text" + NUMBER = "number" + + +# These constants are deprecated as of Home Assistant 2022.5 +# Please use the CodeFormat enum instead. FORMAT_TEXT: Final = "text" FORMAT_NUMBER: Final = "number" diff --git a/homeassistant/components/alarmdecoder/alarm_control_panel.py b/homeassistant/components/alarmdecoder/alarm_control_panel.py index f75a4726b88..991d588eccf 100644 --- a/homeassistant/components/alarmdecoder/alarm_control_panel.py +++ b/homeassistant/components/alarmdecoder/alarm_control_panel.py @@ -2,9 +2,9 @@ import voluptuous as vol from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -77,7 +77,7 @@ class AlarmDecoderAlarmPanel(AlarmControlPanelEntity): _attr_name = "Alarm Panel" _attr_should_poll = False - _attr_code_format = FORMAT_NUMBER + _attr_code_format = CodeFormat.NUMBER _attr_supported_features = ( AlarmControlPanelEntityFeature.ARM_HOME | AlarmControlPanelEntityFeature.ARM_AWAY diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py index 4a87c864c72..527186dccbe 100644 --- a/homeassistant/components/alexa/capabilities.py +++ b/homeassistant/components/alexa/capabilities.py @@ -13,8 +13,8 @@ from homeassistant.components import ( vacuum, ) from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, AlarmControlPanelEntityFeature, + CodeFormat, ) import homeassistant.components.climate.const as climate import homeassistant.components.media_player.const as media_player @@ -1226,7 +1226,7 @@ class AlexaSecurityPanelController(AlexaCapability): configuration["supportedArmStates"] = supported_arm_states - if code_format == FORMAT_NUMBER: + if code_format == CodeFormat.NUMBER: configuration["supportedAuthorizationTypes"] = [{"type": "FOUR_DIGIT_PIN"}] return configuration diff --git a/homeassistant/components/concord232/alarm_control_panel.py b/homeassistant/components/concord232/alarm_control_panel.py index d81357b5dc0..e8f21c46278 100644 --- a/homeassistant/components/concord232/alarm_control_panel.py +++ b/homeassistant/components/concord232/alarm_control_panel.py @@ -96,7 +96,7 @@ class Concord232Alarm(alarm.AlarmControlPanelEntity): @property def code_format(self): """Return the characters if code is defined.""" - return alarm.FORMAT_NUMBER + return alarm.CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/deconz/alarm_control_panel.py b/homeassistant/components/deconz/alarm_control_panel.py index 4ae199c446f..49555d1bd08 100644 --- a/homeassistant/components/deconz/alarm_control_panel.py +++ b/homeassistant/components/deconz/alarm_control_panel.py @@ -18,9 +18,9 @@ from pydeconz.sensor import ( from homeassistant.components.alarm_control_panel import ( DOMAIN, - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -120,7 +120,7 @@ class DeconzAlarmControlPanel(DeconzDevice, AlarmControlPanelEntity): TYPE = DOMAIN _device: AncillaryControl - _attr_code_format = FORMAT_NUMBER + _attr_code_format = CodeFormat.NUMBER _attr_supported_features = ( AlarmControlPanelEntityFeature.ARM_AWAY | AlarmControlPanelEntityFeature.ARM_HOME diff --git a/homeassistant/components/elkm1/alarm_control_panel.py b/homeassistant/components/elkm1/alarm_control_panel.py index 06017acc4d6..eb0653b5984 100644 --- a/homeassistant/components/elkm1/alarm_control_panel.py +++ b/homeassistant/components/elkm1/alarm_control_panel.py @@ -6,9 +6,9 @@ import voluptuous as vol from homeassistant.components.alarm_control_panel import ( ATTR_CHANGED_BY, - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -164,7 +164,7 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity): @property def code_format(self): """Return the alarm code format.""" - return FORMAT_NUMBER + return CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/envisalink/alarm_control_panel.py b/homeassistant/components/envisalink/alarm_control_panel.py index 0d2ae78c6a6..3dfa1e0762d 100644 --- a/homeassistant/components/envisalink/alarm_control_panel.py +++ b/homeassistant/components/envisalink/alarm_control_panel.py @@ -6,9 +6,9 @@ import logging import voluptuous as vol from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.const import ( ATTR_ENTITY_ID, @@ -145,7 +145,7 @@ class EnvisalinkAlarm(EnvisalinkDevice, AlarmControlPanelEntity): """Regex for code format or None if no code is required.""" if self._code: return None - return FORMAT_NUMBER + return CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/ifttt/alarm_control_panel.py b/homeassistant/components/ifttt/alarm_control_panel.py index 101dffac682..ebab2592403 100644 --- a/homeassistant/components/ifttt/alarm_control_panel.py +++ b/homeassistant/components/ifttt/alarm_control_panel.py @@ -7,11 +7,10 @@ import re import voluptuous as vol from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, - FORMAT_TEXT, PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.const import ( ATTR_ENTITY_ID, @@ -177,8 +176,8 @@ class IFTTTAlarmPanel(AlarmControlPanelEntity): if self._code is None: return None if isinstance(self._code, str) and re.search("^\\d+$", self._code): - return FORMAT_NUMBER - return FORMAT_TEXT + return CodeFormat.NUMBER + return CodeFormat.TEXT def alarm_disarm(self, code=None): """Send disarm command.""" diff --git a/homeassistant/components/manual/alarm_control_panel.py b/homeassistant/components/manual/alarm_control_panel.py index b9ac0bdcf5c..dd347336d9e 100644 --- a/homeassistant/components/manual/alarm_control_panel.py +++ b/homeassistant/components/manual/alarm_control_panel.py @@ -294,8 +294,8 @@ class ManualAlarm(alarm.AlarmControlPanelEntity, RestoreEntity): if self._code is None: return None if isinstance(self._code, str) and re.search("^\\d+$", self._code): - return alarm.FORMAT_NUMBER - return alarm.FORMAT_TEXT + return alarm.CodeFormat.NUMBER + return alarm.CodeFormat.TEXT @property def code_arm_required(self): diff --git a/homeassistant/components/manual_mqtt/alarm_control_panel.py b/homeassistant/components/manual_mqtt/alarm_control_panel.py index 2161dad804c..730d7ae1f9e 100644 --- a/homeassistant/components/manual_mqtt/alarm_control_panel.py +++ b/homeassistant/components/manual_mqtt/alarm_control_panel.py @@ -319,8 +319,8 @@ class ManualMQTTAlarm(alarm.AlarmControlPanelEntity): if self._code is None: return None if isinstance(self._code, str) and re.search("^\\d+$", self._code): - return alarm.FORMAT_NUMBER - return alarm.FORMAT_TEXT + return alarm.CodeFormat.NUMBER + return alarm.CodeFormat.TEXT @property def code_arm_required(self): diff --git a/homeassistant/components/mqtt/alarm_control_panel.py b/homeassistant/components/mqtt/alarm_control_panel.py index da45de4e190..a58e71e78d6 100644 --- a/homeassistant/components/mqtt/alarm_control_panel.py +++ b/homeassistant/components/mqtt/alarm_control_panel.py @@ -235,8 +235,8 @@ class MqttAlarm(MqttEntity, alarm.AlarmControlPanelEntity): if (code := self._config.get(CONF_CODE)) is None: return None if code == REMOTE_CODE or (isinstance(code, str) and re.search("^\\d+$", code)): - return alarm.FORMAT_NUMBER - return alarm.FORMAT_TEXT + return alarm.CodeFormat.NUMBER + return alarm.CodeFormat.TEXT @property def code_arm_required(self): diff --git a/homeassistant/components/ness_alarm/alarm_control_panel.py b/homeassistant/components/ness_alarm/alarm_control_panel.py index 65c30e83620..9fccee6f64f 100644 --- a/homeassistant/components/ness_alarm/alarm_control_panel.py +++ b/homeassistant/components/ness_alarm/alarm_control_panel.py @@ -74,7 +74,7 @@ class NessAlarmPanel(alarm.AlarmControlPanelEntity): @property def code_format(self): """Return the regex for code format or None if no code is required.""" - return alarm.FORMAT_NUMBER + return alarm.CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/nx584/alarm_control_panel.py b/homeassistant/components/nx584/alarm_control_panel.py index 749513db7c0..2ef664cb6d4 100644 --- a/homeassistant/components/nx584/alarm_control_panel.py +++ b/homeassistant/components/nx584/alarm_control_panel.py @@ -112,7 +112,7 @@ class NX584Alarm(alarm.AlarmControlPanelEntity): @property def code_format(self): """Return one or more digits/characters.""" - return alarm.FORMAT_NUMBER + return alarm.CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/risco/alarm_control_panel.py b/homeassistant/components/risco/alarm_control_panel.py index 3391770b828..f3578151acc 100644 --- a/homeassistant/components/risco/alarm_control_panel.py +++ b/homeassistant/components/risco/alarm_control_panel.py @@ -2,9 +2,9 @@ import logging from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -132,7 +132,7 @@ class RiscoAlarm(AlarmControlPanelEntity, RiscoEntity): @property def code_format(self): """Return one or more digits/characters.""" - return FORMAT_NUMBER + return CodeFormat.NUMBER def _validate_code(self, code): """Validate given code.""" diff --git a/homeassistant/components/satel_integra/alarm_control_panel.py b/homeassistant/components/satel_integra/alarm_control_panel.py index b02d36bf4a1..4c036b4be85 100644 --- a/homeassistant/components/satel_integra/alarm_control_panel.py +++ b/homeassistant/components/satel_integra/alarm_control_panel.py @@ -142,7 +142,7 @@ class SatelIntegraAlarmPanel(alarm.AlarmControlPanelEntity): @property def code_format(self): """Return the regex for code format or None if no code is required.""" - return alarm.FORMAT_NUMBER + return alarm.CodeFormat.NUMBER @property def state(self): diff --git a/homeassistant/components/simplisafe/alarm_control_panel.py b/homeassistant/components/simplisafe/alarm_control_panel.py index 3d6abf39498..dc670393f18 100644 --- a/homeassistant/components/simplisafe/alarm_control_panel.py +++ b/homeassistant/components/simplisafe/alarm_control_panel.py @@ -20,10 +20,9 @@ from simplipy.websocket import ( ) from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, - FORMAT_TEXT, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -130,9 +129,9 @@ class SimpliSafeAlarm(SimpliSafeEntity, AlarmControlPanelEntity): if code := self._simplisafe.entry.options.get(CONF_CODE): if code.isdigit(): - self._attr_code_format = FORMAT_NUMBER + self._attr_code_format = CodeFormat.NUMBER else: - self._attr_code_format = FORMAT_TEXT + self._attr_code_format = CodeFormat.TEXT self._last_event = None diff --git a/homeassistant/components/template/alarm_control_panel.py b/homeassistant/components/template/alarm_control_panel.py index 523648bdade..07610a59457 100644 --- a/homeassistant/components/template/alarm_control_panel.py +++ b/homeassistant/components/template/alarm_control_panel.py @@ -8,11 +8,10 @@ import voluptuous as vol from homeassistant.components.alarm_control_panel import ( ENTITY_ID_FORMAT, - FORMAT_NUMBER, - FORMAT_TEXT, PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.const import ( ATTR_CODE, @@ -60,12 +59,12 @@ CONF_CODE_ARM_REQUIRED = "code_arm_required" CONF_CODE_FORMAT = "code_format" -class CodeFormat(Enum): +class TemplateCodeFormat(Enum): """Class to represent different code formats.""" no_code = None - number = FORMAT_NUMBER - text = FORMAT_TEXT + number = CodeFormat.NUMBER + text = CodeFormat.TEXT ALARM_CONTROL_PANEL_SCHEMA = vol.Schema( @@ -76,8 +75,8 @@ ALARM_CONTROL_PANEL_SCHEMA = vol.Schema( vol.Optional(CONF_ARM_HOME_ACTION): cv.SCRIPT_SCHEMA, vol.Optional(CONF_ARM_NIGHT_ACTION): cv.SCRIPT_SCHEMA, vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_CODE_FORMAT, default=CodeFormat.number.name): cv.enum( - CodeFormat + vol.Optional(CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name): cv.enum( + TemplateCodeFormat ), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_UNIQUE_ID): cv.string, diff --git a/homeassistant/components/verisure/alarm_control_panel.py b/homeassistant/components/verisure/alarm_control_panel.py index c521befde83..8f92ee0a5dd 100644 --- a/homeassistant/components/verisure/alarm_control_panel.py +++ b/homeassistant/components/verisure/alarm_control_panel.py @@ -4,9 +4,9 @@ from __future__ import annotations import asyncio from homeassistant.components.alarm_control_panel import ( - FORMAT_NUMBER, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback @@ -32,7 +32,7 @@ class VerisureAlarm( ): """Representation of a Verisure alarm status.""" - _attr_code_format = FORMAT_NUMBER + _attr_code_format = CodeFormat.NUMBER _attr_name = "Verisure Alarm" _attr_supported_features = ( AlarmControlPanelEntityFeature.ARM_HOME diff --git a/homeassistant/components/zha/alarm_control_panel.py b/homeassistant/components/zha/alarm_control_panel.py index bccc75958eb..ef616a8f894 100644 --- a/homeassistant/components/zha/alarm_control_panel.py +++ b/homeassistant/components/zha/alarm_control_panel.py @@ -4,9 +4,9 @@ import functools from zigpy.zcl.clusters.security import IasAce from homeassistant.components.alarm_control_panel import ( - FORMAT_TEXT, AlarmControlPanelEntity, AlarmControlPanelEntityFeature, + CodeFormat, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -116,7 +116,7 @@ class ZHAAlarmControlPanel(ZhaEntity, AlarmControlPanelEntity): @property def code_format(self): """Regex for code format or None if no code is required.""" - return FORMAT_TEXT + return CodeFormat.TEXT @property def changed_by(self): diff --git a/pylint/plugins/hass_imports.py b/pylint/plugins/hass_imports.py index 34bd2cb407f..ad068162de1 100644 --- a/pylint/plugins/hass_imports.py +++ b/pylint/plugins/hass_imports.py @@ -24,12 +24,20 @@ _OBSOLETE_IMPORT: dict[str, list[ObsoleteImportMatch]] = { reason="replaced by AlarmControlPanelEntityFeature enum", constant=re.compile(r"^SUPPORT_(\w*)$"), ), + ObsoleteImportMatch( + reason="replaced by CodeFormat enum", + constant=re.compile(r"^FORMAT_(\w*)$"), + ), ], "homeassistant.components.alarm_control_panel.const": [ ObsoleteImportMatch( reason="replaced by AlarmControlPanelEntityFeature enum", constant=re.compile(r"^SUPPORT_(\w*)$"), ), + ObsoleteImportMatch( + reason="replaced by CodeFormat enum", + constant=re.compile(r"^FORMAT_(\w*)$"), + ), ], "homeassistant.components.binarysensor": [ ObsoleteImportMatch( diff --git a/tests/components/mqtt/test_alarm_control_panel.py b/tests/components/mqtt/test_alarm_control_panel.py index a278cde768b..5c73463924e 100644 --- a/tests/components/mqtt/test_alarm_control_panel.py +++ b/tests/components/mqtt/test_alarm_control_panel.py @@ -476,7 +476,7 @@ async def test_attributes_code_number(hass, mqtt_mock): state = hass.states.get("alarm_control_panel.test") assert ( state.attributes.get(alarm_control_panel.ATTR_CODE_FORMAT) - == alarm_control_panel.FORMAT_NUMBER + == alarm_control_panel.CodeFormat.NUMBER ) @@ -491,7 +491,7 @@ async def test_attributes_remote_code_number(hass, mqtt_mock): state = hass.states.get("alarm_control_panel.test") assert ( state.attributes.get(alarm_control_panel.ATTR_CODE_FORMAT) - == alarm_control_panel.FORMAT_NUMBER + == alarm_control_panel.CodeFormat.NUMBER ) @@ -506,7 +506,7 @@ async def test_attributes_code_text(hass, mqtt_mock): state = hass.states.get("alarm_control_panel.test") assert ( state.attributes.get(alarm_control_panel.ATTR_CODE_FORMAT) - == alarm_control_panel.FORMAT_TEXT + == alarm_control_panel.CodeFormat.TEXT )