From 380223bb96e7f777e4ae4e65d13de4adf7f42ace Mon Sep 17 00:00:00 2001 From: Thomas Kemmer Date: Sat, 30 Aug 2014 14:02:43 +0200 Subject: [PATCH 1/3] local: Return multiple tracks from lookup() --- mopidy/local/__init__.py | 6 ++---- mopidy/local/library.py | 8 +++++--- tests/local/test_library.py | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/mopidy/local/__init__.py b/mopidy/local/__init__.py index 104c43af..725e6783 100644 --- a/mopidy/local/__init__.py +++ b/mopidy/local/__init__.py @@ -99,11 +99,9 @@ class Library(object): """ Lookup the given URI. - Unlike the core APIs, local tracks uris can only be resolved to a - single track. - :param string uri: track URI - :rtype: :class:`~mopidy.models.Track` + :rtype: List of :class:`~mopidy.models.Track` or single + :class:`~mopidy.models.Track` for backward compatibility """ raise NotImplementedError diff --git a/mopidy/local/library.py b/mopidy/local/library.py index a4645084..ec5f4869 100644 --- a/mopidy/local/library.py +++ b/mopidy/local/library.py @@ -33,11 +33,13 @@ class LocalLibraryProvider(backend.LibraryProvider): def lookup(self, uri): if not self._library: return [] - track = self._library.lookup(uri) - if track is None: + tracks = self._library.lookup(uri) + if tracks is None: logger.debug('Failed to lookup %r', uri) return [] - return [track] + if isinstance(tracks, models.Track): + tracks = [tracks] + return tracks def find_exact(self, query=None, uris=None): if not self._library: diff --git a/tests/local/test_library.py b/tests/local/test_library.py index fcc6d4df..3cfcb49a 100644 --- a/tests/local/test_library.py +++ b/tests/local/test_library.py @@ -4,6 +4,7 @@ import os import shutil import tempfile import unittest +import mock import pykka @@ -129,6 +130,26 @@ class LocalLibraryProviderTest(unittest.TestCase): tracks = self.library.lookup('fake uri') self.assertEqual(tracks, []) + @mock.patch.object( + json.JsonLibrary, 'lookup') + def test_lookup_multiple_tracks(self, mock_lookup): + backend = actor.LocalBackend(config=self.config, audio=None) + + mock_lookup.return_value = self.tracks + tracks = backend.library.lookup('fake album uri') + mock_lookup.assert_called_with('fake album uri') + self.assertEqual(tracks, self.tracks) + + mock_lookup.return_value = [self.tracks[0]] + tracks = backend.library.lookup(self.tracks[0].uri) + mock_lookup.assert_called_with(self.tracks[0].uri) + self.assertEqual(tracks, self.tracks[0:1]) + + mock_lookup.return_value = [] + tracks = backend.library.lookup('fake uri') + mock_lookup.assert_called_with('fake uri') + self.assertEqual(tracks, []) + # TODO: move to search_test module def test_find_exact_no_hits(self): result = self.library.find_exact(track_name=['unknown track']) From f90671fe966999f5a52a8b29a8a4dff3d625df05 Mon Sep 17 00:00:00 2001 From: Thomas Kemmer Date: Sat, 30 Aug 2014 14:10:39 +0200 Subject: [PATCH 2/3] Fixed flake8: I201 Missing newline between sections or imports --- tests/local/test_library.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/local/test_library.py b/tests/local/test_library.py index 3cfcb49a..831b8605 100644 --- a/tests/local/test_library.py +++ b/tests/local/test_library.py @@ -4,6 +4,7 @@ import os import shutil import tempfile import unittest + import mock import pykka From 806174916d1cd1c455203171e7c5590d2de21031 Mon Sep 17 00:00:00 2001 From: Thomas Kemmer Date: Fri, 5 Sep 2014 05:35:18 +0200 Subject: [PATCH 3/3] Change JsonLibrary.lookup to return a list --- mopidy/local/json.py | 4 ++-- tests/local/test_library.py | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/mopidy/local/json.py b/mopidy/local/json.py index 5ae04592..30fbb562 100644 --- a/mopidy/local/json.py +++ b/mopidy/local/json.py @@ -151,9 +151,9 @@ class JsonLibrary(local.Library): def lookup(self, uri): try: - return self._tracks[uri] + return [self._tracks[uri]] except KeyError: - return None + return [] def search(self, query=None, limit=100, offset=0, uris=None, exact=False): tracks = self._tracks.values() diff --git a/tests/local/test_library.py b/tests/local/test_library.py index 831b8605..148c82e5 100644 --- a/tests/local/test_library.py +++ b/tests/local/test_library.py @@ -131,22 +131,18 @@ class LocalLibraryProviderTest(unittest.TestCase): tracks = self.library.lookup('fake uri') self.assertEqual(tracks, []) - @mock.patch.object( - json.JsonLibrary, 'lookup') - def test_lookup_multiple_tracks(self, mock_lookup): + # test backward compatibility with local libraries returning a + # single Track + @mock.patch.object(json.JsonLibrary, 'lookup') + def test_lookup_return_single_track(self, mock_lookup): backend = actor.LocalBackend(config=self.config, audio=None) - mock_lookup.return_value = self.tracks - tracks = backend.library.lookup('fake album uri') - mock_lookup.assert_called_with('fake album uri') - self.assertEqual(tracks, self.tracks) - - mock_lookup.return_value = [self.tracks[0]] + mock_lookup.return_value = self.tracks[0] tracks = backend.library.lookup(self.tracks[0].uri) mock_lookup.assert_called_with(self.tracks[0].uri) self.assertEqual(tracks, self.tracks[0:1]) - mock_lookup.return_value = [] + mock_lookup.return_value = None tracks = backend.library.lookup('fake uri') mock_lookup.assert_called_with('fake uri') self.assertEqual(tracks, [])