Make core.stored_playlists.create() support multibackend (#217)

This commit is contained in:
Stein Magnus Jodal 2012-10-31 09:42:35 +01:00
parent 0ddbb4e28a
commit e2474da1ef
2 changed files with 35 additions and 3 deletions

View File

@ -21,16 +21,26 @@ class StoredPlaylistsController(object):
results = pykka.get_all(futures)
return list(itertools.chain(*results))
def create(self, name):
def create(self, name, uri_scheme=None):
"""
Create a new playlist.
If ``uri_scheme`` matches an URI scheme handled by a current backend,
that backend is asked to create the playlist. If ``uri_scheme`` is
:class:`None` or doesn't match a current backend, the first backend is
asked to create the playlist.
:param name: name of the new playlist
:type name: string
:param uri_scheme: use the backend matching the URI scheme
:type uri_scheme: string
:rtype: :class:`mopidy.models.Playlist`
"""
# TODO Support multiple backends
return self.backends[0].stored_playlists.create(name).get()
if uri_scheme in self.backends.by_uri_scheme:
backend = self.backends.by_uri_scheme[uri_scheme]
else:
backend = self.backends[0]
return backend.stored_playlists.create(name).get()
def delete(self, playlist):
"""

View File

@ -37,5 +37,27 @@ class StoredPlaylistsTest(unittest.TestCase):
self.assertIn(self.pl2a, result)
self.assertIn(self.pl2b, result)
def test_create_without_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')
self.assertEqual(playlist, result)
self.sp1.create.assert_called_once_with('foo')
self.assertFalse(self.sp2.create.called)
def test_create_with_uri_scheme_selects_the_matching_backend(self):
playlist = Playlist()
self.sp2.create().get.return_value = playlist
self.sp2.reset_mock()
result = self.core.stored_playlists.create('foo', uri_scheme='dummy2')
self.assertEqual(playlist, result)
self.assertFalse(self.sp1.create.called)
self.sp2.create.assert_called_once_with('foo')
# TODO The rest of the stored playlists API is pending redesign before
# we'll update it to support multiple backends.