core: Add core.library.get_images

This commit is contained in:
Thomas Adamcik 2015-02-12 22:38:42 +01:00
parent 05b66ba4a3
commit c0b0e3657a
3 changed files with 69 additions and 1 deletions

View File

@ -92,6 +92,14 @@ class LibraryProvider(object):
"""
return []
def get_images(self, uris):
"""
See :meth:`mopidy.core.LibraryController.get_images`.
*MAY be implemented by subclass.*
"""
return {}
# TODO: replace with search(query, exact=True, ...)
def find_exact(self, query=None, uris=None):
"""

View File

@ -72,6 +72,22 @@ class LibraryController(object):
return []
return backend.library.browse(uri).get()
def get_images(self, uris):
"""Lookup the images for the given URIs
:param list uris: list of uris to find images for
:rtype: dict mapping uris to :class:`mopidy.models.Image` instances
"""
futures = [
backend.library.get_images(backend_uris)
for (backend, backend_uris)
in self._get_backends_to_uris(uris).items() if backend_uris]
images = {}
for result in pykka.get_all(futures):
images.update(result)
return images
def find_exact(self, query=None, uris=None, **kwargs):
"""
Search the library for tracks where ``field`` is ``values``.

View File

@ -5,7 +5,7 @@ import unittest
import mock
from mopidy import backend, core
from mopidy.models import Ref, SearchResult, Track
from mopidy.models import Image, Ref, SearchResult, Track
class CoreLibraryTest(unittest.TestCase):
@ -14,6 +14,8 @@ class CoreLibraryTest(unittest.TestCase):
self.backend1 = mock.Mock()
self.backend1.uri_schemes.get.return_value = ['dummy1']
self.library1 = mock.Mock(spec=backend.LibraryProvider)
self.library1.get_images().get.return_value = {}
self.library1.get_images.reset_mock()
self.library1.root_directory.get.return_value = dummy1_root
self.backend1.library = self.library1
@ -21,6 +23,8 @@ class CoreLibraryTest(unittest.TestCase):
self.backend2 = mock.Mock()
self.backend2.uri_schemes.get.return_value = ['dummy2', 'du2']
self.library2 = mock.Mock(spec=backend.LibraryProvider)
self.library2.get_images().get.return_value = {}
self.library2.get_images.reset_mock()
self.library2.root_directory.get.return_value = dummy2_root
self.backend2.library = self.library2
@ -33,6 +37,46 @@ class CoreLibraryTest(unittest.TestCase):
self.core = core.Core(mixer=None, backends=[
self.backend1, self.backend2, self.backend3])
def test_get_images_returns_empty_dict_for_no_uris(self):
self.assertEqual({}, self.core.library.get_images([]))
def test_get_images_returns_empty_dict_for_unknown_uri(self):
self.assertEqual({}, self.core.library.get_images(['dummy4:bar']))
def test_get_images_returns_empty_dict_for_library_less_uri(self):
self.assertEqual({}, self.core.library.get_images(['dummy3:foo']))
def test_get_images_maps_uri_to_backend(self):
self.core.library.get_images(['dummy1:track'])
self.library1.get_images.assert_called_once_with(['dummy1:track'])
self.library2.get_images.assert_not_called()
def test_get_images_maps_uri_to_backends(self):
self.core.library.get_images(['dummy1:track', 'dummy2:track'])
self.library1.get_images.assert_called_once_with(['dummy1:track'])
self.library2.get_images.assert_called_once_with(['dummy2:track'])
def test_get_images_returns_images(self):
self.library1.get_images().get.return_value = {
'dummy1:track': Image(uri='uri')}
self.library1.get_images.reset_mock()
result = self.core.library.get_images(['dummy1:track'])
self.assertEqual({'dummy1:track': Image(uri='uri')}, result)
def test_get_images_merges_results(self):
self.library1.get_images().get.return_value = {
'dummy1:track': Image(uri='uri1')}
self.library1.get_images.reset_mock()
self.library2.get_images().get.return_value = {
'dummy2:track': Image(uri='uri2')}
self.library2.get_images.reset_mock()
result = self.core.library.get_images(['dummy1:track', 'dummy2:track'])
expected = {'dummy1:track': Image(uri='uri1'),
'dummy2:track': Image(uri='uri2')}
self.assertEqual(expected, result)
def test_browse_root_returns_dir_ref_for_each_lib_with_root_dir_name(self):
result = self.core.library.browse(None)