diff --git a/pylint/plugins/hass_imports.py b/pylint/plugins/hass_imports.py index 0d6582535f7..156309caba1 100644 --- a/pylint/plugins/hass_imports.py +++ b/pylint/plugins/hass_imports.py @@ -233,6 +233,11 @@ class HassImportsFormatChecker(BaseChecker): "hass-import-constant-alias", "Used when a constant should be imported as an alias", ), + "W7427": ( + "`%s` alias is unnecessary for `%s`", + "hass-import-constant-unnecessary-alias", + "Used when a constant alias is unnecessary", + ), } options = () @@ -274,16 +279,24 @@ class HassImportsFormatChecker(BaseChecker): self, current_package: str, node: nodes.ImportFrom ) -> None: """Check for improper 'from ._ import _' invocations.""" - if node.level <= 1 or ( - not current_package.startswith("homeassistant.components.") - and not current_package.startswith("tests.components.") + if not current_package.startswith( + ("homeassistant.components.", "tests.components.") ): return + split_package = current_package.split(".") + current_component = split_package[2] + + self._check_for_constant_alias(node, current_component, current_component) + + if node.level <= 1: + # No need to check relative import + return + if not node.modname and len(split_package) == node.level + 1: for name in node.names: # Allow relative import to component root - if name[0] != split_package[2]: + if name[0] != current_component: self.add_message("hass-absolute-import", node=node) return return @@ -298,6 +311,15 @@ class HassImportsFormatChecker(BaseChecker): ) -> bool: """Check for hass-import-constant-alias.""" if current_component == imported_component: + # Check for `from homeassistant.components.self import DOMAIN as XYZ` + for name, alias in node.names: + if name == "DOMAIN" and (alias is not None and alias != "DOMAIN"): + self.add_message( + "hass-import-constant-unnecessary-alias", + node=node, + args=(alias, "DOMAIN"), + ) + return False return True # Check for `from homeassistant.components.other import DOMAIN` diff --git a/tests/components/decora/test_light.py b/tests/components/decora/test_light.py index 6315d6c3986..06db3724f3c 100644 --- a/tests/components/decora/test_light.py +++ b/tests/components/decora/test_light.py @@ -2,7 +2,7 @@ from unittest.mock import Mock, patch -from homeassistant.components.decora import DOMAIN as DECORA_DOMAIN +from homeassistant.components.decora import DOMAIN from homeassistant.components.light import DOMAIN as PLATFORM_DOMAIN from homeassistant.const import CONF_PLATFORM from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant @@ -22,7 +22,7 @@ async def test_repair_issue_is_created( { PLATFORM_DOMAIN: [ { - CONF_PLATFORM: DECORA_DOMAIN, + CONF_PLATFORM: DOMAIN, } ], }, @@ -30,5 +30,5 @@ async def test_repair_issue_is_created( await hass.async_block_till_done() assert ( HOMEASSISTANT_DOMAIN, - f"deprecated_system_packages_yaml_integration_{DECORA_DOMAIN}", + f"deprecated_system_packages_yaml_integration_{DOMAIN}", ) in issue_registry.issues diff --git a/tests/components/sms/test_init.py b/tests/components/sms/test_init.py index 03cebfe9b52..68c57ba7f55 100644 --- a/tests/components/sms/test_init.py +++ b/tests/components/sms/test_init.py @@ -24,7 +24,7 @@ async def test_repair_issue_is_created( """Test repair issue is created.""" from homeassistant.components.sms import ( # pylint: disable=import-outside-toplevel DEPRECATED_ISSUE_ID, - DOMAIN as SMS_DOMAIN, + DOMAIN, ) with ( @@ -33,7 +33,7 @@ async def test_repair_issue_is_created( ): config_entry = MockConfigEntry( title="test", - domain=SMS_DOMAIN, + domain=DOMAIN, data={ CONF_DEVICE: "/dev/ttyUSB0", }, diff --git a/tests/components/tensorflow/test_image_processing.py b/tests/components/tensorflow/test_image_processing.py index 06199b9c60c..8ec1cc7c8b0 100644 --- a/tests/components/tensorflow/test_image_processing.py +++ b/tests/components/tensorflow/test_image_processing.py @@ -3,7 +3,7 @@ from unittest.mock import Mock, patch from homeassistant.components.image_processing import DOMAIN as IMAGE_PROCESSING_DOMAINN -from homeassistant.components.tensorflow import CONF_GRAPH, DOMAIN as TENSORFLOW_DOMAIN +from homeassistant.components.tensorflow import CONF_GRAPH, DOMAIN from homeassistant.const import CONF_ENTITY_ID, CONF_MODEL, CONF_PLATFORM, CONF_SOURCE from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant from homeassistant.helpers import issue_registry as ir @@ -22,7 +22,7 @@ async def test_repair_issue_is_created( { IMAGE_PROCESSING_DOMAINN: [ { - CONF_PLATFORM: TENSORFLOW_DOMAIN, + CONF_PLATFORM: DOMAIN, CONF_SOURCE: [ {CONF_ENTITY_ID: "camera.test_camera"}, ], @@ -36,5 +36,5 @@ async def test_repair_issue_is_created( await hass.async_block_till_done() assert ( HOMEASSISTANT_DOMAIN, - f"deprecated_system_packages_yaml_integration_{TENSORFLOW_DOMAIN}", + f"deprecated_system_packages_yaml_integration_{DOMAIN}", ) in issue_registry.issues