Update api infos (#28)

* New cleanup

* Cleanup addons data object from api stuff.

* Fix lint

* Fix repo export

* Fix part 2

* Update API.md
This commit is contained in:
Pascal Vizeli 2017-05-02 18:50:35 +02:00 committed by GitHub
parent dbe6b860c7
commit f6048467ad
5 changed files with 70 additions and 67 deletions

12
API.md
View File

@ -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 <fla@dld.ch>"
"source": "URL_OF_REPOSITORY",
"url": "null|WEBSITE",
"maintainer": "null|BLA BLU <fla@dld.ch>"
}
]
}

View File

@ -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."""

View File

@ -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}

View File

@ -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

View File

@ -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'