From 4b7d6e552648f205f08d763587783d24a198da35 Mon Sep 17 00:00:00 2001 From: Michael Nguyen Date: Wed, 13 Dec 2017 16:25:33 -0600 Subject: [PATCH] Feature/overwritten settings (#1304) prevent settings initalization from skills __init__ to override settings.json values --- mycroft/skills/core.py | 1 + mycroft/skills/settings.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mycroft/skills/core.py b/mycroft/skills/core.py index 03211f90ab..7e83358b78 100644 --- a/mycroft/skills/core.py +++ b/mycroft/skills/core.py @@ -130,6 +130,7 @@ def load_skill(skill_descriptor, emitter, skill_id, BLACKLISTED_SKILLS=None): callable(skill_module.create_skill)): # v2 skills framework skill = skill_module.create_skill() + skill.settings.allow_overwrite = True skill.bind(emitter) skill.skill_id = skill_id skill.load_data_files(dirname(skill_descriptor['info'][1])) diff --git a/mycroft/skills/settings.py b/mycroft/skills/settings.py index 59b002cd79..f29e985a3e 100644 --- a/mycroft/skills/settings.py +++ b/mycroft/skills/settings.py @@ -80,6 +80,12 @@ class SkillSettings(dict): def __init__(self, directory, name): super(SkillSettings, self).__init__() + # when skills try to instantiate settings + # in __init__, it can erase the settings saved + # on disk (settings.json). So this prevents that + # This is set to true in core.py after skill init + self.allow_overwrite = False + self.api = DeviceApi() self.config = ConfigurationManager.get() self.name = name @@ -93,9 +99,8 @@ class SkillSettings(dict): self._device_identity = None self._api_path = None self._user_identity = None - # if settingsmeta.json exists - # this block of code is a control flow for - # different scenarios that may arises with settingsmeta + + # if settingsmeta exist if isfile(self._meta_path): self._poll_skill_settings() self.load_skill_settings() @@ -156,7 +161,8 @@ class SkillSettings(dict): def __setitem__(self, key, value): """ Add/Update key. """ - return super(SkillSettings, self).__setitem__(key, value) + if self.allow_overwrite or key not in self: + return super(SkillSettings, self).__setitem__(key, value) def _load_settings_meta(self): """ Loads settings metadata from skills path. """