X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=musicpd.py;h=855ff5f9718020a4da6fd9bb8b9aaffa6cc7bf70;hb=bfd56e9bb04f1d02016c1b8c0406c01152550e31;hp=5b4c3888ebae5f2343135819abd92f762634ac53;hpb=50cb8c23bcd8767244d68e24374e2978a85da420;p=python-musicpd.git diff --git a/musicpd.py b/musicpd.py index 5b4c388..855ff5f 100644 --- a/musicpd.py +++ b/musicpd.py @@ -15,16 +15,35 @@ # You should have received a copy of the GNU Lesser General Public License # along with python-musicpd. If not, see . -# pylint: disable=C0111 +# pylint: disable=missing-docstring import socket +from functools import wraps HELLO_PREFIX = "OK MPD " ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" -VERSION = '0.4.2' +VERSION = '0.4.3' + + +def iterator_wrapper(func): + """Decorator handling iterate option""" + @wraps(func) + def decorated_function(instance, *args, **kwargs): + generator = func(instance, *args, **kwargs) + if not instance.iterate: + return list(generator) + instance._iterating = True + def iterator(gen): + try: + for item in gen: + yield item + finally: + instance._iterating = False + return iterator(generator) + return decorated_function class MPDError(Exception): @@ -75,7 +94,6 @@ class Range: except (TypeError, ValueError): raise CommandError('Not a tuple of int') - class _NotConnected: def __getattr__(self, attr): return self._dummy @@ -358,19 +376,6 @@ class MPDClient: self._command_list = None self._fetch_nothing() - def _iterator_wrapper(self, iterator): - try: - for item in iterator: - yield item - finally: - self._iterating = False - - def _wrap_iterator(self, iterator): - if not self.iterate: - return list(iterator) - self._iterating = True - return self._iterator_wrapper(iterator) - def _fetch_nothing(self): line = self._read_line() if line is not None: @@ -382,11 +387,13 @@ class MPDClient: return return pairs[0][1] + @iterator_wrapper def _fetch_list(self): - return self._wrap_iterator(self._read_list()) + return self._read_list() + @iterator_wrapper def _fetch_playlist(self): - return self._wrap_iterator(self._read_playlist()) + return self._read_playlist() def _fetch_object(self): objs = list(self._read_objects()) @@ -394,8 +401,9 @@ class MPDClient: return {} return objs[0] + @iterator_wrapper def _fetch_objects(self, delimiters): - return self._wrap_iterator(self._read_objects(delimiters)) + return self._read_objects(delimiters) def _fetch_changes(self): return self._fetch_objects(["cpos"]) @@ -424,8 +432,9 @@ class MPDClient: def _fetch_neighbors(self): return self._fetch_objects(["neighbor"]) + @iterator_wrapper def _fetch_command_list(self): - return self._wrap_iterator(self._read_command_list()) + return self._read_command_list() def _hello(self): line = self._rfile.readline() @@ -437,7 +446,6 @@ class MPDClient: self.mpd_version = line[len(HELLO_PREFIX):].strip() def _reset(self): - # pylint: disable=w0201 self.mpd_version = None self._iterating = False self._pending = [] @@ -538,5 +546,4 @@ class MPDClient: def escape(text): return text.replace("\\", "\\\\").replace('"', '\\"') - # vim: set expandtab shiftwidth=4 softtabstop=4 textwidth=79: