Skip to content

Commit

Permalink
Add strict typing to openexchangerates (#76004)
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinHjelmare committed Aug 1, 2022
1 parent 81d1786 commit 826de70
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 24 deletions.
1 change: 1 addition & 0 deletions .strict-typing
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ homeassistant.components.nut.*
homeassistant.components.oncue.*
homeassistant.components.onewire.*
homeassistant.components.open_meteo.*
homeassistant.components.openexchangerates.*
homeassistant.components.openuv.*
homeassistant.components.peco.*
homeassistant.components.overkiz.*
Expand Down
47 changes: 23 additions & 24 deletions homeassistant/components/openexchangerates/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,13 @@
from datetime import timedelta
from http import HTTPStatus
import logging
from typing import Any

import requests
import voluptuous as vol

from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
from homeassistant.const import (
ATTR_ATTRIBUTION,
CONF_API_KEY,
CONF_BASE,
CONF_NAME,
CONF_QUOTE,
)
from homeassistant.const import CONF_API_KEY, CONF_BASE, CONF_NAME, CONF_QUOTE
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
Expand Down Expand Up @@ -49,10 +44,10 @@ def setup_platform(
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the Open Exchange Rates sensor."""
name = config.get(CONF_NAME)
api_key = config.get(CONF_API_KEY)
base = config.get(CONF_BASE)
quote = config.get(CONF_QUOTE)
name: str = config[CONF_NAME]
api_key: str = config[CONF_API_KEY]
base: str = config[CONF_BASE]
quote: str = config[CONF_QUOTE]

parameters = {"base": base, "app_id": api_key}

Expand All @@ -70,55 +65,59 @@ def setup_platform(
class OpenexchangeratesSensor(SensorEntity):
"""Representation of an Open Exchange Rates sensor."""

def __init__(self, rest, name, quote):
_attr_attribution = ATTRIBUTION

def __init__(self, rest: OpenexchangeratesData, name: str, quote: str) -> None:
"""Initialize the sensor."""
self.rest = rest
self._name = name
self._quote = quote
self._state = None
self._state: float | None = None

@property
def name(self):
def name(self) -> str:
"""Return the name of the sensor."""
return self._name

@property
def native_value(self):
def native_value(self) -> float | None:
"""Return the state of the sensor."""
return self._state

@property
def extra_state_attributes(self):
def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return other attributes of the sensor."""
attr = self.rest.data
attr[ATTR_ATTRIBUTION] = ATTRIBUTION

return attr

def update(self):
def update(self) -> None:
"""Update current conditions."""
self.rest.update()
value = self.rest.data
self._state = round(value[str(self._quote)], 4)
if (value := self.rest.data) is None:
self._attr_available = False
return

self._attr_available = True
self._state = round(value[self._quote], 4)


class OpenexchangeratesData:
"""Get data from Openexchangerates.org."""

def __init__(self, resource, parameters, quote):
def __init__(self, resource: str, parameters: dict[str, str], quote: str) -> None:
"""Initialize the data object."""
self._resource = resource
self._parameters = parameters
self._quote = quote
self.data = None
self.data: dict[str, Any] | None = None

@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self):
def update(self) -> None:
"""Get the latest data from openexchangerates.org."""
try:
result = requests.get(self._resource, params=self._parameters, timeout=10)
self.data = result.json()["rates"]
except requests.exceptions.HTTPError:
_LOGGER.error("Check the Openexchangerates API key")
self.data = None
return False
11 changes: 11 additions & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1769,6 +1769,17 @@ no_implicit_optional = true
warn_return_any = true
warn_unreachable = true

[mypy-homeassistant.components.openexchangerates.*]
check_untyped_defs = true
disallow_incomplete_defs = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_decorators = true
disallow_untyped_defs = true
no_implicit_optional = true
warn_return_any = true
warn_unreachable = true

[mypy-homeassistant.components.openuv.*]
check_untyped_defs = true
disallow_incomplete_defs = true
Expand Down

0 comments on commit 826de70

Please sign in to comment.