core: Re-add one uri scheme per backend constraint.
This commit is contained in:
parent
f5430f4a7f
commit
e82ce6256d
@ -91,25 +91,24 @@ class Backends(list):
|
||||
self.with_playback = collections.OrderedDict()
|
||||
self.with_playlists = collections.OrderedDict()
|
||||
|
||||
backends_by_scheme = {}
|
||||
name = lambda backend: backend.actor_ref.actor_class.__name__
|
||||
|
||||
for backend in backends:
|
||||
has_library = backend.has_library().get()
|
||||
has_playback = backend.has_playback().get()
|
||||
has_playlists = backend.has_playlists().get()
|
||||
|
||||
for scheme in backend.uri_schemes.get():
|
||||
self.add(self.with_library, has_library, scheme, backend)
|
||||
self.add(self.with_playback, has_playback, scheme, backend)
|
||||
self.add(self.with_playlists, has_playlists, scheme, backend)
|
||||
assert scheme not in backends_by_scheme, (
|
||||
'Cannot add URI scheme %s for %s, '
|
||||
'it is already handled by %s'
|
||||
) % (scheme, name(backend), name(backends_by_scheme[scheme]))
|
||||
backends_by_scheme[scheme] = backend
|
||||
|
||||
def add(self, registry, supported, uri_scheme, backend):
|
||||
if not supported:
|
||||
return
|
||||
|
||||
if uri_scheme not in registry:
|
||||
registry[uri_scheme] = backend
|
||||
return
|
||||
|
||||
get_name = lambda actor: actor.actor_ref.actor_class.__name__
|
||||
raise AssertionError(
|
||||
'Cannot add URI scheme %s for %s, it is already handled by %s' %
|
||||
(uri_scheme, get_name(backend), get_name(registry[uri_scheme])))
|
||||
if has_library:
|
||||
self.with_library[scheme] = backend
|
||||
if has_playback:
|
||||
self.with_playback[scheme] = backend
|
||||
if has_playlists:
|
||||
self.with_playlists[scheme] = backend
|
||||
|
||||
@ -13,9 +13,11 @@ class CoreActorTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.backend1 = mock.Mock()
|
||||
self.backend1.uri_schemes.get.return_value = ['dummy1']
|
||||
self.backend1.actor_ref.actor_class.__name__ = b'B1'
|
||||
|
||||
self.backend2 = mock.Mock()
|
||||
self.backend2.uri_schemes.get.return_value = ['dummy2']
|
||||
self.backend2.actor_ref.actor_class.__name__ = b'B2'
|
||||
|
||||
self.core = Core(audio=None, backends=[self.backend1, self.backend2])
|
||||
|
||||
@ -29,32 +31,12 @@ class CoreActorTest(unittest.TestCase):
|
||||
self.assertIn('dummy2', result)
|
||||
|
||||
def test_backends_with_colliding_uri_schemes_fails(self):
|
||||
self.backend1.actor_ref.actor_class.__name__ = b'B1'
|
||||
self.backend2.actor_ref.actor_class.__name__ = b'B2'
|
||||
self.backend2.uri_schemes.get.return_value = ['dummy1', 'dummy2']
|
||||
|
||||
self.assertRaisesRegexp(
|
||||
AssertionError,
|
||||
'Cannot add URI scheme dummy1 for B2, it is already handled by B1',
|
||||
Core, audio=None, backends=[self.backend1, self.backend2])
|
||||
|
||||
def test_backends_with_colliding_uri_schemes_passes(self):
|
||||
"""
|
||||
Checks that backends with overlapping schemes, but distinct sub parts
|
||||
provided can co-exist.
|
||||
"""
|
||||
|
||||
self.backend1.has_library().get.return_value = False
|
||||
self.backend1.has_playlists().get.return_value = False
|
||||
|
||||
self.backend2.uri_schemes.get.return_value = ['dummy1']
|
||||
self.backend2.has_playback().get.return_value = False
|
||||
self.backend2.has_playlists().get.return_value = False
|
||||
|
||||
core = Core(audio=None, backends=[self.backend1, self.backend2])
|
||||
self.assertEqual(core.backends.with_playback,
|
||||
{'dummy1': self.backend1})
|
||||
self.assertEqual(core.backends.with_library,
|
||||
{'dummy1': self.backend2})
|
||||
|
||||
def test_version(self):
|
||||
self.assertEqual(self.core.version, versioning.get_version())
|
||||
|
||||
Loading…
Reference in New Issue
Block a user