diff --git a/homeassistant/backports/enum.py b/homeassistant/backports/enum.py index 33cafe3b1dd..871244b4567 100644 --- a/homeassistant/backports/enum.py +++ b/homeassistant/backports/enum.py @@ -1,32 +1,15 @@ -"""Enum backports from standard lib.""" +"""Enum backports from standard lib. + +This file contained the backport of the StrEnum of Python 3.11. + +Since we have dropped support for Python 3.10, we can remove this backport. +This file is kept for now to avoid breaking custom components that might +import it. +""" from __future__ import annotations -from enum import Enum -from typing import Any, Self +from enum import StrEnum - -class StrEnum(str, Enum): - """Partial backport of Python 3.11's StrEnum for our basic use cases.""" - - value: str - - def __new__(cls, value: str, *args: Any, **kwargs: Any) -> Self: - """Create a new StrEnum instance.""" - if not isinstance(value, str): - raise TypeError(f"{value!r} is not a string") - return super().__new__(cls, value, *args, **kwargs) - - def __str__(self) -> str: - """Return self.value.""" - return self.value - - @staticmethod - def _generate_next_value_( - name: str, start: int, count: int, last_values: list[Any] - ) -> Any: - """Make `auto()` explicitly unsupported. - - We may revisit this when it's very clear that Python 3.11's - `StrEnum.auto()` behavior will no longer change. - """ - raise TypeError("auto() is not supported by this implementation") +__all__ = [ + "StrEnum", +] diff --git a/homeassistant/components/alarm_control_panel/const.py b/homeassistant/components/alarm_control_panel/const.py index e6e628f834d..f14a1ce66e0 100644 --- a/homeassistant/components/alarm_control_panel/const.py +++ b/homeassistant/components/alarm_control_panel/const.py @@ -1,9 +1,7 @@ """Provides the constants needed for component.""" -from enum import IntFlag +from enum import IntFlag, StrEnum from typing import Final -from homeassistant.backports.enum import StrEnum - DOMAIN: Final = "alarm_control_panel" ATTR_CHANGED_BY: Final = "changed_by" diff --git a/homeassistant/components/assist_pipeline/pipeline.py b/homeassistant/components/assist_pipeline/pipeline.py index 891fc639fee..1be9ddbb14f 100644 --- a/homeassistant/components/assist_pipeline/pipeline.py +++ b/homeassistant/components/assist_pipeline/pipeline.py @@ -4,12 +4,12 @@ from __future__ import annotations import asyncio from collections.abc import AsyncIterable, Callable, Iterable from dataclasses import asdict, dataclass, field +from enum import StrEnum import logging from typing import Any, cast import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.components import conversation, media_source, stt, tts, websocket_api from homeassistant.components.tts.media_source import ( generate_media_source_id as tts_generate_media_source_id, diff --git a/homeassistant/components/assist_pipeline/vad.py b/homeassistant/components/assist_pipeline/vad.py index a737490f22f..cb19811d650 100644 --- a/homeassistant/components/assist_pipeline/vad.py +++ b/homeassistant/components/assist_pipeline/vad.py @@ -2,11 +2,10 @@ from __future__ import annotations from dataclasses import dataclass, field +from enum import StrEnum import webrtcvad -from homeassistant.backports.enum import StrEnum - _SAMPLE_RATE = 16000 diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 1c2d6d779fb..79e20c6f571 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -3,12 +3,12 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum import logging from typing import Literal, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.core import HomeAssistant diff --git a/homeassistant/components/braviatv/const.py b/homeassistant/components/braviatv/const.py index 5925a97422a..34b621802f9 100644 --- a/homeassistant/components/braviatv/const.py +++ b/homeassistant/components/braviatv/const.py @@ -1,10 +1,9 @@ """Constants for Bravia TV integration.""" from __future__ import annotations +from enum import StrEnum from typing import Final -from homeassistant.backports.enum import StrEnum - ATTR_CID: Final = "cid" ATTR_MAC: Final = "macAddr" ATTR_MANUFACTURER: Final = "Sony" diff --git a/homeassistant/components/button/__init__.py b/homeassistant/components/button/__init__.py index 0e2790a2e85..901acdcdec1 100644 --- a/homeassistant/components/button/__init__.py +++ b/homeassistant/components/button/__init__.py @@ -3,12 +3,12 @@ from __future__ import annotations from dataclasses import dataclass from datetime import datetime, timedelta +from enum import StrEnum import logging from typing import final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.config_validation import ( # noqa: F401 diff --git a/homeassistant/components/camera/const.py b/homeassistant/components/camera/const.py index ab5832e48ab..f745f60b51a 100644 --- a/homeassistant/components/camera/const.py +++ b/homeassistant/components/camera/const.py @@ -1,8 +1,7 @@ """Constants for Camera component.""" +from enum import StrEnum from typing import Final -from homeassistant.backports.enum import StrEnum - DOMAIN: Final = "camera" DATA_CAMERA_PREFS: Final = "camera_prefs" diff --git a/homeassistant/components/climate/const.py b/homeassistant/components/climate/const.py index 41d4646aeae..23c76c151d7 100644 --- a/homeassistant/components/climate/const.py +++ b/homeassistant/components/climate/const.py @@ -1,8 +1,6 @@ """Provides the constants needed for component.""" -from enum import IntFlag - -from homeassistant.backports.enum import StrEnum +from enum import IntFlag, StrEnum class HVACMode(StrEnum): diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index a3965552b16..354b972e2b7 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -4,14 +4,13 @@ from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass from datetime import timedelta -from enum import IntFlag +from enum import IntFlag, StrEnum import functools as ft import logging from typing import Any, ParamSpec, TypeVar, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( SERVICE_CLOSE_COVER, diff --git a/homeassistant/components/device_tracker/const.py b/homeassistant/components/device_tracker/const.py index ad68472d9b0..3a0b0afd7c9 100644 --- a/homeassistant/components/device_tracker/const.py +++ b/homeassistant/components/device_tracker/const.py @@ -2,11 +2,10 @@ from __future__ import annotations from datetime import timedelta +from enum import StrEnum import logging from typing import Final -from homeassistant.backports.enum import StrEnum - LOGGER: Final = logging.getLogger(__package__) DOMAIN: Final = "device_tracker" diff --git a/homeassistant/components/diagnostics/const.py b/homeassistant/components/diagnostics/const.py index 0d07abde2bd..20f97be1eb1 100644 --- a/homeassistant/components/diagnostics/const.py +++ b/homeassistant/components/diagnostics/const.py @@ -1,5 +1,5 @@ """Constants for the Diagnostics integration.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum DOMAIN = "diagnostics" diff --git a/homeassistant/components/dlna_dms/dms.py b/homeassistant/components/dlna_dms/dms.py index 8fc55830c63..6352d98da3c 100644 --- a/homeassistant/components/dlna_dms/dms.py +++ b/homeassistant/components/dlna_dms/dms.py @@ -4,6 +4,7 @@ from __future__ import annotations import asyncio from collections.abc import Callable, Coroutine from dataclasses import dataclass +from enum import StrEnum import functools from typing import Any, TypeVar, cast @@ -15,7 +16,6 @@ from async_upnp_client.exceptions import UpnpActionError, UpnpConnectionError, U from async_upnp_client.profiles.dlna import ContentDirectoryErrorCode, DmsDevice from didl_lite import didl_lite -from homeassistant.backports.enum import StrEnum from homeassistant.backports.functools import cached_property from homeassistant.components import ssdp from homeassistant.components.media_player import BrowseError, MediaClass diff --git a/homeassistant/components/event/__init__.py b/homeassistant/components/event/__init__.py index a98a3fa6c3f..98dd6036bc9 100644 --- a/homeassistant/components/event/__init__.py +++ b/homeassistant/components/event/__init__.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import asdict, dataclass from datetime import datetime, timedelta +from enum import StrEnum import logging from typing import Any, Self, final -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.config_validation import ( # noqa: F401 diff --git a/homeassistant/components/fritz/const.py b/homeassistant/components/fritz/const.py index 1ce21081f9c..16015ec5837 100644 --- a/homeassistant/components/fritz/const.py +++ b/homeassistant/components/fritz/const.py @@ -1,5 +1,6 @@ """Constants for the FRITZ!Box Tools integration.""" +from enum import StrEnum from typing import Literal from fritzconnection.core.exceptions import ( @@ -13,7 +14,6 @@ from fritzconnection.core.exceptions import ( FritzServiceError, ) -from homeassistant.backports.enum import StrEnum from homeassistant.const import Platform diff --git a/homeassistant/components/fritzbox_callmonitor/config_flow.py b/homeassistant/components/fritzbox_callmonitor/config_flow.py index f7ce25c2ebe..5065aa65b4d 100644 --- a/homeassistant/components/fritzbox_callmonitor/config_flow.py +++ b/homeassistant/components/fritzbox_callmonitor/config_flow.py @@ -1,6 +1,7 @@ """Config flow for fritzbox_callmonitor.""" from __future__ import annotations +from enum import StrEnum from typing import Any, cast from fritzconnection import FritzConnection @@ -9,7 +10,6 @@ from requests.exceptions import ConnectionError as RequestsConnectionError import voluptuous as vol from homeassistant import config_entries -from homeassistant.backports.enum import StrEnum from homeassistant.const import ( CONF_HOST, CONF_NAME, diff --git a/homeassistant/components/fritzbox_callmonitor/const.py b/homeassistant/components/fritzbox_callmonitor/const.py index 4f224660ae9..75050374e52 100644 --- a/homeassistant/components/fritzbox_callmonitor/const.py +++ b/homeassistant/components/fritzbox_callmonitor/const.py @@ -1,7 +1,7 @@ """Constants for the AVM Fritz!Box call monitor integration.""" +from enum import StrEnum from typing import Final -from homeassistant.backports.enum import StrEnum from homeassistant.const import Platform diff --git a/homeassistant/components/fritzbox_callmonitor/sensor.py b/homeassistant/components/fritzbox_callmonitor/sensor.py index ed2be40f30f..adf6bd3a35a 100644 --- a/homeassistant/components/fritzbox_callmonitor/sensor.py +++ b/homeassistant/components/fritzbox_callmonitor/sensor.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections.abc import Mapping from datetime import datetime, timedelta +from enum import StrEnum import logging import queue from threading import Event as ThreadingEvent, Thread @@ -11,7 +12,6 @@ from typing import Any, cast from fritzconnection.core.fritzmonitor import FritzMonitor -from homeassistant.backports.enum import StrEnum from homeassistant.components.sensor import SensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, CONF_PORT, EVENT_HOMEASSISTANT_STOP diff --git a/homeassistant/components/hassio/const.py b/homeassistant/components/hassio/const.py index 2bc314f169a..0735f2645cc 100644 --- a/homeassistant/components/hassio/const.py +++ b/homeassistant/components/hassio/const.py @@ -1,5 +1,5 @@ """Hass.io const variables.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum DOMAIN = "hassio" diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index 79effa6f0c2..a525c626f14 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -3,12 +3,12 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum import logging from typing import Any, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_MODE, diff --git a/homeassistant/components/humidifier/const.py b/homeassistant/components/humidifier/const.py index 35601cf2b1f..09c0714cbeb 100644 --- a/homeassistant/components/humidifier/const.py +++ b/homeassistant/components/humidifier/const.py @@ -1,7 +1,5 @@ """Provides the constants needed for component.""" -from enum import IntFlag - -from homeassistant.backports.enum import StrEnum +from enum import IntFlag, StrEnum MODE_NORMAL = "normal" MODE_ECO = "eco" diff --git a/homeassistant/components/image_processing/__init__.py b/homeassistant/components/image_processing/__init__.py index 733a1344538..7640925451a 100644 --- a/homeassistant/components/image_processing/__init__.py +++ b/homeassistant/components/image_processing/__init__.py @@ -4,12 +4,12 @@ from __future__ import annotations import asyncio from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum import logging from typing import Any, Final, TypedDict, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.components.camera import Image from homeassistant.const import ( ATTR_ENTITY_ID, diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 0f49ab605a7..f7f0150bdd2 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -5,14 +5,13 @@ from collections.abc import Iterable import csv import dataclasses from datetime import timedelta -from enum import IntFlag +from enum import IntFlag, StrEnum import logging import os from typing import Any, Self, cast, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( SERVICE_TOGGLE, diff --git a/homeassistant/components/logger/helpers.py b/homeassistant/components/logger/helpers.py index dcd4348a561..49996408a1d 100644 --- a/homeassistant/components/logger/helpers.py +++ b/homeassistant/components/logger/helpers.py @@ -5,10 +5,10 @@ from collections import defaultdict from collections.abc import Mapping import contextlib from dataclasses import asdict, dataclass +from enum import StrEnum import logging from typing import Any, cast -from homeassistant.backports.enum import StrEnum from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.storage import Store from homeassistant.helpers.typing import ConfigType diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 36512620e51..39b67477f97 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -7,6 +7,7 @@ from collections.abc import Callable from contextlib import suppress from dataclasses import dataclass import datetime as dt +from enum import StrEnum import functools as ft import hashlib from http import HTTPStatus @@ -22,7 +23,6 @@ import async_timeout import voluptuous as vol from yarl import URL -from homeassistant.backports.enum import StrEnum from homeassistant.components import websocket_api from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView from homeassistant.components.websocket_api import ERR_NOT_SUPPORTED, ERR_UNKNOWN_ERROR diff --git a/homeassistant/components/media_player/const.py b/homeassistant/components/media_player/const.py index 9ad7b983c7f..2c609750153 100644 --- a/homeassistant/components/media_player/const.py +++ b/homeassistant/components/media_player/const.py @@ -1,7 +1,5 @@ """Provides the constants needed for component.""" -from enum import IntFlag - -from homeassistant.backports.enum import StrEnum +from enum import IntFlag, StrEnum # How long our auth signature on the content should be valid for CONTENT_AUTH_EXPIRY_TIME = 3600 * 24 diff --git a/homeassistant/components/mqtt/models.py b/homeassistant/components/mqtt/models.py index fb11400a312..5a966a4455c 100644 --- a/homeassistant/components/mqtt/models.py +++ b/homeassistant/components/mqtt/models.py @@ -7,12 +7,12 @@ from collections import deque from collections.abc import Callable, Coroutine from dataclasses import dataclass, field import datetime as dt +from enum import StrEnum import logging from typing import TYPE_CHECKING, Any, TypedDict import attr -from homeassistant.backports.enum import StrEnum from homeassistant.const import ATTR_ENTITY_ID, ATTR_NAME from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback from homeassistant.helpers import template diff --git a/homeassistant/components/number/const.py b/homeassistant/components/number/const.py index 3d7dba15b0e..9248d3f9e57 100644 --- a/homeassistant/components/number/const.py +++ b/homeassistant/components/number/const.py @@ -1,11 +1,11 @@ """Provides the constants needed for the component.""" from __future__ import annotations +from enum import StrEnum from typing import Final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_PARTS_PER_BILLION, diff --git a/homeassistant/components/persistent_notification/__init__.py b/homeassistant/components/persistent_notification/__init__.py index 581720c2730..c9e8e3703db 100644 --- a/homeassistant/components/persistent_notification/__init__.py +++ b/homeassistant/components/persistent_notification/__init__.py @@ -3,12 +3,12 @@ from __future__ import annotations from collections.abc import Callable, Mapping from datetime import datetime +from enum import StrEnum import logging from typing import Any, Final, TypedDict import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.components import websocket_api from homeassistant.core import CALLBACK_TYPE, HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv, singleton diff --git a/homeassistant/components/qnap_qsw/entity.py b/homeassistant/components/qnap_qsw/entity.py index 288c184984d..38e45457462 100644 --- a/homeassistant/components/qnap_qsw/entity.py +++ b/homeassistant/components/qnap_qsw/entity.py @@ -2,6 +2,7 @@ from __future__ import annotations from dataclasses import dataclass +from enum import StrEnum from typing import Any from aioqsw.const import ( @@ -14,7 +15,6 @@ from aioqsw.const import ( QSD_SYSTEM_BOARD, ) -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_URL from homeassistant.core import callback diff --git a/homeassistant/components/rainmachine/util.py b/homeassistant/components/rainmachine/util.py index d4131fdb022..61ef1be500a 100644 --- a/homeassistant/components/rainmachine/util.py +++ b/homeassistant/components/rainmachine/util.py @@ -4,9 +4,9 @@ from __future__ import annotations from collections.abc import Awaitable, Callable, Iterable from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum from typing import Any -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import entity_registry as er diff --git a/homeassistant/components/recorder/const.py b/homeassistant/components/recorder/const.py index ec5c5c984b5..fc7683db901 100644 --- a/homeassistant/components/recorder/const.py +++ b/homeassistant/components/recorder/const.py @@ -1,6 +1,7 @@ """Recorder constants.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum + from homeassistant.const import ATTR_ATTRIBUTION, ATTR_RESTORED, ATTR_SUPPORTED_FEATURES from homeassistant.helpers.json import ( # noqa: F401 pylint: disable=unused-import JSON_DUMP, diff --git a/homeassistant/components/sensor/const.py b/homeassistant/components/sensor/const.py index 6e4f355f852..139725ee1ab 100644 --- a/homeassistant/components/sensor/const.py +++ b/homeassistant/components/sensor/const.py @@ -1,11 +1,11 @@ """Constants for sensor.""" from __future__ import annotations +from enum import StrEnum from typing import Final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_PARTS_PER_BILLION, diff --git a/homeassistant/components/shelly/const.py b/homeassistant/components/shelly/const.py index 608798976ba..cc82f0ad700 100644 --- a/homeassistant/components/shelly/const.py +++ b/homeassistant/components/shelly/const.py @@ -1,14 +1,13 @@ """Constants for the Shelly integration.""" from __future__ import annotations +from enum import StrEnum from logging import Logger, getLogger import re from typing import Final from awesomeversion import AwesomeVersion -from homeassistant.backports.enum import StrEnum - DOMAIN: Final = "shelly" LOGGER: Logger = getLogger(__package__) diff --git a/homeassistant/components/spotify/browse_media.py b/homeassistant/components/spotify/browse_media.py index e6a1f16eede..162369fd27d 100644 --- a/homeassistant/components/spotify/browse_media.py +++ b/homeassistant/components/spotify/browse_media.py @@ -1,6 +1,7 @@ """Support for Spotify media browsing.""" from __future__ import annotations +from enum import StrEnum from functools import partial import logging from typing import Any @@ -8,7 +9,6 @@ from typing import Any from spotipy import Spotify import yarl -from homeassistant.backports.enum import StrEnum from homeassistant.components.media_player import ( BrowseError, BrowseMedia, diff --git a/homeassistant/components/stookwijzer/const.py b/homeassistant/components/stookwijzer/const.py index cdd5ac2a567..1a125da6a6b 100644 --- a/homeassistant/components/stookwijzer/const.py +++ b/homeassistant/components/stookwijzer/const.py @@ -1,9 +1,8 @@ """Constants for the Stookwijzer integration.""" +from enum import StrEnum import logging from typing import Final -from homeassistant.backports.enum import StrEnum - DOMAIN: Final = "stookwijzer" LOGGER = logging.getLogger(__package__) diff --git a/homeassistant/components/switch/__init__.py b/homeassistant/components/switch/__init__.py index 6eb2a275e18..bf3c3424142 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -3,11 +3,11 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum import logging import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( SERVICE_TOGGLE, diff --git a/homeassistant/components/switchbot/const.py b/homeassistant/components/switchbot/const.py index 17e95486298..0f7d1407fc5 100644 --- a/homeassistant/components/switchbot/const.py +++ b/homeassistant/components/switchbot/const.py @@ -1,7 +1,7 @@ """Constants for the switchbot integration.""" -from switchbot import SwitchbotModel +from enum import StrEnum -from homeassistant.backports.enum import StrEnum +from switchbot import SwitchbotModel DOMAIN = "switchbot" MANUFACTURER = "switchbot" diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index f07a672afbd..4182b177bf6 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -3,13 +3,13 @@ from __future__ import annotations from dataclasses import asdict, dataclass from datetime import timedelta +from enum import StrEnum import logging import re from typing import Any, final import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.config_entries import ConfigEntry from homeassistant.const import MAX_LENGTH_STATE_STATE from homeassistant.core import HomeAssistant, ServiceCall diff --git a/homeassistant/components/tuya/alarm_control_panel.py b/homeassistant/components/tuya/alarm_control_panel.py index c2c9c207c02..cd92e62b864 100644 --- a/homeassistant/components/tuya/alarm_control_panel.py +++ b/homeassistant/components/tuya/alarm_control_panel.py @@ -1,9 +1,10 @@ """Support for Tuya Alarm.""" from __future__ import annotations +from enum import StrEnum + from tuya_iot import TuyaDevice, TuyaDeviceManager -from homeassistant.backports.enum import StrEnum from homeassistant.components.alarm_control_panel import ( AlarmControlPanelEntity, AlarmControlPanelEntityDescription, diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index 20dc724deb9..acf9f8bbd2c 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -3,11 +3,11 @@ from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass, field +from enum import StrEnum import logging from tuya_iot import TuyaCloudOpenAPIEndpoint -from homeassistant.backports.enum import StrEnum from homeassistant.components.sensor import SensorDeviceClass from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, diff --git a/homeassistant/components/update/__init__.py b/homeassistant/components/update/__init__.py index 13ab6d38e8a..b9d01629536 100644 --- a/homeassistant/components/update/__init__.py +++ b/homeassistant/components/update/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta +from enum import StrEnum from functools import lru_cache import logging from typing import Any, Final, final @@ -10,7 +11,6 @@ from typing import Any, Final, final from awesomeversion import AwesomeVersion, AwesomeVersionCompareException import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.components import websocket_api from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_OFF, STATE_ON, EntityCategory diff --git a/homeassistant/components/wallbox/const.py b/homeassistant/components/wallbox/const.py index a6f92541a10..9bab8232dab 100644 --- a/homeassistant/components/wallbox/const.py +++ b/homeassistant/components/wallbox/const.py @@ -1,5 +1,5 @@ """Constants for the Wallbox integration.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum DOMAIN = "wallbox" diff --git a/homeassistant/components/withings/common.py b/homeassistant/components/withings/common.py index da43ae973cd..9282e3977c1 100644 --- a/homeassistant/components/withings/common.py +++ b/homeassistant/components/withings/common.py @@ -6,7 +6,7 @@ from collections.abc import Callable from dataclasses import dataclass import datetime from datetime import timedelta -from enum import IntEnum +from enum import IntEnum, StrEnum from http import HTTPStatus import logging import re @@ -27,7 +27,6 @@ from withings_api.common import ( query_measure_groups, ) -from homeassistant.backports.enum import StrEnum from homeassistant.components import webhook from homeassistant.components.application_credentials import AuthImplementation from homeassistant.components.http import HomeAssistantView diff --git a/homeassistant/components/withings/const.py b/homeassistant/components/withings/const.py index 1193b6f612a..02d8977c604 100644 --- a/homeassistant/components/withings/const.py +++ b/homeassistant/components/withings/const.py @@ -1,5 +1,5 @@ """Constants used by the Withings component.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum CONF_PROFILES = "profiles" CONF_USE_WEBHOOK = "use_webhook" diff --git a/homeassistant/components/zwave_js/discovery.py b/homeassistant/components/zwave_js/discovery.py index 947e5157a8a..9569ba97167 100644 --- a/homeassistant/components/zwave_js/discovery.py +++ b/homeassistant/components/zwave_js/discovery.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections.abc import Generator from dataclasses import asdict, dataclass, field +from enum import StrEnum from typing import TYPE_CHECKING, Any, cast from awesomeversion import AwesomeVersion @@ -47,7 +48,6 @@ from zwave_js_server.model.value import ( Value as ZwaveValue, ) -from homeassistant.backports.enum import StrEnum from homeassistant.const import EntityCategory, Platform from homeassistant.core import callback from homeassistant.helpers.device_registry import DeviceEntry diff --git a/homeassistant/components/zwave_me/const.py b/homeassistant/components/zwave_me/const.py index 84d49ff7b9d..1ec4f8d1601 100644 --- a/homeassistant/components/zwave_me/const.py +++ b/homeassistant/components/zwave_me/const.py @@ -1,5 +1,6 @@ """Constants for ZWaveMe.""" -from homeassistant.backports.enum import StrEnum +from enum import StrEnum + from homeassistant.const import Platform # Base component constants diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index 6fa80406e61..15fcb9a50de 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -6,7 +6,7 @@ from collections import ChainMap from collections.abc import Callable, Coroutine, Generator, Iterable, Mapping from contextvars import ContextVar from copy import deepcopy -from enum import Enum +from enum import Enum, StrEnum import functools import logging from random import randint @@ -14,7 +14,6 @@ from types import MappingProxyType from typing import TYPE_CHECKING, Any, Self, TypeVar, cast from . import data_entry_flow, loader -from .backports.enum import StrEnum from .components import persistent_notification from .const import EVENT_HOMEASSISTANT_STARTED, EVENT_HOMEASSISTANT_STOP, Platform from .core import CALLBACK_TYPE, CoreState, Event, HassJob, HomeAssistant, callback diff --git a/homeassistant/const.py b/homeassistant/const.py index 85f0f4eee15..513d72555a5 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -1,10 +1,9 @@ """Constants used by Home Assistant components.""" from __future__ import annotations +from enum import StrEnum from typing import Final -from .backports.enum import StrEnum - APPLICATION_NAME: Final = "HomeAssistant" MAJOR_VERSION: Final = 2023 MINOR_VERSION: Final = 8 diff --git a/homeassistant/core.py b/homeassistant/core.py index 8bb30f5d57d..3673f9acba5 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -43,7 +43,6 @@ import voluptuous as vol import yarl from . import block_async_io, loader, util -from .backports.enum import StrEnum from .const import ( ATTR_DOMAIN, ATTR_FRIENDLY_NAME, @@ -133,7 +132,7 @@ BLOCK_LOG_TIMEOUT = 60 ServiceResponse = JsonObjectType | None -class ConfigSource(StrEnum): +class ConfigSource(enum.StrEnum): """Source of core configuration.""" DEFAULT = "default" @@ -1669,7 +1668,7 @@ class StateMachine: ) -class SupportsResponse(StrEnum): +class SupportsResponse(enum.StrEnum): """Service call response configuration.""" NONE = "none" diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index c0a5860529e..e0408a24b2e 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -5,13 +5,13 @@ import abc from collections.abc import Callable, Iterable, Mapping import copy from dataclasses import dataclass +from enum import StrEnum import logging from types import MappingProxyType from typing import Any, Required, TypedDict import voluptuous as vol -from .backports.enum import StrEnum from .core import HomeAssistant, callback from .exceptions import HomeAssistantError from .helpers.frame import report diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 8d0ee78eca7..122fd752a84 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -9,7 +9,7 @@ from datetime import ( time as time_sys, timedelta, ) -from enum import Enum +from enum import Enum, StrEnum import inspect import logging from numbers import Number @@ -25,7 +25,6 @@ from uuid import UUID import voluptuous as vol import voluptuous_serialize -from homeassistant.backports.enum import StrEnum from homeassistant.const import ( ATTR_AREA_ID, ATTR_DEVICE_ID, diff --git a/homeassistant/helpers/device_registry.py b/homeassistant/helpers/device_registry.py index a59313ed886..c65e87a2119 100644 --- a/homeassistant/helpers/device_registry.py +++ b/homeassistant/helpers/device_registry.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections import UserDict from collections.abc import Coroutine, ValuesView +from enum import StrEnum import logging import time from typing import TYPE_CHECKING, Any, TypeVar, cast @@ -10,7 +11,6 @@ from urllib.parse import urlparse import attr -from homeassistant.backports.enum import StrEnum from homeassistant.const import EVENT_HOMEASSISTANT_STARTED, EVENT_HOMEASSISTANT_STOP from homeassistant.core import Event, HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index cabac2617c2..5fc4609d812 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -12,6 +12,7 @@ from __future__ import annotations from collections import UserDict from collections.abc import Callable, Iterable, Mapping, ValuesView from datetime import datetime, timedelta +from enum import StrEnum import logging import time from typing import TYPE_CHECKING, Any, TypeVar, cast @@ -19,7 +20,6 @@ from typing import TYPE_CHECKING, Any, TypeVar, cast import attr import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_FRIENDLY_NAME, diff --git a/homeassistant/helpers/issue_registry.py b/homeassistant/helpers/issue_registry.py index afe2d98ed0b..9bd6ebffadb 100644 --- a/homeassistant/helpers/issue_registry.py +++ b/homeassistant/helpers/issue_registry.py @@ -3,12 +3,12 @@ from __future__ import annotations import dataclasses from datetime import datetime +from enum import StrEnum import functools as ft from typing import Any, cast from awesomeversion import AwesomeVersion, AwesomeVersionStrategy -from homeassistant.backports.enum import StrEnum from homeassistant.const import __version__ as ha_version from homeassistant.core import HomeAssistant, callback from homeassistant.util.async_ import run_callback_threadsafe diff --git a/homeassistant/helpers/selector.py b/homeassistant/helpers/selector.py index b97f781eaf3..8ec8d5eac3e 100644 --- a/homeassistant/helpers/selector.py +++ b/homeassistant/helpers/selector.py @@ -2,14 +2,13 @@ from __future__ import annotations from collections.abc import Callable, Mapping, Sequence -from enum import IntFlag +from enum import IntFlag, StrEnum from functools import cache from typing import Any, Generic, Literal, Required, TypedDict, TypeVar, cast from uuid import UUID import voluptuous as vol -from homeassistant.backports.enum import StrEnum from homeassistant.const import CONF_MODE, CONF_UNIT_OF_MEASUREMENT from homeassistant.core import split_entity_id, valid_entity_id from homeassistant.util import decorator diff --git a/homeassistant/util/ssl.py b/homeassistant/util/ssl.py index 664d6f15650..84585d7a8c7 100644 --- a/homeassistant/util/ssl.py +++ b/homeassistant/util/ssl.py @@ -1,13 +1,12 @@ """Helper to create SSL contexts.""" import contextlib +from enum import StrEnum from functools import cache from os import environ import ssl import certifi -from homeassistant.backports.enum import StrEnum - class SSLCipherList(StrEnum): """SSL cipher lists.""" diff --git a/pylint/plugins/hass_imports.py b/pylint/plugins/hass_imports.py index be44c4256ce..8b3aea61ff4 100644 --- a/pylint/plugins/hass_imports.py +++ b/pylint/plugins/hass_imports.py @@ -18,6 +18,12 @@ class ObsoleteImportMatch: _OBSOLETE_IMPORT: dict[str, list[ObsoleteImportMatch]] = { + "homeassistant.backports.enum": [ + ObsoleteImportMatch( + reason="We can now use the Python 3.11 provided enum.StrEnum instead", + constant=re.compile(r"^StrEnum$"), + ), + ], "homeassistant.components.alarm_control_panel": [ ObsoleteImportMatch( reason="replaced by AlarmControlPanelEntityFeature enum", diff --git a/tests/backports/__init__.py b/tests/backports/__init__.py deleted file mode 100644 index 3f701810a5d..00000000000 --- a/tests/backports/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""The tests for the backports.""" diff --git a/tests/backports/test_enum.py b/tests/backports/test_enum.py deleted file mode 100644 index 06b876eac8d..00000000000 --- a/tests/backports/test_enum.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Test Home Assistant enum utils.""" - -from enum import auto - -import pytest - -from homeassistant.backports.enum import StrEnum - - -def test_strenum() -> None: - """Test StrEnum.""" - - class TestEnum(StrEnum): - Test = "test" - - assert str(TestEnum.Test) == "test" - assert TestEnum.Test == "test" - assert TestEnum("test") is TestEnum.Test - assert TestEnum(TestEnum.Test) is TestEnum.Test - - with pytest.raises(ValueError): - TestEnum(42) - - with pytest.raises(ValueError): - TestEnum("str but unknown") - - with pytest.raises(TypeError): - - class FailEnum(StrEnum): - Test = 42 - - with pytest.raises(TypeError): - - class FailEnum2(StrEnum): - Test = auto() diff --git a/tests/components/esphome/test_enum_mapper.py b/tests/components/esphome/test_enum_mapper.py index 52b81bb3836..a9ee5242592 100644 --- a/tests/components/esphome/test_enum_mapper.py +++ b/tests/components/esphome/test_enum_mapper.py @@ -1,8 +1,9 @@ """Test ESPHome enum mapper.""" +from enum import StrEnum + from aioesphomeapi import APIIntEnum -from homeassistant.backports.enum import StrEnum from homeassistant.components.esphome.enum_mapper import EsphomeEnumMapper diff --git a/tests/components/samsungtv/test_media_player.py b/tests/components/samsungtv/test_media_player.py index 3d3077a1c6a..674dea752a0 100644 --- a/tests/components/samsungtv/test_media_player.py +++ b/tests/components/samsungtv/test_media_player.py @@ -694,7 +694,7 @@ async def test_device_class(hass: HomeAssistant) -> None: """Test for device_class property.""" await setup_samsungtv_entry(hass, MOCK_CONFIG) state = hass.states.get(ENTITY_ID) - assert state.attributes[ATTR_DEVICE_CLASS] is MediaPlayerDeviceClass.TV.value + assert state.attributes[ATTR_DEVICE_CLASS] == MediaPlayerDeviceClass.TV @pytest.mark.usefixtures("rest_api") diff --git a/tests/components/utility_meter/test_sensor.py b/tests/components/utility_meter/test_sensor.py index 5cb9e594cb2..3d2d95fd26f 100644 --- a/tests/components/utility_meter/test_sensor.py +++ b/tests/components/utility_meter/test_sensor.py @@ -489,7 +489,7 @@ async def test_device_class( state = hass.states.get("sensor.energy_meter") assert state is not None assert state.state == "0" - assert state.attributes.get(ATTR_DEVICE_CLASS) is SensorDeviceClass.ENERGY.value + assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.ENERGY assert state.attributes.get(ATTR_STATE_CLASS) is SensorStateClass.TOTAL assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfEnergy.KILO_WATT_HOUR diff --git a/tests/util/test_enum.py b/tests/util/test_enum.py index 61e8471b9d8..e975960bbe0 100644 --- a/tests/util/test_enum.py +++ b/tests/util/test_enum.py @@ -1,10 +1,9 @@ """Test enum helpers.""" -from enum import Enum, IntEnum, IntFlag +from enum import Enum, IntEnum, IntFlag, StrEnum from typing import Any import pytest -from homeassistant.backports.enum import StrEnum from homeassistant.util.enum import try_parse_enum