Cleanup of code reviews from initial modern forms (#51794)

This commit is contained in:
Brian Towles 2021-06-14 14:04:02 -05:00 committed by GitHub
parent 7329dc4f6b
commit b1fa01e4bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 88 deletions

View File

@ -15,7 +15,6 @@ from homeassistant.components.fan import DOMAIN as FAN_DOMAIN
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_MODEL, ATTR_NAME, ATTR_SW_VERSION, CONF_HOST
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import (
@ -38,24 +37,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
# Create Modern Forms instance for this entry
coordinator = ModernFormsDataUpdateCoordinator(hass, host=entry.data[CONF_HOST])
await coordinator.async_refresh()
if not coordinator.last_update_success:
raise ConfigEntryNotReady
await coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = coordinator
if entry.unique_id is None:
hass.config_entries.async_update_entry(
entry, unique_id=coordinator.data.info.mac_address
)
# Set up all platforms for this device/entry.
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, platform)
)
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
@ -106,7 +94,7 @@ class ModernFormsDataUpdateCoordinator(DataUpdateCoordinator[ModernFormsDeviceSt
host: str,
) -> None:
"""Initialize global Modern Forms data updater."""
self.modernforms = ModernFormsDevice(
self.modern_forms = ModernFormsDevice(
host, session=async_get_clientsession(hass)
)
@ -125,7 +113,7 @@ class ModernFormsDataUpdateCoordinator(DataUpdateCoordinator[ModernFormsDeviceSt
async def _async_update_data(self) -> ModernFormsDevice:
"""Fetch data from Modern Forms."""
try:
return await self.modernforms.update(
return await self.modern_forms.update(
full_update=not self.last_update_success
)
except ModernFormsError as error:
@ -152,7 +140,6 @@ class ModernFormsDeviceEntity(CoordinatorEntity[ModernFormsDataUpdateCoordinator
self._entry_id = entry_id
self._attr_icon = icon
self._attr_name = name
self._unsub_dispatcher = None
@property
def device_info(self) -> DeviceInfo:

View File

@ -4,25 +4,11 @@ DOMAIN = "modern_forms"
ATTR_IDENTIFIERS = "identifiers"
ATTR_MANUFACTURER = "manufacturer"
ATTR_MODEL = "model"
ATTR_OWNER = "owner"
ATTR_IDENTITY = "identity"
ATTR_MCU_FIRMWARE_VERSION = "mcu_firmware_version"
ATTR_FIRMWARE_VERSION = "firmware_version"
SIGNAL_INSTANCE_ADD = f"{DOMAIN}_instance_add_signal." "{}"
SIGNAL_INSTANCE_REMOVE = f"{DOMAIN}_instance_remove_signal." "{}"
SIGNAL_ENTITY_REMOVE = f"{DOMAIN}_entity_remove_signal." "{}"
CONF_ON_UNLOAD = "ON_UNLOAD"
OPT_BRIGHTNESS = "brightness"
OPT_ON = "on"
OPT_SPEED = "speed"
# Services
SERVICE_SET_LIGHT_SLEEP_TIMER = "set_light_sleep_timer"
SERVICE_CLEAR_LIGHT_SLEEP_TIMER = "clear_light_sleep_timer"
SERVICE_SET_FAN_SLEEP_TIMER = "set_fan_sleep_timer"
SERVICE_CLEAR_FAN_SLEEP_TIMER = "clear_fan_sleep_timer"

View File

@ -1,16 +1,15 @@
"""Support for Modern Forms Fan Fans."""
from __future__ import annotations
from functools import partial
from typing import Any, Callable
from typing import Any
from aiomodernforms.const import FAN_POWER_OFF, FAN_POWER_ON
import voluptuous as vol
from homeassistant.components.fan import SUPPORT_DIRECTION, SUPPORT_SET_SPEED, FanEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import callback
import homeassistant.helpers.entity_platform as entity_platform
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.util.percentage import (
int_states_in_range,
@ -35,7 +34,9 @@ from .const import (
async def async_setup_entry(
hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities: Callable
hass: HomeAssistantType,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a Modern Forms platform from config entry."""
@ -61,11 +62,9 @@ async def async_setup_entry(
"async_clear_fan_sleep_timer",
)
update_func = partial(
async_update_fan, config_entry, coordinator, {}, async_add_entities
async_add_entities(
[ModernFormsFanEntity(entry_id=config_entry.entry_id, coordinator=coordinator)]
)
coordinator.async_add_listener(update_func)
update_func()
class ModernFormsFanEntity(FanEntity, ModernFormsDeviceEntity):
@ -82,7 +81,7 @@ class ModernFormsFanEntity(FanEntity, ModernFormsDeviceEntity):
coordinator=coordinator,
name=f"{coordinator.data.info.device_name} Fan",
)
self._attr_unique_id = f"{self.coordinator.data.info.mac_address}_fan"
self._attr_unique_id = f"{self.coordinator.data.info.mac_address}"
@property
def supported_features(self) -> int:
@ -117,7 +116,7 @@ class ModernFormsFanEntity(FanEntity, ModernFormsDeviceEntity):
@modernforms_exception_handler
async def async_set_direction(self, direction: str) -> None:
"""Set the direction of the fan."""
await self.coordinator.modernforms.fan(direction=direction)
await self.coordinator.modern_forms.fan(direction=direction)
@modernforms_exception_handler
async def async_set_percentage(self, percentage: int) -> None:
@ -142,12 +141,12 @@ class ModernFormsFanEntity(FanEntity, ModernFormsDeviceEntity):
data[OPT_SPEED] = round(
percentage_to_ranged_value(self.SPEED_RANGE, percentage)
)
await self.coordinator.modernforms.fan(**data)
await self.coordinator.modern_forms.fan(**data)
@modernforms_exception_handler
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the fan off."""
await self.coordinator.modernforms.fan(on=FAN_POWER_OFF)
await self.coordinator.modern_forms.fan(on=FAN_POWER_OFF)
@modernforms_exception_handler
async def async_set_fan_sleep_timer(
@ -155,26 +154,11 @@ class ModernFormsFanEntity(FanEntity, ModernFormsDeviceEntity):
sleep_time: int,
) -> None:
"""Set a Modern Forms light sleep timer."""
await self.coordinator.modernforms.fan(sleep=sleep_time * 60)
await self.coordinator.modern_forms.fan(sleep=sleep_time * 60)
@modernforms_exception_handler
async def async_clear_fan_sleep_timer(
self,
) -> None:
"""Clear a Modern Forms fan sleep timer."""
await self.coordinator.modernforms.fan(sleep=CLEAR_TIMER)
@callback
def async_update_fan(
entry: ConfigEntry,
coordinator: ModernFormsDataUpdateCoordinator,
current: dict[str, ModernFormsFanEntity],
async_add_entities,
) -> None:
"""Update Modern Forms Fan info."""
if not current:
current[entry.entry_id] = ModernFormsFanEntity(
entry_id=entry.entry_id, coordinator=coordinator
)
async_add_entities([current[entry.entry_id]])
await self.coordinator.modern_forms.fan(sleep=CLEAR_TIMER)

View File

@ -9,7 +9,6 @@
"zeroconf": [
{"type":"_easylink._tcp.local.", "name":"wac*"}
],
"dependencies": [],
"codeowners": [
"@wonderslug"
],

View File

@ -15,10 +15,7 @@ set_fan_sleep_timer:
number:
min: 1
max: 1440
step: 1
unit_of_measurement: minutes
mode: slider
clear_fan_sleep_timer:
name: Clear fan sleep timer
description: Clear the sleep timer on a Modern Forms fan.

View File

@ -1,5 +1,4 @@
{
"title": "Modern Forms",
"config": {
"flow_title": "{name}",
"step": {
@ -9,9 +8,6 @@
"host": "[%key:common::config_flow::data::host%]"
}
},
"confirm": {
"description": "[%key:common::config_flow::description::confirm_setup%]"
},
"zeroconf_confirm": {
"description": "Do you want to add the Modern Forms fan named `{name}` to Home Assistant?",
"title": "Discovered Modern Forms fan device"

View File

@ -39,15 +39,20 @@ async def test_full_user_flow_implementation(
assert result.get("type") == RESULT_TYPE_FORM
assert "flow_id" in result
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_HOST: "192.168.1.123"}
)
with patch(
"homeassistant.components.modern_forms.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_HOST: "192.168.1.123"}
)
assert result.get("title") == "ModernFormsFan"
assert "data" in result
assert result.get("type") == RESULT_TYPE_CREATE_ENTRY
assert result["data"][CONF_HOST] == "192.168.1.123"
assert result["data"][CONF_MAC] == "AA:BB:CC:DD:EE:FF"
assert result2.get("title") == "ModernFormsFan"
assert "data" in result2
assert result2.get("type") == RESULT_TYPE_CREATE_ENTRY
assert result2["data"][CONF_HOST] == "192.168.1.123"
assert result2["data"][CONF_MAC] == "AA:BB:CC:DD:EE:FF"
assert len(mock_setup_entry.mock_calls) == 1
async def test_full_zeroconf_flow_implementation(
@ -166,12 +171,26 @@ async def test_user_device_exists_abort(
headers={"Content-Type": CONTENT_TYPE_JSON},
)
await init_integration(hass, aioclient_mock)
await init_integration(hass, aioclient_mock, skip_setup=True)
await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
data={
"host": "192.168.1.123",
"hostname": "example.local.",
"properties": {CONF_MAC: "AA:BB:CC:DD:EE:FF"},
},
)
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
data={CONF_HOST: "192.168.1.123"},
data={
"host": "192.168.1.123",
"hostname": "example.local.",
"properties": {CONF_MAC: "AA:BB:CC:DD:EE:FF"},
},
)
assert result.get("type") == RESULT_TYPE_ABORT
@ -182,7 +201,17 @@ async def test_zeroconf_with_mac_device_exists_abort(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Test we abort zeroconf flow if a Modern Forms device already configured."""
await init_integration(hass, aioclient_mock)
await init_integration(hass, aioclient_mock, skip_setup=True)
await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
data={
"host": "192.168.1.123",
"hostname": "example.local.",
"properties": {CONF_MAC: "AA:BB:CC:DD:EE:FF"},
},
)
result = await hass.config_entries.flow.async_init(
DOMAIN,

View File

@ -48,7 +48,7 @@ async def test_fan_state(
entry = entity_registry.async_get("fan.modernformsfan_fan")
assert entry
assert entry.unique_id == "AA:BB:CC:DD:EE:FF_fan"
assert entry.unique_id == "AA:BB:CC:DD:EE:FF"
async def test_change_state(

View File

@ -39,14 +39,6 @@ async def test_unload_config_entry(
assert not hass.data.get(DOMAIN)
async def test_setting_unique_id(hass, aioclient_mock):
"""Test we set unique ID if not set yet."""
entry = await init_integration(hass, aioclient_mock)
assert hass.data[DOMAIN]
assert entry.unique_id == "AA:BB:CC:DD:EE:FF"
async def test_fan_only_device(hass, aioclient_mock):
"""Test we set unique ID if not set yet."""
await init_integration(