Complete typehinting in CoreSys (#1745)

* Complete typehinting in CoreSys

* Improve Addon model abstraction, solving Pylint warning
This commit is contained in:
Franck Nijhof 2020-05-22 17:05:40 +02:00 committed by GitHub
parent 33bbd92d9b
commit 6caec79958
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 85 additions and 40 deletions

View File

@ -2,6 +2,8 @@
reports=no reports=no
jobs=2 jobs=2
good-names=id,i,j,k,ex,Run,_,fp,T
# Reasons disabled: # Reasons disabled:
# format - handled by black # format - handled by black
# locally-disabled - it spams too much # locally-disabled - it spams too much

View File

@ -71,9 +71,8 @@ class Addon(AddonModel):
def __init__(self, coresys: CoreSys, slug: str): def __init__(self, coresys: CoreSys, slug: str):
"""Initialize data holder.""" """Initialize data holder."""
self.coresys: CoreSys = coresys super().__init__(coresys, slug)
self.instance: DockerAddon = DockerAddon(coresys, self) self.instance: DockerAddon = DockerAddon(coresys, self)
self.slug: str = slug
async def load(self) -> None: async def load(self) -> None:
"""Async initialize of object.""" """Async initialize of object."""

View File

@ -65,7 +65,7 @@ from ..const import (
SECURITY_PROFILE, SECURITY_PROFILE,
AddonStages, AddonStages,
) )
from ..coresys import CoreSysAttributes from ..coresys import CoreSys, CoreSysAttributes
from .validate import RE_SERVICE, RE_VOLUME, schema_ui_options, validate_options from .validate import RE_SERVICE, RE_VOLUME, schema_ui_options, validate_options
Data = Dict[str, Any] Data = Dict[str, Any]
@ -74,7 +74,10 @@ Data = Dict[str, Any]
class AddonModel(CoreSysAttributes): class AddonModel(CoreSysAttributes):
"""Add-on Data layout.""" """Add-on Data layout."""
slug: str = None def __init__(self, coresys: CoreSys, slug: str):
"""Initialize data holder."""
self.coresys: CoreSys = coresys
self.slug: str = slug
@property @property
def data(self) -> Data: def data(self) -> Data:

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Any, Callable, Coroutine, Optional, TypeVar
import aiohttp import aiohttp
@ -35,6 +35,9 @@ if TYPE_CHECKING:
from .plugins import PluginManager from .plugins import PluginManager
T = TypeVar("T")
class CoreSys: class CoreSys:
"""Class that handle all shared data.""" """Class that handle all shared data."""
@ -82,6 +85,8 @@ class CoreSys:
@property @property
def dev(self) -> bool: def dev(self) -> bool:
"""Return True if we run dev mode.""" """Return True if we run dev mode."""
if self._updater is None:
return False
return self._updater.channel == UpdateChannels.DEV return self._updater.channel == UpdateChannels.DEV
@property @property
@ -127,10 +132,12 @@ class CoreSys:
@property @property
def core(self) -> Core: def core(self) -> Core:
"""Return core object.""" """Return core object."""
if self._core is None:
raise RuntimeError("Core not set!")
return self._core return self._core
@core.setter @core.setter
def core(self, value: Core): def core(self, value: Core) -> None:
"""Set a Core object.""" """Set a Core object."""
if self._core: if self._core:
raise RuntimeError("Core already set!") raise RuntimeError("Core already set!")
@ -139,10 +146,12 @@ class CoreSys:
@property @property
def plugins(self) -> PluginManager: def plugins(self) -> PluginManager:
"""Return PluginManager object.""" """Return PluginManager object."""
if self._plugins is None:
raise RuntimeError("PluginManager not set!")
return self._plugins return self._plugins
@plugins.setter @plugins.setter
def plugins(self, value: PluginManager): def plugins(self, value: PluginManager) -> None:
"""Set a PluginManager object.""" """Set a PluginManager object."""
if self._plugins: if self._plugins:
raise RuntimeError("PluginManager already set!") raise RuntimeError("PluginManager already set!")
@ -151,10 +160,12 @@ class CoreSys:
@property @property
def arch(self) -> CpuArch: def arch(self) -> CpuArch:
"""Return CpuArch object.""" """Return CpuArch object."""
if self._arch is None:
raise RuntimeError("CpuArch not set!")
return self._arch return self._arch
@arch.setter @arch.setter
def arch(self, value: CpuArch): def arch(self, value: CpuArch) -> None:
"""Set a CpuArch object.""" """Set a CpuArch object."""
if self._arch: if self._arch:
raise RuntimeError("CpuArch already set!") raise RuntimeError("CpuArch already set!")
@ -163,10 +174,12 @@ class CoreSys:
@property @property
def auth(self) -> Auth: def auth(self) -> Auth:
"""Return Auth object.""" """Return Auth object."""
if self._auth is None:
raise RuntimeError("Auth not set!")
return self._auth return self._auth
@auth.setter @auth.setter
def auth(self, value: Auth): def auth(self, value: Auth) -> None:
"""Set a Auth object.""" """Set a Auth object."""
if self._auth: if self._auth:
raise RuntimeError("Auth already set!") raise RuntimeError("Auth already set!")
@ -175,10 +188,12 @@ class CoreSys:
@property @property
def homeassistant(self) -> HomeAssistant: def homeassistant(self) -> HomeAssistant:
"""Return Home Assistant object.""" """Return Home Assistant object."""
if self._homeassistant is None:
raise RuntimeError("Home Assistant not set!")
return self._homeassistant return self._homeassistant
@homeassistant.setter @homeassistant.setter
def homeassistant(self, value: HomeAssistant): def homeassistant(self, value: HomeAssistant) -> None:
"""Set a HomeAssistant object.""" """Set a HomeAssistant object."""
if self._homeassistant: if self._homeassistant:
raise RuntimeError("Home Assistant already set!") raise RuntimeError("Home Assistant already set!")
@ -187,10 +202,12 @@ class CoreSys:
@property @property
def supervisor(self) -> Supervisor: def supervisor(self) -> Supervisor:
"""Return Supervisor object.""" """Return Supervisor object."""
if self._supervisor is None:
raise RuntimeError("Supervisor not set!")
return self._supervisor return self._supervisor
@supervisor.setter @supervisor.setter
def supervisor(self, value: Supervisor): def supervisor(self, value: Supervisor) -> None:
"""Set a Supervisor object.""" """Set a Supervisor object."""
if self._supervisor: if self._supervisor:
raise RuntimeError("Supervisor already set!") raise RuntimeError("Supervisor already set!")
@ -199,10 +216,12 @@ class CoreSys:
@property @property
def api(self) -> RestAPI: def api(self) -> RestAPI:
"""Return API object.""" """Return API object."""
if self._api is None:
raise RuntimeError("API not set!")
return self._api return self._api
@api.setter @api.setter
def api(self, value: RestAPI): def api(self, value: RestAPI) -> None:
"""Set an API object.""" """Set an API object."""
if self._api: if self._api:
raise RuntimeError("API already set!") raise RuntimeError("API already set!")
@ -211,10 +230,12 @@ class CoreSys:
@property @property
def updater(self) -> Updater: def updater(self) -> Updater:
"""Return Updater object.""" """Return Updater object."""
if self._updater is None:
raise RuntimeError("Updater not set!")
return self._updater return self._updater
@updater.setter @updater.setter
def updater(self, value: Updater): def updater(self, value: Updater) -> None:
"""Set a Updater object.""" """Set a Updater object."""
if self._updater: if self._updater:
raise RuntimeError("Updater already set!") raise RuntimeError("Updater already set!")
@ -223,10 +244,12 @@ class CoreSys:
@property @property
def secrets(self) -> SecretsManager: def secrets(self) -> SecretsManager:
"""Return SecretsManager object.""" """Return SecretsManager object."""
if self._secrets is None:
raise RuntimeError("SecretsManager not set!")
return self._secrets return self._secrets
@secrets.setter @secrets.setter
def secrets(self, value: SecretsManager): def secrets(self, value: SecretsManager) -> None:
"""Set a Updater object.""" """Set a Updater object."""
if self._secrets: if self._secrets:
raise RuntimeError("SecretsManager already set!") raise RuntimeError("SecretsManager already set!")
@ -235,10 +258,12 @@ class CoreSys:
@property @property
def addons(self) -> AddonManager: def addons(self) -> AddonManager:
"""Return AddonManager object.""" """Return AddonManager object."""
if self._addons is None:
raise RuntimeError("AddonManager not set!")
return self._addons return self._addons
@addons.setter @addons.setter
def addons(self, value: AddonManager): def addons(self, value: AddonManager) -> None:
"""Set a AddonManager object.""" """Set a AddonManager object."""
if self._addons: if self._addons:
raise RuntimeError("AddonManager already set!") raise RuntimeError("AddonManager already set!")
@ -247,10 +272,12 @@ class CoreSys:
@property @property
def store(self) -> StoreManager: def store(self) -> StoreManager:
"""Return StoreManager object.""" """Return StoreManager object."""
if self._store is None:
raise RuntimeError("StoreManager not set!")
return self._store return self._store
@store.setter @store.setter
def store(self, value: StoreManager): def store(self, value: StoreManager) -> None:
"""Set a StoreManager object.""" """Set a StoreManager object."""
if self._store: if self._store:
raise RuntimeError("StoreManager already set!") raise RuntimeError("StoreManager already set!")
@ -259,10 +286,12 @@ class CoreSys:
@property @property
def snapshots(self) -> SnapshotManager: def snapshots(self) -> SnapshotManager:
"""Return SnapshotManager object.""" """Return SnapshotManager object."""
if self._snapshots is None:
raise RuntimeError("SnapshotManager not set!")
return self._snapshots return self._snapshots
@snapshots.setter @snapshots.setter
def snapshots(self, value: SnapshotManager): def snapshots(self, value: SnapshotManager) -> None:
"""Set a SnapshotManager object.""" """Set a SnapshotManager object."""
if self._snapshots: if self._snapshots:
raise RuntimeError("SnapshotsManager already set!") raise RuntimeError("SnapshotsManager already set!")
@ -271,10 +300,12 @@ class CoreSys:
@property @property
def tasks(self) -> Tasks: def tasks(self) -> Tasks:
"""Return Tasks object.""" """Return Tasks object."""
if self._tasks is None:
raise RuntimeError("Tasks not set!")
return self._tasks return self._tasks
@tasks.setter @tasks.setter
def tasks(self, value: Tasks): def tasks(self, value: Tasks) -> None:
"""Set a Tasks object.""" """Set a Tasks object."""
if self._tasks: if self._tasks:
raise RuntimeError("Tasks already set!") raise RuntimeError("Tasks already set!")
@ -283,10 +314,12 @@ class CoreSys:
@property @property
def services(self) -> ServiceManager: def services(self) -> ServiceManager:
"""Return ServiceManager object.""" """Return ServiceManager object."""
if self._services is None:
raise RuntimeError("Services not set!")
return self._services return self._services
@services.setter @services.setter
def services(self, value: ServiceManager): def services(self, value: ServiceManager) -> None:
"""Set a ServiceManager object.""" """Set a ServiceManager object."""
if self._services: if self._services:
raise RuntimeError("Services already set!") raise RuntimeError("Services already set!")
@ -295,10 +328,12 @@ class CoreSys:
@property @property
def discovery(self) -> Discovery: def discovery(self) -> Discovery:
"""Return ServiceManager object.""" """Return ServiceManager object."""
if self._discovery is None:
raise RuntimeError("Discovery not set!")
return self._discovery return self._discovery
@discovery.setter @discovery.setter
def discovery(self, value: Discovery): def discovery(self, value: Discovery) -> None:
"""Set a Discovery object.""" """Set a Discovery object."""
if self._discovery: if self._discovery:
raise RuntimeError("Discovery already set!") raise RuntimeError("Discovery already set!")
@ -307,10 +342,12 @@ class CoreSys:
@property @property
def dbus(self) -> DBusManager: def dbus(self) -> DBusManager:
"""Return DBusManager object.""" """Return DBusManager object."""
if self._dbus is None:
raise RuntimeError("DBusManager not set!")
return self._dbus return self._dbus
@dbus.setter @dbus.setter
def dbus(self, value: DBusManager): def dbus(self, value: DBusManager) -> None:
"""Set a DBusManager object.""" """Set a DBusManager object."""
if self._dbus: if self._dbus:
raise RuntimeError("DBusManager already set!") raise RuntimeError("DBusManager already set!")
@ -319,10 +356,12 @@ class CoreSys:
@property @property
def host(self) -> HostManager: def host(self) -> HostManager:
"""Return HostManager object.""" """Return HostManager object."""
if self._host is None:
raise RuntimeError("HostManager not set!")
return self._host return self._host
@host.setter @host.setter
def host(self, value: HostManager): def host(self, value: HostManager) -> None:
"""Set a HostManager object.""" """Set a HostManager object."""
if self._host: if self._host:
raise RuntimeError("HostManager already set!") raise RuntimeError("HostManager already set!")
@ -331,10 +370,12 @@ class CoreSys:
@property @property
def hwmonitor(self) -> HwMonitor: def hwmonitor(self) -> HwMonitor:
"""Return HwMonitor object.""" """Return HwMonitor object."""
if self._hwmonitor is None:
raise RuntimeError("HwMonitor not set!")
return self._hwmonitor return self._hwmonitor
@hwmonitor.setter @hwmonitor.setter
def hwmonitor(self, value: HwMonitor): def hwmonitor(self, value: HwMonitor) -> None:
"""Set a HwMonitor object.""" """Set a HwMonitor object."""
if self._hwmonitor: if self._hwmonitor:
raise RuntimeError("HwMonitor already set!") raise RuntimeError("HwMonitor already set!")
@ -343,10 +384,12 @@ class CoreSys:
@property @property
def ingress(self) -> Ingress: def ingress(self) -> Ingress:
"""Return Ingress object.""" """Return Ingress object."""
if self._ingress is None:
raise RuntimeError("Ingress not set!")
return self._ingress return self._ingress
@ingress.setter @ingress.setter
def ingress(self, value: Ingress): def ingress(self, value: Ingress) -> None:
"""Set a Ingress object.""" """Set a Ingress object."""
if self._ingress: if self._ingress:
raise RuntimeError("Ingress already set!") raise RuntimeError("Ingress already set!")
@ -355,10 +398,12 @@ class CoreSys:
@property @property
def hassos(self) -> HassOS: def hassos(self) -> HassOS:
"""Return HassOS object.""" """Return HassOS object."""
if self._hassos is None:
raise RuntimeError("HassOS not set!")
return self._hassos return self._hassos
@hassos.setter @hassos.setter
def hassos(self, value: HassOS): def hassos(self, value: HassOS) -> None:
"""Set a HassOS object.""" """Set a HassOS object."""
if self._hassos: if self._hassos:
raise RuntimeError("HassOS already set!") raise RuntimeError("HassOS already set!")
@ -370,7 +415,7 @@ class CoreSys:
return self._machine return self._machine
@machine.setter @machine.setter
def machine(self, value: str): def machine(self, value: str) -> None:
"""Set a machine type string.""" """Set a machine type string."""
if self._machine: if self._machine:
raise RuntimeError("Machine type already set!") raise RuntimeError("Machine type already set!")
@ -382,7 +427,7 @@ class CoreSys:
return self._machine_id return self._machine_id
@machine_id.setter @machine_id.setter
def machine_id(self, value: str): def machine_id(self, value: str) -> None:
"""Set a machine-id type string.""" """Set a machine-id type string."""
if self._machine_id: if self._machine_id:
raise RuntimeError("Machine-ID type already set!") raise RuntimeError("Machine-ID type already set!")
@ -390,17 +435,17 @@ class CoreSys:
class CoreSysAttributes: class CoreSysAttributes:
"""Inheret basic CoreSysAttributes.""" """Inherit basic CoreSysAttributes."""
coresys = None coresys: CoreSys
@property @property
def sys_machine(self) -> str: def sys_machine(self) -> Optional[str]:
"""Return running machine type of the Supervisor system.""" """Return running machine type of the Supervisor system."""
return self.coresys.machine return self.coresys.machine
@property @property
def sys_dev(self) -> str: def sys_dev(self) -> bool:
"""Return True if we run dev mode.""" """Return True if we run dev mode."""
return self.coresys.dev return self.coresys.dev
@ -410,7 +455,7 @@ class CoreSysAttributes:
return self.coresys.timezone return self.coresys.timezone
@property @property
def sys_machine_id(self) -> str: def sys_machine_id(self) -> Optional[str]:
"""Return timezone.""" """Return timezone."""
return self.coresys.machine_id return self.coresys.machine_id
@ -549,10 +594,12 @@ class CoreSysAttributes:
"""Return HassOS object.""" """Return HassOS object."""
return self.coresys.hassos return self.coresys.hassos
def sys_run_in_executor(self, funct, *args) -> asyncio.Future: def sys_run_in_executor(
self, funct: Callable[..., T], *args: Any
) -> Coroutine[Any, Any, T]:
"""Add an job to the executor pool.""" """Add an job to the executor pool."""
return self.sys_loop.run_in_executor(None, funct, *args) return self.sys_loop.run_in_executor(None, funct, *args)
def sys_create_task(self, coroutine) -> asyncio.Task: def sys_create_task(self, coroutine: Coroutine) -> asyncio.Task:
"""Create an async task.""" """Create an async task."""
return self.sys_loop.create_task(coroutine) return self.sys_loop.create_task(coroutine)

View File

@ -2,7 +2,6 @@
import logging import logging
from ..addons.model import AddonModel, Data from ..addons.model import AddonModel, Data
from ..coresys import CoreSys
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@ -10,11 +9,6 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
class AddonStore(AddonModel): class AddonStore(AddonModel):
"""Hold data for add-on inside Supervisor.""" """Hold data for add-on inside Supervisor."""
def __init__(self, coresys: CoreSys, slug: str):
"""Initialize data holder."""
self.coresys: CoreSys = coresys
self.slug: str = slug
@property @property
def data(self) -> Data: def data(self) -> Data:
"""Return add-on data/config.""" """Return add-on data/config."""