Code Cleanup for Vizio component (#31076)

* code cleanup

* dont use named arguments for positional arguments

* remove extra comma
This commit is contained in:
Raman Gupta 2020-01-22 19:55:34 -05:00 committed by Martin Hjelmare
parent a0d2a3c6c5
commit 192b656635
4 changed files with 100 additions and 100 deletions

View File

@ -50,22 +50,24 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
return True return True
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry) -> bool:
"""Load the saved entities.""" """Load the saved entities."""
for platform in PLATFORMS: for platform in PLATFORMS:
hass.async_create_task( hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, platform) hass.config_entries.async_forward_entry_setup(config_entry, platform)
) )
return True return True
async def async_unload_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool: async def async_unload_entry(
hass: HomeAssistantType, config_entry: ConfigEntry
) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
unload_ok = all( unload_ok = all(
await asyncio.gather( await asyncio.gather(
*[ *[
hass.config_entries.async_forward_entry_unload(entry, platform) hass.config_entries.async_forward_entry_unload(config_entry, platform)
for platform in PLATFORMS for platform in PLATFORMS
] ]
) )

View File

@ -30,8 +30,11 @@ from .const import (
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
def _config_flow_schema(input_dict: Dict[str, Any]) -> vol.Schema: def _get_config_flow_schema(input_dict: Dict[str, Any] = None) -> vol.Schema:
"""Return schema defaults based on user input/config dict. Retain info already provided for future form views by setting them as defaults in schema.""" """Return schema defaults based on user input/config dict. Retain info already provided for future form views by setting them as defaults in schema."""
if input_dict is None:
input_dict = {}
return vol.Schema( return vol.Schema(
{ {
vol.Required( vol.Required(
@ -50,6 +53,32 @@ def _config_flow_schema(input_dict: Dict[str, Any]) -> vol.Schema:
) )
class VizioOptionsConfigFlow(config_entries.OptionsFlow):
"""Handle Transmission client options."""
def __init__(self, config_entry: ConfigEntry) -> None:
"""Initialize vizio options flow."""
self.config_entry = config_entry
async def async_step_init(
self, user_input: Dict[str, Any] = None
) -> Dict[str, Any]:
"""Manage the vizio options."""
if user_input is not None:
return self.async_create_entry(title="", data=user_input)
options = {
vol.Optional(
CONF_VOLUME_STEP,
default=self.config_entry.options.get(
CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP
),
): vol.All(vol.Coerce(int), vol.Range(min=1, max=10))
}
return self.async_show_form(step_id="init", data_schema=vol.Schema(options))
class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a Vizio config flow.""" """Handle a Vizio config flow."""
@ -58,14 +87,13 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
@staticmethod @staticmethod
@callback @callback
def async_get_options_flow(config_entry): def async_get_options_flow(config_entry: ConfigEntry) -> VizioOptionsConfigFlow:
"""Get the options flow for this handler.""" """Get the options flow for this handler."""
return VizioOptionsConfigFlow(config_entry) return VizioOptionsConfigFlow(config_entry)
def __init__(self) -> None: def __init__(self) -> None:
"""Initialize config flow.""" """Initialize config flow."""
self.import_schema = None self._user_schema = None
self.user_schema = None
self._must_show_form = None self._must_show_form = None
async def async_step_user( async def async_step_user(
@ -76,7 +104,7 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
if user_input is not None: if user_input is not None:
# Store current values in case setup fails and user needs to edit # Store current values in case setup fails and user needs to edit
self.user_schema = _config_flow_schema(user_input) self._user_schema = _get_config_flow_schema(user_input)
# Check if new config entry matches any existing config entries # Check if new config entry matches any existing config entries
for entry in self.hass.config_entries.async_entries(DOMAIN): for entry in self.hass.config_entries.async_entries(DOMAIN):
@ -129,7 +157,7 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
) )
# Use user_input params as default values for schema if user_input is non-empty, otherwise use default schema # Use user_input params as default values for schema if user_input is non-empty, otherwise use default schema
schema = self.user_schema or self.import_schema or _config_flow_schema({}) schema = self._user_schema or _get_config_flow_schema()
return self.async_show_form(step_id="user", data_schema=schema, errors=errors) return self.async_show_form(step_id="user", data_schema=schema, errors=errors)
@ -158,9 +186,6 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
return self.async_abort(reason="already_setup") return self.async_abort(reason="already_setup")
# Store import values in case setup fails so user can see error
self.import_schema = _config_flow_schema(import_config)
return await self.async_step_user(user_input=import_config) return await self.async_step_user(user_input=import_config)
async def async_step_zeroconf( async def async_step_zeroconf(
@ -190,29 +215,3 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self._must_show_form = True self._must_show_form = True
return await self.async_step_user(user_input=discovery_info) return await self.async_step_user(user_input=discovery_info)
class VizioOptionsConfigFlow(config_entries.OptionsFlow):
"""Handle Transmission client options."""
def __init__(self, config_entry: ConfigEntry) -> None:
"""Initialize vizio options flow."""
self.config_entry = config_entry
async def async_step_init(
self, user_input: Dict[str, Any] = None
) -> Dict[str, Any]:
"""Manage the vizio options."""
if user_input is not None:
return self.async_create_entry(title="", data=user_input)
options = {
vol.Optional(
CONF_VOLUME_STEP,
default=self.config_entry.options.get(
CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP
),
): vol.All(vol.Coerce(int), vol.Range(min=1, max=10))
}
return self.async_show_form(step_id="init", data_schema=vol.Schema(options))

View File

@ -67,8 +67,8 @@ async def async_setup_entry(
DEVICE_ID, DEVICE_ID,
host, host,
name, name,
token, auth_token=token,
VIZIO_DEVICE_CLASSES[device_class], device_type=VIZIO_DEVICE_CLASSES[device_class],
session=async_get_clientsession(hass, False), session=async_get_clientsession(hass, False),
timeout=DEFAULT_TIMEOUT, timeout=DEFAULT_TIMEOUT,
) )
@ -86,9 +86,9 @@ async def async_setup_entry(
) )
raise PlatformNotReady raise PlatformNotReady
entity = VizioDevice(config_entry, device, name, volume_step, device_class) entity = VizioDevice(config_entry, device, name, volume_step, device_class,)
async_add_entities([entity], True) async_add_entities([entity], update_before_add=True)
class VizioDevice(MediaPlayerDevice): class VizioDevice(MediaPlayerDevice):
@ -122,7 +122,7 @@ class VizioDevice(MediaPlayerDevice):
@util.Throttle(MIN_TIME_BETWEEN_SCANS, MIN_TIME_BETWEEN_FORCED_SCANS) @util.Throttle(MIN_TIME_BETWEEN_SCANS, MIN_TIME_BETWEEN_FORCED_SCANS)
async def async_update(self) -> None: async def async_update(self) -> None:
"""Retrieve latest state of the device.""" """Retrieve latest state of the device."""
is_on = await self._device.get_power_state(False) is_on = await self._device.get_power_state(log_api_exception=False)
if is_on is None: if is_on is None:
self._available = False self._available = False
@ -139,15 +139,15 @@ class VizioDevice(MediaPlayerDevice):
self._state = STATE_ON self._state = STATE_ON
volume = await self._device.get_current_volume(False) volume = await self._device.get_current_volume(log_api_exception=False)
if volume is not None: if volume is not None:
self._volume_level = float(volume) / self._max_volume self._volume_level = float(volume) / self._max_volume
input_ = await self._device.get_current_input(False) input_ = await self._device.get_current_input(log_api_exception=False)
if input_ is not None: if input_ is not None:
self._current_input = input_.meta_name self._current_input = input_.meta_name
inputs = await self._device.get_inputs(False) inputs = await self._device.get_inputs(log_api_exception=False)
if inputs is not None: if inputs is not None:
self._available_inputs = [input_.name for input_ in inputs] self._available_inputs = [input_.name for input_ in inputs]
@ -275,7 +275,7 @@ class VizioDevice(MediaPlayerDevice):
async def async_volume_up(self) -> None: async def async_volume_up(self) -> None:
"""Increasing volume of the device.""" """Increasing volume of the device."""
await self._device.vol_up(self._volume_step) await self._device.vol_up(num=self._volume_step)
if self._volume_level is not None: if self._volume_level is not None:
self._volume_level = min( self._volume_level = min(
@ -284,7 +284,7 @@ class VizioDevice(MediaPlayerDevice):
async def async_volume_down(self) -> None: async def async_volume_down(self) -> None:
"""Decreasing volume of the device.""" """Decreasing volume of the device."""
await self._device.vol_down(self._volume_step) await self._device.vol_down(num=self._volume_step)
if self._volume_level is not None: if self._volume_level is not None:
self._volume_level = max( self._volume_level = max(
@ -296,9 +296,10 @@ class VizioDevice(MediaPlayerDevice):
if self._volume_level is not None: if self._volume_level is not None:
if volume > self._volume_level: if volume > self._volume_level:
num = int(self._max_volume * (volume - self._volume_level)) num = int(self._max_volume * (volume - self._volume_level))
await self._device.vol_up(num) await self._device.vol_up(num=num)
self._volume_level = volume self._volume_level = volume
elif volume < self._volume_level: elif volume < self._volume_level:
num = int(self._max_volume * (self._volume_level - volume)) num = int(self._max_volume * (self._volume_level - volume))
await self._device.vol_down(num) await self._device.vol_down(num=num)
self._volume_level = volume self._volume_level = volume

View File

@ -129,7 +129,9 @@ def vizio_cant_connect_fixture():
async def test_user_flow_minimum_fields( async def test_user_flow_minimum_fields(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test user config flow with minimum fields.""" """Test user config flow with minimum fields."""
# test form shows # test form shows
@ -156,7 +158,9 @@ async def test_user_flow_minimum_fields(
async def test_user_flow_all_fields( async def test_user_flow_all_fields(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test user config flow with all fields.""" """Test user config flow with all fields."""
# test form shows # test form shows
@ -192,9 +196,7 @@ async def test_options_flow(hass: HomeAssistantType) -> None:
assert not entry.options assert not entry.options
result = await hass.config_entries.options.async_init( result = await hass.config_entries.options.async_init(entry.entry_id, data=None)
entry.entry_id, context={"source": "test"}, data=None
)
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["step_id"] == "init" assert result["step_id"] == "init"
@ -209,7 +211,9 @@ async def test_options_flow(hass: HomeAssistantType) -> None:
async def test_user_host_already_configured( async def test_user_host_already_configured(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test host is already configured during user setup.""" """Test host is already configured during user setup."""
entry = MockConfigEntry( entry = MockConfigEntry(
@ -220,14 +224,7 @@ async def test_user_host_already_configured(
fail_entry[CONF_NAME] = "newtestname" fail_entry[CONF_NAME] = "newtestname"
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER} DOMAIN, context={"source": SOURCE_USER}, data=fail_entry
)
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input=fail_entry
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
@ -235,7 +232,9 @@ async def test_user_host_already_configured(
async def test_user_name_already_configured( async def test_user_name_already_configured(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test name is already configured during user setup.""" """Test name is already configured during user setup."""
entry = MockConfigEntry( entry = MockConfigEntry(
@ -247,13 +246,7 @@ async def test_user_name_already_configured(
fail_entry[CONF_HOST] = "0.0.0.0" fail_entry[CONF_HOST] = "0.0.0.0"
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER} DOMAIN, context={"source": SOURCE_USER}, data=fail_entry
)
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"], fail_entry
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
@ -261,7 +254,9 @@ async def test_user_name_already_configured(
async def test_user_esn_already_exists( async def test_user_esn_already_exists(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test ESN is already configured with different host and name during user setup.""" """Test ESN is already configured with different host and name during user setup."""
# Set up new entry # Set up new entry
@ -283,36 +278,25 @@ async def test_user_esn_already_exists(
async def test_user_error_on_could_not_connect( async def test_user_error_on_could_not_connect(
hass: HomeAssistantType, vizio_cant_connect hass: HomeAssistantType, vizio_cant_connect: pytest.fixture
) -> None: ) -> None:
"""Test with could_not_connect during user_setup.""" """Test with could_not_connect during user_setup."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER} DOMAIN, context={"source": SOURCE_USER}, data=MOCK_USER_VALID_TV_CONFIG
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"], MOCK_USER_VALID_TV_CONFIG
)
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["errors"] == {"base": "cant_connect"} assert result["errors"] == {"base": "cant_connect"}
async def test_user_error_on_tv_needs_token( async def test_user_error_on_tv_needs_token(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test when config fails custom validation for non null access token when device_class = tv during user setup.""" """Test when config fails custom validation for non null access token when device_class = tv during user setup."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER} DOMAIN, context={"source": SOURCE_USER}, data=MOCK_INVALID_TV_CONFIG
)
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"], MOCK_INVALID_TV_CONFIG
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
@ -320,12 +304,14 @@ async def test_user_error_on_tv_needs_token(
async def test_import_flow_minimum_fields( async def test_import_flow_minimum_fields(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test import config flow with minimum fields.""" """Test import config flow with minimum fields."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": "import"}, context={"source": SOURCE_IMPORT},
data=vol.Schema(VIZIO_SCHEMA)( data=vol.Schema(VIZIO_SCHEMA)(
{CONF_HOST: HOST, CONF_DEVICE_CLASS: DEVICE_CLASS_SPEAKER} {CONF_HOST: HOST, CONF_DEVICE_CLASS: DEVICE_CLASS_SPEAKER}
), ),
@ -340,12 +326,14 @@ async def test_import_flow_minimum_fields(
async def test_import_flow_all_fields( async def test_import_flow_all_fields(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test import config flow with all fields.""" """Test import config flow with all fields."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": "import"}, context={"source": SOURCE_IMPORT},
data=vol.Schema(VIZIO_SCHEMA)(MOCK_IMPORT_VALID_TV_CONFIG), data=vol.Schema(VIZIO_SCHEMA)(MOCK_IMPORT_VALID_TV_CONFIG),
) )
@ -359,7 +347,9 @@ async def test_import_flow_all_fields(
async def test_import_entity_already_configured( async def test_import_entity_already_configured(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test entity is already configured during import setup.""" """Test entity is already configured during import setup."""
entry = MockConfigEntry( entry = MockConfigEntry(
@ -371,7 +361,7 @@ async def test_import_entity_already_configured(
fail_entry = vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG.copy()) fail_entry = vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG.copy())
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": "import"}, data=fail_entry DOMAIN, context={"source": SOURCE_IMPORT}, data=fail_entry
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
@ -379,7 +369,9 @@ async def test_import_entity_already_configured(
async def test_import_flow_update_options( async def test_import_flow_update_options(
hass: HomeAssistantType, vizio_connect, vizio_bypass_update hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_update: pytest.fixture,
) -> None: ) -> None:
"""Test import config flow with updated options.""" """Test import config flow with updated options."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -388,6 +380,7 @@ async def test_import_flow_update_options(
data=vol.Schema(VIZIO_SCHEMA)(MOCK_IMPORT_VALID_TV_CONFIG), data=vol.Schema(VIZIO_SCHEMA)(MOCK_IMPORT_VALID_TV_CONFIG),
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result["result"].options == {CONF_VOLUME_STEP: VOLUME_STEP} assert result["result"].options == {CONF_VOLUME_STEP: VOLUME_STEP}
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
entry_id = result["result"].entry_id entry_id = result["result"].entry_id
@ -409,7 +402,10 @@ async def test_import_flow_update_options(
async def test_zeroconf_flow( async def test_zeroconf_flow(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup, vizio_guess_device_type hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
vizio_guess_device_type: pytest.fixture,
) -> None: ) -> None:
"""Test zeroconf config flow.""" """Test zeroconf config flow."""
discovery_info = MOCK_ZEROCONF_ENTRY.copy() discovery_info = MOCK_ZEROCONF_ENTRY.copy()
@ -437,7 +433,9 @@ async def test_zeroconf_flow(
async def test_zeroconf_flow_already_configured( async def test_zeroconf_flow_already_configured(
hass: HomeAssistantType, vizio_connect, vizio_bypass_setup hass: HomeAssistantType,
vizio_connect: pytest.fixture,
vizio_bypass_setup: pytest.fixture,
) -> None: ) -> None:
"""Test entity is already configured during zeroconf setup.""" """Test entity is already configured during zeroconf setup."""
entry = MockConfigEntry( entry = MockConfigEntry(