From f6048467adf1ef2550b1ae83e244473b29fb648c Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 2 May 2017 18:50:35 +0200 Subject: [PATCH] Update api infos (#28) * New cleanup * Cleanup addons data object from api stuff. * Fix lint * Fix repo export * Fix part 2 * Update API.md --- API.md | 12 ++++--- hassio/addons/data.py | 69 +++++++--------------------------------- hassio/addons/util.py | 5 +++ hassio/api/supervisor.py | 50 ++++++++++++++++++++++++++--- hassio/const.py | 1 + 5 files changed, 70 insertions(+), 67 deletions(-) diff --git a/API.md b/API.md index 90b3244c9..84f93fbb4 100644 --- a/API.md +++ b/API.md @@ -37,8 +37,9 @@ The addons from `addons` are only installed one. { "name": "xy bla", "slug": "xy", - "version": "INSTALL_VERSION", - "last_version": "VERSION_FOR_UPDATE", + "repository": "12345678|null", + "version": "LAST_VERSION", + "installed": "INSTALL_VERSION", "detached": "bool", "description": "description" } @@ -59,7 +60,7 @@ Get all available addons { "name": "xy bla", "slug": "xy", - "repository": "12345678|null", + "repository": "core|local|REP_ID", "version": "LAST_VERSION", "installed": "none|INSTALL_VERSION", "detached": "bool", @@ -70,8 +71,9 @@ Get all available addons { "slug": "12345678", "name": "Repitory Name", - "url": "WEBSITE", - "maintainer": "BLA BLU " + "source": "URL_OF_REPOSITORY", + "url": "null|WEBSITE", + "maintainer": "null|BLA BLU " } ] } diff --git a/hassio/addons/data.py b/hassio/addons/data.py index 5248778a6..28a7dc08f 100644 --- a/hassio/addons/data.py +++ b/hassio/addons/data.py @@ -12,9 +12,8 @@ from .validate import ( from ..const import ( FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO, - DOCKER_REPO, ATTR_INSTALLED, ATTR_SCHEMA, ATTR_IMAGE, ATTR_DETACHED, - MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL, - ATTR_MAINTAINER, ATTR_LAST_VERSION) + DOCKER_REPO, ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS, + MAP_BACKUP, ATTR_REPOSITORY) from ..config import Config from ..tools import read_json_file, write_json_file @@ -142,48 +141,12 @@ class AddonsData(Config): return set(self._system_data.keys()) @property - def list_all_api(self): - """Return a list of available addons for api.""" - data = [] - all_addons = {**self._system_data, **self._addons_cache} - detached = self.list_detached - - for addon, values in all_addons.items(): - i_version = self._user_data.get(addon, {}).get(ATTR_VERSION) - - data.append({ - ATTR_NAME: values[ATTR_NAME], - ATTR_SLUG: addon, - ATTR_DESCRIPTON: values[ATTR_DESCRIPTON], - ATTR_VERSION: values[ATTR_VERSION], - ATTR_INSTALLED: i_version, - ATTR_DETACHED: addon in detached, - ATTR_REPOSITORY: values[ATTR_REPOSITORY], - }) - - return data - - @property - def list_installed_api(self): - """Return a list of available addons for api.""" - data = [] - all_addons = {**self._system_data, **self._addons_cache} - detached = self.list_detached - - for addon, values in all_addons.items(): - i_version = self._user_data.get(addon, {}).get(ATTR_VERSION) - - data.append({ - ATTR_NAME: values[ATTR_NAME], - ATTR_SLUG: addon, - ATTR_DESCRIPTON: values[ATTR_DESCRIPTON], - ATTR_VERSION: values[ATTR_VERSION], - ATTR_LAST_VERSION: values[ATTR_VERSION], - ATTR_INSTALLED: i_version, - ATTR_DETACHED: addon in detached - }) - - return data + def list_all(self): + """Return a list of all addons.""" + return { + **self._system_data, + **self._addons_cache + } def list_startup(self, start_type): """Get list of installed addon with need start by type.""" @@ -212,19 +175,9 @@ class AddonsData(Config): return addon_list @property - def list_repositories_api(self): + def list_repositories(self): """Return list of addon repositories.""" - repositories = [] - - for slug, data in self._repositories_data.items(): - repositories.append({ - ATTR_SLUG: slug, - ATTR_NAME: data[ATTR_NAME], - ATTR_URL: data.get(ATTR_URL), - ATTR_MAINTAINER: data.get(ATTR_MAINTAINER), - }) - - return repositories + return list(self._repositories_data.values()) def exists_addon(self, addon): """Return True if a addon exists.""" @@ -236,7 +189,7 @@ class AddonsData(Config): def version_installed(self, addon): """Return installed version.""" - return self._user_data[addon][ATTR_VERSION] + return self._user_data.get(addon, {}).get(ATTR_VERSION) def set_addon_install(self, addon, version): """Set addon as installed.""" diff --git a/hassio/addons/util.py b/hassio/addons/util.py index 152c28866..c0d097734 100644 --- a/hassio/addons/util.py +++ b/hassio/addons/util.py @@ -19,3 +19,8 @@ def extract_hash_from_path(path): if not RE_SHA1.match(repo_dir): return get_hash_from_repository(repo_dir) return repo_dir + + +def create_hash_index_list(name_list): + """Create a dict with hash from repositories list.""" + return {get_hash_from_repository(repo): repo for repo in name_list} diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index 8fc841af3..289c07c43 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -5,9 +5,12 @@ import logging import voluptuous as vol from .util import api_process, api_process_raw, api_validate +from ..addons.util import create_hash_index_list from ..const import ( ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL, - HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES) + HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES, + ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, + ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL) _LOGGER = logging.getLogger(__name__) @@ -33,6 +36,42 @@ class APISupervisor(object): self.addons = addons self.host_control = host_control + def _addons_list(self, only_installed): + """Return a list of addons.""" + data = [] + detached = self.addons.list_detached + + for addon, values in self.addons.list_all.items(): + i_version = self.addons.version_installed(addon) + + data.append({ + ATTR_NAME: values[ATTR_NAME], + ATTR_SLUG: addon, + ATTR_DESCRIPTON: values[ATTR_DESCRIPTON], + ATTR_VERSION: values[ATTR_VERSION], + ATTR_INSTALLED: i_version, + ATTR_DETACHED: addon in detached, + ATTR_REPOSITORY: values[ATTR_REPOSITORY], + }) + + return data + + def _repositories_list(self): + """Return a list of addons repositories.""" + repositories = [] + list_id = create_hash_index_list(self.config.addons_repositories) + + for repository in self.addons.list_repositories: + repository.append({ + ATTR_SLUG: repository[ATTR_SLUG], + ATTR_NAME: repository[ATTR_NAME], + ATTR_SOURCE: list_id.get(repository[ATTR_SLUG]), + ATTR_URL: repository.get(ATTR_URL), + ATTR_MAINTAINER: repository.get(ATTR_MAINTAINER), + }) + + return repositories + @api_process async def ping(self, request): """Return ok for signal that the api is ready.""" @@ -45,7 +84,7 @@ class APISupervisor(object): ATTR_VERSION: HASSIO_VERSION, ATTR_LAST_VERSION: self.config.last_hassio, ATTR_BETA_CHANNEL: self.config.upstream_beta, - ATTR_ADDONS: self.addons.list_installed_api, + ATTR_ADDONS: self._addons_list(only_installed=True), ATTR_ADDONS_REPOSITORIES: self.config.addons_repositories, } @@ -53,8 +92,8 @@ class APISupervisor(object): async def available_addons(self, request): """Return information for all available addons.""" return { - ATTR_ADDONS: self.addons.list_all_api, - ATTR_REPOSITORIES: self.addons.list_repositories_api, + ATTR_ADDONS: self._addons_list(only_installed=False), + ATTR_REPOSITORIES: self._repositories_list(), } @api_process @@ -80,6 +119,9 @@ class APISupervisor(object): for url in set(old - new): self.addons.drop_git_repository(url) + # read repository + self.addons.read_data_from_repositories() + return True @api_process diff --git a/hassio/const.py b/hassio/const.py index 74597396b..8acc3e84c 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -36,6 +36,7 @@ RESULT_OK = 'ok' ATTR_HOSTNAME = 'hostname' ATTR_OS = 'os' ATTR_TYPE = 'type' +ATTR_SOURCE = 'source' ATTR_FEATURES = 'features' ATTR_ADDONS = 'addons' ATTR_VERSION = 'version'