Refactor BaseCurrentPlaylistController.get_by_{id,uri} into a generic get(**criteria)

This commit is contained in:
Stein Magnus Jodal 2010-03-31 18:41:30 +02:00
parent db4f449be9
commit c24c7818e5
2 changed files with 39 additions and 28 deletions

View File

@ -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):
"""

View File

@ -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))