Add basic runtime setting support

This commit is contained in:
Thomas Adamcik 2010-08-23 23:30:20 +02:00
parent 53aa64d52c
commit 947b91aa5c
2 changed files with 31 additions and 1 deletions

View File

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

View File

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