Remove implict name check from Entity base class (#101905)

This commit is contained in:
J. Nick Koston 2023-10-15 11:40:43 -10:00 committed by GitHub
parent d0fb994199
commit e5ebdf7ad4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 102 deletions

View File

@ -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

View File

@ -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,
)