-
-
Notifications
You must be signed in to change notification settings - Fork 30.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move enum mapper to own file to prevent circular dependency (#90890)
* Move enum_mapper to own file to prevent circular dependency * Add enum mapper test
- Loading branch information
1 parent
2fc34e7
commit eb469d6
Showing
8 changed files
with
93 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
"""Helper class to convert between Home Assistant and ESPHome enum values.""" | ||
|
||
from typing import Generic, TypeVar, overload | ||
|
||
from aioesphomeapi import APIIntEnum | ||
|
||
_EnumT = TypeVar("_EnumT", bound=APIIntEnum) | ||
_ValT = TypeVar("_ValT") | ||
|
||
|
||
class EsphomeEnumMapper(Generic[_EnumT, _ValT]): | ||
"""Helper class to convert between hass and esphome enum values.""" | ||
|
||
def __init__(self, mapping: dict[_EnumT, _ValT]) -> None: | ||
"""Construct a EsphomeEnumMapper.""" | ||
# Add none mapping | ||
augmented_mapping: dict[ | ||
_EnumT | None, _ValT | None | ||
] = mapping # type: ignore[assignment] | ||
augmented_mapping[None] = None | ||
|
||
self._mapping = augmented_mapping | ||
self._inverse: dict[_ValT, _EnumT] = {v: k for k, v in mapping.items()} | ||
|
||
@overload | ||
def from_esphome(self, value: _EnumT) -> _ValT: | ||
... | ||
|
||
@overload | ||
def from_esphome(self, value: _EnumT | None) -> _ValT | None: | ||
... | ||
|
||
def from_esphome(self, value: _EnumT | None) -> _ValT | None: | ||
"""Convert from an esphome int representation to a hass string.""" | ||
return self._mapping[value] | ||
|
||
def from_hass(self, value: _ValT) -> _EnumT: | ||
"""Convert from a hass string to a esphome int representation.""" | ||
return self._inverse[value] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
"""Test ESPHome enum mapper.""" | ||
|
||
from aioesphomeapi import APIIntEnum | ||
|
||
from homeassistant.backports.enum import StrEnum | ||
from homeassistant.components.esphome.enum_mapper import EsphomeEnumMapper | ||
|
||
|
||
class MockEnum(APIIntEnum): | ||
"""Mock enum.""" | ||
|
||
ESPHOME_FOO = 1 | ||
ESPHOME_BAR = 2 | ||
|
||
|
||
class MockStrEnum(StrEnum): | ||
"""Mock enum.""" | ||
|
||
HA_FOO = "foo" | ||
HA_BAR = "bar" | ||
|
||
|
||
MOCK_MAPPING: EsphomeEnumMapper[MockEnum, MockStrEnum] = EsphomeEnumMapper( | ||
{ | ||
MockEnum.ESPHOME_FOO: MockStrEnum.HA_FOO, | ||
MockEnum.ESPHOME_BAR: MockStrEnum.HA_BAR, | ||
} | ||
) | ||
|
||
|
||
async def test_map_esphome_to_ha() -> None: | ||
"""Test mapping from ESPHome to HA.""" | ||
|
||
assert MOCK_MAPPING.from_esphome(MockEnum.ESPHOME_FOO) == MockStrEnum.HA_FOO | ||
assert MOCK_MAPPING.from_esphome(MockEnum.ESPHOME_BAR) == MockStrEnum.HA_BAR | ||
|
||
|
||
async def test_map_ha_to_esphome() -> None: | ||
"""Test mapping from HA to ESPHome.""" | ||
|
||
assert MOCK_MAPPING.from_hass(MockStrEnum.HA_FOO) == MockEnum.ESPHOME_FOO | ||
assert MOCK_MAPPING.from_hass(MockStrEnum.HA_BAR) == MockEnum.ESPHOME_BAR |