From 0641d2d2074cc4e7da80e13410ada5387ded7421 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 27 Oct 2012 23:07:19 +0200 Subject: [PATCH] Make core.stored_playlists.playlists support multiple backends --- mopidy/core/stored_playlists.py | 15 ++++++++++- tests/core/stored_playlists_test.py | 41 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/core/stored_playlists_test.py diff --git a/mopidy/core/stored_playlists.py b/mopidy/core/stored_playlists.py index d7bcbd0c..4a8f5463 100644 --- a/mopidy/core/stored_playlists.py +++ b/mopidy/core/stored_playlists.py @@ -1,3 +1,6 @@ +import pykka + + class StoredPlaylistsController(object): pykka_traversable = True @@ -12,10 +15,14 @@ class StoredPlaylistsController(object): Read/write. List of :class:`mopidy.models.Playlist`. """ - return self.backends[0].stored_playlists.playlists.get() + futures = [backend.stored_playlists.playlists + for backend in self.backends] + results = pykka.get_all(futures) + return [playlist for result in results for playlist in result] @playlists.setter # noqa def playlists(self, playlists): + # TODO Support multiple backends self.backends[0].stored_playlists.playlists = playlists def create(self, name): @@ -26,6 +33,7 @@ class StoredPlaylistsController(object): :type name: string :rtype: :class:`mopidy.models.Playlist` """ + # TODO Support multiple backends return self.backends[0].stored_playlists.create(name).get() def delete(self, playlist): @@ -35,6 +43,7 @@ class StoredPlaylistsController(object): :param playlist: the playlist to delete :type playlist: :class:`mopidy.models.Playlist` """ + # TODO Support multiple backends return self.backends[0].stored_playlists.delete(playlist).get() def get(self, **criteria): @@ -76,12 +85,14 @@ class StoredPlaylistsController(object): :type uri: string :rtype: :class:`mopidy.models.Playlist` """ + # TODO Support multiple backends return self.backends[0].stored_playlists.lookup(uri).get() def refresh(self): """ Refresh the stored playlists in :attr:`playlists`. """ + # TODO Support multiple backends return self.backends[0].stored_playlists.refresh().get() def rename(self, playlist, new_name): @@ -93,6 +104,7 @@ class StoredPlaylistsController(object): :param new_name: the new name :type new_name: string """ + # TODO Support multiple backends return self.backends[0].stored_playlists.rename( playlist, new_name).get() @@ -103,4 +115,5 @@ class StoredPlaylistsController(object): :param playlist: the playlist :type playlist: :class:`mopidy.models.Playlist` """ + # TODO Support multiple backends return self.backends[0].stored_playlists.save(playlist).get() diff --git a/tests/core/stored_playlists_test.py b/tests/core/stored_playlists_test.py new file mode 100644 index 00000000..d92b89c0 --- /dev/null +++ b/tests/core/stored_playlists_test.py @@ -0,0 +1,41 @@ +import mock + +from mopidy.backends import base +from mopidy.core import Core +from mopidy.models import Playlist, Track + +from tests import unittest + + +class StoredPlaylistsTest(unittest.TestCase): + def setUp(self): + self.backend1 = mock.Mock() + self.backend1.uri_schemes.get.return_value = ['dummy1'] + self.sp1 = mock.Mock(spec=base.BaseStoredPlaylistsProvider) + self.backend1.stored_playlists = self.sp1 + + self.backend2 = mock.Mock() + self.backend2.uri_schemes.get.return_value = ['dummy2'] + self.sp2 = mock.Mock(spec=base.BaseStoredPlaylistsProvider) + self.backend2.stored_playlists = self.sp2 + + 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] + + self.pl2a = Playlist(tracks=[Track(uri='dummy2:a')]) + 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]) + + def test_get_playlists_combines_result_from_backends(self): + result = self.core.stored_playlists.playlists + + self.assertIn(self.pl1a, result) + self.assertIn(self.pl1b, result) + self.assertIn(self.pl2a, result) + self.assertIn(self.pl2b, result) + + # TODO The rest of the stored playlists API is pending redesign before + # we'll update it to support multiple backends.