From 53245c65238e3009dd1f3412f7f9bef10385f64e Mon Sep 17 00:00:00 2001
From: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
Date: Fri, 25 Mar 2022 23:14:48 +0100
Subject: [PATCH] Update pylint to 2.13.0 (#68656)

---
 .../components/alexa/capabilities.py          | 46 ++++++++-----------
 homeassistant/components/alexa/resources.py   |  8 ++--
 .../components/broadlink/config_flow.py       |  8 +++-
 .../components/color_extractor/__init__.py    |  2 +-
 .../components/harmony/subscriber.py          |  1 -
 .../components/horizon/media_player.py        |  8 ++--
 homeassistant/components/http/__init__.py     |  4 +-
 .../components/icloud/config_flow.py          |  4 +-
 homeassistant/components/recorder/models.py   |  2 -
 .../components/solaredge_local/sensor.py      |  1 -
 homeassistant/components/sonos/__init__.py    |  1 +
 homeassistant/components/tuya/__init__.py     |  4 ++
 homeassistant/components/zha/core/gateway.py  |  2 +
 homeassistant/components/zha/sensor.py        |  5 +-
 homeassistant/config_entries.py               |  2 +-
 homeassistant/core.py                         |  2 +-
 .../helpers/helper_config_entry_flow.py       |  1 -
 pyproject.toml                                |  1 -
 requirements_test.txt                         |  2 +-
 tests/pylint/test_enforce_type_hints.py       |  4 ++
 20 files changed, 53 insertions(+), 55 deletions(-)

diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py
index 327d5973892..db122e23f13 100644
--- a/homeassistant/components/alexa/capabilities.py
+++ b/homeassistant/components/alexa/capabilities.py
@@ -75,6 +75,8 @@ class AlexaCapability:
     https://developer.amazon.com/docs/device-apis/message-guide.html
     """
 
+    # pylint: disable=no-self-use
+
     supported_locales = {"en-US"}
 
     def __init__(self, entity: State, instance: str | None = None) -> None:
@@ -86,28 +88,23 @@ class AlexaCapability:
         """Return the Alexa API name of this interface."""
         raise NotImplementedError
 
-    @staticmethod
-    def properties_supported() -> list[dict]:
+    def properties_supported(self) -> list[dict]:
         """Return what properties this entity supports."""
         return []
 
-    @staticmethod
-    def properties_proactively_reported() -> bool:
+    def properties_proactively_reported(self) -> bool:
         """Return True if properties asynchronously reported."""
         return False
 
-    @staticmethod
-    def properties_retrievable() -> bool:
+    def properties_retrievable(self) -> bool:
         """Return True if properties can be retrieved."""
         return False
 
-    @staticmethod
-    def properties_non_controllable() -> bool | None:
+    def properties_non_controllable(self) -> bool | None:
         """Return True if non controllable."""
         return None
 
-    @staticmethod
-    def get_property(name):
+    def get_property(self, name):
         """Read and return a property.
 
         Return value should be a dict, or raise UnsupportedProperty.
@@ -117,13 +114,11 @@ class AlexaCapability:
         """
         raise UnsupportedProperty(name)
 
-    @staticmethod
-    def supports_deactivation():
+    def supports_deactivation(self):
         """Applicable only to scenes."""
         return None
 
-    @staticmethod
-    def capability_proactively_reported():
+    def capability_proactively_reported(self):
         """Return True if the capability is proactively reported.
 
         Set properties_proactively_reported() for proactively reported properties.
@@ -131,16 +126,14 @@ class AlexaCapability:
         """
         return None
 
-    @staticmethod
-    def capability_resources():
+    def capability_resources(self):
         """Return the capability object.
 
         Applicable to ToggleController, RangeController, and ModeController interfaces.
         """
         return []
 
-    @staticmethod
-    def configuration():
+    def configuration(self):
         """Return the configuration object.
 
         Applicable to the ThermostatController, SecurityControlPanel, ModeController, RangeController,
@@ -148,8 +141,7 @@ class AlexaCapability:
         """
         return []
 
-    @staticmethod
-    def configurations():
+    def configurations(self):
         """Return the configurations object.
 
         The plural configurations object is different that the singular configuration object.
@@ -157,31 +149,29 @@ class AlexaCapability:
         """
         return []
 
-    @staticmethod
-    def inputs():
+    def inputs(self):
         """Applicable only to media players."""
         return []
 
-    @staticmethod
-    def semantics():
+    def semantics(self):
         """Return the semantics object.
 
         Applicable to ToggleController, RangeController, and ModeController interfaces.
         """
         return []
 
-    @staticmethod
-    def supported_operations():
+    def supported_operations(self):
         """Return the supportedOperations object."""
         return []
 
-    @staticmethod
-    def camera_stream_configurations():
+    def camera_stream_configurations(self):
         """Applicable only to CameraStreamController."""
         return None
 
     def serialize_discovery(self):
         """Serialize according to the Discovery API."""
+        # pylint: disable=assignment-from-none
+        # Methods may be overridden and return a value.
         result = {"type": "AlexaInterface", "interface": self.name(), "version": "3"}
 
         if (instance := self.instance) is not None:
diff --git a/homeassistant/components/alexa/resources.py b/homeassistant/components/alexa/resources.py
index 5c02eca4fb2..aec43f41f9a 100644
--- a/homeassistant/components/alexa/resources.py
+++ b/homeassistant/components/alexa/resources.py
@@ -200,6 +200,8 @@ class AlexaCapabilityResource:
     https://developer.amazon.com/docs/device-apis/resources-and-assets.html#capability-resources
     """
 
+    # pylint: disable=no-self-use
+
     def __init__(self, labels):
         """Initialize an Alexa resource."""
         self._resource_labels = []
@@ -210,13 +212,11 @@ class AlexaCapabilityResource:
         """Return capabilityResources object serialized for an API response."""
         return self.serialize_labels(self._resource_labels)
 
-    @staticmethod
-    def serialize_configuration():
+    def serialize_configuration(self):
         """Return ModeResources, PresetResources friendlyNames serialized for an API response."""
         return []
 
-    @staticmethod
-    def serialize_labels(resources):
+    def serialize_labels(self, resources):
         """Return resource label objects for friendlyNames serialized for an API response."""
         labels = []
         for label in resources:
diff --git a/homeassistant/components/broadlink/config_flow.py b/homeassistant/components/broadlink/config_flow.py
index 8a32ba02ee8..da8b489a98b 100644
--- a/homeassistant/components/broadlink/config_flow.py
+++ b/homeassistant/components/broadlink/config_flow.py
@@ -188,7 +188,9 @@ class BroadlinkFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
 
         await self.async_set_unique_id(device.mac.hex())
         _LOGGER.error(
-            "Failed to authenticate to the device at %s: %s", device.host[0], err_msg
+            "Failed to authenticate to the device at %s: %s",
+            device.host[0],
+            err_msg,  # pylint: disable=used-before-assignment
         )
         return self.async_show_form(step_id="auth", errors=errors)
 
@@ -251,7 +253,9 @@ class BroadlinkFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
                 return await self.async_step_finish()
 
             _LOGGER.error(
-                "Failed to unlock the device at %s: %s", device.host[0], err_msg
+                "Failed to unlock the device at %s: %s",
+                device.host[0],
+                err_msg,  # pylint: disable=used-before-assignment
             )
 
         else:
diff --git a/homeassistant/components/color_extractor/__init__.py b/homeassistant/components/color_extractor/__init__.py
index cbc5b0c8821..b0884643be9 100644
--- a/homeassistant/components/color_extractor/__init__.py
+++ b/homeassistant/components/color_extractor/__init__.py
@@ -80,7 +80,7 @@ async def async_setup(hass: HomeAssistant, hass_config: ConfigType) -> bool:
         except UnidentifiedImageError as ex:
             _LOGGER.error(
                 "Bad image from %s '%s' provided, are you sure it's an image? %s",
-                image_type,
+                image_type,  # pylint: disable=used-before-assignment
                 image_reference,
                 ex,
             )
diff --git a/homeassistant/components/harmony/subscriber.py b/homeassistant/components/harmony/subscriber.py
index f71b486fd16..2731d8555f0 100644
--- a/homeassistant/components/harmony/subscriber.py
+++ b/homeassistant/components/harmony/subscriber.py
@@ -3,7 +3,6 @@
 import asyncio
 import logging
 
-# pylint: disable-next=deprecated-typing-alias
 # Issue with Python 3.9.0 and 3.9.1 with collections.abc.Callable
 # https://bugs.python.org/issue42965
 from typing import Any, Callable, NamedTuple, Optional
diff --git a/homeassistant/components/horizon/media_player.py b/homeassistant/components/horizon/media_player.py
index 31e905b7864..fd6b7b3d3cc 100644
--- a/homeassistant/components/horizon/media_player.py
+++ b/homeassistant/components/horizon/media_player.py
@@ -202,12 +202,12 @@ class HorizonDevice(MediaPlayerEntity):
             try:
                 self._client.connect()
                 self._client.authorize()
-            except AuthenticationError as msg:
-                _LOGGER.error("Authentication to %s failed: %s", self._name, msg)
+            except AuthenticationError as msg2:
+                _LOGGER.error("Authentication to %s failed: %s", self._name, msg2)
                 return
-            except OSError as msg:
+            except OSError as msg2:
                 # occurs if horizon box is offline
-                _LOGGER.error("Reconnect to %s failed: %s", self._name, msg)
+                _LOGGER.error("Reconnect to %s failed: %s", self._name, msg2)
                 return
 
             self._send(key=key, channel=channel)
diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py
index a41329a1548..374e69975ce 100644
--- a/homeassistant/components/http/__init__.py
+++ b/homeassistant/components/http/__init__.py
@@ -365,10 +365,10 @@ class HomeAssistantHTTP:
             )
             try:
                 context = self._create_emergency_ssl_context()
