From a8e6cd26dc58e6a9a64b7d4ace9f70daa64c9e08 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 24 Mar 2015 23:40:46 +0100 Subject: [PATCH] core: Warn if backend does not implement as_list() Fixes #1080 --- mopidy/core/playlists.py | 24 ++++++++++++++++++------ tests/core/test_playlists.py | 11 +++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/mopidy/core/playlists.py b/mopidy/core/playlists.py index e791380f..669e1f35 100644 --- a/mopidy/core/playlists.py +++ b/mopidy/core/playlists.py @@ -1,6 +1,6 @@ from __future__ import absolute_import, unicode_literals -import itertools +import logging import urlparse import pykka @@ -10,6 +10,9 @@ from mopidy.models import Playlist from mopidy.utils.deprecation import deprecated_property +logger = logging.getLogger(__name__) + + class PlaylistsController(object): pykka_traversable = True @@ -29,11 +32,20 @@ class PlaylistsController(object): .. versionadded:: 1.0 """ - futures = [ - b.playlists.as_list() - for b in self.backends.with_playlists.values()] - results = pykka.get_all(futures) - return list(itertools.chain(*results)) + futures = { + b.actor_ref.actor_class.__name__: b.playlists.as_list() + for b in set(self.backends.with_playlists.values())} + + results = [] + for backend_name, future in futures.items(): + try: + results.extend(future.get()) + except NotImplementedError: + logger.warning( + '%s does not implement playlists.as_list(). ' + 'Please upgrade it.', backend_name) + + return results def get_items(self, uri): """ diff --git a/tests/core/test_playlists.py b/tests/core/test_playlists.py index fecbbdcb..081f73e6 100644 --- a/tests/core/test_playlists.py +++ b/tests/core/test_playlists.py @@ -31,10 +31,12 @@ class PlaylistsTest(unittest.TestCase): self.sp2.lookup.return_value.get.side_effect = [self.pl2a, self.pl2b] self.backend1 = mock.Mock() + self.backend1.actor_ref.actor_class.__name__ = 'Backend1' self.backend1.uri_schemes.get.return_value = ['dummy1'] self.backend1.playlists = self.sp1 self.backend2 = mock.Mock() + self.backend2.actor_ref.actor_class.__name__ = 'Backend2' self.backend2.uri_schemes.get.return_value = ['dummy2'] self.backend2.playlists = self.sp2 @@ -55,6 +57,15 @@ class PlaylistsTest(unittest.TestCase): self.assertIn(self.plr2a, result) self.assertIn(self.plr2b, result) + def test_as_list_ignores_backends_that_dont_support_it(self): + self.sp2.as_list.return_value.get.side_effect = NotImplementedError + + result = self.core.playlists.as_list() + + self.assertEqual(len(result), 2) + self.assertIn(self.plr1a, result) + self.assertIn(self.plr1b, result) + def test_get_items_selects_the_matching_backend(self): ref = Ref.track() self.sp2.get_items.return_value.get.return_value = [ref]