diff --git a/mopidy/__init__.py b/mopidy/__init__.py index a7ccade1..d94913b0 100644 --- a/mopidy/__init__.py +++ b/mopidy/__init__.py @@ -6,7 +6,20 @@ def get_version(): def get_mpd_protocol_version(): return u'0.16.0' -class SettingsError(Exception): +class MopidyException(Exception): + def __init__(self, message): + self.message = message + + @property + def message(self): + """Reimplement message field that was deprecated in Python 2.6""" + return self._message + + @message.setter + def message(self, message): + self._message = message + +class SettingsError(MopidyException): pass class Settings(object): diff --git a/mopidy/mpd/__init__.py b/mopidy/mpd/__init__.py index 8f352807..c0685891 100644 --- a/mopidy/mpd/__init__.py +++ b/mopidy/mpd/__init__.py @@ -1,6 +1,8 @@ -class MpdAckError(Exception): +from mopidy import MopidyException + +class MpdAckError(MopidyException): pass class MpdNotImplemented(MpdAckError): - def __init__(self, *args): - super(MpdNotImplemented, self).__init__(u'Not implemented', *args) + def __init__(self): + super(MpdNotImplemented, self).__init__(u'Not implemented') diff --git a/mopidy/mpd/frontend.py b/mopidy/mpd/frontend.py index 55cbfeeb..7a92a6c8 100644 --- a/mopidy/mpd/frontend.py +++ b/mopidy/mpd/frontend.py @@ -64,8 +64,9 @@ class MpdFrontend(object): groups = matches.groupdict() try: result = _request_handlers[pattern](self, **groups) - except MpdAckError, e: - return self.handle_response(u'ACK %s' % e, add_ok=False) + except MpdAckError as e: + return self.handle_response(u'ACK %s' % e.message, + add_ok=False) if self.command_list is not False: return None else: @@ -285,7 +286,7 @@ class MpdFrontend(object): songpos = int(songpos) track = self.backend.current_playlist.playlist.tracks[songpos] self.backend.current_playlist.remove(track) - except IndexError, e: + except IndexError as e: raise MpdAckError(u'Position out of bounds') @handle_pattern(r'^deleteid "(?P\d+)"$') @@ -301,8 +302,8 @@ class MpdFrontend(object): try: track = self.backend.current_playlist.get_by_id(songid) return self.backend.current_playlist.remove(track) - except KeyError, e: - raise MpdAckError(unicode(e)) + except KeyError as e: + raise MpdAckError(e[0]) @handle_pattern(r'^clear$') def _current_playlist_clear(self): @@ -408,8 +409,8 @@ class MpdFrontend(object): songid = int(songid) track = self.backend.current_playlist.get_by_id(songid) return track.mpd_format() - except KeyError, e: - raise MpdAckError(e) + except KeyError as e: + raise MpdAckError(e[0]) else: return self.backend.current_playlist.playlist.mpd_format() @@ -825,8 +826,8 @@ class MpdFrontend(object): try: track = self.backend.current_playlist.get_by_id(songid) return self.backend.playback.play(track) - except KeyError, e: - raise MpdAckError(unicode(e)) + except KeyError as e: + raise MpdAckError(e[0]) @handle_pattern(r'^play "(?P\d+)"$') def _playback_playpos(self, songpos): @@ -1335,8 +1336,8 @@ class MpdFrontend(object): try: return ['file: %s' % t.uri for t in self.backend.stored_playlists.get_by_name(name).tracks] - except KeyError, e: - raise MpdAckError(e) + except KeyError as e: + raise MpdAckError(e[0]) @handle_pattern(r'^listplaylistinfo "(?P[^"]+)"$') def _stored_playlists_listplaylistinfo(self, name): @@ -1355,8 +1356,8 @@ class MpdFrontend(object): try: return self.backend.stored_playlists.get_by_name(name).mpd_format( search_result=True) - except KeyError, e: - raise MpdAckError(e) + except KeyError as e: + raise MpdAckError(e[0]) @handle_pattern(r'^listplaylists$') def _stored_playlists_listplaylists(self): diff --git a/tests/mpd/exception_test.py b/tests/mpd/exception_test.py new file mode 100644 index 00000000..029063e8 --- /dev/null +++ b/tests/mpd/exception_test.py @@ -0,0 +1,19 @@ +import unittest + +from mopidy.mpd import MpdAckError, MpdNotImplemented + +class MpdExceptionsTest(unittest.TestCase): + def test_key_error_wrapped_in_mpd_ack_error(self): + try: + try: + raise KeyError(u'Track X not found') + except KeyError as e: + raise MpdAckError(e[0]) + except MpdAckError as e: + self.assertEqual(e.message, u'Track X not found') + + def test_mpd_not_implemented_is_a_mpd_ack_error(self): + try: + raise MpdNotImplemented + except MpdAckError as e: + self.assertEqual(e.message, u'Not implemented')