-            except OSError as error:
+            except OSError as error2:
                 _LOGGER.error(
                     "Could not create an emergency self signed ssl certificate: %s",
-                    error,
+                    error2,
                 )
                 context = None
             else:
diff --git a/homeassistant/components/icloud/config_flow.py b/homeassistant/components/icloud/config_flow.py
index 9bfa12a76a2..3eb6ced782c 100644
--- a/homeassistant/components/icloud/config_flow.py
+++ b/homeassistant/components/icloud/config_flow.py
@@ -288,8 +288,8 @@ class IcloudFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
                         self._with_family,
                     )
                     return await self.async_step_verification_code(None, errors)
-                except PyiCloudFailedLoginException as error:
-                    _LOGGER.error("Error logging into iCloud service: %s", error)
+                except PyiCloudFailedLoginException as error_login:
+                    _LOGGER.error("Error logging into iCloud service: %s", error_login)
                     self.api = None
                     errors = {CONF_PASSWORD: "invalid_auth"}
                     return self._show_setup_form(user_input, errors, "user")
diff --git a/homeassistant/components/recorder/models.py b/homeassistant/components/recorder/models.py
index 660b6355911..71ac332d34e 100644
--- a/homeassistant/components/recorder/models.py
+++ b/homeassistant/components/recorder/models.py
@@ -528,8 +528,6 @@ class LazyState(State):
 
     __slots__ = [
         "_row",
-        "entity_id",
-        "state",
         "_attributes",
         "_last_changed",
         "_last_updated",
diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py
index 368121e79e9..d07a95683eb 100644
--- a/homeassistant/components/solaredge_local/sensor.py
+++ b/homeassistant/components/solaredge_local/sensor.py
@@ -209,7 +209,6 @@ def setup_platform(
         _LOGGER.debug("Credentials correct and site is active")
     except AttributeError:
         _LOGGER.error("Missing details data in solaredge status")
-        _LOGGER.debug("Status is: %s", status)
         return
     except (ConnectTimeout, HTTPError):
         _LOGGER.error("Could not retrieve details from SolarEdge API")
diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py
index 27d51d8f3e6..bb4c61fdadf 100644
--- a/homeassistant/components/sonos/__init__.py
+++ b/homeassistant/components/sonos/__init__.py
@@ -188,6 +188,7 @@ class SonosDiscoveryManager:
             _ = soco.volume
             return soco
         except NotSupportedException as exc:
+            # pylint: disable-next=used-before-assignment
             _LOGGER.debug("Device %s is not supported, ignoring: %s", uid, exc)
             self.data.discovery_ignored.add(ip_address)
         except (OSError, SoCoException) as ex:
diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py
index ad6c8142828..97422179960 100644
--- a/homeassistant/components/tuya/__init__.py
+++ b/homeassistant/components/tuya/__init__.py
@@ -234,6 +234,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
 class DeviceListener(TuyaDeviceListener):
     """Device Update Listener."""
 
+    # pylint: disable=arguments-differ
+    # Library incorrectly defines methods as 'classmethod'
+    # https://github.com/tuya/tuya-iot-python-sdk/pull/48
+
     def __init__(
         self,
         hass: HomeAssistant,
diff --git a/homeassistant/components/zha/core/gateway.py b/homeassistant/components/zha/core/gateway.py
index 6c600bf93d6..18213c396cc 100644
--- a/homeassistant/components/zha/core/gateway.py
+++ b/homeassistant/components/zha/core/gateway.py
@@ -98,6 +98,8 @@ if TYPE_CHECKING:
     from ..entity import ZhaEntity
     from .store import ZhaStorage
 
+    # pylint: disable-next=broken-collections-callable
+    # Safe inside TYPE_CHECKING block
     _LogFilterType = Union[Filter, Callable[[LogRecord], int]]
 
 _LOGGER = logging.getLogger(__name__)
diff --git a/homeassistant/components/zha/sensor.py b/homeassistant/components/zha/sensor.py
index 1e7d4f28a38..302bbc2a054 100644
--- a/homeassistant/components/zha/sensor.py
+++ b/homeassistant/components/zha/sensor.py
@@ -231,7 +231,7 @@ class Battery(Sensor):
         return cls(unique_id, zha_device, channels, **kwargs)
 
     @staticmethod
-    def formatter(value: int) -> int:
+    def formatter(value: int) -> int:  # pylint: disable=arguments-differ
         """Return the state of the entity."""
         # per zcl specs battery percent is reported at 200% ¯\_(ツ)_/¯
         if not isinstance(value, numbers.Number) or value == -1:
@@ -391,8 +391,7 @@ class Illuminance(Sensor):
     _attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
     _unit = LIGHT_LUX
 
-    @staticmethod
-    def formatter(value: int) -> float:
+    def formatter(self, value: int) -> float:
         """Convert illumination data."""
         return round(pow(10, ((value - 1) / 10000)), 1)
 
diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py
index 7bc37bcd305..0e94aa458a3 100644
--- a/homeassistant/config_entries.py
+++ b/homeassistant/config_entries.py
@@ -1187,7 +1187,7 @@ async def _old_conf_migrator(old_config: dict[str, Any]) -> dict[str, Any]:
 class ConfigFlow(data_entry_flow.FlowHandler):
     """Base class for config flows with some helpers."""
 
-    def __init_subclass__(cls, domain: str | None = None, **kwargs: Any) -> None:
+    def __init_subclass__(cls, *, domain: str | None = None, **kwargs: Any) -> None:
         """Initialize a subclass, register if possible."""
         super().__init_subclass__(**kwargs)
         if domain is not None:
diff --git a/homeassistant/core.py b/homeassistant/core.py
index 11d90d6d05b..733281aa5e6 100644
--- a/homeassistant/core.py
+++ b/homeassistant/core.py
@@ -101,7 +101,7 @@ block_async_io.enable()
 
 _T = TypeVar("_T")
 _R = TypeVar("_R")
-_R_co = TypeVar("_R_co", covariant=True)  # pylint: disable=invalid-name
+_R_co = TypeVar("_R_co", covariant=True)
 # Internal; not helpers.typing.UNDEFINED due to circular dependency
 _UNDEF: dict[Any, Any] = {}
 _CallableT = TypeVar("_CallableT", bound=Callable[..., Any])
diff --git a/homeassistant/helpers/helper_config_entry_flow.py b/homeassistant/helpers/helper_config_entry_flow.py
index ba62d5d59e5..16471c13e41 100644
--- a/homeassistant/helpers/helper_config_entry_flow.py
+++ b/homeassistant/helpers/helper_config_entry_flow.py
@@ -181,7 +181,6 @@ class HelperConfigFlowHandler(config_entries.ConfigFlow):
 
     VERSION = 1
 
-    # pylint: disable-next=arguments-differ
     def __init_subclass__(cls, **kwargs: Any) -> None:
         """Initialize a subclass."""
         super().__init_subclass__(**kwargs)
diff --git a/pyproject.toml b/pyproject.toml
index c1a08a3f0c3..fbe9fa4b6e8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -67,7 +67,6 @@ good-names = [
     "j",
     "k",
     "Run",
-    "T",
     "ip",
 ]
 
diff --git a/requirements_test.txt b/requirements_test.txt
index a78f7d57a7b..34a4936b3d8 100644
--- a/requirements_test.txt
+++ b/requirements_test.txt
@@ -13,7 +13,7 @@ freezegun==1.2.1
 mock-open==1.4.0
 mypy==0.942
 pre-commit==2.17.0
-pylint==2.12.2
+pylint==2.13.0
 pipdeptree==2.2.1
 pylint-strict-informational==0.1
 pytest-aiohttp==0.3.0
diff --git a/tests/pylint/test_enforce_type_hints.py b/tests/pylint/test_enforce_type_hints.py
index 81fdd2fa916..64be85c9a44 100644
--- a/tests/pylint/test_enforce_type_hints.py
+++ b/tests/pylint/test_enforce_type_hints.py
@@ -137,6 +137,10 @@ def test_invalid_discovery_info(
             msg_id="hass-argument-type",
             node=discovery_info_node,
             args=(4, "DiscoveryInfoType | None"),
+            line=6,
+            col_offset=4,
+            end_line=6,
+            end_col_offset=41,
         ),
     ):
         type_hint_checker.visit_asyncfunctiondef(func_node)
-- 
GitLab