diff --git a/mopidy/utils/settings.py b/mopidy/utils/settings.py index e45c5521..9340dc01 100644 --- a/mopidy/utils/settings.py +++ b/mopidy/utils/settings.py @@ -15,6 +15,7 @@ class SettingsProxy(object): self.default = self._get_settings_dict_from_module( default_settings_module) self.local = self._get_local_settings() + self.runtime = {} def _get_local_settings(self): dotdir = os.path.expanduser(u'~/.mopidy/') @@ -37,6 +38,7 @@ class SettingsProxy(object): def current(self): current = copy(self.default) current.update(self.local) + current.update(self.runtime) return current def __getattr__(self, attr): @@ -49,6 +51,12 @@ class SettingsProxy(object): raise SettingsError(u'Setting "%s" is empty.' % attr) return value + def __setattr__(self, attr, value): + if self._is_setting(attr): + self.runtime[attr] = value + else: + super(SettingsProxy, self).__setattr__(attr, value) + def validate(self): if self.get_errors(): logger.error(u'Settings validation errors: %s', diff --git a/tests/utils/settings_test.py b/tests/utils/settings_test.py index 5bf0f9b4..0c06ae5c 100644 --- a/tests/utils/settings_test.py +++ b/tests/utils/settings_test.py @@ -1,6 +1,7 @@ import unittest -from mopidy.utils.settings import validate_settings +from mopidy import settings as default_settings_module +from mopidy.utils.settings import validate_settings, SettingsProxy class ValidateSettingsTest(unittest.TestCase): def setUp(self): @@ -43,3 +44,24 @@ class ValidateSettingsTest(unittest.TestCase): result = validate_settings(self.defaults, {'FOO': '', 'BAR': ''}) self.assertEquals(len(result), 2) + + +class SettingsProxyTest(unittest.TestCase): + def setUp(self): + self.settings = SettingsProxy(default_settings_module) + + def test_set_and_get_attr(self): + self.settings.TEST = 'test' + self.assertEqual(self.settings.TEST, 'test') + + def test_setattr_updates_runtime_settings(self): + self.settings.TEST = 'test' + self.assert_('TEST' in self.settings.runtime) + + def test_setattr_updates_runtime_with_value(self): + self.settings.TEST = 'test' + self.assertEqual(self.settings.runtime['TEST'], 'test') + + def test_runtime_value_included_in_current(self): + self.settings.TEST = 'test' + self.assertEqual(self.settings.current['TEST'], 'test')