Import configurator (#64211)

Co-authored-by: epenet <epenet@users.noreply.github.com>
This commit is contained in:
epenet 2022-01-18 19:18:37 +01:00 committed by GitHub
parent 9fd704cabf
commit 81461832c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 26 deletions

View File

@ -8,6 +8,7 @@ the user has submitted configuration information.
""" """
from contextlib import suppress from contextlib import suppress
import functools as ft import functools as ft
from typing import Any
from homeassistant.const import ( from homeassistant.const import (
ATTR_ENTITY_PICTURE, ATTR_ENTITY_PICTURE,
@ -60,7 +61,7 @@ def async_request_config(
link_name=None, link_name=None,
link_url=None, link_url=None,
entity_picture=None, entity_picture=None,
): ) -> str:
"""Create a new request for configuration. """Create a new request for configuration.
Will return an ID to be used for sequent calls. Will return an ID to be used for sequent calls.
@ -87,7 +88,7 @@ def async_request_config(
@bind_hass @bind_hass
def request_config(hass, *args, **kwargs): def request_config(hass: HomeAssistant, *args: Any, **kwargs: Any) -> str:
"""Create a new request for configuration. """Create a new request for configuration.
Will return an ID to be used for sequent calls. Will return an ID to be used for sequent calls.
@ -106,7 +107,7 @@ def async_notify_errors(hass, request_id, error):
@bind_hass @bind_hass
def notify_errors(hass, request_id, error): def notify_errors(hass: HomeAssistant, request_id: str, error: str) -> None:
"""Add errors to a config request.""" """Add errors to a config request."""
return run_callback_threadsafe( return run_callback_threadsafe(
hass.loop, async_notify_errors, hass, request_id, error hass.loop, async_notify_errors, hass, request_id, error
@ -115,14 +116,14 @@ def notify_errors(hass, request_id, error):
@bind_hass @bind_hass
@async_callback @async_callback
def async_request_done(hass, request_id): def async_request_done(hass: HomeAssistant, request_id: str) -> None:
"""Mark a configuration request as done.""" """Mark a configuration request as done."""
with suppress(KeyError): # If request_id does not exist with suppress(KeyError): # If request_id does not exist
hass.data[DATA_REQUESTS].pop(request_id).async_request_done(request_id) hass.data[DATA_REQUESTS].pop(request_id).async_request_done(request_id)
@bind_hass @bind_hass
def request_done(hass, request_id): def request_done(hass: HomeAssistant, request_id: str) -> None:
"""Mark a configuration request as done.""" """Mark a configuration request as done."""
return run_callback_threadsafe( return run_callback_threadsafe(
hass.loop, async_request_done, hass, request_id hass.loop, async_request_done, hass, request_id
@ -149,7 +150,7 @@ class Configurator:
@async_callback @async_callback
def async_request_config( def async_request_config(
self, name, callback, description, submit_caption, fields, entity_picture self, name, callback, description, submit_caption, fields, entity_picture
): ) -> str:
"""Set up a request for configuration.""" """Set up a request for configuration."""
entity_id = async_generate_entity_id(ENTITY_ID_FORMAT, name, hass=self.hass) entity_id = async_generate_entity_id(ENTITY_ID_FORMAT, name, hass=self.hass)

View File

@ -1,5 +1,4 @@
"""Support for the Fitbit API.""" """Support for the Fitbit API."""
from __future__ import annotations from __future__ import annotations
import datetime import datetime
@ -14,6 +13,7 @@ from fitbit.api import FitbitOauth2Client
from oauthlib.oauth2.rfc6749.errors import MismatchingStateError, MissingTokenError from oauthlib.oauth2.rfc6749.errors import MismatchingStateError, MissingTokenError
import voluptuous as vol import voluptuous as vol
from homeassistant.components import configurator
from homeassistant.components.http import HomeAssistantView from homeassistant.components.http import HomeAssistantView
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA, PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA,
@ -83,7 +83,6 @@ def request_app_setup(
discovery_info: DiscoveryInfoType | None = None, discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Assist user with configuring the Fitbit dev application.""" """Assist user with configuring the Fitbit dev application."""
configurator = hass.components.configurator
def fitbit_configuration_callback(fields: list[dict[str, str]]) -> None: def fitbit_configuration_callback(fields: list[dict[str, str]]) -> None:
"""Handle configuration updates.""" """Handle configuration updates."""
@ -91,11 +90,9 @@ def request_app_setup(
if os.path.isfile(config_path): if os.path.isfile(config_path):
config_file = load_json(config_path) config_file = load_json(config_path)
if config_file == DEFAULT_CONFIG: if config_file == DEFAULT_CONFIG:
error_msg = ( error_msg = "You didn't correctly modify fitbit.conf, please try again."
"You didn't correctly modify fitbit.conf",
" please try again", configurator.notify_errors(hass, _CONFIGURING["fitbit"], error_msg)
)
configurator.notify_errors(_CONFIGURING["fitbit"], error_msg)
else: else:
setup_platform(hass, config, add_entities, discovery_info) setup_platform(hass, config, add_entities, discovery_info)
else: else:
@ -121,6 +118,7 @@ def request_app_setup(
submit = "I have saved my Client ID and Client Secret into fitbit.conf." submit = "I have saved my Client ID and Client Secret into fitbit.conf."
_CONFIGURING["fitbit"] = configurator.request_config( _CONFIGURING["fitbit"] = configurator.request_config(
hass,
"Fitbit", "Fitbit",
fitbit_configuration_callback, fitbit_configuration_callback,
description=description, description=description,
@ -131,10 +129,9 @@ def request_app_setup(
def request_oauth_completion(hass: HomeAssistant) -> None: def request_oauth_completion(hass: HomeAssistant) -> None:
"""Request user complete Fitbit OAuth2 flow.""" """Request user complete Fitbit OAuth2 flow."""
configurator = hass.components.configurator
if "fitbit" in _CONFIGURING: if "fitbit" in _CONFIGURING:
configurator.notify_errors( configurator.notify_errors(
_CONFIGURING["fitbit"], "Failed to register, please try again." hass, _CONFIGURING["fitbit"], "Failed to register, please try again."
) )
return return
@ -147,6 +144,7 @@ def request_oauth_completion(hass: HomeAssistant) -> None:
description = f"Please authorize Fitbit by visiting {start_url}" description = f"Please authorize Fitbit by visiting {start_url}"
_CONFIGURING["fitbit"] = configurator.request_config( _CONFIGURING["fitbit"] = configurator.request_config(
hass,
"Fitbit", "Fitbit",
fitbit_configuration_callback, fitbit_configuration_callback,
description=description, description=description,
@ -175,7 +173,7 @@ def setup_platform(
return return
if "fitbit" in _CONFIGURING: if "fitbit" in _CONFIGURING:
hass.components.configurator.request_done(_CONFIGURING.pop("fitbit")) configurator.request_done(hass, _CONFIGURING.pop("fitbit"))
access_token: str | None = config_file.get(ATTR_ACCESS_TOKEN) access_token: str | None = config_file.get(ATTR_ACCESS_TOKEN)
refresh_token: str | None = config_file.get(ATTR_REFRESH_TOKEN) refresh_token: str | None = config_file.get(ATTR_REFRESH_TOKEN)

View File

@ -10,6 +10,7 @@ from typing import Any
import voluptuous as vol import voluptuous as vol
from websocket import _exceptions, create_connection from websocket import _exceptions, create_connection
from homeassistant.components import configurator
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
from homeassistant.components.media_player.const import ( from homeassistant.components.media_player.const import (
MEDIA_TYPE_MUSIC, MEDIA_TYPE_MUSIC,
@ -65,10 +66,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def request_configuration(hass, config, url, add_entities_callback): def request_configuration(hass, config, url, add_entities_callback):
"""Request configuration steps from the user.""" """Request configuration steps from the user."""
configurator = hass.components.configurator
if "gpmdp" in _CONFIGURING: if "gpmdp" in _CONFIGURING:
configurator.notify_errors( configurator.notify_errors(
_CONFIGURING["gpmdp"], "Failed to register, please try again." hass, _CONFIGURING["gpmdp"], "Failed to register, please try again."
) )
return return
@ -152,8 +152,7 @@ def setup_gpmdp(hass, config, code, add_entities):
return return
if "gpmdp" in _CONFIGURING: if "gpmdp" in _CONFIGURING:
configurator = hass.components.configurator configurator.request_done(hass, _CONFIGURING.pop("gpmdp"))
configurator.request_done(_CONFIGURING.pop("gpmdp"))
add_entities([GPMDP(name, url, code)], True) add_entities([GPMDP(name, url, code)], True)

View File

@ -6,6 +6,7 @@ import os
from rtmapi import Rtm, RtmRequestFailedException from rtmapi import Rtm, RtmRequestFailedException
import voluptuous as vol import voluptuous as vol
from homeassistant.components import configurator
from homeassistant.const import CONF_API_KEY, CONF_ID, CONF_NAME, CONF_TOKEN, STATE_OK from homeassistant.const import CONF_API_KEY, CONF_ID, CONF_NAME, CONF_TOKEN, STATE_OK
from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.core import HomeAssistant, ServiceCall
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -105,7 +106,6 @@ def _register_new_account(
hass, account_name, api_key, shared_secret, stored_rtm_config, component hass, account_name, api_key, shared_secret, stored_rtm_config, component
): ):
request_id = None request_id = None
configurator = hass.components.configurator
api = Rtm(api_key, shared_secret, "write", None) api = Rtm(api_key, shared_secret, "write", None)
url, frob = api.authenticate_desktop() url, frob = api.authenticate_desktop()
_LOGGER.debug("Sent authentication request to server") _LOGGER.debug("Sent authentication request to server")
@ -117,7 +117,7 @@ def _register_new_account(
if api.token is None: if api.token is None:
_LOGGER.error("Failed to register, please try again") _LOGGER.error("Failed to register, please try again")
configurator.notify_errors( configurator.notify_errors(
request_id, "Failed to register, please try again." hass, request_id, "Failed to register, please try again."
) )
return return
@ -134,9 +134,10 @@ def _register_new_account(
component, component,
) )
configurator.request_done(request_id) configurator.request_done(hass, request_id)
request_id = configurator.async_request_config( request_id = configurator.async_request_config(
hass,
f"{DOMAIN} - {account_name}", f"{DOMAIN} - {account_name}",
callback=register_account_callback, callback=register_account_callback,
description=( description=(

View File

@ -8,6 +8,7 @@ import logging
from pysabnzbd import SabnzbdApi, SabnzbdApiException from pysabnzbd import SabnzbdApi, SabnzbdApiException
import voluptuous as vol import voluptuous as vol
from homeassistant.components import configurator
from homeassistant.components.discovery import SERVICE_SABNZBD from homeassistant.components.discovery import SERVICE_SABNZBD
from homeassistant.components.sensor import SensorEntityDescription from homeassistant.components.sensor import SensorEntityDescription
from homeassistant.const import ( from homeassistant.const import (
@ -267,11 +268,10 @@ def async_setup_sabnzbd(hass, sab_api, config, name):
def async_request_configuration(hass, config, host, web_root): def async_request_configuration(hass, config, host, web_root):
"""Request configuration steps from the user.""" """Request configuration steps from the user."""
configurator = hass.components.configurator
# We got an error if this method is called while we are configuring # We got an error if this method is called while we are configuring
if host in _CONFIGURING: if host in _CONFIGURING:
configurator.async_notify_errors( configurator.async_notify_errors(
_CONFIGURING[host], "Failed to register, please try again." hass, _CONFIGURING[host], "Failed to register, please try again."
) )
return return
@ -291,7 +291,7 @@ def async_request_configuration(hass, config, host, web_root):
conf[host] = {CONF_API_KEY: api_key} conf[host] = {CONF_API_KEY: api_key}
save_json(hass.config.path(CONFIG_FILE), conf) save_json(hass.config.path(CONFIG_FILE), conf)
req_config = _CONFIGURING.pop(host) req_config = _CONFIGURING.pop(host)
configurator.request_done(req_config) configurator.request_done(hass, req_config)
hass.async_add_job(success) hass.async_add_job(success)
async_setup_sabnzbd(hass, sab_api, config, config.get(CONF_NAME, DEFAULT_NAME)) async_setup_sabnzbd(hass, sab_api, config, config.get(CONF_NAME, DEFAULT_NAME))