From 92bd599ecf5d1048ce04593dd06fa9940a756b39 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 12 Nov 2012 22:38:49 +0100 Subject: [PATCH] Update stored playlists controller to support backends without playlists --- mopidy/core/stored_playlists.py | 31 +++++++++++-------- tests/core/stored_playlists_test.py | 46 ++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/mopidy/core/stored_playlists.py b/mopidy/core/stored_playlists.py index 8c04d5ad..24d54b7b 100644 --- a/mopidy/core/stored_playlists.py +++ b/mopidy/core/stored_playlists.py @@ -18,7 +18,8 @@ class StoredPlaylistsController(object): Read-only. List of :class:`mopidy.models.Playlist`. """ - futures = [b.stored_playlists.playlists for b in self.backends] + futures = [b.stored_playlists.playlists + for b in self.backends.with_stored_playlists] results = pykka.get_all(futures) return list(itertools.chain(*results)) @@ -40,10 +41,10 @@ class StoredPlaylistsController(object): :type uri_scheme: string :rtype: :class:`mopidy.models.Playlist` """ - if uri_scheme in self.backends.by_uri_scheme: + if uri_scheme in self.backends.with_stored_playlists_by_uri_scheme: backend = self.backends.by_uri_scheme[uri_scheme] else: - backend = self.backends[0] + backend = self.backends.with_stored_playlists[0] return backend.stored_playlists.create(name).get() def delete(self, uri): @@ -57,8 +58,9 @@ class StoredPlaylistsController(object): :type uri: string """ uri_scheme = urlparse.urlparse(uri).scheme - if uri_scheme in self.backends.by_uri_scheme: - backend = self.backends.by_uri_scheme[uri_scheme] + backend = self.backends.with_stored_playlists_by_uri_scheme.get( + uri_scheme, None) + if backend: backend.stored_playlists.delete(uri).get() def get(self, **criteria): @@ -101,7 +103,8 @@ class StoredPlaylistsController(object): :rtype: :class:`mopidy.models.Playlist` or :class:`None` """ uri_scheme = urlparse.urlparse(uri).scheme - backend = self.backends.by_uri_scheme.get(uri_scheme, None) + backend = self.backends.with_stored_playlists_by_uri_scheme.get( + uri_scheme, None) if backend: return backend.stored_playlists.lookup(uri).get() else: @@ -120,11 +123,13 @@ class StoredPlaylistsController(object): :type uri_scheme: string """ if uri_scheme is None: - futures = [b.stored_playlists.refresh() for b in self.backends] + futures = [b.stored_playlists.refresh() + for b in self.backends.with_stored_playlists] pykka.get_all(futures) else: - if uri_scheme in self.backends.by_uri_scheme: - backend = self.backends.by_uri_scheme[uri_scheme] + backend = self.backends.with_stored_playlists_by_uri_scheme.get( + uri_scheme, None) + if backend: backend.stored_playlists.refresh().get() def save(self, playlist): @@ -152,7 +157,7 @@ class StoredPlaylistsController(object): if playlist.uri is None: return uri_scheme = urlparse.urlparse(playlist.uri).scheme - if uri_scheme not in self.backends.by_uri_scheme: - return - backend = self.backends.by_uri_scheme[uri_scheme] - return backend.stored_playlists.save(playlist).get() + backend = self.backends.with_stored_playlists_by_uri_scheme.get( + uri_scheme, None) + if backend: + return backend.stored_playlists.save(playlist).get() diff --git a/tests/core/stored_playlists_test.py b/tests/core/stored_playlists_test.py index b0d48512..d9b4c08a 100644 --- a/tests/core/stored_playlists_test.py +++ b/tests/core/stored_playlists_test.py @@ -19,6 +19,12 @@ class StoredPlaylistsTest(unittest.TestCase): self.sp2 = mock.Mock(spec=base.BaseStoredPlaylistsProvider) self.backend2.stored_playlists = self.sp2 + # A backend without the optional stored playlists provider + self.backend3 = mock.Mock() + self.backend3.uri_schemes.get.return_value = ['dummy3'] + self.backend3.has_stored_playlists().get.return_value = False + self.backend3.stored_playlists = None + self.pl1a = Playlist(tracks=[Track(uri='dummy1:a')]) self.pl1b = Playlist(tracks=[Track(uri='dummy1:b')]) self.sp1.playlists.get.return_value = [self.pl1a, self.pl1b] @@ -27,7 +33,8 @@ class StoredPlaylistsTest(unittest.TestCase): self.pl2b = Playlist(tracks=[Track(uri='dummy2:b')]) self.sp2.playlists.get.return_value = [self.pl2a, self.pl2b] - self.core = Core(audio=None, backends=[self.backend1, self.backend2]) + self.core = Core(audio=None, backends=[ + self.backend3, self.backend1, self.backend2]) def test_get_playlists_combines_result_from_backends(self): result = self.core.stored_playlists.playlists @@ -59,6 +66,17 @@ class StoredPlaylistsTest(unittest.TestCase): self.assertFalse(self.sp1.create.called) self.sp2.create.assert_called_once_with('foo') + def test_create_with_unsupported_uri_scheme_uses_first_backend(self): + playlist = Playlist() + self.sp1.create().get.return_value = playlist + self.sp1.reset_mock() + + result = self.core.stored_playlists.create('foo', uri_scheme='dummy3') + + self.assertEqual(playlist, result) + self.sp1.create.assert_called_once_with('foo') + self.assertFalse(self.sp2.create.called) + def test_delete_selects_the_dummy1_backend(self): self.core.stored_playlists.delete('dummy1:a') @@ -77,6 +95,12 @@ class StoredPlaylistsTest(unittest.TestCase): self.assertFalse(self.sp1.delete.called) self.assertFalse(self.sp2.delete.called) + def test_delete_ignores_backend_without_playlist_support(self): + self.core.stored_playlists.delete('dummy3:a') + + self.assertFalse(self.sp1.delete.called) + self.assertFalse(self.sp2.delete.called) + def test_lookup_selects_the_dummy1_backend(self): self.core.stored_playlists.lookup('dummy1:a') @@ -89,6 +113,13 @@ class StoredPlaylistsTest(unittest.TestCase): self.assertFalse(self.sp1.lookup.called) self.sp2.lookup.assert_called_once_with('dummy2:a') + def test_lookup_track_in_backend_without_playlists_fails(self): + result = self.core.stored_playlists.lookup('dummy3:a') + + self.assertIsNone(result) + self.assertFalse(self.sp1.lookup.called) + self.assertFalse(self.sp2.lookup.called) + def test_refresh_without_uri_scheme_refreshes_all_backends(self): self.core.stored_playlists.refresh() @@ -107,6 +138,12 @@ class StoredPlaylistsTest(unittest.TestCase): self.assertFalse(self.sp1.refresh.called) self.assertFalse(self.sp2.refresh.called) + def test_refresh_ignores_backend_without_playlist_support(self): + self.core.stored_playlists.refresh(uri_scheme='dummy3') + + self.assertFalse(self.sp1.refresh.called) + self.assertFalse(self.sp2.refresh.called) + def test_save_selects_the_dummy1_backend(self): playlist = Playlist(uri='dummy1:a') self.sp1.save().get.return_value = playlist @@ -142,3 +179,10 @@ class StoredPlaylistsTest(unittest.TestCase): self.assertIsNone(result) self.assertFalse(self.sp1.save.called) self.assertFalse(self.sp2.save.called) + + def test_save_ignores_backend_without_playlist_support(self): + result = self.core.stored_playlists.save(Playlist(uri='dummy3:a')) + + self.assertIsNone(result) + self.assertFalse(self.sp1.save.called) + self.assertFalse(self.sp2.save.called)