diff --git a/docs/source/_ext/edit_on_github.py b/docs/source/_ext/edit_on_github.py index a31fb13ebf1..1d40bfc33ab 100644 --- a/docs/source/_ext/edit_on_github.py +++ b/docs/source/_ext/edit_on_github.py @@ -8,19 +8,19 @@ Loosely based on https://github.com/astropy/astropy/pull/347 import os import warnings -__licence__ = 'BSD (3 clause)' +__licence__ = "BSD (3 clause)" def get_github_url(app, view, path): - github_fmt = 'https://github.com/{}/{}/{}/{}{}' return ( - github_fmt.format(app.config.edit_on_github_project, view, - app.config.edit_on_github_branch, - app.config.edit_on_github_src_path, path)) + f"https://github.com/{app.config.edit_on_github_project}/" + f"{view}/{app.config.edit_on_github_branch}/" + f"{app.config.edit_on_github_src_path}{path}" + ) def html_page_context(app, pagename, templatename, context, doctree): - if templatename != 'page.html': + if templatename != "page.html": return if not app.config.edit_on_github_project: @@ -29,16 +29,16 @@ def html_page_context(app, pagename, templatename, context, doctree): if not doctree: warnings.warn("doctree is None") return - path = os.path.relpath(doctree.get('source'), app.builder.srcdir) - show_url = get_github_url(app, 'blob', path) - edit_url = get_github_url(app, 'edit', path) + path = os.path.relpath(doctree.get("source"), app.builder.srcdir) + show_url = get_github_url(app, "blob", path) + edit_url = get_github_url(app, "edit", path) - context['show_on_github_url'] = show_url - context['edit_on_github_url'] = edit_url + context["show_on_github_url"] = show_url + context["edit_on_github_url"] = edit_url def setup(app): - app.add_config_value('edit_on_github_project', '', True) - app.add_config_value('edit_on_github_branch', 'master', True) - app.add_config_value('edit_on_github_src_path', '', True) # 'eg' "docs/" - app.connect('html-page-context', html_page_context) + app.add_config_value("edit_on_github_project", "", True) + app.add_config_value("edit_on_github_branch", "master", True) + app.add_config_value("edit_on_github_src_path", "", True) # 'eg' "docs/" + app.connect("html-page-context", html_page_context) diff --git a/docs/source/conf.py b/docs/source/conf.py index cea9a22b64e..242a90088b3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -22,25 +22,26 @@ import sys from homeassistant.const import __short_version__, __version__ -PROJECT_NAME = 'Home Assistant' -PROJECT_PACKAGE_NAME = 'homeassistant' -PROJECT_AUTHOR = 'The Home Assistant Authors' -PROJECT_COPYRIGHT = f' 2013-2020, {PROJECT_AUTHOR}' -PROJECT_LONG_DESCRIPTION = ('Home Assistant is an open-source ' - 'home automation platform running on Python 3. ' - 'Track and control all devices at home and ' - 'automate control. ' - 'Installation in less than a minute.') -PROJECT_GITHUB_USERNAME = 'home-assistant' -PROJECT_GITHUB_REPOSITORY = 'home-assistant' +PROJECT_NAME = "Home Assistant" +PROJECT_PACKAGE_NAME = "homeassistant" +PROJECT_AUTHOR = "The Home Assistant Authors" +PROJECT_COPYRIGHT = f" 2013-2020, {PROJECT_AUTHOR}" +PROJECT_LONG_DESCRIPTION = ( + "Home Assistant is an open-source " + "home automation platform running on Python 3. " + "Track and control all devices at home and " + "automate control. " + "Installation in less than a minute." +) +PROJECT_GITHUB_USERNAME = "home-assistant" +PROJECT_GITHUB_REPOSITORY = "home-assistant" -GITHUB_PATH = '{}/{}'.format( - PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY) -GITHUB_URL = f'https://github.com/{GITHUB_PATH}' +GITHUB_PATH = f"{PROJECT_GITHUB_USERNAME}/{PROJECT_GITHUB_REPOSITORY}" +GITHUB_URL = f"https://github.com/{GITHUB_PATH}" -sys.path.insert(0, os.path.abspath('_ext')) -sys.path.insert(0, os.path.abspath('../homeassistant')) +sys.path.insert(0, os.path.abspath("_ext")) +sys.path.insert(0, os.path.abspath("../homeassistant")) # -- General configuration ------------------------------------------------ @@ -52,27 +53,27 @@ sys.path.insert(0, os.path.abspath('../homeassistant')) # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.linkcode', - 'sphinx_autodoc_annotation', - 'edit_on_github' + "sphinx.ext.autodoc", + "sphinx.ext.linkcode", + "sphinx_autodoc_annotation", + "edit_on_github", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. project = PROJECT_NAME @@ -88,25 +89,25 @@ version = __short_version__ # The full version, including alpha/beta/rc tags. release = __version__ -code_branch = 'dev' if 'dev' in __version__ else 'master' +code_branch = "dev" if "dev" in __version__ else "master" # Edit on Github config edit_on_github_project = GITHUB_PATH edit_on_github_branch = code_branch -edit_on_github_src_path = 'docs/source/' +edit_on_github_src_path = "docs/source/" def linkcode_resolve(domain, info): """Determine the URL corresponding to Python object.""" - if domain != 'py': + if domain != "py": return None - modname = info['module'] - fullname = info['fullname'] + modname = info["module"] + fullname = info["fullname"] submod = sys.modules.get(modname) if submod is None: return None obj = submod - for part in fullname.split('.'): + for part in fullname.split("."): try: obj = getattr(obj, part) except: @@ -131,7 +132,8 @@ def linkcode_resolve(domain, info): fn = fn[index:] - return f'{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}' + return f"{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}" + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -174,7 +176,7 @@ exclude_patterns = [] # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -191,22 +193,22 @@ todo_include_todos = False # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = { - 'logo': 'logo.png', - 'logo_name': PROJECT_NAME, - 'description': PROJECT_LONG_DESCRIPTION, - 'github_user': PROJECT_GITHUB_USERNAME, - 'github_repo': PROJECT_GITHUB_REPOSITORY, - 'github_type': 'star', - 'github_banner': True, - 'travis_button': True, - 'touch_icon': 'logo-apple.png', + "logo": "logo.png", + "logo_name": PROJECT_NAME, + "description": PROJECT_LONG_DESCRIPTION, + "github_user": PROJECT_GITHUB_USERNAME, + "github_repo": PROJECT_GITHUB_REPOSITORY, + "github_type": "star", + "github_banner": True, + "travis_button": True, + "touch_icon": "logo-apple.png", # 'fixed_sidebar': True, # Re-enable when we have more content } @@ -232,12 +234,12 @@ html_theme_options = { # This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # -html_favicon = '_static/favicon.ico' +html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -249,7 +251,7 @@ html_static_path = ['_static'] # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. # -html_last_updated_fmt = '%b %d, %Y' +html_last_updated_fmt = "%b %d, %Y" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. @@ -259,13 +261,13 @@ html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = { - '**': [ - 'about.html', - 'links.html', - 'searchbox.html', - 'sourcelink.html', - 'navigation.html', - 'relations.html' + "**": [ + "about.html", + "links.html", + "searchbox.html", + "sourcelink.html", + "navigation.html", + "relations.html", ] } @@ -326,34 +328,36 @@ html_sidebars = { # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'Home-Assistantdoc' +htmlhelp_basename = "Home-Assistantdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'home-assistant.tex', 'Home Assistant Documentation', - 'Home Assistant Team', 'manual'), + ( + master_doc, + "home-assistant.tex", + "Home Assistant Documentation", + "Home Assistant Team", + "manual", + ) ] # The name of an image file (relative to this directory) to place at the top of @@ -394,8 +398,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'home-assistant', 'Home Assistant Documentation', - [author], 1) + (master_doc, "home-assistant", "Home Assistant Documentation", [author], 1) ] # If true, show URL addresses after external links. @@ -409,9 +412,15 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Home-Assistant', 'Home Assistant Documentation', - author, 'Home Assistant', 'Open-source home automation platform.', - 'Miscellaneous'), + ( + master_doc, + "Home-Assistant", + "Home Assistant Documentation", + author, + "Home Assistant", + "Open-source home automation platform.", + "Miscellaneous", + ) ] # Documents to append as an appendix to all manuals. diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index 6dd5edb81b4..728ee3c5985 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -36,9 +36,8 @@ def validate_python() -> None: """Validate that the right Python version is running.""" if sys.version_info[:3] < REQUIRED_PYTHON_VER: print( - "Home Assistant requires at least Python {}.{}.{}".format( - *REQUIRED_PYTHON_VER - ) + "Home Assistant requires at least Python " + f"{REQUIRED_PYTHON_VER[0]}.{REQUIRED_PYTHON_VER[1]}.{REQUIRED_PYTHON_VER[2]}" ) sys.exit(1) diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index a615c5e4033..9e0d8939da4 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -191,9 +191,7 @@ class AfterShipSensor(Entity): "name": name, "tracking_number": track["tracking_number"], "slug": track["slug"], - "link": "{}{}/{}".format( - BASE, track["slug"], track["tracking_number"] - ), + "link": f"{BASE}{track['slug']}/{track['tracking_number']}", "last_update": track["updated_at"], "expected_delivery": track["expected_delivery"], "status": track["tag"], diff --git a/homeassistant/components/august/__init__.py b/homeassistant/components/august/__init__.py index cd2783e6cb8..280bd987965 100644 --- a/homeassistant/components/august/__init__.py +++ b/homeassistant/components/august/__init__.py @@ -90,8 +90,11 @@ async def async_request_validation(hass, config_entry, august_gateway): hass.data[DOMAIN][entry_id][TWO_FA_REVALIDATE] = configurator.async_request_config( f"{DEFAULT_NAME} ({username})", async_august_configuration_validation_callback, - description="August must be re-verified. Please check your {} ({}) and enter the verification " - "code below".format(login_method, username), + description=( + "August must be re-verified. " + f"Please check your {login_method} ({username}) " + "and enter the verification code below" + ), submit_caption="Verify", fields=[ {"id": VERIFICATION_CODE_KEY, "name": "Verification code", "type": "string"} @@ -265,7 +268,7 @@ class AugustData(AugustSubscriberMixin): self._api.async_get_doorbell_detail, ) _LOGGER.debug( - "async_signal_device_id_update (from detail updates): %s", device_id, + "async_signal_device_id_update (from detail updates): %s", device_id ) self.async_signal_device_id_update(device_id) diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index 6a03d899a09..e930a0de597 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -92,7 +92,7 @@ def calculate_offset(event, offset): time = search.group(1) if ":" not in time: if time[0] == "+" or time[0] == "-": - time = "{}0:{}".format(time[0], time[1:]) + time = f"{time[0]}0:{time[1:]}" else: time = f"0:{time}" diff --git a/homeassistant/components/canary/__init__.py b/homeassistant/components/canary/__init__.py index a8a45f5b946..1c7c8bb4a90 100644 --- a/homeassistant/components/canary/__init__.py +++ b/homeassistant/components/canary/__init__.py @@ -49,9 +49,7 @@ def setup(hass, config): except (ConnectTimeout, HTTPError) as ex: _LOGGER.error("Unable to connect to Canary service: %s", str(ex)) hass.components.persistent_notification.create( - "Error: {}
" - "You will need to restart hass after fixing." - "".format(ex), + f"Error: {ex}
You will need to restart hass after fixing.", title=NOTIFICATION_TITLE, notification_id=NOTIFICATION_ID, ) diff --git a/homeassistant/components/canary/sensor.py b/homeassistant/components/canary/sensor.py index 88b42d296ed..0be5171af48 100644 --- a/homeassistant/components/canary/sensor.py +++ b/homeassistant/components/canary/sensor.py @@ -76,7 +76,7 @@ class CanarySensor(Entity): @property def unique_id(self): """Return the unique ID of this sensor.""" - return "{}_{}".format(self._device_id, self._sensor_type[0]) + return f"{self._device_id}_{self._sensor_type[0]}" @property def unit_of_measurement(self): diff --git a/homeassistant/components/cisco_webex_teams/notify.py b/homeassistant/components/cisco_webex_teams/notify.py index 7be53d1fb6c..271d58fcc8e 100644 --- a/homeassistant/components/cisco_webex_teams/notify.py +++ b/homeassistant/components/cisco_webex_teams/notify.py @@ -48,7 +48,7 @@ class CiscoWebexTeamsNotificationService(BaseNotificationService): title = "" if kwargs.get(ATTR_TITLE) is not None: - title = "{}{}".format(kwargs.get(ATTR_TITLE), "
") + title = f"{kwargs.get(ATTR_TITLE)}
" try: self.client.messages.create(roomId=self.room, html=f"{title}{message}") diff --git a/homeassistant/components/cloud/alexa_config.py b/homeassistant/components/cloud/alexa_config.py index 8d1527b1930..86b3532e00e 100644 --- a/homeassistant/components/cloud/alexa_config.py +++ b/homeassistant/components/cloud/alexa_config.py @@ -119,9 +119,9 @@ class AlexaConfig(alexa_config.AbstractConfig): if self.should_report_state: await self._prefs.async_update(alexa_report_state=False) self.hass.components.persistent_notification.async_create( - "There was an error reporting state to Alexa ({}). " + f"There was an error reporting state to Alexa ({body['reason']}). " "Please re-link your Alexa skill via the Alexa app to " - "continue using it.".format(body["reason"]), + "continue using it.", "Alexa state reporting disabled", "cloud_alexa_report", ) diff --git a/homeassistant/components/coinbase/sensor.py b/homeassistant/components/coinbase/sensor.py index a13dfef11da..973c3d39159 100644 --- a/homeassistant/components/coinbase/sensor.py +++ b/homeassistant/components/coinbase/sensor.py @@ -82,7 +82,7 @@ class AccountSensor(Entity): """Get the latest state of the sensor.""" self._coinbase_data.update() for account in self._coinbase_data.accounts["data"]: - if self._name == "Coinbase {}".format(account["name"]): + if self._name == f"Coinbase {account['name']}": self._state = account["balance"]["amount"] self._native_balance = account["native_balance"]["amount"] self._native_currency = account["native_balance"]["currency"] diff --git a/homeassistant/components/ezviz/camera.py b/homeassistant/components/ezviz/camera.py index b8ede42a508..e7e6725e455 100644 --- a/homeassistant/components/ezviz/camera.py +++ b/homeassistant/components/ezviz/camera.py @@ -219,15 +219,16 @@ class HassEzvizCamera(Camera): ffmpeg = ImageFrame(self._ffmpeg.binary, loop=self.hass.loop) image = await asyncio.shield( - ffmpeg.get_image(self._rtsp_stream, output_format=IMAGE_JPEG,) + ffmpeg.get_image(self._rtsp_stream, output_format=IMAGE_JPEG) ) return image async def stream_source(self): """Return the stream source.""" if self._local_rtsp_port: - rtsp_stream_source = "rtsp://{}:{}@{}:{}".format( - self._username, self._password, self._local_ip, self._local_rtsp_port + rtsp_stream_source = ( + f"rtsp://{self._username}:{self._password}@" + f"{self._local_ip}:{self._local_rtsp_port}" ) _LOGGER.debug( "Camera %s source stream: %s", self._serial, rtsp_stream_source diff --git a/homeassistant/components/hdmi_cec/media_player.py b/homeassistant/components/hdmi_cec/media_player.py index 9b130f91b72..c49ee45271a 100644 --- a/homeassistant/components/hdmi_cec/media_player.py +++ b/homeassistant/components/hdmi_cec/media_player.py @@ -67,9 +67,7 @@ class CecPlayerDevice(CecDevice, MediaPlayerDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "{}.{}_{}".format( - DOMAIN, "hdmi", hex(self._logical_address)[2:] - ) + self.entity_id = f"{DOMAIN}.hdmi_{hex(self._logical_address)[2:]}" def send_keypress(self, key): """Send keypress to CEC adapter.""" diff --git a/homeassistant/components/hdmi_cec/switch.py b/homeassistant/components/hdmi_cec/switch.py index a4ef91dee8f..0fcf9c01c8f 100644 --- a/homeassistant/components/hdmi_cec/switch.py +++ b/homeassistant/components/hdmi_cec/switch.py @@ -28,9 +28,7 @@ class CecSwitchDevice(CecDevice, SwitchDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "{}.{}_{}".format( - DOMAIN, "hdmi", hex(self._logical_address)[2:] - ) + self.entity_id = f"{DOMAIN}.hdmi_{hex(self._logical_address)[2:]}" def turn_on(self, **kwargs) -> None: """Turn device on.""" diff --git a/homeassistant/components/n26/sensor.py b/homeassistant/components/n26/sensor.py index 93f0fae918a..7752efe82ea 100644 --- a/homeassistant/components/n26/sensor.py +++ b/homeassistant/components/n26/sensor.py @@ -71,7 +71,7 @@ class N26Account(Entity): @property def name(self) -> str: """Friendly name of the sensor.""" - return "n26_{}".format(self._iban[-4:]) + return f"n26_{self._iban[-4:]}" @property def state(self) -> float: @@ -110,7 +110,7 @@ class N26Account(Entity): } for limit in self._data.limits: - limit_attr_name = "limit_{}".format(limit["limit"].lower()) + limit_attr_name = f"limit_{limit['limit'].lower()}" attributes[limit_attr_name] = limit["amount"] return attributes @@ -143,7 +143,7 @@ class N26Card(Entity): @property def name(self) -> str: """Friendly name of the sensor.""" - return "{}_card_{}".format(self._account_name.lower(), self._card["id"]) + return f"{self._account_name.lower()}_card_{self._card['id']}" @property def state(self) -> float: @@ -206,9 +206,7 @@ class N26Space(Entity): @property def unique_id(self): """Return the unique ID of the entity.""" - return "space_{}_{}".format( - self._data.balance["iban"][-4:], self._space["name"].lower() - ) + return f"space_{self._data.balance['iban'][-4:]}_{self._space['name'].lower()}" @property def name(self) -> str: diff --git a/homeassistant/components/n26/switch.py b/homeassistant/components/n26/switch.py index 90651cb5a4b..6ec111720f3 100644 --- a/homeassistant/components/n26/switch.py +++ b/homeassistant/components/n26/switch.py @@ -42,7 +42,7 @@ class N26CardSwitch(SwitchDevice): @property def name(self) -> str: """Friendly name of the sensor.""" - return "card_{}".format(self._card["id"]) + return f"card_{self._card['id']}" @property def is_on(self): diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index 54c385c1f23..f92f6466156 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -200,7 +200,7 @@ async def async_setup_entry(hass, entry): now = datetime.utcnow() trip_id = service.data.get( - ATTR_TRIP_ID, "trip_{}".format(int(now.timestamp())) + ATTR_TRIP_ID, f"trip_{int(now.timestamp())}" ) eta_begin = now + service.data[ATTR_ETA] eta_window = service.data.get(ATTR_ETA_WINDOW, timedelta(minutes=1)) @@ -368,15 +368,11 @@ class NestSensorDevice(Entity): if device is not None: # device specific self.device = device - self._name = "{} {}".format( - self.device.name_long, self.variable.replace("_", " ") - ) + self._name = f"{self.device.name_long} {self.variable.replace('_', ' ')}" else: # structure only self.device = structure - self._name = "{} {}".format( - self.structure.name, self.variable.replace("_", " ") - ) + self._name = f"{self.structure.name} {self.variable.replace('_', ' ')}" self._state = None self._unit = None diff --git a/homeassistant/components/websocket_api/auth.py b/homeassistant/components/websocket_api/auth.py index 9e33ed74fd4..f5b29f49b1e 100644 --- a/homeassistant/components/websocket_api/auth.py +++ b/homeassistant/components/websocket_api/auth.py @@ -57,8 +57,8 @@ class AuthPhase: try: msg = AUTH_MESSAGE_SCHEMA(msg) except vol.Invalid as err: - error_msg = "Auth message incorrectly formatted: {}".format( - humanize_error(msg, err) + error_msg = ( + f"Auth message incorrectly formatted: {humanize_error(msg, err)}" ) self._logger.warning(error_msg) self._send_message(auth_invalid_message(error_msg)) diff --git a/homeassistant/components/wink/__init__.py b/homeassistant/components/wink/__init__.py index 54d3b2efde9..2d20183cb3d 100644 --- a/homeassistant/components/wink/__init__.py +++ b/homeassistant/components/wink/__init__.py @@ -233,15 +233,13 @@ def _request_app_setup(hass, config): start_url = f"{hass.config.api.base_url}{WINK_AUTH_CALLBACK_PATH}" - description = """Please create a Wink developer app at + description = f"""Please create a Wink developer app at https://developer.wink.com. - Add a Redirect URI of {}. + Add a Redirect URI of {start_url}. They will provide you a Client ID and secret after reviewing your request. (This can take several days). - """.format( - start_url - ) + """ hass.data[DOMAIN]["configuring"][DOMAIN] = configurator.request_config( DOMAIN, @@ -351,9 +349,7 @@ def setup(hass, config): # Home . else: - redirect_uri = "{}{}".format( - hass.config.api.base_url, WINK_AUTH_CALLBACK_PATH - ) + redirect_uri = f"{hass.config.api.base_url}{WINK_AUTH_CALLBACK_PATH}" wink_auth_start_url = pywink.get_authorization_url( config_file.get(ATTR_CLIENT_ID), redirect_uri diff --git a/homeassistant/components/wirelesstag/sensor.py b/homeassistant/components/wirelesstag/sensor.py index 14f63084709..2a845249028 100644 --- a/homeassistant/components/wirelesstag/sensor.py +++ b/homeassistant/components/wirelesstag/sensor.py @@ -58,8 +58,8 @@ class WirelessTagSensor(WirelessTagBaseSensor): # sensor.wirelesstag_bedroom_temperature # and not as sensor.bedroom for temperature and # sensor.bedroom_2 for humidity - self._entity_id = "{}.{}_{}_{}".format( - "sensor", WIRELESSTAG_DOMAIN, self.underscored_name, self._sensor_type + self._entity_id = ( + f"sensor.{WIRELESSTAG_DOMAIN}_{self.underscored_name}_{self._sensor_type}" ) async def async_added_to_hass(self): diff --git a/homeassistant/components/wirelesstag/switch.py b/homeassistant/components/wirelesstag/switch.py index 1bc806d9e32..79242394f7f 100644 --- a/homeassistant/components/wirelesstag/switch.py +++ b/homeassistant/components/wirelesstag/switch.py @@ -57,7 +57,7 @@ class WirelessTagSwitch(WirelessTagBaseSensor, SwitchDevice): super().__init__(api, tag) self._switch_type = switch_type self.sensor_type = SWITCH_TYPES[self._switch_type][1] - self._name = "{} {}".format(self._tag.name, SWITCH_TYPES[self._switch_type][0]) + self._name = f"{self._tag.name} {SWITCH_TYPES[self._switch_type][0]}" def turn_on(self, **kwargs): """Turn on the switch.""" diff --git a/homeassistant/components/withings/sensor.py b/homeassistant/components/withings/sensor.py index 7e58beb4419..61e4dab8510 100644 --- a/homeassistant/components/withings/sensor.py +++ b/homeassistant/components/withings/sensor.py @@ -320,8 +320,9 @@ class WithingsHealthSensor(Entity): @property def unique_id(self) -> str: """Return a unique, Home Assistant friendly identifier for this entity.""" - return "withings_{}_{}_{}".format( - self._slug, self._user_id, slugify(self._attribute.measurement) + return ( + f"withings_{self._slug}_{self._user_id}_" + f"{slugify(self._attribute.measurement)}" ) @property diff --git a/homeassistant/components/wunderground/sensor.py b/homeassistant/components/wunderground/sensor.py index 22aefa5be4a..6d843c222d9 100644 --- a/homeassistant/components/wunderground/sensor.py +++ b/homeassistant/components/wunderground/sensor.py @@ -217,9 +217,9 @@ class WUHourlyForecastSensorConfig(WUSensorConfig): :param field: field name to use as value """ super().__init__( - friendly_name=lambda wu: "{} {}".format( - wu.data["hourly_forecast"][period]["FCTTIME"]["weekday_name_abbrev"], - wu.data["hourly_forecast"][period]["FCTTIME"]["civil"], + friendly_name=lambda wu: ( + f"{wu.data['hourly_forecast'][period]['FCTTIME']['weekday_name_abbrev']} " + f"{wu.data['hourly_forecast'][period]['FCTTIME']['civil']}" ), feature="hourly", value=lambda wu: wu.data["hourly_forecast"][period][field], @@ -477,8 +477,9 @@ SENSOR_TYPES = { "Wind Summary", "wind_string", "mdi:weather-windy" ), "temp_high_record_c": WUAlmanacSensorConfig( - lambda wu: "High Temperature Record ({})".format( - wu.data["almanac"]["temp_high"]["recordyear"] + lambda wu: ( + f"High Temperature Record " + f"({wu.data['almanac']['temp_high']['recordyear']})" ), "temp_high", "record", @@ -487,8 +488,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_high_record_f": WUAlmanacSensorConfig( - lambda wu: "High Temperature Record ({})".format( - wu.data["almanac"]["temp_high"]["recordyear"] + lambda wu: ( + f"High Temperature Record " + f"({wu.data['almanac']['temp_high']['recordyear']})" ), "temp_high", "record", @@ -497,8 +499,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_low_record_c": WUAlmanacSensorConfig( - lambda wu: "Low Temperature Record ({})".format( - wu.data["almanac"]["temp_low"]["recordyear"] + lambda wu: ( + f"Low Temperature Record " + f"({wu.data['almanac']['temp_low']['recordyear']})" ), "temp_low", "record", @@ -507,8 +510,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_low_record_f": WUAlmanacSensorConfig( - lambda wu: "Low Temperature Record ({})".format( - wu.data["almanac"]["temp_low"]["recordyear"] + lambda wu: ( + f"Low Temperature Record " + f"({wu.data['almanac']['temp_low']['recordyear']})" ), "temp_low", "record", diff --git a/homeassistant/components/xiaomi/camera.py b/homeassistant/components/xiaomi/camera.py index 2b249c7b7c8..45466be2cc4 100644 --- a/homeassistant/components/xiaomi/camera.py +++ b/homeassistant/components/xiaomi/camera.py @@ -136,9 +136,7 @@ class XiaomiCamera(Camera): else: video = videos[-1] - return "ftp://{}:{}@{}:{}{}/{}".format( - self.user, self.passwd, host, self.port, ftp.pwd(), video - ) + return f"ftp://{self.user}:{self.passwd}@{host}:{self.port}{ftp.pwd()}/{video}" async def async_camera_image(self): """Return a still image response from the camera.""" diff --git a/homeassistant/components/xiaomi_aqara/__init__.py b/homeassistant/components/xiaomi_aqara/__init__.py index 533238ac5e7..450a6e4c862 100644 --- a/homeassistant/components/xiaomi_aqara/__init__.py +++ b/homeassistant/components/xiaomi_aqara/__init__.py @@ -242,8 +242,8 @@ class XiaomiDevice(Entity): self.parse_voltage(device["data"]) if hasattr(self, "_data_key") and self._data_key: # pylint: disable=no-member - self._unique_id = "{}{}".format( - self._data_key, self._sid # pylint: disable=no-member + self._unique_id = ( + f"{self._data_key}{self._sid}" # pylint: disable=no-member ) else: self._unique_id = f"{self._type}{self._sid}" diff --git a/homeassistant/components/xiaomi_miio/light.py b/homeassistant/components/xiaomi_miio/light.py index 61462bcdbc0..c4ea831ceeb 100644 --- a/homeassistant/components/xiaomi_miio/light.py +++ b/homeassistant/components/xiaomi_miio/light.py @@ -718,7 +718,7 @@ class XiaomiPhilipsEyecareLampAmbientLight(XiaomiPhilipsAbstractLight): """Initialize the light device.""" name = f"{name} Ambient Light" if unique_id is not None: - unique_id = "{}-{}".format(unique_id, "ambient") + unique_id = f"{unique_id}-ambient" super().__init__(name, light, model, unique_id) async def async_turn_on(self, **kwargs): diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index 63229b851d0..c66f9b745f5 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -429,7 +429,7 @@ class ChuangMiPlugSwitch(XiaomiPlugGenericSwitch): name = f"{name} USB" if channel_usb else name if unique_id is not None and channel_usb: - unique_id = "{}-{}".format(unique_id, "usb") + unique_id = f"{unique_id}-usb" super().__init__(name, plug, model, unique_id) self._channel_usb = channel_usb diff --git a/homeassistant/components/yi/camera.py b/homeassistant/components/yi/camera.py index 658cc3a23ee..4273b5294ed 100644 --- a/homeassistant/components/yi/camera.py +++ b/homeassistant/components/yi/camera.py @@ -110,14 +110,9 @@ class YiCamera(Camera): await ftp.quit() self._is_on = True - return "ftp://{}:{}@{}:{}{}/{}/{}".format( - self.user, - self.passwd, - self.host, - self.port, - self.path, - latest_dir, - videos[-1], + return ( + f"ftp://{self.user}:{self.passwd}@{self.host}:" + f"{self.port}{self.path}/{latest_dir}/{videos[-1]}" ) except (ConnectionRefusedError, StatusCodeError) as err: _LOGGER.error("Error while fetching video: %s", err) diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index a5eb90df218..664ce0a38b6 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -159,7 +159,7 @@ class ZamgData: """The class for handling the data retrieval.""" API_URL = "http://www.zamg.ac.at/ogd/" - API_HEADERS = {USER_AGENT: "{} {}".format("home-assistant.zamg/", __version__)} + API_HEADERS = {USER_AGENT: f"home-assistant.zamg/ {__version__}"} def __init__(self, station_id): """Initialize the probe.""" diff --git a/homeassistant/components/zamg/weather.py b/homeassistant/components/zamg/weather.py index 46818578534..c1a0ab62cc5 100644 --- a/homeassistant/components/zamg/weather.py +++ b/homeassistant/components/zamg/weather.py @@ -78,8 +78,9 @@ class ZamgWeather(WeatherEntity): @property def name(self): """Return the name of the sensor.""" - return self.stationname or "ZAMG {}".format( - self.zamg_data.data.get("Name") or "(unknown station)" + return ( + self.stationname + or f"ZAMG {self.zamg_data.data.get('Name') or '(unknown station)'}" ) @property diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 56e8d3ddcbf..287ad0dd522 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -93,9 +93,7 @@ class ZHADevice(LogMixin): self._zigpy_device = zigpy_device self._zha_gateway = zha_gateway self._available = False - self._available_signal = "{}_{}_{}".format( - self.name, self.ieee, SIGNAL_AVAILABLE - ) + self._available_signal = f"{self.name}_{self.ieee}_{SIGNAL_AVAILABLE}" self._checkins_missed_count = 0 self.unsubs = [] self.unsubs.append( @@ -104,10 +102,11 @@ class ZHADevice(LogMixin): ) ) self.quirk_applied = isinstance(self._zigpy_device, zigpy.quirks.CustomDevice) - self.quirk_class = "{}.{}".format( - self._zigpy_device.__class__.__module__, - self._zigpy_device.__class__.__name__, + self.quirk_class = ( + f"{self._zigpy_device.__class__.__module__}." + f"{self._zigpy_device.__class__.__name__}" ) + if self.is_mains_powered: self._consider_unavailable_time = _CONSIDER_UNAVAILABLE_MAINS else: @@ -352,9 +351,7 @@ class ZHADevice(LogMixin): if self._available != available and available: # Update the state the first time the device comes online async_dispatcher_send(self.hass, self._available_signal, False) - async_dispatcher_send( - self.hass, "{}_{}".format(self._available_signal, "entity"), available - ) + async_dispatcher_send(self.hass, f"{self._available_signal}_entity", available) self._available = available @property diff --git a/homeassistant/components/zha/entity.py b/homeassistant/components/zha/entity.py index 0ba7ff09f3f..dd12924f4b0 100644 --- a/homeassistant/components/zha/entity.py +++ b/homeassistant/components/zha/entity.py @@ -119,7 +119,7 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): self.remove_future = asyncio.Future() await self.async_accept_signal( None, - "{}_{}".format(SIGNAL_REMOVE, str(self.zha_device.ieee)), + f"{SIGNAL_REMOVE}_{self.zha_device.ieee}", self.async_remove, signal_override=True, ) @@ -182,7 +182,7 @@ class ZhaEntity(BaseZhaEntity): await self.async_check_recently_seen() await self.async_accept_signal( None, - "{}_{}".format(self.zha_device.available_signal, "entity"), + f"{self.zha_device.available_signal}_entity", self.async_set_available, signal_override=True, ) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 9beef00a921..279cd5b8eb0 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -261,7 +261,7 @@ def _obj_to_dict(obj): def _value_name(value): """Return the name of the value.""" - return "{} {}".format(node_name(value.node), value.label).strip() + return f"{node_name(value.node)} {value.label}".strip() def nice_print_node(node): @@ -826,9 +826,7 @@ async def async_setup_entry(hass, config_entry): ) return _LOGGER.info( - "Node %s on instance %s does not have resettable meters.", - node_id, - instance, + "Node %s on instance %s does not have resettable meters.", node_id, instance ) def heal_node(service): diff --git a/homeassistant/components/zwave/lock.py b/homeassistant/components/zwave/lock.py index 382d2c4dbf2..0bbcf9815c6 100644 --- a/homeassistant/components/zwave/lock.py +++ b/homeassistant/components/zwave/lock.py @@ -337,21 +337,20 @@ class ZwaveLock(ZWaveDeviceEntity, LockDevice): ) if alarm_type == 21: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), - MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level)), + self._lock_status = ( + f"{LOCK_ALARM_TYPE.get(str(alarm_type))}" + f"{MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level))}" ) return if str(alarm_type) in ALARM_TYPE_STD: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), str(alarm_level) - ) + self._lock_status = f"{LOCK_ALARM_TYPE.get(str(alarm_type))}{alarm_level}" return if alarm_type == 161: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), - TAMPER_ALARM_LEVEL.get(str(alarm_level)), + self._lock_status = ( + f"{LOCK_ALARM_TYPE.get(str(alarm_type))}" + f"{TAMPER_ALARM_LEVEL.get(str(alarm_level))}" ) + return if alarm_type != 0: self._lock_status = LOCK_ALARM_TYPE.get(str(alarm_type)) diff --git a/homeassistant/config.py b/homeassistant/config.py index 068dbd47fa9..297680279db 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -116,10 +116,9 @@ def _no_duplicate_auth_provider( key = (config[CONF_TYPE], config.get(CONF_ID)) if key in config_keys: raise vol.Invalid( - "Duplicate auth provider {} found. Please add unique IDs if " - "you want to have the same auth provider twice".format( - config[CONF_TYPE] - ) + f"Duplicate auth provider {config[CONF_TYPE]} found. " + "Please add unique IDs " + "if you want to have the same auth provider twice" ) config_keys.add(key) return configs @@ -140,8 +139,9 @@ def _no_duplicate_auth_mfa_module( key = config.get(CONF_ID, config[CONF_TYPE]) if key in config_keys: raise vol.Invalid( - "Duplicate mfa module {} found. Please add unique IDs if " - "you want to have the same mfa module twice".format(config[CONF_TYPE]) + f"Duplicate mfa module {config[CONF_TYPE]} found. " + "Please add unique IDs " + "if you want to have the same mfa module twice" ) config_keys.add(key) return configs @@ -319,8 +319,9 @@ def load_yaml_config_file(config_path: str) -> Dict[Any, Any]: conf_dict = load_yaml(config_path) if not isinstance(conf_dict, dict): - msg = "The configuration file {} does not contain a dictionary".format( - os.path.basename(config_path) + msg = ( + f"The configuration file {os.path.basename(config_path)} " + "does not contain a dictionary" ) _LOGGER.error(msg) raise HomeAssistantError(msg) @@ -415,16 +416,13 @@ def _format_config_error( message = f"Invalid config for [{domain}]: " if isinstance(ex, vol.Invalid): if "extra keys not allowed" in ex.error_message: + path = "->".join(str(m) for m in ex.path) message += ( - "[{option}] is an invalid option for [{domain}]. " - "Check: {domain}->{path}.".format( - option=ex.path[-1], - domain=domain, - path="->".join(str(m) for m in ex.path), - ) + f"[{ex.path[-1]}] is an invalid option for [{domain}]. " + f"Check: {domain}->{path}." ) else: - message += "{}.".format(humanize_error(config, ex)) + message += f"{humanize_error(config, ex)}." else: message += str(ex) @@ -433,9 +431,9 @@ def _format_config_error( except AttributeError: domain_config = config - message += " (See {}, line {}). ".format( - getattr(domain_config, "__config_file__", "?"), - getattr(domain_config, "__line__", "?"), + message += ( + f" (See {getattr(domain_config, '__config_file__', '?')}, " + f"line {getattr(domain_config, '__line__', '?')}). " ) if domain != CONF_CORE and link: @@ -551,9 +549,9 @@ def _log_pkg_error(package: str, component: str, config: Dict, message: str) -> message = f"Package {package} setup failed. Integration {component} {message}" pack_config = config[CONF_CORE][CONF_PACKAGES].get(package, config) - message += " (See {}:{}). ".format( - getattr(pack_config, "__config_file__", "?"), - getattr(pack_config, "__line__", "?"), + message += ( + f" (See {getattr(pack_config, '__config_file__', '?')}:" + f"{getattr(pack_config, '__line__', '?')}). " ) _LOGGER.error(message) diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index 0d419ae66c2..20763dd39a5 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -179,9 +179,7 @@ class FlowManager(abc.ABC): RESULT_TYPE_ABORT, RESULT_TYPE_EXTERNAL_STEP_DONE, ): - raise ValueError( - "Handler returned incorrect type: {}".format(result["type"]) - ) + raise ValueError(f"Handler returned incorrect type: {result['type']}") if result["type"] in ( RESULT_TYPE_FORM, diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index b8e54155922..36a9bccf39d 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -146,7 +146,7 @@ class EntityRegistry: Conflicts checked against registered and currently existing entities. """ return ensure_unique_string( - "{}.{}".format(domain, slugify(suggested_object_id)), + f"{domain}.{slugify(suggested_object_id)}", chain( self.entities.keys(), self.hass.states.async_entity_ids(domain), diff --git a/homeassistant/loader.py b/homeassistant/loader.py index f8b9ba55aa1..913262d35c4 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -425,8 +425,7 @@ def _load_file( if str(err) not in white_listed_errors: _LOGGER.exception( - ("Error loading %s. Make sure all dependencies are installed"), - path, + ("Error loading %s. Make sure all dependencies are installed"), path ) return None diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index 23d90796c86..25b25f41a20 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -233,9 +233,7 @@ def line_info(obj, **kwargs): """Display line config source.""" if hasattr(obj, "__config_file__"): return color( - "cyan", - "[source {}:{}]".format(obj.__config_file__, obj.__line__ or "?"), - **kwargs, + "cyan", f"[source {obj.__config_file__}:{obj.__line__ or '?'}]", **kwargs ) return "?" diff --git a/homeassistant/util/ruamel_yaml.py b/homeassistant/util/ruamel_yaml.py index 71d3ab2cc43..8635de00fe4 100644 --- a/homeassistant/util/ruamel_yaml.py +++ b/homeassistant/util/ruamel_yaml.py @@ -54,9 +54,8 @@ def _yaml_unsupported( constructor: ExtSafeConstructor, node: ruamel.yaml.nodes.Node ) -> None: raise UnsupportedYamlError( - "Unsupported YAML, you can not use {} in {}".format( - node.tag, os.path.basename(constructor.name or "(None)") - ) + f"Unsupported YAML, you can not use {node.tag} in " + f"{os.path.basename(constructor.name or '(None)')}" ) diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index b6f357d4cda..5c7385822fd 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -182,7 +182,7 @@ def gather_requirements_from_modules(errors, reqs): try: module = importlib.import_module(package) except ImportError as err: - print("{}.py: {}".format(package.replace(".", "/"), err)) + print(f"{package.replace('.', '/')}.py: {err}") errors.append(package) continue diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 2bec560f299..76d62bda606 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -48,9 +48,7 @@ def generate_and_validate(integrations: Dict[str, Integration]): "codeowners", "Code owners need to be valid GitHub handles." ) - parts.append( - "homeassistant/components/{}/* {}".format(domain, " ".join(codeowners)) - ) + parts.append(f"homeassistant/components/{domain}/* {' '.join(codeowners)}") parts.append(f"\n{INDIVIDUAL_FILES.strip()}") diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index 758279cabf8..eeaf6f01262 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -12,12 +12,7 @@ DOCUMENTATION_URL_HOST = "www.home-assistant.io" DOCUMENTATION_URL_PATH_PREFIX = "/integrations/" DOCUMENTATION_URL_EXCEPTIONS = ["https://www.home-assistant.io/hassio"] -SUPPORTED_QUALITY_SCALES = [ - "gold", - "internal", - "platinum", - "silver", -] +SUPPORTED_QUALITY_SCALES = ["gold", "internal", "platinum", "silver"] def documentation_url(value: str) -> str: @@ -68,8 +63,7 @@ def validate_manifest(integration: Integration): MANIFEST_SCHEMA(integration.manifest) except vol.Invalid as err: integration.add_error( - "manifest", - "Invalid manifest: {}".format(humanize_error(integration.manifest, err)), + "manifest", f"Invalid manifest: {humanize_error(integration.manifest, err)}" ) integration.manifest = None return diff --git a/script/hassfest/services.py b/script/hassfest/services.py index 08cde60f5b5..1e05ef63efb 100644 --- a/script/hassfest/services.py +++ b/script/hassfest/services.py @@ -79,7 +79,7 @@ def validate_services(integration: Integration): SERVICES_SCHEMA(data) except vol.Invalid as err: integration.add_error( - "services", "Invalid services.yaml: {}".format(humanize_error(data, err)) + "services", f"Invalid services.yaml: {humanize_error(data, err)}" ) diff --git a/script/hassfest/zeroconf.py b/script/hassfest/zeroconf.py index 48a5873133b..89e0eb7fba4 100644 --- a/script/hassfest/zeroconf.py +++ b/script/hassfest/zeroconf.py @@ -79,8 +79,8 @@ def generate_and_validate(integrations: Dict[str, Integration]): if model in homekit_dict: integration.add_error( "zeroconf", - "Integrations {} and {} have overlapping HomeKit " - "models".format(domain, homekit_dict[model]), + f"Integrations {domain} and {homekit_dict[model]} " + "have overlapping HomeKit models", ) break @@ -100,8 +100,8 @@ def generate_and_validate(integrations: Dict[str, Integration]): if key.startswith(key_2) or key_2.startswith(key): integration.add_error( "zeroconf", - "Integrations {} and {} have overlapping HomeKit " - "models".format(homekit_dict[key], homekit_dict[key_2]), + f"Integrations {homekit_dict[key]} and {homekit_dict[key_2]} " + "have overlapping HomeKit models", ) warned.add(key) warned.add(key_2) diff --git a/script/lazytox.py b/script/lazytox.py index e171cb3d669..5a8837b8154 100755 --- a/script/lazytox.py +++ b/script/lazytox.py @@ -61,7 +61,7 @@ async def async_exec(*args, display=False): argsp = [] for arg in args: if os.path.isfile(arg): - argsp.append("\\\n {}".format(shlex.quote(arg))) + argsp.append(f"\\\n {shlex.quote(arg)}") else: argsp.append(shlex.quote(arg)) printc("cyan", *argsp) @@ -75,9 +75,7 @@ async def async_exec(*args, display=False): kwargs["stderr"] = asyncio.subprocess.PIPE proc = await asyncio.create_subprocess_exec(*args, **kwargs) except FileNotFoundError as err: - printc( - FAIL, f"Could not execute {args[0]}. Did you install test requirements?", - ) + printc(FAIL, f"Could not execute {args[0]}. Did you install test requirements?") raise err if not display: