From 4cf041119b82937e0f197ecc6ad06a117fcfce8a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 18 Aug 2010 12:36:17 +0200 Subject: [PATCH 1/5] Validate state before handling the end of track event --- mopidy/backends/base/playback.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index f484bf89..d1acc05a 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -307,6 +307,9 @@ class BasePlaybackController(object): Typically called by :class:`mopidy.process.CoreProcess` after a message from a library thread is received. """ + if self.state == self.STOPPED: + return + original_cp_track = self.current_cp_track if self.cp_track_at_eot: self.play(self.cp_track_at_eot) From a87f7f9381e8b1419528735575a730de09cea8ba Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 18 Aug 2010 12:36:47 +0200 Subject: [PATCH 2/5] Remove tests as it is a duplicate of test_end_of_song_with_single_and_repeat_starts_same --- tests/backends/base.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/backends/base.py b/tests/backends/base.py index eb13af59..733c63cc 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -663,14 +663,6 @@ class BasePlaybackControllerTest(object): self.playback.on_end_of_track() self.assert_(self.tracks[0] not in self.backend.current_playlist.tracks) - @populate_playlist - def test_end_of_track_with_single_and_repeat(self): - self.playback.single = True - self.playback.repeat = True - self.playback.play() - self.playback.on_end_of_track() - self.assertEqual(self.playback.current_track, self.tracks[1]) - @populate_playlist def test_end_of_track_with_random(self): # FIXME feels very fragile From 1872082932648c3c563194e4bed4869c7190da9b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 18 Aug 2010 13:03:24 +0200 Subject: [PATCH 3/5] Calculate the active settings dynamically, so tests can do mopidy.settings.local.clear() to get rid of local settings --- mopidy/utils/settings.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/mopidy/utils/settings.py b/mopidy/utils/settings.py index 18f59df7..1f37cdd1 100644 --- a/mopidy/utils/settings.py +++ b/mopidy/utils/settings.py @@ -12,11 +12,9 @@ logger = logging.getLogger('mopidy.utils.settings') class SettingsProxy(object): def __init__(self, default_settings_module): - self.default_settings = self._get_settings_dict_from_module( + self.default = self._get_settings_dict_from_module( default_settings_module) - self.local_settings = self._get_local_settings() - self.raw_settings = copy(self.default_settings) - self.raw_settings.update(self.local_settings) + self.local = self._get_local_settings() def _get_local_settings(self): dotdir = os.path.expanduser(u'~/.mopidy/') @@ -35,12 +33,18 @@ class SettingsProxy(object): def _is_setting(self, name): return name.isupper() + @property + def active(self): + active = copy(self.default) + active.update(self.local) + return active + def __getattr__(self, attr): if not self._is_setting(attr): return - if attr not in self.raw_settings: + if attr not in self.active: raise SettingsError(u'Setting "%s" is not set.' % attr) - value = self.raw_settings[attr] + value = self.active[attr] if type(value) != bool and not value: raise SettingsError(u'Setting "%s" is empty.' % attr) return value @@ -52,7 +56,7 @@ class SettingsProxy(object): raise SettingsError(u'Settings validation failed.') def get_errors(self): - return validate_settings(self.default_settings, self.local_settings) + return validate_settings(self.default, self.local) def get_errors_as_string(self): lines = [] @@ -114,8 +118,8 @@ def list_settings_optparse_callback(*args): from mopidy import settings errors = settings.get_errors() lines = [] - for (key, value) in sorted(settings.raw_settings.iteritems()): - default_value = settings.default_settings.get(key) + for (key, value) in sorted(settings.active.iteritems()): + default_value = settings.default.get(key) if key.endswith('PASSWORD'): value = u'********' lines.append(u'%s:' % key) From 107c87477ec2b03b6e717a9ab8762876403eaca0 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 18 Aug 2010 13:05:46 +0200 Subject: [PATCH 4/5] Rename mopidy.settings.{active => current} --- mopidy/utils/settings.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mopidy/utils/settings.py b/mopidy/utils/settings.py index 1f37cdd1..478a03e6 100644 --- a/mopidy/utils/settings.py +++ b/mopidy/utils/settings.py @@ -34,17 +34,17 @@ class SettingsProxy(object): return name.isupper() @property - def active(self): - active = copy(self.default) - active.update(self.local) - return active + def current(self): + current = copy(self.default) + current.update(self.local) + return current def __getattr__(self, attr): if not self._is_setting(attr): return - if attr not in self.active: + if attr not in self.current: raise SettingsError(u'Setting "%s" is not set.' % attr) - value = self.active[attr] + value = self.current[attr] if type(value) != bool and not value: raise SettingsError(u'Setting "%s" is empty.' % attr) return value @@ -118,7 +118,7 @@ def list_settings_optparse_callback(*args): from mopidy import settings errors = settings.get_errors() lines = [] - for (key, value) in sorted(settings.active.iteritems()): + for (key, value) in sorted(settings.current.iteritems()): default_value = settings.default.get(key) if key.endswith('PASSWORD'): value = u'********' From 3b7831db286aa14476ea9ba00430f21ff450f5ef Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 18 Aug 2010 19:06:29 +0200 Subject: [PATCH 5/5] Add Zeroconf/Avahi to roadmap --- docs/development/roadmap.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/development/roadmap.rst b/docs/development/roadmap.rst index f9588cb8..dff9a9d7 100644 --- a/docs/development/roadmap.rst +++ b/docs/development/roadmap.rst @@ -57,6 +57,8 @@ Stuff we want to do, but not right now, and maybe never - Frontends: + - Publish the server's presence to the network using `Zeroconf + `_/Avahi. - D-Bus/`MPRIS `_ - REST/JSON web service with a jQuery client as example application. Maybe based upon `Tornado `_ and `jQuery