Update the library controller to support backends without a library

This commit is contained in:
Stein Magnus Jodal 2012-11-12 21:41:48 +01:00
parent 429e87fe6e
commit 6f32d72792
2 changed files with 27 additions and 5 deletions

View File

@ -15,7 +15,7 @@ class LibraryController(object):
def _get_backend(self, uri):
uri_scheme = urlparse.urlparse(uri).scheme
return self.backends.by_uri_scheme.get(uri_scheme, None)
return self.backends.with_library_by_uri_scheme.get(uri_scheme, None)
def find_exact(self, **query):
"""
@ -34,7 +34,8 @@ class LibraryController(object):
:type query: dict
:rtype: :class:`mopidy.models.Playlist`
"""
futures = [b.library.find_exact(**query) for b in self.backends]
futures = [b.library.find_exact(**query)
for b in self.backends.with_library]
results = pykka.get_all(futures)
return Playlist(tracks=[
track for playlist in results for track in playlist.tracks])
@ -65,7 +66,8 @@ class LibraryController(object):
if backend:
backend.library.refresh(uri).get()
else:
futures = [b.library.refresh(uri) for b in self.backends]
futures = [b.library.refresh(uri)
for b in self.backends.with_library]
pykka.get_all(futures)
def search(self, **query):
@ -85,7 +87,8 @@ class LibraryController(object):
:type query: dict
:rtype: :class:`mopidy.models.Playlist`
"""
futures = [b.library.search(**query) for b in self.backends]
futures = [b.library.search(**query)
for b in self.backends.with_library]
results = pykka.get_all(futures)
track_lists = [playlist.tracks for playlist in results]
tracks = list(itertools.chain(*track_lists))

View File

@ -19,7 +19,13 @@ class CoreLibraryTest(unittest.TestCase):
self.library2 = mock.Mock(spec=base.BaseLibraryProvider)
self.backend2.library = self.library2
self.core = Core(audio=None, backends=[self.backend1, self.backend2])
# A backend without the optional library provider
self.backend3 = mock.Mock()
self.backend3.uri_schemes.get.return_value = ['dummy3']
self.backend3.has_library().get.return_value = False
self.core = Core(audio=None, backends=[
self.backend1, self.backend2, self.backend3])
def test_lookup_selects_dummy1_backend(self):
self.core.library.lookup('dummy1:a')
@ -33,6 +39,13 @@ class CoreLibraryTest(unittest.TestCase):
self.assertFalse(self.library1.lookup.called)
self.library2.lookup.assert_called_once_with('dummy2:a')
def test_lookup_fails_for_dummy3_track(self):
result = self.core.library.lookup('dummy3:a')
self.assertIsNone(result)
self.assertFalse(self.library1.lookup.called)
self.assertFalse(self.library2.lookup.called)
def test_refresh_with_uri_selects_dummy1_backend(self):
self.core.library.refresh('dummy1:a')
@ -45,6 +58,12 @@ class CoreLibraryTest(unittest.TestCase):
self.assertFalse(self.library1.refresh.called)
self.library2.refresh.assert_called_once_with('dummy2:a')
def test_refresh_with_uri_fails_silently_for_dummy3_uri(self):
self.core.library.refresh('dummy3:a')
self.assertFalse(self.library1.refresh.called)
self.assertFalse(self.library2.refresh.called)
def test_refresh_without_uri_calls_all_backends(self):
self.core.library.refresh()