mirror of
https://github.com/home-assistant/core.git
synced 2026-09-24 23:41:48 -05:00
Bump google air quality api to 2.0.0 (#158234)
This commit is contained in:
@@ -52,9 +52,9 @@ async def _validate_input(
|
||||
description_placeholders: dict[str, str],
|
||||
) -> bool:
|
||||
try:
|
||||
await api.async_air_quality(
|
||||
await api.async_get_current_conditions(
|
||||
lat=user_input[CONF_LOCATION][CONF_LATITUDE],
|
||||
long=user_input[CONF_LOCATION][CONF_LONGITUDE],
|
||||
lon=user_input[CONF_LOCATION][CONF_LONGITUDE],
|
||||
)
|
||||
except GoogleAirQualityApiError as err:
|
||||
errors["base"] = "cannot_connect"
|
||||
|
||||
@@ -7,7 +7,7 @@ from typing import Final
|
||||
|
||||
from google_air_quality_api.api import GoogleAirQualityApi
|
||||
from google_air_quality_api.exceptions import GoogleAirQualityApiError
|
||||
from google_air_quality_api.model import AirQualityData
|
||||
from google_air_quality_api.model import AirQualityCurrentConditionsData
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE
|
||||
@@ -23,7 +23,9 @@ UPDATE_INTERVAL: Final = timedelta(hours=1)
|
||||
type GoogleAirQualityConfigEntry = ConfigEntry[GoogleAirQualityRuntimeData]
|
||||
|
||||
|
||||
class GoogleAirQualityUpdateCoordinator(DataUpdateCoordinator[AirQualityData]):
|
||||
class GoogleAirQualityUpdateCoordinator(
|
||||
DataUpdateCoordinator[AirQualityCurrentConditionsData]
|
||||
):
|
||||
"""Coordinator for fetching Google AirQuality data."""
|
||||
|
||||
config_entry: GoogleAirQualityConfigEntry
|
||||
@@ -48,10 +50,10 @@ class GoogleAirQualityUpdateCoordinator(DataUpdateCoordinator[AirQualityData]):
|
||||
self.lat = subentry.data[CONF_LATITUDE]
|
||||
self.long = subentry.data[CONF_LONGITUDE]
|
||||
|
||||
async def _async_update_data(self) -> AirQualityData:
|
||||
async def _async_update_data(self) -> AirQualityCurrentConditionsData:
|
||||
"""Fetch air quality data for this coordinate."""
|
||||
try:
|
||||
return await self.client.async_air_quality(self.lat, self.long)
|
||||
return await self.client.async_get_current_conditions(self.lat, self.long)
|
||||
except GoogleAirQualityApiError as ex:
|
||||
_LOGGER.debug("Cannot fetch air quality data: %s", str(ex))
|
||||
raise UpdateFailed(
|
||||
|
||||
@@ -8,5 +8,5 @@
|
||||
"iot_class": "cloud_polling",
|
||||
"loggers": ["google_air_quality_api"],
|
||||
"quality_scale": "bronze",
|
||||
"requirements": ["google_air_quality_api==1.1.3"]
|
||||
"requirements": ["google_air_quality_api==2.0.0"]
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
import logging
|
||||
|
||||
from google_air_quality_api.model import AirQualityData
|
||||
from google_air_quality_api.model import AirQualityCurrentConditionsData
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
SensorDeviceClass,
|
||||
@@ -33,15 +33,17 @@ PARALLEL_UPDATES = 0
|
||||
class AirQualitySensorEntityDescription(SensorEntityDescription):
|
||||
"""Describes Air Quality sensor entity."""
|
||||
|
||||
exists_fn: Callable[[AirQualityData], bool] = lambda _: True
|
||||
options_fn: Callable[[AirQualityData], list[str] | None] = lambda _: None
|
||||
value_fn: Callable[[AirQualityData], StateType]
|
||||
native_unit_of_measurement_fn: Callable[[AirQualityData], str | None] = (
|
||||
exists_fn: Callable[[AirQualityCurrentConditionsData], bool] = lambda _: True
|
||||
options_fn: Callable[[AirQualityCurrentConditionsData], list[str] | None] = (
|
||||
lambda _: None
|
||||
)
|
||||
translation_placeholders_fn: Callable[[AirQualityData], dict[str, str]] | None = (
|
||||
None
|
||||
)
|
||||
value_fn: Callable[[AirQualityCurrentConditionsData], StateType]
|
||||
native_unit_of_measurement_fn: Callable[
|
||||
[AirQualityCurrentConditionsData], str | None
|
||||
] = lambda _: None
|
||||
translation_placeholders_fn: (
|
||||
Callable[[AirQualityCurrentConditionsData], dict[str, str]] | None
|
||||
) = None
|
||||
|
||||
|
||||
AIR_QUALITY_SENSOR_TYPES: tuple[AirQualitySensorEntityDescription, ...] = (
|
||||
|
||||
Generated
+1
-1
@@ -1096,7 +1096,7 @@ google-nest-sdm==9.1.2
|
||||
google-photos-library-api==0.12.1
|
||||
|
||||
# homeassistant.components.google_air_quality
|
||||
google_air_quality_api==1.1.3
|
||||
google_air_quality_api==2.0.0
|
||||
|
||||
# homeassistant.components.slide
|
||||
# homeassistant.components.slide_local
|
||||
|
||||
Generated
+1
-1
@@ -972,7 +972,7 @@ google-nest-sdm==9.1.2
|
||||
google-photos-library-api==0.12.1
|
||||
|
||||
# homeassistant.components.google_air_quality
|
||||
google_air_quality_api==1.1.3
|
||||
google_air_quality_api==2.0.0
|
||||
|
||||
# homeassistant.components.slide
|
||||
# homeassistant.components.slide_local
|
||||
|
||||
@@ -4,7 +4,7 @@ from collections.abc import AsyncGenerator, Generator
|
||||
from typing import Any
|
||||
from unittest.mock import AsyncMock, Mock, patch
|
||||
|
||||
from google_air_quality_api.model import AirQualityData
|
||||
from google_air_quality_api.model import AirQualityCurrentConditionsData
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.google_air_quality import CONF_REFERRER
|
||||
@@ -81,7 +81,9 @@ def mock_client_api() -> Generator[Mock]:
|
||||
),
|
||||
):
|
||||
api = mock_api.return_value
|
||||
api.async_air_quality.return_value = AirQualityData.from_dict(responses)
|
||||
api.async_get_current_conditions.return_value = (
|
||||
AirQualityCurrentConditionsData.from_dict(responses)
|
||||
)
|
||||
|
||||
yield api
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ async def test_create_entry(
|
||||
},
|
||||
)
|
||||
|
||||
mock_api.async_air_quality.assert_called_once_with(lat=10.1, long=20.1)
|
||||
mock_api.async_get_current_conditions.assert_called_once_with(lat=10.1, lon=20.1)
|
||||
|
||||
_assert_create_entry_result(result)
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
@@ -101,7 +101,7 @@ async def test_form_with_referrer(
|
||||
},
|
||||
)
|
||||
|
||||
mock_api.async_air_quality.assert_called_once_with(lat=10.1, long=20.1)
|
||||
mock_api.async_get_current_conditions.assert_called_once_with(lat=10.1, lon=20.1)
|
||||
|
||||
_assert_create_entry_result(result, expected_referrer="test-referrer")
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
@@ -126,7 +126,7 @@ async def test_form_exceptions(
|
||||
DOMAIN, context={"source": SOURCE_USER}
|
||||
)
|
||||
|
||||
mock_api.async_air_quality.side_effect = api_exception
|
||||
mock_api.async_get_current_conditions.side_effect = api_exception
|
||||
result = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
@@ -154,7 +154,7 @@ async def test_form_exceptions(
|
||||
# FlowResultType.CREATE_ENTRY or FlowResultType.ABORT so
|
||||
# we can show the config flow is able to recover from an error.
|
||||
|
||||
mock_api.async_air_quality.side_effect = None
|
||||
mock_api.async_get_current_conditions.side_effect = None
|
||||
result = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
@@ -196,7 +196,7 @@ async def test_form_api_key_already_configured(
|
||||
|
||||
assert result["type"] is FlowResultType.ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
assert mock_api.async_air_quality.call_count == 0
|
||||
assert mock_api.async_get_current_conditions.call_count == 0
|
||||
|
||||
|
||||
async def test_form_location_already_configured(
|
||||
@@ -224,7 +224,7 @@ async def test_form_location_already_configured(
|
||||
|
||||
assert result["type"] is FlowResultType.ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
assert mock_api.async_air_quality.call_count == 0
|
||||
assert mock_api.async_get_current_conditions.call_count == 0
|
||||
|
||||
|
||||
async def test_form_not_already_configured(
|
||||
@@ -251,7 +251,9 @@ async def test_form_not_already_configured(
|
||||
},
|
||||
)
|
||||
|
||||
mock_api.async_air_quality.assert_called_once_with(lat=10.1002, long=20.0998)
|
||||
mock_api.async_get_current_conditions.assert_called_once_with(
|
||||
lat=10.1002, lon=20.0998
|
||||
)
|
||||
|
||||
assert result["type"] is FlowResultType.CREATE_ENTRY
|
||||
assert result["title"] == "Google Air Quality"
|
||||
@@ -281,7 +283,7 @@ async def test_subentry_flow(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# After initial setup for 1 subentry, each API is called once
|
||||
assert mock_api.async_air_quality.call_count == 1
|
||||
assert mock_api.async_get_current_conditions.call_count == 1
|
||||
|
||||
result = await hass.config_entries.subentries.async_init(
|
||||
(mock_config_entry.entry_id, "location"),
|
||||
@@ -313,7 +315,7 @@ async def test_subentry_flow(
|
||||
# Initial setup: 1 of each API call
|
||||
# Subentry flow validation: 1 current conditions call
|
||||
# Reload with 2 subentries: 2 of each API call
|
||||
assert mock_api.async_air_quality.call_count == 1 + 1 + 2
|
||||
assert mock_api.async_get_current_conditions.call_count == 1 + 1 + 2
|
||||
|
||||
entry = hass.config_entries.async_get_entry(mock_config_entry.entry_id)
|
||||
assert len(entry.subentries) == 2
|
||||
|
||||
@@ -33,7 +33,7 @@ async def test_config_not_ready(
|
||||
) -> None:
|
||||
"""Test for setup failure if an API call fails."""
|
||||
mock_config_entry.add_to_hass(hass)
|
||||
mock_api.async_air_quality.side_effect = GoogleAirQualityApiError()
|
||||
mock_api.async_get_current_conditions.side_effect = GoogleAirQualityApiError()
|
||||
|
||||
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user