Make core.stored_playlists.playlists support multiple backends

This commit is contained in:
Stein Magnus Jodal 2012-10-27 23:07:19 +02:00
parent a35deec050
commit 0641d2d207
2 changed files with 55 additions and 1 deletions

View File

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

View File

@ -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.