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/backends/base/stored_playlists.py b/tests/backends/base/stored_playlists.py index 630898de..ef5806ef 100644 --- a/tests/backends/base/stored_playlists.py +++ b/tests/backends/base/stored_playlists.py @@ -10,10 +10,6 @@ from tests import SkipTest, data_folder class BaseStoredPlaylistsControllerTest(object): def setUp(self): - self.original_playlist_folder = settings.LOCAL_PLAYLIST_FOLDER - self.original_tag_cache = settings.LOCAL_TAG_CACHE - self.original_music_folder = settings.LOCAL_MUSIC_FOLDER - settings.LOCAL_PLAYLIST_FOLDER = tempfile.mkdtemp() settings.LOCAL_TAG_CACHE = data_folder('library_tag_cache') settings.LOCAL_MUSIC_FOLDER = data_folder('') @@ -27,9 +23,7 @@ class BaseStoredPlaylistsControllerTest(object): if os.path.exists(settings.LOCAL_PLAYLIST_FOLDER): shutil.rmtree(settings.LOCAL_PLAYLIST_FOLDER) - settings.LOCAL_PLAYLIST_FOLDER = self.original_playlist_folder - settings.LOCAL_TAG_CACHE = self.original_tag_cache - settings.LOCAL_MUSIC_FOLDER = self.original_music_folder + settings.runtime.clear() def test_create(self): playlist = self.stored.create('test') diff --git a/tests/backends/local/current_playlist_test.py b/tests/backends/local/current_playlist_test.py index 01354a06..3895497a 100644 --- a/tests/backends/local/current_playlist_test.py +++ b/tests/backends/local/current_playlist_test.py @@ -22,10 +22,9 @@ class LocalCurrentPlaylistControllerTest(BaseCurrentPlaylistControllerTest, for i in range(1, 4)] def setUp(self): - self.original_backends = settings.BACKENDS settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) super(LocalCurrentPlaylistControllerTest, self).setUp() def tearDown(self): super(LocalCurrentPlaylistControllerTest, self).tearDown() - settings.BACKENDS = settings.original_backends + settings.runtime.clear() diff --git a/tests/backends/local/library_test.py b/tests/backends/local/library_test.py index 75751e3d..c0605ef2 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -17,16 +17,12 @@ class LocalLibraryControllerTest(BaseLibraryControllerTest, unittest.TestCase): backend_class = LocalBackend def setUp(self): - self.original_tag_cache = settings.LOCAL_TAG_CACHE - self.original_music_folder = settings.LOCAL_MUSIC_FOLDER - settings.LOCAL_TAG_CACHE = data_folder('library_tag_cache') settings.LOCAL_MUSIC_FOLDER = data_folder('') super(LocalLibraryControllerTest, self).setUp() def tearDown(self): - settings.LOCAL_TAG_CACHE = self.original_tag_cache - settings.LOCAL_MUSIC_FOLDER = self.original_music_folder + settings.runtime.clear() super(LocalLibraryControllerTest, self).tearDown() diff --git a/tests/backends/local/playback_test.py b/tests/backends/local/playback_test.py index 4a385a9d..a84dfcde 100644 --- a/tests/backends/local/playback_test.py +++ b/tests/backends/local/playback_test.py @@ -23,7 +23,6 @@ class LocalPlaybackControllerTest(BasePlaybackControllerTest, for i in range(1, 4)] def setUp(self): - self.original_backends = settings.BACKENDS settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) super(LocalPlaybackControllerTest, self).setUp() @@ -32,7 +31,7 @@ class LocalPlaybackControllerTest(BasePlaybackControllerTest, def tearDown(self): super(LocalPlaybackControllerTest, self).tearDown() - settings.BACKENDS = settings.original_backends + settings.runtime.clear() def add_track(self, path): uri = path_to_uri(data_folder(path)) diff --git a/tests/outputs/gstreamer_test.py b/tests/outputs/gstreamer_test.py index 3f18739d..3a578280 100644 --- a/tests/outputs/gstreamer_test.py +++ b/tests/outputs/gstreamer_test.py @@ -17,7 +17,6 @@ from tests import data_folder class GStreamerOutputTest(unittest.TestCase): def setUp(self): - self.original_backends = settings.BACKENDS settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) self.song_uri = path_to_uri(data_folder('song1.wav')) self.core_queue = multiprocessing.Queue() @@ -26,7 +25,7 @@ class GStreamerOutputTest(unittest.TestCase): def tearDown(self): self.output.destroy() - settings.BACKENDS = settings.original_backends + settings.runtime.clear() def test_play_uri_existing_file(self): self.assertTrue(self.output.play_uri(self.song_uri)) 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')