diff --git a/homeassistant/components/duotecno/__init__.py b/homeassistant/components/duotecno/__init__.py index d9d890c28f3..288210c7280 100644 --- a/homeassistant/components/duotecno/__init__.py +++ b/homeassistant/components/duotecno/__init__.py @@ -12,11 +12,11 @@ from homeassistant.exceptions import ConfigEntryNotReady from .const import DOMAIN PLATFORMS: list[Platform] = [ - Platform.SWITCH, + Platform.BINARY_SENSOR, + Platform.CLIMATE, Platform.COVER, Platform.LIGHT, - Platform.CLIMATE, - Platform.BINARY_SENSOR, + Platform.SWITCH, ] diff --git a/homeassistant/components/ecoforest/__init__.py b/homeassistant/components/ecoforest/__init__.py index 205dfe67deb..7b4dd08610a 100644 --- a/homeassistant/components/ecoforest/__init__.py +++ b/homeassistant/components/ecoforest/__init__.py @@ -18,7 +18,7 @@ from homeassistant.exceptions import ConfigEntryNotReady from .const import DOMAIN from .coordinator import EcoforestCoordinator -PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.NUMBER, Platform.SWITCH] +PLATFORMS: list[Platform] = [Platform.NUMBER, Platform.SENSOR, Platform.SWITCH] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/electric_kiwi/__init__.py b/homeassistant/components/electric_kiwi/__init__.py index ea10cdb4dc4..00ff6749364 100644 --- a/homeassistant/components/electric_kiwi/__init__.py +++ b/homeassistant/components/electric_kiwi/__init__.py @@ -18,7 +18,7 @@ from .coordinator import ( ElectricKiwiHOPDataCoordinator, ) -PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.SELECT] +PLATFORMS: list[Platform] = [Platform.SELECT, Platform.SENSOR] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/jewish_calendar/__init__.py b/homeassistant/components/jewish_calendar/__init__.py index d3291e51bc1..550ca2d9e5d 100644 --- a/homeassistant/components/jewish_calendar/__init__.py +++ b/homeassistant/components/jewish_calendar/__init__.py @@ -11,7 +11,7 @@ from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.typing import ConfigType DOMAIN = "jewish_calendar" -PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.BINARY_SENSOR] +PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.SENSOR] CONF_DIASPORA = "diaspora" CONF_LANGUAGE = "language" diff --git a/homeassistant/components/peco/__init__.py b/homeassistant/components/peco/__init__.py index bcdc4195100..52e988f0f60 100644 --- a/homeassistant/components/peco/__init__.py +++ b/homeassistant/components/peco/__init__.py @@ -29,7 +29,7 @@ from .const import ( SMART_METER_SCAN_INTERVAL, ) -PLATFORMS: Final = [Platform.SENSOR, Platform.BINARY_SENSOR] +PLATFORMS: Final = [Platform.BINARY_SENSOR, Platform.SENSOR] @dataclass diff --git a/homeassistant/components/tplink_omada/__init__.py b/homeassistant/components/tplink_omada/__init__.py index e2daa903bbc..265b31bce9c 100644 --- a/homeassistant/components/tplink_omada/__init__.py +++ b/homeassistant/components/tplink_omada/__init__.py @@ -18,7 +18,7 @@ from .config_flow import CONF_SITE, create_omada_client from .const import DOMAIN from .controller import OmadaSiteController -PLATFORMS: list[Platform] = [Platform.SWITCH, Platform.UPDATE, Platform.BINARY_SENSOR] +PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.SWITCH, Platform.UPDATE] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/v2c/__init__.py b/homeassistant/components/v2c/__init__.py index 3cf615caa3c..ea82a9b64fc 100644 --- a/homeassistant/components/v2c/__init__.py +++ b/homeassistant/components/v2c/__init__.py @@ -13,9 +13,9 @@ from .coordinator import V2CUpdateCoordinator PLATFORMS: list[Platform] = [ Platform.BINARY_SENSOR, + Platform.NUMBER, Platform.SENSOR, Platform.SWITCH, - Platform.NUMBER, ] diff --git a/homeassistant/components/vallox/__init__.py b/homeassistant/components/vallox/__init__.py index 573b45d8d2b..d12f7b4ffa1 100644 --- a/homeassistant/components/vallox/__init__.py +++ b/homeassistant/components/vallox/__init__.py @@ -46,10 +46,10 @@ CONFIG_SCHEMA = vol.Schema( ) PLATFORMS: list[str] = [ - Platform.SENSOR, - Platform.FAN, Platform.BINARY_SENSOR, + Platform.FAN, Platform.NUMBER, + Platform.SENSOR, Platform.SWITCH, ] diff --git a/homeassistant/components/weatherkit/__init__.py b/homeassistant/components/weatherkit/__init__.py index 15ad5fa2ffb..307b2272d6c 100644 --- a/homeassistant/components/weatherkit/__init__.py +++ b/homeassistant/components/weatherkit/__init__.py @@ -23,7 +23,7 @@ from .const import ( ) from .coordinator import WeatherKitDataUpdateCoordinator -PLATFORMS: list[Platform] = [Platform.WEATHER, Platform.SENSOR] +PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.WEATHER] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/pylint/plugins/hass_enforce_sorted_platforms.py b/pylint/plugins/hass_enforce_sorted_platforms.py index b3fb7c8adcc..f597a7a1191 100644 --- a/pylint/plugins/hass_enforce_sorted_platforms.py +++ b/pylint/plugins/hass_enforce_sorted_platforms.py @@ -20,18 +20,28 @@ class HassEnforceSortedPlatformsChecker(BaseChecker): } options = () + def visit_annassign(self, node: nodes.AnnAssign) -> None: + """Check for sorted PLATFORMS const with type annotations.""" + self._do_sorted_check(node.target, node) + def visit_assign(self, node: nodes.Assign) -> None: - """Check for sorted PLATFORMS const.""" + """Check for sorted PLATFORMS const without type annotations.""" for target in node.targets: - if ( - isinstance(target, nodes.AssignName) - and target.name == "PLATFORMS" - and isinstance(node.value, nodes.List) - ): - platforms = [v.as_string() for v in node.value.elts] - sorted_platforms = sorted(platforms) - if platforms != sorted_platforms: - self.add_message("hass-enforce-sorted-platforms", node=node) + self._do_sorted_check(target, node) + + def _do_sorted_check( + self, target: nodes.NodeNG, node: nodes.Assign | nodes.AnnAssign + ) -> None: + """Check for sorted PLATFORMS const.""" + if ( + isinstance(target, nodes.AssignName) + and target.name == "PLATFORMS" + and isinstance(node.value, nodes.List) + ): + platforms = [v.as_string() for v in node.value.elts] + sorted_platforms = sorted(platforms) + if platforms != sorted_platforms: + self.add_message("hass-enforce-sorted-platforms", node=node) def register(linter: PyLinter) -> None: diff --git a/tests/pylint/test_enforce_sorted_platforms.py b/tests/pylint/test_enforce_sorted_platforms.py index 923291411f0..71bde88bc13 100644 --- a/tests/pylint/test_enforce_sorted_platforms.py +++ b/tests/pylint/test_enforce_sorted_platforms.py @@ -27,6 +27,18 @@ from . import assert_adds_messages, assert_no_messages """, id="multiple_platforms", ), + pytest.param( + """ + PLATFORMS: list[str] = [Platform.SENSOR] + """, + id="typed_on_platform", + ), + pytest.param( + """ + PLATFORMS: list[str] = [Platform.BINARY_SENSOR, Platform.BUTTON, Platform.SENSOR] + """, + id="typed_multiple_platform", + ), ], ) def test_enforce_sorted_platforms( @@ -69,3 +81,31 @@ def test_enforce_sorted_platforms_bad( ), ): enforce_sorted_platforms_checker.visit_assign(assign_node) + + +def test_enforce_sorted_platforms_bad_typed( + linter: UnittestLinter, + enforce_sorted_platforms_checker: BaseChecker, +) -> None: + """Bad typed test case.""" + assign_node = astroid.extract_node( + """ + PLATFORMS: list[str] = [Platform.SENSOR, Platform.BINARY_SENSOR, Platform.BUTTON] + """, + "homeassistant.components.pylint_test", + ) + + with assert_adds_messages( + linter, + MessageTest( + msg_id="hass-enforce-sorted-platforms", + line=2, + node=assign_node, + args=None, + confidence=UNDEFINED, + col_offset=0, + end_line=2, + end_col_offset=81, + ), + ): + enforce_sorted_platforms_checker.visit_annassign(assign_node)