core: Add tlid argument to index calls.

Should save clients from having to pass tl_track models around.
This commit is contained in:
Thomas Adamcik 2015-04-17 20:42:52 +02:00 committed by
parent 5acc3ea564
commit 6a7005be1e
3 changed files with 72 additions and 17 deletions

View File

@ -200,19 +200,32 @@ class TracklistController(object):
# Methods
def index(self, tl_track):
def index(self, tl_track=None, tlid=None):
"""
The position of the given track in the tracklist.
:param tl_track: the track to find the index of
:type tl_track: :class:`mopidy.models.TlTrack` or :class:`None`
:param tlid: of the track to find the index of
:type tlid: TLID number or :class:`None`
:rtype: :class:`int` or :class:`None`
.. versionchanged:: 1.1
Added the *tlid* parameter
"""
tl_track is None or validation.check_instance(tl_track, TlTrack)
try:
return self._tl_tracks.index(tl_track)
except ValueError:
return None
tlid is None or validation.check_integer(tlid, min=0)
if tl_track is not None:
try:
return self._tl_tracks.index(tl_track)
except ValueError:
pass
elif tlid is not None:
for i, tl_track in enumerate(self._tl_tracks):
if tl_track.tlid == tlid:
return i
return None
def eot_track(self, tl_track):
"""

View File

@ -5,7 +5,7 @@ import unittest
import mock
from mopidy import backend, core
from mopidy.models import Track
from mopidy.models import TlTrack, Track
from mopidy.utils import deprecation
@ -102,3 +102,55 @@ class TracklistTest(unittest.TestCase):
self.core.tracklist.filter({'uri': 'a'})
# TODO Extract tracklist tests from the local backend tests
class TracklistIndexTest(unittest.TestCase):
def setUp(self): # noqa: N802
self.tracks = [
Track(uri='dummy1:a', name='foo'),
Track(uri='dummy1:b', name='foo'),
Track(uri='dummy1:c', name='bar'),
]
def lookup(uris):
return {u: [t for t in self.tracks if t.uri == u] for u in uris}
self.core = core.Core(mixer=None, backends=[])
self.core.library.lookup = mock.Mock()
self.core.library.lookup.side_effect = lookup
self.tl_tracks = self.core.tracklist.add(uris=[
t.uri for t in self.tracks])
def test_index_returns_index_of_track(self):
self.assertEqual(0, self.core.tracklist.index(self.tl_tracks[0]))
self.assertEqual(1, self.core.tracklist.index(self.tl_tracks[1]))
self.assertEqual(2, self.core.tracklist.index(self.tl_tracks[2]))
def test_index_returns_none_if_item_not_found(self):
tl_track = TlTrack(0, Track())
self.assertEqual(self.core.tracklist.index(tl_track), None)
def test_index_returns_none_if_called_with_none(self):
self.assertEqual(self.core.tracklist.index(None), None)
def test_index_errors_out_for_invalid_tltrack(self):
with self.assertRaises(ValueError):
self.core.tracklist.index('abc')
def test_index_return_index_when_called_with_tlids(self):
tl_tracks = self.tl_tracks
self.assertEqual(0, self.core.tracklist.index(tlid=tl_tracks[0].tlid))
self.assertEqual(1, self.core.tracklist.index(tlid=tl_tracks[1].tlid))
self.assertEqual(2, self.core.tracklist.index(tlid=tl_tracks[2].tlid))
def test_index_returns_none_if_tlid_not_found(self):
self.assertEqual(self.core.tracklist.index(tlid=123), None)
def test_index_returns_none_if_called_with_tlid_none(self):
self.assertEqual(self.core.tracklist.index(tlid=None), None)
def test_index_errors_out_for_invalid_tlid(self):
with self.assertRaises(ValueError):
self.core.tracklist.index(tlid=-1)

View File

@ -8,7 +8,7 @@ import pykka
from mopidy import core
from mopidy.core import PlaybackState
from mopidy.local import actor
from mopidy.models import Playlist, TlTrack, Track
from mopidy.models import Playlist, Track
from mopidy.utils import deprecation
from tests import dummy_audio, path_to_data_dir
@ -176,16 +176,6 @@ class LocalTracklistProviderTest(unittest.TestCase):
tl_tracks = self.controller.add(self.controller.tracks[1:2])
self.assertEqual(tl_tracks[0].track, self.controller.tracks[1])
def test_index_returns_index_of_track(self):
tl_tracks = self.controller.add(self.tracks)
self.assertEqual(0, self.controller.index(tl_tracks[0]))
self.assertEqual(1, self.controller.index(tl_tracks[1]))
self.assertEqual(2, self.controller.index(tl_tracks[2]))
def test_index_returns_none_if_item_not_found(self):
tl_track = TlTrack(0, Track())
self.assertEqual(self.controller.index(tl_track), None)
@populate_tracklist
def test_move_single(self):
self.controller.move(0, 0, 2)