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:
4
CODEOWNERS
generated
4
CODEOWNERS
generated
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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."""
|
||||
@@ -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"
|
||||
|
||||
@@ -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__(
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Base entity definition for Nintendo Parental."""
|
||||
"""Base entity definition for Nintendo parental controls."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -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",
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
2
homeassistant/generated/config_flows.py
generated
2
homeassistant/generated/config_flows.py
generated
@@ -441,7 +441,7 @@ FLOWS = {
|
||||
"nightscout",
|
||||
"niko_home_control",
|
||||
"nina",
|
||||
"nintendo_parental",
|
||||
"nintendo_parental_controls",
|
||||
"nmap_tracker",
|
||||
"nmbs",
|
||||
"nobo_hub",
|
||||
|
||||
@@ -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
2
requirements_all.txt
generated
@@ -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
|
||||
|
||||
2
requirements_test_all.txt
generated
2
requirements_test_all.txt
generated
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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,
|
||||
})
|
||||
@@ -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
|
||||
@@ -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:
|
||||
Reference in New Issue
Block a user