From ad275a2cdb85c5387c3dcdf67600c14b14f264d4 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 12:23:32 -0700 Subject: [PATCH 01/14] Re-implement `mycroft.ready` event emit with service status checks --- neon_core/__init__.py | 2 ++ neon_core/skills/skill_manager.py | 56 ++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/neon_core/__init__.py b/neon_core/__init__.py index dc45a4b5b..837699d77 100644 --- a/neon_core/__init__.py +++ b/neon_core/__init__.py @@ -31,6 +31,8 @@ environ["OVOS_DEFAULT_CONFIG"] = join(dirname(__file__), "configuration", "neon.yaml") +environ.setdefault('OVOS_CONFIG_BASE_FOLDER', "neon") +environ.setdefault('OVOS_CONFIG_FILENAME', "neon.yaml") # Patching deprecation warnings # TODO: Deprecate after migration to ovos-workshop 1.0+ and ovos-core 0.3.0 diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index c2d5b86bd..718ad3524 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -30,7 +30,7 @@ from os.path import isdir, join, expanduser from ovos_utils.xdg_utils import xdg_data_home from ovos_utils.log import LOG - +from ovos_bus_client.message import Message from ovos_core.skill_manager import SkillManager @@ -71,10 +71,50 @@ def _get_plugin_skill_loader(self, skill_id, init_bus=True): LOG.debug("Ignoring request not to bind bus") return SkillManager._get_plugin_skill_loader(self, skill_id, True) - def run(self): - """Load skills and update periodically from disk and internet.""" - from os import environ - environ.setdefault('OVOS_CONFIG_BASE_FOLDER', "neon") - environ.setdefault('OVOS_CONFIG_FILENAME', "neon.yaml") - LOG.debug("set default configuration to `neon/neon.yaml`") - SkillManager.run(self) + # Re-implement support for internet and network skill load + def _wait_until_skills_ready(self): + """ + Block until configured network and internet skills are loaded to + delay skills service reporting ready. + """ + ready_settings = self.config.get("ready_settings", ["skills"]) + if "network_skills" in ready_settings: + if not self._network_loaded.wait(self._network_skill_timeout): + LOG.error("Timeout waiting for network skills to load") + return False + if "internet_skills" in ready_settings: + if not self._internet_loaded.wait(self._internet_skill_timeout): + LOG.error("Timeout waiting for internet skills to load") + return False + LOG.info(f"Configured ready settings met: {ready_settings}") + return True + + def _check_device_ready(self): + while not self._wait_until_skills_ready(): + LOG.warning("Skills not ready, still waiting...") + ready_settings = self.config.get("ready_settings", ["skills"]) + valid_services = ("skills", "voice", "audio", "gui_service", "internet") + ready_services = {s: False for s in ready_settings if s in valid_services} + while not all(ready_services.values()): + for service in ready_services: + if not ready_services[service]: + resp = self.bus.wait_for_response(Message(f"mycroft.{service}.is_ready", context={"source": ["skills"], "destination": [service]})) + service_ready = resp and resp.data.get("status") == "ready" + if service_ready: + LOG.info(f"{service} reports ready") + ready_services[service] = service_ready + LOG.info(f"All configured ready settings met: {ready_services}") + self.bus.emit(Message("mycroft.ready", context={"source": ["skills"], "destination": valid_services})) + + # Override to maintain skill load support + def handle_initial_training(self, message): + """ + This method blocks `run` until network and internet skills are loaded + (if configured). After `self.initial_load_complete` is set to True, + the skills service will be marked as ready + """ + # Wait for network and internet skills to load as configured + if not self._wait_until_skills_ready(): + LOG.error("Skills did not report ready. Continuing anyway.") + self.initial_load_complete = True + From 1ac141a0c689d096cf95a9af74ffee240ef6f990 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 12:25:32 -0700 Subject: [PATCH 02/14] Update ovos-core dependency to align with new SkillManager patches --- requirements/requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 6c0b56062..b6e2910d0 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,4 @@ -# ovos-core version pinned for compat. with patches in NeonCore -ovos-core[lgpl]~=0.1 +ovos-core[lgpl]~=0.2 neon-utils[network]~=1.13,>=1.13.1a4 From b8036b4766fe256196395bff0b7a2891e2920c69 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 12:45:31 -0700 Subject: [PATCH 03/14] Troubleshooting readiness overrides --- neon_core/skills/skill_manager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 718ad3524..d2b58c219 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -35,6 +35,9 @@ class NeonSkillManager(SkillManager): + def _define_message_bus_events(self): + # Overriding to use overridden handlers in this class + SkillManager._define_message_bus_events(self) def get_default_skills_dir(self): """ @@ -86,7 +89,7 @@ def _wait_until_skills_ready(self): if not self._internet_loaded.wait(self._internet_skill_timeout): LOG.error("Timeout waiting for internet skills to load") return False - LOG.info(f"Configured ready settings met: {ready_settings}") + LOG.info(f"Configured ready settings met: {ready_settings}") return True def _check_device_ready(self): @@ -113,6 +116,7 @@ def handle_initial_training(self, message): (if configured). After `self.initial_load_complete` is set to True, the skills service will be marked as ready """ + LOG.debug(f"Handling message: {message.msg_type}") # Wait for network and internet skills to load as configured if not self._wait_until_skills_ready(): LOG.error("Skills did not report ready. Continuing anyway.") From 68d05747fd27951cfb39fbb14a24bc025ce1b1ba Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 12:52:58 -0700 Subject: [PATCH 04/14] Troubleshooting override of `handle_initial_training` --- neon_core/skills/skill_manager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index d2b58c219..b26a32f8f 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -38,6 +38,8 @@ class NeonSkillManager(SkillManager): def _define_message_bus_events(self): # Overriding to use overridden handlers in this class SkillManager._define_message_bus_events(self) + self.bus.remove_all_listeners("mycroft.skills.trained") + self.bus.once("mycroft.skills.trained", self.handle_initial_training) def get_default_skills_dir(self): """ From db5e4f7484f84906fe406819da34c1ea0b1c87e5 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:04:10 -0700 Subject: [PATCH 05/14] Troubleshooting readiness check patching --- neon_core/skills/skill_manager.py | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index b26a32f8f..a8022bf2b 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -35,11 +35,14 @@ class NeonSkillManager(SkillManager): - def _define_message_bus_events(self): - # Overriding to use overridden handlers in this class - SkillManager._define_message_bus_events(self) - self.bus.remove_all_listeners("mycroft.skills.trained") - self.bus.once("mycroft.skills.trained", self.handle_initial_training) + def _load_on_startup(self): + """ + Override to wait for configured ready settings before announcing the + service is ready + """ + SkillManager._load_on_startup(self) + LOG.info(f"Waiting for skill ready settings") # TODO Log is only for debugging + self._wait_until_skills_ready() def get_default_skills_dir(self): """ @@ -66,10 +69,6 @@ def get_default_skills_dir(self): return skill_dir - def _load_new_skills(self, *args, **kwargs): - # Override load method for config module checks - SkillManager._load_new_skills(self, *args, **kwargs) - def _get_plugin_skill_loader(self, skill_id, init_bus=True): assert self.bus is not None if not init_bus: @@ -111,16 +110,3 @@ def _check_device_ready(self): LOG.info(f"All configured ready settings met: {ready_services}") self.bus.emit(Message("mycroft.ready", context={"source": ["skills"], "destination": valid_services})) - # Override to maintain skill load support - def handle_initial_training(self, message): - """ - This method blocks `run` until network and internet skills are loaded - (if configured). After `self.initial_load_complete` is set to True, - the skills service will be marked as ready - """ - LOG.debug(f"Handling message: {message.msg_type}") - # Wait for network and internet skills to load as configured - if not self._wait_until_skills_ready(): - LOG.error("Skills did not report ready. Continuing anyway.") - self.initial_load_complete = True - From 01fd4cb72b14f7535d10abead6cb6c81076104ac Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:09:18 -0700 Subject: [PATCH 06/14] Troueblshooting wait for configured skills to load --- neon_core/skills/skill_manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index a8022bf2b..08b984d78 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -35,13 +35,13 @@ class NeonSkillManager(SkillManager): - def _load_on_startup(self): + def _sync_skill_loading_state(self): """ Override to wait for configured ready settings before announcing the service is ready """ - SkillManager._load_on_startup(self) - LOG.info(f"Waiting for skill ready settings") # TODO Log is only for debugging + SkillManager._sync_skill_loading_state(self) + LOG.info("Waiting for skill ready settings") # TODO Log is only for debugging self._wait_until_skills_ready() def get_default_skills_dir(self): From 6ce12e65707b18248f7494f008294de16d96ba51 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:20:41 -0700 Subject: [PATCH 07/14] Fix code-assistant generated invalid timeout param reference --- neon_core/skills/skill_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 08b984d78..427c90d18 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -87,7 +87,7 @@ def _wait_until_skills_ready(self): LOG.error("Timeout waiting for network skills to load") return False if "internet_skills" in ready_settings: - if not self._internet_loaded.wait(self._internet_skill_timeout): + if not self._internet_loaded.wait(self._network_skill_timeout): LOG.error("Timeout waiting for internet skills to load") return False LOG.info(f"Configured ready settings met: {ready_settings}") From 6b70656b3fd129633ee52818e2aec465c2dd28e9 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:28:23 -0700 Subject: [PATCH 08/14] Update to ensure `mycroft.ready` checks run and event is emitted --- neon_core/skills/skill_manager.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 427c90d18..87a995974 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -28,6 +28,7 @@ from os import makedirs from os.path import isdir, join, expanduser +from threading import Thread from ovos_utils.xdg_utils import xdg_data_home from ovos_utils.log import LOG from ovos_bus_client.message import Message @@ -44,6 +45,12 @@ def _sync_skill_loading_state(self): LOG.info("Waiting for skill ready settings") # TODO Log is only for debugging self._wait_until_skills_ready() + # Start a background thread to check for configured ready settings + # while allowing the skills service to continue initialization + ready_event_thread = Thread(target=self._check_device_ready) + ready_event_thread.daemon = True + ready_event_thread.start() + def get_default_skills_dir(self): """ Go through legacy config params to locate the default skill directory @@ -90,7 +97,7 @@ def _wait_until_skills_ready(self): if not self._internet_loaded.wait(self._network_skill_timeout): LOG.error("Timeout waiting for internet skills to load") return False - LOG.info(f"Configured ready settings met: {ready_settings}") + LOG.info(f"Configured skill load conditions met") return True def _check_device_ready(self): From da8807ece17555fb2ac8643ae262215ad469c5bb Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:43:45 -0700 Subject: [PATCH 09/14] Add logging to troubleshoot init --- neon_core/skills/skill_manager.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 87a995974..125c7b441 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -97,7 +97,7 @@ def _wait_until_skills_ready(self): if not self._internet_loaded.wait(self._network_skill_timeout): LOG.error("Timeout waiting for internet skills to load") return False - LOG.info(f"Configured skill load conditions met") + LOG.debug("Configured skill load conditions met") return True def _check_device_ready(self): @@ -106,14 +106,17 @@ def _check_device_ready(self): ready_settings = self.config.get("ready_settings", ["skills"]) valid_services = ("skills", "voice", "audio", "gui_service", "internet") ready_services = {s: False for s in ready_settings if s in valid_services} + LOG.info(f"Waiting for services: {ready_services}") while not all(ready_services.values()): for service in ready_services: if not ready_services[service]: resp = self.bus.wait_for_response(Message(f"mycroft.{service}.is_ready", context={"source": ["skills"], "destination": [service]})) + LOG.info(resp) # TODO: Log to be downgraded to debug service_ready = resp and resp.data.get("status") == "ready" if service_ready: LOG.info(f"{service} reports ready") ready_services[service] = service_ready + LOG.info(f"Services ready: {ready_services}") # TODO: Log to be downgraded to debug LOG.info(f"All configured ready settings met: {ready_services}") self.bus.emit(Message("mycroft.ready", context={"source": ["skills"], "destination": valid_services})) From b5a3c7f8139db8363f09e35336e4df2a4b247a0a Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:47:51 -0700 Subject: [PATCH 10/14] Update logging to troubleshoot waiting for services --- neon_core/skills/skill_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 125c7b441..ec484d182 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -111,7 +111,7 @@ def _check_device_ready(self): for service in ready_services: if not ready_services[service]: resp = self.bus.wait_for_response(Message(f"mycroft.{service}.is_ready", context={"source": ["skills"], "destination": [service]})) - LOG.info(resp) # TODO: Log to be downgraded to debug + LOG.info(resp.data if resp else f"No response for service={service}") # TODO: Log to be downgraded to debug service_ready = resp and resp.data.get("status") == "ready" if service_ready: LOG.info(f"{service} reports ready") From aabbc8a511d3ae3aac63d8483b8d0a48df766a47 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 13:52:05 -0700 Subject: [PATCH 11/14] Fix service ready message parsing and cleanup logging --- neon_core/skills/skill_manager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index ec484d182..97dc2c059 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -111,12 +111,11 @@ def _check_device_ready(self): for service in ready_services: if not ready_services[service]: resp = self.bus.wait_for_response(Message(f"mycroft.{service}.is_ready", context={"source": ["skills"], "destination": [service]})) - LOG.info(resp.data if resp else f"No response for service={service}") # TODO: Log to be downgraded to debug - service_ready = resp and resp.data.get("status") == "ready" + LOG.debug(resp.data if resp else f"No response for service={service}") # TODO: Log to be downgraded to debug + service_ready = resp and resp.data.get("status") if service_ready: LOG.info(f"{service} reports ready") ready_services[service] = service_ready - LOG.info(f"Services ready: {ready_services}") # TODO: Log to be downgraded to debug LOG.info(f"All configured ready settings met: {ready_services}") self.bus.emit(Message("mycroft.ready", context={"source": ["skills"], "destination": valid_services})) From e74858484756f7ceb0e24d9ec3c242cfb2e50442 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 14:52:31 -0700 Subject: [PATCH 12/14] Lint skill_manager module and add unit test coverage for added methods --- neon_core/skills/skill_manager.py | 53 ++++++++++++++++++++++++------- test/test_skills_module.py | 45 ++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index 97dc2c059..e695ed1b4 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -42,7 +42,9 @@ def _sync_skill_loading_state(self): service is ready """ SkillManager._sync_skill_loading_state(self) - LOG.info("Waiting for skill ready settings") # TODO Log is only for debugging + LOG.info( + "Waiting for skill ready settings" + ) # TODO Log is only for debugging self._wait_until_skills_ready() # Start a background thread to check for configured ready settings @@ -56,11 +58,14 @@ def get_default_skills_dir(self): Go through legacy config params to locate the default skill directory """ skill_config = self.config["skills"] - skill_dir = skill_config.get("directory") or \ - skill_config.get("extra_directories") - skill_dir = skill_dir[0] if isinstance(skill_dir, list) and \ - len(skill_dir) > 0 else skill_dir or \ - join(xdg_data_home(), "neon", "skills") + skill_dir = skill_config.get("directory") or skill_config.get( + "extra_directories" + ) + skill_dir = ( + skill_dir[0] + if isinstance(skill_dir, list) and len(skill_dir) > 0 + else skill_dir or join(xdg_data_home(), "neon", "skills") + ) skill_dir = expanduser(skill_dir) if not isdir(skill_dir): @@ -104,18 +109,42 @@ def _check_device_ready(self): while not self._wait_until_skills_ready(): LOG.warning("Skills not ready, still waiting...") ready_settings = self.config.get("ready_settings", ["skills"]) - valid_services = ("skills", "voice", "audio", "gui_service", "internet") - ready_services = {s: False for s in ready_settings if s in valid_services} + valid_services = ( + "skills", + "voice", + "audio", + "gui_service", + "internet", + ) + ready_services = { + s: False for s in ready_settings if s in valid_services + } LOG.info(f"Waiting for services: {ready_services}") while not all(ready_services.values()): for service in ready_services: if not ready_services[service]: - resp = self.bus.wait_for_response(Message(f"mycroft.{service}.is_ready", context={"source": ["skills"], "destination": [service]})) - LOG.debug(resp.data if resp else f"No response for service={service}") # TODO: Log to be downgraded to debug + resp = self.bus.wait_for_response( + Message( + f"mycroft.{service}.is_ready", + context={ + "source": ["skills"], + "destination": [service], + }, + ) + ) + LOG.debug( + resp.data + if resp + else f"No response for service={service}" + ) service_ready = resp and resp.data.get("status") if service_ready: LOG.info(f"{service} reports ready") ready_services[service] = service_ready LOG.info(f"All configured ready settings met: {ready_services}") - self.bus.emit(Message("mycroft.ready", context={"source": ["skills"], "destination": valid_services})) - + self.bus.emit( + Message( + "mycroft.ready", + context={"source": ["skills"], "destination": valid_services}, + ) + ) diff --git a/test/test_skills_module.py b/test/test_skills_module.py index 331f27e7d..295f37deb 100644 --- a/test/test_skills_module.py +++ b/test/test_skills_module.py @@ -32,12 +32,12 @@ import unittest import wave +from pytest import mark +from mock import Mock, patch from copy import deepcopy from os.path import join, dirname, expanduser, isdir from threading import Event from time import time - -from unittest.mock import Mock, patch from ovos_bus_client import Message from ovos_utils.messagebus import FakeBus from ovos_utils.xdg_utils import xdg_data_home @@ -357,12 +357,7 @@ class TestSkillManager(unittest.TestCase): @classmethod def setUpClass(cls) -> None: - #from neon_core.util.runtime_utils import use_neon_core - #from neon_utils.configuration_utils import init_config_dir os.environ["XDG_CONFIG_HOME"] = cls.config_dir - os.environ["OVOS_CONFIG_BASE_FOLDER"] = "neon" - os.environ["OVOS_CONFIG_FILENAME"] = "neon.yaml" - #use_neon_core(init_config_dir)() @classmethod def tearDownClass(cls) -> None: @@ -372,6 +367,7 @@ def tearDownClass(cls) -> None: if os.path.isdir(cls.config_dir): shutil.rmtree(cls.config_dir) + @mark.skip("Skill directory handling is deprecated") @patch("ovos_core.skill_manager.SkillManager.run") def test_get_default_skills_dir(self, _): from neon_core.skills.skill_manager import NeonSkillManager @@ -410,5 +406,40 @@ def test_get_default_skills_dir(self, _): self.assertEqual(default_dir, expanduser('~/neon-skills')) self.assertTrue(isdir(expanduser("~/neon-skills"))) + def test_wait_until_skills_ready(self): + from neon_core.skills.skill_manager import NeonSkillManager + manager = NeonSkillManager(FakeBus()) + manager._network_skill_timeout = 1 + + # No ready settings is ready + manager.config['ready_settings'] = [] + self.assertTrue(manager._wait_until_skills_ready()) + + # Check network skills not ready + manager.config['ready_settings'] = ['network_skills'] + self.assertFalse(manager._wait_until_skills_ready()) + + # Check internet skills not ready + manager.config['ready_settings'].append('internet_skills') + self.assertFalse(manager._wait_until_skills_ready()) + + # Check skills are loaded + manager._network_loaded.set() + manager._internet_loaded.set() + self.assertTrue(manager._wait_until_skills_ready()) + + def test_check_device_ready(self): + from neon_core.skills.skill_manager import NeonSkillManager + manager = NeonSkillManager(FakeBus()) + + on_ready = Mock() + manager.bus.on("mycroft.ready", on_ready) + + # No services to wait for + manager.config['ready_settings'] = [] + manager._check_device_ready() + on_ready.assert_called_once() + + if __name__ == "__main__": unittest.main() From 7d1540bfaaf16258a7b490c7b5f9c526ff0953be Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 14:56:04 -0700 Subject: [PATCH 13/14] Mark method to get default skill directory as deprecated --- neon_core/skills/skill_manager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/neon_core/skills/skill_manager.py b/neon_core/skills/skill_manager.py index e695ed1b4..9853cdb86 100644 --- a/neon_core/skills/skill_manager.py +++ b/neon_core/skills/skill_manager.py @@ -30,7 +30,7 @@ from os.path import isdir, join, expanduser from threading import Thread from ovos_utils.xdg_utils import xdg_data_home -from ovos_utils.log import LOG +from ovos_utils.log import LOG, deprecated from ovos_bus_client.message import Message from ovos_core.skill_manager import SkillManager @@ -53,6 +53,8 @@ def _sync_skill_loading_state(self): ready_event_thread.daemon = True ready_event_thread.start() + @deprecated("Legacy skills are deprecated and this method should not " + "be used.", "25.10.1") def get_default_skills_dir(self): """ Go through legacy config params to locate the default skill directory From e8461bdef7c10f253e88344e4d07a661e70b7c1d Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 11 Sep 2025 14:59:22 -0700 Subject: [PATCH 14/14] Update tests to prevent extra overrides of config envvars --- test/test_configuration.py | 2 -- test/test_skills_module.py | 8 -------- 2 files changed, 10 deletions(-) diff --git a/test/test_configuration.py b/test/test_configuration.py index f0e787df3..f8b6483ef 100644 --- a/test/test_configuration.py +++ b/test/test_configuration.py @@ -37,8 +37,6 @@ class ConfigurationTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: os.environ["XDG_CONFIG_HOME"] = cls.CONFIG_PATH - os.environ["OVOS_CONFIG_BASE_FOLDER"] = "neon" - os.environ["OVOS_CONFIG_FILENAME"] = "neon.yaml" @classmethod def tearDownClass(cls) -> None: diff --git a/test/test_skills_module.py b/test/test_skills_module.py index 295f37deb..283002ded 100644 --- a/test/test_skills_module.py +++ b/test/test_skills_module.py @@ -67,8 +67,6 @@ class TestSkillService(unittest.TestCase): @classmethod def setUpClass(cls) -> None: os.environ["XDG_CONFIG_HOME"] = cls.config_dir - os.environ["OVOS_CONFIG_BASE_FOLDER"] = "neon" - os.environ["OVOS_CONFIG_FILENAME"] = "neon.yaml" @classmethod def tearDownClass(cls) -> None: @@ -184,8 +182,6 @@ def setUpClass(cls) -> None: import neon_core os.environ["XDG_CONFIG_HOME"] = cls.test_config_dir - os.environ["OVOS_CONFIG_BASE_FOLDER"] = "neon" - os.environ["OVOS_CONFIG_FILENAME"] = "neon.yaml" import ovos_config import importlib importlib.reload(ovos_config.meta) @@ -209,8 +205,6 @@ def setUpClass(cls) -> None: def tearDownClass(cls) -> None: cls.intent_service.shutdown() os.environ.pop("XDG_CONFIG_HOME") - os.environ.pop("OVOS_CONFIG_BASE_FOLDER") - os.environ.pop("OVOS_CONFIG_FILENAME") shutil.rmtree(cls.test_config_dir) def test_save_utterance_transcription(self): @@ -362,8 +356,6 @@ def setUpClass(cls) -> None: @classmethod def tearDownClass(cls) -> None: os.environ.pop("XDG_CONFIG_HOME") - os.environ.pop("OVOS_CONFIG_BASE_FOLDER") - os.environ.pop("OVOS_CONFIG_FILENAME") if os.path.isdir(cls.config_dir): shutil.rmtree(cls.config_dir)