Skip to content

Commit

Permalink
Merge pull request #1082 from adamcik/feature/only-support-new-style-…
Browse files Browse the repository at this point in the history
…search-in-backends

core/backend: Stop supporting old search signatures
  • Loading branch information
jodal committed Mar 24, 2015
2 parents f2a56ed + ead725e commit d768a3b
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 63 deletions.
32 changes: 14 additions & 18 deletions mopidy/core/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,25 +242,21 @@ def search(self, query=None, uris=None, exact=False, **kwargs):
The ``exact`` keyword argument, which replaces :meth:`find_exact`.
"""
query = _normalize_query(query or kwargs)
futures = []
futures = {}
for backend, backend_uris in self._get_backends_to_uris(uris).items():
if hasattr(backend.library, 'find_exact'):
# Backends with find_exact probably don't have support for
# search with the exact kwarg, so give them the legacy calls.
if exact:
futures.append(backend.library.find_exact(
query=query, uris=backend_uris))
else:
futures.append(backend.library.search(
query=query, uris=backend_uris))
else:
# Assume backends without find_exact are up to date. Worst case
# the exact gets swallowed by the **kwargs and things hopefully
# still work.
futures.append(backend.library.search(
query=query, uris=backend_uris, exact=exact))

return [result for result in pykka.get_all(futures) if result]
futures[backend] = backend.library.search(
query=query, uris=backend_uris, exact=exact)

results = []
for backend, future in futures.items():
try:
results.append(future.get())
except TypeError:
backend_name = backend.actor_ref.actor_class.__name__
logger.warning(
'%s does not implement library.search() with exact '
'support. Please upgrade it.', backend_name)
return [r for r in results if r]


def _normalize_query(query):
Expand Down
9 changes: 2 additions & 7 deletions mopidy/local/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,7 @@ def lookup(self, uri):
tracks = [tracks]
return tracks

def find_exact(self, query=None, uris=None):
def search(self, query=None, uris=None, exact=False):
if not self._library:
return None
return self._library.search(query=query, uris=uris, exact=True)

def search(self, query=None, uris=None):
if not self._library:
return None
return self._library.search(query=query, uris=uris, exact=False)
return self._library.search(query=query, uris=uris, exact=exact)
61 changes: 27 additions & 34 deletions tests/core/test_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -361,42 +361,35 @@ def test_find_exact_normalises_bad_queries(self):
query={'any': ['foobar']}, uris=None, exact=True)


class LegacyLibraryProvider(backend.LibraryProvider):
def find_exact(self, query=None, uris=None):
pass


class LegacyCoreLibraryTest(unittest.TestCase):
def test_backend_with_find_exact_gets_find_exact_call(self):
b1 = mock.Mock()
b1.uri_schemes.get.return_value = ['dummy1']
b1.library = mock.Mock(spec=LegacyLibraryProvider)

b2 = mock.Mock()
b2.uri_schemes.get.return_value = ['dummy2']
b2.library = mock.Mock(spec=backend.LibraryProvider)

c = core.Core(mixer=None, backends=[b1, b2])
c.library.find_exact(query={'any': ['a']})

b1.library.find_exact.assert_called_once_with(
query=dict(any=['a']), uris=None)
b2.library.search.assert_called_once_with(
class LegacyFindExactToSearchLibraryTest(unittest.TestCase):
def setUp(self): # noqa: N802
self.backend = mock.Mock()
self.backend.actor_ref.actor_class.__name__ = 'DummyBackend'
self.backend.uri_schemes.get.return_value = ['dummy']
self.backend.library = mock.Mock(spec=backend.LibraryProvider)
self.core = core.Core(mixer=None, backends=[self.backend])

def test_core_find_exact_calls_backend_search_with_exact(self):
self.core.library.find_exact(query={'any': ['a']})
self.backend.library.search.assert_called_once_with(
query=dict(any=['a']), uris=None, exact=True)

def test_backend_with_find_exact_gets_search_without_exact_arg(self):
b1 = mock.Mock()
b1.uri_schemes.get.return_value = ['dummy1']
b1.library = mock.Mock(spec=LegacyLibraryProvider)
def test_core_find_exact_handles_legacy_backend(self):
self.backend.library.search.return_value.get.side_effect = TypeError
self.core.library.find_exact(query={'any': ['a']})
# We are just testing that this doesn't fail.

b2 = mock.Mock()
b2.uri_schemes.get.return_value = ['dummy2']
b2.library = mock.Mock(spec=backend.LibraryProvider)
def test_core_search_call_backend_search_with_exact(self):
self.core.library.search(query={'any': ['a']})
self.backend.library.search.assert_called_once_with(
query=dict(any=['a']), uris=None, exact=False)

c = core.Core(mixer=None, backends=[b1, b2])
c.library.search(query={'any': ['a']})
def test_core_search_with_exact_call_backend_search_with_exact(self):
self.core.library.search(query={'any': ['a']}, exact=True)
self.backend.library.search.assert_called_once_with(
query=dict(any=['a']), uris=None, exact=True)

b1.library.search.assert_called_once_with(
query=dict(any=['a']), uris=None)
b2.library.search.assert_called_once_with(
query=dict(any=['a']), uris=None, exact=False)
def test_core_search_with_handles_legacy_backend(self):
self.backend.library.search.return_value.get.side_effect = TypeError
self.core.library.search(query={'any': ['a']}, exact=True)
# We are just testing that this doesn't fail.
7 changes: 3 additions & 4 deletions tests/dummy_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,15 @@ def browse(self, path):
def get_distinct(self, field, query=None):
return self.dummy_get_distinct_result.get(field, set())

def find_exact(self, **query):
return self.dummy_find_exact_result

def lookup(self, uri):
return [t for t in self.dummy_library if uri == t.uri]

def refresh(self, uri=None):
pass

def search(self, **query):
def search(self, query=None, uris=None, exact=False):
if exact: # TODO: remove uses of dummy_find_exact_result
return self.dummy_find_exact_result
return self.dummy_search_result


Expand Down

0 comments on commit d768a3b

Please sign in to comment.