Refactor BaseCurrentPlaylistController.get_by_{id,uri} into a generic get(**criteria)
This commit is contained in:
parent
db4f449be9
commit
c24c7818e5
@ -90,33 +90,28 @@ class BaseCurrentPlaylistController(object):
|
||||
self.backend.playback.current_track = None
|
||||
self.playlist = Playlist()
|
||||
|
||||
def get_by_id(self, id):
|
||||
def get(self, **criteria):
|
||||
"""
|
||||
Get track by ID. Raises :class:`KeyError` if not found.
|
||||
Get track by given criterias. Raises :class:`KeyError` if not found.
|
||||
|
||||
:param id: track ID
|
||||
:type id: int
|
||||
Examples::
|
||||
|
||||
get(id=1) # Returns track with ID 1
|
||||
get(uri='xyz') # Returns track with URI 'xyz'
|
||||
|
||||
:param **criteria: on or more criteria to match by
|
||||
:type **criteria: dict
|
||||
:rtype: :class:`mopidy.models.Track`
|
||||
"""
|
||||
matches = filter(lambda t: t.id == id, self._playlist.tracks)
|
||||
matches = self._playlist.tracks
|
||||
for (key, value) in criteria.iteritems():
|
||||
matches = filter(lambda t: getattr(t, key) == value, matches)
|
||||
if matches:
|
||||
return matches[0]
|
||||
else:
|
||||
raise KeyError('Track with ID "%s" not found' % id)
|
||||
|
||||
def get_by_uri(self, uri):
|
||||
"""
|
||||
Get track by URI. Raises :class:`KeyError` if not found.
|
||||
|
||||
:param uri: track URI
|
||||
:type uri: string
|
||||
:rtype: :class:`mopidy.models.Track`
|
||||
"""
|
||||
matches = filter(lambda t: t.uri == uri, self._playlist.tracks)
|
||||
if matches:
|
||||
return matches[0]
|
||||
else:
|
||||
raise KeyError('Track with URI "%s" not found' % uri)
|
||||
criteria_string = ', '.join(
|
||||
['%s=%s' % (k, v) for (k, v) in criteria.iteritems()])
|
||||
raise KeyError(u'Track matching "%s" not found' % criteria_string)
|
||||
|
||||
def load(self, playlist):
|
||||
"""
|
||||
|
||||
@ -11,17 +11,17 @@ class CurrentPlaylistGetTest(unittest.TestCase):
|
||||
def test_get_by_id_returns_unique_match(self):
|
||||
track = Track(id=1)
|
||||
self.c.playlist = Playlist(tracks=[Track(id=13), track, Track(id=17)])
|
||||
self.assertEqual(track, self.c.get_by_id(1))
|
||||
self.assertEqual(track, self.c.get(id=1))
|
||||
|
||||
def test_get_by_id_returns_first_of_multiple_matches(self):
|
||||
track = Track(id=1)
|
||||
self.c.playlist = Playlist(tracks=[Track(id=13), track, track])
|
||||
self.assertEqual(track, self.c.get_by_id(1))
|
||||
self.assertEqual(track, self.c.get(id=1))
|
||||
|
||||
def test_get_by_id_raises_keyerror_if_no_match(self):
|
||||
self.c.playlist = Playlist(tracks=[Track(id=13), Track(id=17)])
|
||||
try:
|
||||
self.c.get_by_id(1)
|
||||
self.c.get(id=1)
|
||||
self.fail(u'Should raise KeyError if no match')
|
||||
except KeyError:
|
||||
pass
|
||||
@ -30,17 +30,33 @@ class CurrentPlaylistGetTest(unittest.TestCase):
|
||||
track = Track(uri='a')
|
||||
self.c.playlist = Playlist(
|
||||
tracks=[Track(uri='z'), track, Track(uri='y')])
|
||||
self.assertEqual(track, self.c.get_by_uri('a'))
|
||||
self.assertEqual(track, self.c.get(uri='a'))
|
||||
|
||||
def test_get_by_uri_returns_first_of_multiple_matches(self):
|
||||
track = Track(uri='a')
|
||||
self.c.playlist = Playlist(tracks=[Track(uri='z'), track, track])
|
||||
self.assertEqual(track, self.c.get_by_uri('a'))
|
||||
self.assertEqual(track, self.c.get(uri='a'))
|
||||
|
||||
def test_get_by_uri_raises_keyerror_if_no_match(self):
|
||||
self.c.playlist = Playlist(tracks=[Track(uri='z'), Track(uri='y')])
|
||||
try:
|
||||
self.c.get_by_uri('a')
|
||||
self.c.get(uri='a')
|
||||
self.fail(u'Should raise KeyError if no match')
|
||||
except KeyError:
|
||||
pass
|
||||
except KeyError as e:
|
||||
self.assertEqual(u'Track matching "uri=a" not found', e[0])
|
||||
|
||||
def test_get_by_multiple_criteria_returns_elements_matching_all(self):
|
||||
track1 = Track(id=1, uri='a')
|
||||
track2 = Track(id=1, uri='b')
|
||||
track3 = Track(id=2, uri='b')
|
||||
self.c.playlist = Playlist(tracks=[track1, track2, track3])
|
||||
self.assertEqual(track1, self.c.get(id=1, uri='a'))
|
||||
self.assertEqual(track2, self.c.get(id=1, uri='b'))
|
||||
self.assertEqual(track3, self.c.get(id=2, uri='b'))
|
||||
|
||||
def test_get_by_criteria_that_is_not_present_in_all_elements(self):
|
||||
track1 = Track(id=1)
|
||||
track2 = Track(uri='b')
|
||||
track3 = Track(id=2)
|
||||
self.c.playlist = Playlist(tracks=[track1, track2, track3])
|
||||
self.assertEqual(track1, self.c.get(id=1))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user