1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 21:06:19 +00:00

Change domain and name of Nintendo Switch parental controls integration (#153893)

This commit is contained in:
Erik Montnemery
2025-10-10 17:11:10 +02:00
committed by GitHub
parent d3a8f3191b
commit c9d9730c4a
21 changed files with 76 additions and 70 deletions

4
CODEOWNERS generated
View File

@@ -1065,8 +1065,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/nilu/ @hfurubotten
/homeassistant/components/nina/ @DeerMaximum
/tests/components/nina/ @DeerMaximum
/homeassistant/components/nintendo_parental/ @pantherale0
/tests/components/nintendo_parental/ @pantherale0
/homeassistant/components/nintendo_parental_controls/ @pantherale0
/tests/components/nintendo_parental_controls/ @pantherale0
/homeassistant/components/nissan_leaf/ @filcole
/homeassistant/components/noaa_tides/ @jdelaney72
/homeassistant/components/nobo_hub/ @echoromeo @oyvindwe

View File

@@ -1,4 +1,4 @@
"""The Nintendo Switch Parental Controls integration."""
"""The Nintendo Switch parental controls integration."""
from __future__ import annotations
@@ -14,15 +14,15 @@ from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import CONF_SESSION_TOKEN, DOMAIN
from .coordinator import NintendoParentalConfigEntry, NintendoUpdateCoordinator
from .coordinator import NintendoParentalControlsConfigEntry, NintendoUpdateCoordinator
_PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.TIME]
async def async_setup_entry(
hass: HomeAssistant, entry: NintendoParentalConfigEntry
hass: HomeAssistant, entry: NintendoParentalControlsConfigEntry
) -> bool:
"""Set up Nintendo Switch Parental Controls from a config entry."""
"""Set up Nintendo Switch parental controls from a config entry."""
try:
nintendo_auth = await Authenticator.complete_login(
auth=None,
@@ -45,7 +45,7 @@ async def async_setup_entry(
async def async_unload_entry(
hass: HomeAssistant, entry: NintendoParentalConfigEntry
hass: HomeAssistant, entry: NintendoParentalControlsConfigEntry
) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, _PLATFORMS)

View File

@@ -1,4 +1,4 @@
"""Config flow for the Nintendo Switch Parental Controls integration."""
"""Config flow for the Nintendo Switch parental controls integration."""
from __future__ import annotations
@@ -20,7 +20,7 @@ _LOGGER = logging.getLogger(__name__)
class NintendoConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Nintendo Switch Parental Controls."""
"""Handle a config flow for Nintendo Switch parental controls."""
def __init__(self) -> None:
"""Initialize a new config flow instance."""

View File

@@ -1,6 +1,6 @@
"""Constants for the Nintendo Switch Parental Controls integration."""
"""Constants for the Nintendo Switch parental controls integration."""
DOMAIN = "nintendo_parental"
DOMAIN = "nintendo_parental_controls"
CONF_UPDATE_INTERVAL = "update_interval"
CONF_SESSION_TOKEN = "session_token"

View File

@@ -1,4 +1,4 @@
"""Nintendo Parental Controls data coordinator."""
"""Nintendo parental controls data coordinator."""
from __future__ import annotations
@@ -15,7 +15,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN
type NintendoParentalConfigEntry = ConfigEntry[NintendoUpdateCoordinator]
type NintendoParentalControlsConfigEntry = ConfigEntry[NintendoUpdateCoordinator]
_LOGGER = logging.getLogger(__name__)
UPDATE_INTERVAL = timedelta(seconds=60)
@@ -28,7 +28,7 @@ class NintendoUpdateCoordinator(DataUpdateCoordinator[None]):
self,
hass: HomeAssistant,
authenticator: Authenticator,
config_entry: NintendoParentalConfigEntry,
config_entry: NintendoParentalControlsConfigEntry,
) -> None:
"""Initialize update coordinator."""
super().__init__(

View File

@@ -1,4 +1,4 @@
"""Base entity definition for Nintendo Parental."""
"""Base entity definition for Nintendo parental controls."""
from __future__ import annotations

View File

@@ -1,9 +1,9 @@
{
"domain": "nintendo_parental",
"name": "Nintendo Switch Parental Controls",
"domain": "nintendo_parental_controls",
"name": "Nintendo Switch parental controls",
"codeowners": ["@pantherale0"],
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/nintendo_parental",
"documentation": "https://www.home-assistant.io/integrations/nintendo_parental_controls",
"iot_class": "cloud_polling",
"loggers": ["pynintendoparental"],
"quality_scale": "bronze",

View File

@@ -1,4 +1,4 @@
"""Sensor platform for Nintendo Parental."""
"""Sensor platform for Nintendo parental controls."""
from __future__ import annotations
@@ -16,39 +16,39 @@ from homeassistant.const import UnitOfTime
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import NintendoParentalConfigEntry, NintendoUpdateCoordinator
from .coordinator import NintendoParentalControlsConfigEntry, NintendoUpdateCoordinator
from .entity import Device, NintendoDevice
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
class NintendoParentalSensor(StrEnum):
"""Store keys for Nintendo Parental sensors."""
class NintendoParentalControlsSensor(StrEnum):
"""Store keys for Nintendo parental controls sensors."""
PLAYING_TIME = "playing_time"
TIME_REMAINING = "time_remaining"
@dataclass(kw_only=True, frozen=True)
class NintendoParentalSensorEntityDescription(SensorEntityDescription):
"""Description for Nintendo Parental sensor entities."""
class NintendoParentalControlsSensorEntityDescription(SensorEntityDescription):
"""Description for Nintendo parental controls sensor entities."""
value_fn: Callable[[Device], int | float | None]
SENSOR_DESCRIPTIONS: tuple[NintendoParentalSensorEntityDescription, ...] = (
NintendoParentalSensorEntityDescription(
key=NintendoParentalSensor.PLAYING_TIME,
translation_key=NintendoParentalSensor.PLAYING_TIME,
SENSOR_DESCRIPTIONS: tuple[NintendoParentalControlsSensorEntityDescription, ...] = (
NintendoParentalControlsSensorEntityDescription(
key=NintendoParentalControlsSensor.PLAYING_TIME,
translation_key=NintendoParentalControlsSensor.PLAYING_TIME,
native_unit_of_measurement=UnitOfTime.MINUTES,
device_class=SensorDeviceClass.DURATION,
state_class=SensorStateClass.MEASUREMENT,
value_fn=lambda device: device.today_playing_time,
),
NintendoParentalSensorEntityDescription(
key=NintendoParentalSensor.TIME_REMAINING,
translation_key=NintendoParentalSensor.TIME_REMAINING,
NintendoParentalControlsSensorEntityDescription(
key=NintendoParentalControlsSensor.TIME_REMAINING,
translation_key=NintendoParentalControlsSensor.TIME_REMAINING,
native_unit_of_measurement=UnitOfTime.MINUTES,
device_class=SensorDeviceClass.DURATION,
state_class=SensorStateClass.MEASUREMENT,
@@ -59,27 +59,27 @@ SENSOR_DESCRIPTIONS: tuple[NintendoParentalSensorEntityDescription, ...] = (
async def async_setup_entry(
hass: HomeAssistant,
entry: NintendoParentalConfigEntry,
entry: NintendoParentalControlsConfigEntry,
async_add_devices: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the sensor platform."""
async_add_devices(
NintendoParentalSensorEntity(entry.runtime_data, device, sensor)
NintendoParentalControlsSensorEntity(entry.runtime_data, device, sensor)
for device in entry.runtime_data.api.devices.values()
for sensor in SENSOR_DESCRIPTIONS
)
class NintendoParentalSensorEntity(NintendoDevice, SensorEntity):
class NintendoParentalControlsSensorEntity(NintendoDevice, SensorEntity):
"""Represent a single sensor."""
entity_description: NintendoParentalSensorEntityDescription
entity_description: NintendoParentalControlsSensorEntityDescription
def __init__(
self,
coordinator: NintendoUpdateCoordinator,
device: Device,
description: NintendoParentalSensorEntityDescription,
description: NintendoParentalControlsSensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator=coordinator, device=device, key=description.key)

View File

@@ -1,4 +1,4 @@
"""Time platform for Nintendo Parental."""
"""Time platform for Nintendo parental controls."""
from __future__ import annotations
@@ -17,7 +17,7 @@ from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import BEDTIME_ALARM_DISABLE, BEDTIME_ALARM_MAX, BEDTIME_ALARM_MIN, DOMAIN
from .coordinator import NintendoParentalConfigEntry, NintendoUpdateCoordinator
from .coordinator import NintendoParentalControlsConfigEntry, NintendoUpdateCoordinator
from .entity import Device, NintendoDevice
_LOGGER = logging.getLogger(__name__)
@@ -26,24 +26,24 @@ _LOGGER = logging.getLogger(__name__)
PARALLEL_UPDATES = 0
class NintendoParentalTime(StrEnum):
class NintendoParentalControlsTime(StrEnum):
"""Store keys for Nintendo Parental time."""
BEDTIME_ALARM = "bedtime_alarm"
@dataclass(kw_only=True, frozen=True)
class NintendoParentalTimeEntityDescription(TimeEntityDescription):
class NintendoParentalControlsTimeEntityDescription(TimeEntityDescription):
"""Description for Nintendo Parental time entities."""
value_fn: Callable[[Device], time | None]
set_value_fn: Callable[[Device, time], Coroutine[Any, Any, None]]
TIME_DESCRIPTIONS: tuple[NintendoParentalTimeEntityDescription, ...] = (
NintendoParentalTimeEntityDescription(
key=NintendoParentalTime.BEDTIME_ALARM,
translation_key=NintendoParentalTime.BEDTIME_ALARM,
TIME_DESCRIPTIONS: tuple[NintendoParentalControlsTimeEntityDescription, ...] = (
NintendoParentalControlsTimeEntityDescription(
key=NintendoParentalControlsTime.BEDTIME_ALARM,
translation_key=NintendoParentalControlsTime.BEDTIME_ALARM,
value_fn=lambda device: device.bedtime_alarm,
set_value_fn=lambda device, value: device.set_bedtime_alarm(value=value),
),
@@ -52,27 +52,27 @@ TIME_DESCRIPTIONS: tuple[NintendoParentalTimeEntityDescription, ...] = (
async def async_setup_entry(
hass: HomeAssistant,
entry: NintendoParentalConfigEntry,
entry: NintendoParentalControlsConfigEntry,
async_add_devices: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the time platform."""
async_add_devices(
NintendoParentalTimeEntity(entry.runtime_data, device, entity)
NintendoParentalControlsTimeEntity(entry.runtime_data, device, entity)
for device in entry.runtime_data.api.devices.values()
for entity in TIME_DESCRIPTIONS
)
class NintendoParentalTimeEntity(NintendoDevice, TimeEntity):
class NintendoParentalControlsTimeEntity(NintendoDevice, TimeEntity):
"""Represent a single time entity."""
entity_description: NintendoParentalTimeEntityDescription
entity_description: NintendoParentalControlsTimeEntityDescription
def __init__(
self,
coordinator: NintendoUpdateCoordinator,
device: Device,
description: NintendoParentalTimeEntityDescription,
description: NintendoParentalControlsTimeEntityDescription,
) -> None:
"""Initialize the time entity."""
super().__init__(coordinator=coordinator, device=device, key=description.key)

View File

@@ -441,7 +441,7 @@ FLOWS = {
"nightscout",
"niko_home_control",
"nina",
"nintendo_parental",
"nintendo_parental_controls",
"nmap_tracker",
"nmbs",
"nobo_hub",

View File

@@ -4460,8 +4460,8 @@
"iot_class": "cloud_polling",
"single_config_entry": true
},
"nintendo_parental": {
"name": "Nintendo Switch Parental Controls",
"nintendo_parental_controls": {
"name": "Nintendo Switch parental controls",
"integration_type": "hub",
"config_flow": true,
"iot_class": "cloud_polling"

2
requirements_all.txt generated
View File

@@ -2209,7 +2209,7 @@ pynetio==0.1.9.1
# homeassistant.components.nina
pynina==0.3.6
# homeassistant.components.nintendo_parental
# homeassistant.components.nintendo_parental_controls
pynintendoparental==1.1.1
# homeassistant.components.nobo_hub

View File

@@ -1845,7 +1845,7 @@ pynetgear==0.10.10
# homeassistant.components.nina
pynina==0.3.6
# homeassistant.components.nintendo_parental
# homeassistant.components.nintendo_parental_controls
pynintendoparental==1.1.1
# homeassistant.components.nobo_hub

View File

@@ -1,4 +1,4 @@
"""Tests for the Nintendo Switch Parental Controls integration."""
"""Tests for the Nintendo Switch parental controls integration."""
from homeassistant.core import HomeAssistant

View File

@@ -1,4 +1,4 @@
"""Common fixtures for the Nintendo Switch Parental Controls tests."""
"""Common fixtures for the Nintendo Switch parental controls tests."""
from collections.abc import Generator
from datetime import datetime, time
@@ -8,7 +8,7 @@ from pynintendoparental import NintendoParental
from pynintendoparental.device import Device
import pytest
from homeassistant.components.nintendo_parental.const import DOMAIN
from homeassistant.components.nintendo_parental_controls.const import DOMAIN
from .const import ACCOUNT_ID, API_TOKEN, LOGIN_URL
@@ -44,15 +44,15 @@ def mock_nintendo_authenticator() -> Generator[MagicMock]:
"""Mock Nintendo Authenticator."""
with (
patch(
"homeassistant.components.nintendo_parental.Authenticator",
"homeassistant.components.nintendo_parental_controls.Authenticator",
autospec=True,
) as mock_auth_class,
patch(
"homeassistant.components.nintendo_parental.config_flow.Authenticator",
"homeassistant.components.nintendo_parental_controls.config_flow.Authenticator",
new=mock_auth_class,
),
patch(
"homeassistant.components.nintendo_parental.coordinator.NintendoParental.update",
"homeassistant.components.nintendo_parental_controls.coordinator.NintendoParental.update",
return_value=None,
),
):
@@ -79,7 +79,7 @@ def mock_nintendo_client(
mock_client_instance.devices = {"testdevid": mock_nintendo_device}
# Now patch the NintendoParental class in the coordinator with our mock instance
with patch(
"homeassistant.components.nintendo_parental.coordinator.NintendoParental",
"homeassistant.components.nintendo_parental_controls.coordinator.NintendoParental",
autospec=True,
) as mock_client_class:
mock_client_class.return_value = mock_client_instance
@@ -92,7 +92,7 @@ def mock_nintendo_client(
def mock_setup_entry() -> Generator[AsyncMock]:
"""Override async_setup_entry."""
with patch(
"homeassistant.components.nintendo_parental.async_setup_entry",
"homeassistant.components.nintendo_parental_controls.async_setup_entry",
return_value=True,
) as mock_setup_entry:
yield mock_setup_entry

View File

@@ -1,4 +1,4 @@
"""Constants for the Nintendo Parental Controls test suite."""
"""Constants for the Nintendo parental controls test suite."""
ACCOUNT_ID = "aabbccddee112233"
API_TOKEN = "valid_token"

View File

@@ -25,11 +25,11 @@
'original_device_class': None,
'original_icon': None,
'original_name': 'Bedtime alarm',
'platform': 'nintendo_parental',
'platform': 'nintendo_parental_controls',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': <NintendoParentalTime.BEDTIME_ALARM: 'bedtime_alarm'>,
'translation_key': <NintendoParentalControlsTime.BEDTIME_ALARM: 'bedtime_alarm'>,
'unique_id': 'testdevid_bedtime_alarm',
'unit_of_measurement': None,
})

View File

@@ -1,11 +1,14 @@
"""Test the Nintendo Switch Parental Controls config flow."""
"""Test the Nintendo Switch parental controls config flow."""
from unittest.mock import AsyncMock
from pynintendoparental.exceptions import InvalidSessionTokenException
from homeassistant import config_entries
from homeassistant.components.nintendo_parental.const import CONF_SESSION_TOKEN, DOMAIN
from homeassistant.components.nintendo_parental_controls.const import (
CONF_SESSION_TOKEN,
DOMAIN,
)
from homeassistant.const import CONF_API_TOKEN
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType

View File

@@ -30,7 +30,8 @@ async def test_time(
) -> None:
"""Test time platform."""
with patch(
"homeassistant.components.nintendo_parental._PLATFORMS", [Platform.TIME]
"homeassistant.components.nintendo_parental_controls._PLATFORMS",
[Platform.TIME],
):
await setup_integration(hass, mock_config_entry)
@@ -45,7 +46,8 @@ async def test_set_time(
) -> None:
"""Test time platform service validation errors."""
with patch(
"homeassistant.components.nintendo_parental._PLATFORMS", [Platform.TIME]
"homeassistant.components.nintendo_parental_controls._PLATFORMS",
[Platform.TIME],
):
await setup_integration(hass, mock_config_entry)
await hass.services.async_call(
@@ -67,7 +69,8 @@ async def test_set_time_service_exceptions(
"""Test time platform service validation errors."""
mock_nintendo_device.set_bedtime_alarm.side_effect = BedtimeOutOfRangeError(None)
with patch(
"homeassistant.components.nintendo_parental._PLATFORMS", [Platform.TIME]
"homeassistant.components.nintendo_parental_controls._PLATFORMS",
[Platform.TIME],
):
await setup_integration(hass, mock_config_entry)
with pytest.raises(ServiceValidationError) as err: