From e5ebdf7ad42b6762f145c364c010264aa7bc73f3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Oct 2023 11:40:43 -1000 Subject: [PATCH] Remove implict name check from Entity base class (#101905) --- homeassistant/helpers/entity.py | 35 +---------- tests/helpers/test_entity.py | 106 +++++++++++--------------------- 2 files changed, 39 insertions(+), 102 deletions(-) diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 4bb3e5ef5bd..1bc8f0b308b 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -268,9 +268,6 @@ class Entity(ABC): # it should be using async_write_ha_state. _async_update_ha_state_reported = False - # If we reported this entity is implicitly using device name - _implicit_device_name_reported = False - # If we reported this entity was added without its platform set _no_platform_reported = False @@ -358,22 +355,6 @@ class Entity(ABC): """Return a unique ID.""" return self._attr_unique_id - def _report_implicit_device_name(self) -> None: - """Report entities which use implicit device name.""" - if self._implicit_device_name_reported: - return - report_issue = self._suggest_report_issue() - _LOGGER.warning( - ( - "Entity %s (%s) is implicitly using device name by not setting its " - "name. Instead, the name should be set to None, please %s" - ), - self.entity_id, - type(self), - report_issue, - ) - self._implicit_device_name_reported = True - @property def use_device_name(self) -> bool: """Return if this entity does not have its own name. @@ -388,20 +369,8 @@ class Entity(ABC): return False if hasattr(self, "entity_description"): - if not (name := self.entity_description.name): - return True - if name is UNDEFINED and not self._default_to_device_class_name(): - # Backwards compatibility with leaving EntityDescription.name unassigned - # for device name. - # Deprecated in HA Core 2023.6, remove in HA Core 2023.9 - self._report_implicit_device_name() - return True - return False - if self.name is UNDEFINED and not self._default_to_device_class_name(): - # Backwards compatibility with not overriding name property for device name. - # Deprecated in HA Core 2023.6, remove in HA Core 2023.9 - self._report_implicit_device_name() - return True + return not self.entity_description.name + return not self.name @property diff --git a/tests/helpers/test_entity.py b/tests/helpers/test_entity.py index 572a2afaa5d..cf76083fe7a 100644 --- a/tests/helpers/test_entity.py +++ b/tests/helpers/test_entity.py @@ -956,17 +956,11 @@ async def test_entity_description_fallback() -> None: async def _test_friendly_name( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, ent: entity.Entity, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name.""" - expected_warning = ( - f"Entity {ent.entity_id} ({type(ent)}) is implicitly using device name" - ) - async def async_setup_entry(hass, config_entry, async_add_entities): """Mock setup entry method.""" async_add_entities([ent]) @@ -985,7 +979,6 @@ async def _test_friendly_name( assert len(hass.states.async_entity_ids()) == 1 state = hass.states.async_all()[0] assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name - assert (expected_warning in caplog.text) is warn_implicit_name await async_update_entity(hass, ent.entity_id) assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name @@ -997,25 +990,22 @@ async def _test_friendly_name( "entity_name", "device_name", "expected_friendly_name", - "warn_implicit_name", ), ( - (False, "Entity Blu", "Device Bla", "Entity Blu", False), - (False, None, "Device Bla", None, False), - (True, "Entity Blu", "Device Bla", "Device Bla Entity Blu", False), - (True, None, "Device Bla", "Device Bla", False), - (True, "Entity Blu", UNDEFINED, "Entity Blu", False), - (True, "Entity Blu", None, "Mock Title Entity Blu", False), + (False, "Entity Blu", "Device Bla", "Entity Blu"), + (False, None, "Device Bla", None), + (True, "Entity Blu", "Device Bla", "Device Bla Entity Blu"), + (True, None, "Device Bla", "Device Bla"), + (True, "Entity Blu", UNDEFINED, "Entity Blu"), + (True, "Entity Blu", None, "Mock Title Entity Blu"), ), ) async def test_friendly_name_attr( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, entity_name: str | None, device_name: str | None | UndefinedType, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity uses _attr_*.""" @@ -1031,31 +1021,27 @@ async def test_friendly_name_attr( ent._attr_name = entity_name await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, ) @pytest.mark.parametrize( - ("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"), + ("has_entity_name", "entity_name", "expected_friendly_name"), ( - (False, "Entity Blu", "Entity Blu", False), - (False, None, None, False), - (False, UNDEFINED, None, False), - (True, "Entity Blu", "Device Bla Entity Blu", False), - (True, None, "Device Bla", False), - (True, UNDEFINED, "Device Bla", True), + (False, "Entity Blu", "Entity Blu"), + (False, None, None), + (False, UNDEFINED, None), + (True, "Entity Blu", "Device Bla Entity Blu"), + (True, None, "Device Bla"), + (True, UNDEFINED, "Device Bla None"), ), ) async def test_friendly_name_description( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, entity_name: str | None, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity has an entity description.""" @@ -1072,31 +1058,27 @@ async def test_friendly_name_description( ) await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, ) @pytest.mark.parametrize( - ("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"), + ("has_entity_name", "entity_name", "expected_friendly_name"), ( - (False, "Entity Blu", "Entity Blu", False), - (False, None, None, False), - (False, UNDEFINED, None, False), - (True, "Entity Blu", "Device Bla Entity Blu", False), - (True, None, "Device Bla", False), - (True, UNDEFINED, "Device Bla English cls", False), + (False, "Entity Blu", "Entity Blu"), + (False, None, None), + (False, UNDEFINED, None), + (True, "Entity Blu", "Device Bla Entity Blu"), + (True, None, "Device Bla"), + (True, UNDEFINED, "Device Bla English cls"), ), ) async def test_friendly_name_description_device_class_name( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, entity_name: str | None, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity has an entity description.""" @@ -1139,31 +1121,27 @@ async def test_friendly_name_description_device_class_name( ): await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, ) @pytest.mark.parametrize( - ("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"), + ("has_entity_name", "entity_name", "expected_friendly_name"), ( - (False, "Entity Blu", "Entity Blu", False), - (False, None, None, False), - (False, UNDEFINED, None, False), - (True, "Entity Blu", "Device Bla Entity Blu", False), - (True, None, "Device Bla", False), - (True, UNDEFINED, "Device Bla", True), + (False, "Entity Blu", "Entity Blu"), + (False, None, None), + (False, UNDEFINED, None), + (True, "Entity Blu", "Device Bla Entity Blu"), + (True, None, "Device Bla"), + (True, UNDEFINED, "Device Bla None"), ), ) async def test_friendly_name_property( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, entity_name: str | None, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity has overridden the name property.""" @@ -1179,32 +1157,28 @@ async def test_friendly_name_property( ) await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, ) @pytest.mark.parametrize( - ("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"), + ("has_entity_name", "entity_name", "expected_friendly_name"), ( - (False, "Entity Blu", "Entity Blu", False), - (False, None, None, False), - (False, UNDEFINED, None, False), - (True, "Entity Blu", "Device Bla Entity Blu", False), - (True, None, "Device Bla", False), + (False, "Entity Blu", "Entity Blu"), + (False, None, None), + (False, UNDEFINED, None), + (True, "Entity Blu", "Device Bla Entity Blu"), + (True, None, "Device Bla"), # Won't use the device class name because the entity overrides the name property - (True, UNDEFINED, "Device Bla None", False), + (True, UNDEFINED, "Device Bla None"), ), ) async def test_friendly_name_property_device_class_name( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, entity_name: str | None, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity has overridden the name property.""" @@ -1244,26 +1218,22 @@ async def test_friendly_name_property_device_class_name( ): await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, ) @pytest.mark.parametrize( - ("has_entity_name", "expected_friendly_name", "warn_implicit_name"), + ("has_entity_name", "expected_friendly_name"), ( - (False, None, False), - (True, "Device Bla English cls", False), + (False, None), + (True, "Device Bla English cls"), ), ) async def test_friendly_name_device_class_name( hass: HomeAssistant, - caplog: pytest.LogCaptureFixture, has_entity_name: bool, expected_friendly_name: str | None, - warn_implicit_name: bool, ) -> None: """Test friendly name when the entity has not set the name in any way.""" @@ -1302,10 +1272,8 @@ async def test_friendly_name_device_class_name( ): await _test_friendly_name( hass, - caplog, ent, expected_friendly_name, - warn_implicit_name, )