Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolve uk-ua errors in neon-iris web UI #603

Merged
merged 4 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ RUN pip install wheel && \
pip install .[docker]

COPY docker_overlay/ /
RUN chmod ugo+x /root/run.sh
RUN chmod ugo+x /root/run.sh && \
neon update-default-resources

CMD ["/root/run.sh"]

Expand Down
4 changes: 4 additions & 0 deletions docker_overlay/etc/neon/neon.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
language:
supported_langs:
- en
- uk
skills:
wait_for_internet: false
extra_directories:
Expand Down
9 changes: 9 additions & 0 deletions neon_core/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ def install_default_skills():
click.echo("Default Skills Installed")


@neon_core_cli.command(help="Ensure default resource files are available")
def update_default_resources():
from neon_core.util.skill_utils import update_default_resources
click.echo("Updating Default Resources")
update_default_resources()

# @neon_core_cli.command(help=
# "Install skill requirements for a specified directory")
# @click.argument("skill_dir")
Expand All @@ -102,6 +108,9 @@ def run_skills(install_skills):
from neon_utils.configuration_utils import init_config_dir
init_config_dir()

from neon_core.util.skill_utils import update_default_resources
update_default_resources()

# from neon_core.util.skill_utils import install_local_skills
from neon_core.skills.__main__ import main
if install_skills:
Expand Down
2 changes: 2 additions & 0 deletions neon_core/configuration/neon.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ ignore_logs:
- enclosure.mouth.viseme
- enclosure.mouth.display

data_dir: ~/.cache/neon/res

# Backwards-compat semi-deprecated
precise:
use_precise: true
Expand Down
1 change: 1 addition & 0 deletions neon_core/res/text/uk-ua/skill.error.dialog
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Виникла помилка під час обробки запиту в {{skill}}.
31 changes: 27 additions & 4 deletions neon_core/util/skill_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,13 @@
import re

from copy import copy
from os import listdir, makedirs
from os import listdir, makedirs, symlink
from tempfile import mkdtemp
from shutil import rmtree
from os.path import expanduser, join, isdir, dirname
from os.path import expanduser, join, isdir, dirname, islink
from typing import List

from ovos_utils.xdg_utils import xdg_data_home
from ovos_skill_installer import download_extract_zip
from ovos_utils.log import LOG, log_deprecation

from ovos_config.config import Configuration
Expand All @@ -51,11 +50,12 @@ def get_neon_skills_data(skill_meta_repository: str =
"""
Get skill data from configured neon_skills repository.
:param skill_meta_repository: URL of skills repository containing metadata
:param branch: branch of repository to checkout
:param branch: branch of repository to check out
:param repo_metadata_path: Path to repo directory containing json metadata files
"""
log_deprecation("This skill repository format is deprecated; specify skills as packages")
from ovos_skills_manager.github import normalize_github_url, download_url_from_github_url
from ovos_skill_installer import download_extract_zip
skills_data = dict()
temp_download_dir = mkdtemp()
zip_url = download_url_from_github_url(skill_meta_repository, branch)
Expand Down Expand Up @@ -229,3 +229,26 @@ def _get_skills_from_remote_list(url: str) -> List[str]:
LOG.error(f"Unable to fetch skills list from: {url} ({resp.status_code})")
return []
return [s for s in resp.text.split("\n") if s.strip() and not s.startswith('#')]


def update_default_resources():
"""
Ensure the `res` directory contents are available at the configured data_dir
"""
res_dir = Configuration().get('data_dir')
if not res_dir:
LOG.info("`data_dir` is None; not linking default resources.")
return
res_dir = expanduser(res_dir)
if isdir(res_dir):
LOG.info(f"Directory exists; not linking default resources. {res_dir}")
return
if islink(res_dir):
LOG.debug(f"Link exists; not doing anything.")
return
if not isdir(dirname(res_dir)):
# Ensure directory exists to link default resources in
makedirs(dirname(res_dir))

symlink(join(dirname(dirname(__file__)), "res"), res_dir)
LOG.debug("Updated Neon default resources")
4 changes: 2 additions & 2 deletions requirements/skills_default.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
skill-ddg==0.0.2a3
neon-skill-alerts~=2.0
neon-skill-caffeinewiz~=1.0
neon-skill-caffeinewiz~=1.0,>=1.0.1a2
neon-skill-data_controls~=2.0
neon-skill-fallback_wolfram_alpha~=1.0
neon-skill-personal~=1.0
neon-skill-personal~=1.0,>=1.0.1a2
neon-skill-speak~=2.0
neon-skill-speed_test~=1.0,>=1.0.1
neon-skill-spelling~=1.0
Expand Down
47 changes: 38 additions & 9 deletions test/test_skill_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
import shutil
import sys
import unittest

from os.path import dirname, join, exists, isdir
from unittest.mock import patch

sys.path.append(os.path.dirname(os.path.dirname(__file__)))

Expand Down Expand Up @@ -97,17 +98,21 @@ def test_install_skills_from_list_with_auth(self):
self.assertEqual(len(skill_dirs), len(TEST_SKILLS_WITH_AUTH))
self.assertIn("i-like-brands.neon.neongeckocom", skill_dirs)

def test_install_skills_default(self):
@patch("neon_core.util.skill_utils.install_skills_from_list")
def test_install_skills_default(self, install_skills):
from neon_core.util.skill_utils import install_skills_default,\
_get_skills_from_remote_list
install_skills_default(SKILL_CONFIG)
skill_dirs = [d for d in os.listdir(SKILL_DIR) if
os.path.isdir(os.path.join(SKILL_DIR, d))]
self.assertEqual(
len(skill_dirs),
len(_get_skills_from_remote_list(SKILL_CONFIG["default_skills"])),
f"{skill_dirs}\n\n"
f"{_get_skills_from_remote_list(SKILL_CONFIG['default_skills'])}")
expected = _get_skills_from_remote_list(SKILL_CONFIG["default_skills"])
install_skills.assert_called_once_with(expected,
install_skills.call_args[0][1])
# skill_dirs = [d for d in os.listdir(SKILL_DIR) if
# os.path.isdir(os.path.join(SKILL_DIR, d))]
# self.assertEqual(
# len(skill_dirs),
# len(_get_skills_from_remote_list(SKILL_CONFIG["default_skills"])),
# f"{skill_dirs}\n\n"
# f"{_get_skills_from_remote_list(SKILL_CONFIG['default_skills'])}")

def test_install_skills_with_pip(self):
from neon_core.util.skill_utils import install_skills_from_list
Expand Down Expand Up @@ -243,6 +248,30 @@ def test_skill_class_patches(self):
# # Class added in ovos-workwhop 0.0.12
# pass

@patch("neon_core.util.skill_utils.Configuration")
def test_update_default_resources(self, config):
from neon_core.util.skill_utils import update_default_resources
mock_config = {"data_dir": join(dirname(__file__), "test_resources",
"res")}
config.return_value = mock_config

# Valid create resource path
update_default_resources()
self.assertTrue(exists(mock_config['data_dir']))
self.assertTrue(isdir(join(mock_config['data_dir'], "text", "uk-ua")))

# Valid path already exists
update_default_resources()
self.assertTrue(exists(mock_config['data_dir']))
self.assertTrue(isdir(join(mock_config['data_dir'], "text", "uk-ua")))

os.remove(mock_config['data_dir'])

# Invalid path already exists
mock_config['data_dir'] = dirname(__file__)
update_default_resources()
self.assertFalse(isdir(join(mock_config['data_dir'], "text", "uk-ua")))


if __name__ == '__main__':
unittest.main()
Loading