[Pkg-mpd-commits] [python-mpd] 53/262: mpd.py: adding support for asynchronous commands
Simon McVittie
smcv at debian.org
Sun May 22 18:16:24 UTC 2016
This is an automated email from the git hooks/post-receive script.
smcv pushed a commit to branch upstream
in repository python-mpd.
commit 5c84adfc3853f683df1a79f4e4852386c4714508
Author: J. Alexander Treuman <jat at spatialrift.net>
Date: Thu Jul 15 13:19:57 2010 -0400
mpd.py: adding support for asynchronous commands
send_<cmd>/fetch_<cmd> may now be used to send/fetch the command <cmd>.
fetch_<cmd> may be called multiple times to queue up various commands, but
they must be fetched in the same order they were sent. This functionality
cannot be mixed with command lists.
---
mpd.py | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 5 deletions(-)
diff --git a/mpd.py b/mpd.py
index 62df3a1..2875f95 100644
--- a/mpd.py
+++ b/mpd.py
@@ -38,6 +38,9 @@ class CommandError(MPDError):
class CommandListError(MPDError):
pass
+class PendingCommandError(MPDError):
+ pass
+
class _NotConnected(object):
def __getattr__(self, attr):
@@ -131,14 +134,46 @@ class MPDClient(object):
}
def __getattr__(self, attr):
- try:
- retval = self._commands[attr]
- except KeyError:
+ if attr.startswith("send_"):
+ command = attr.replace("send_", "", 1)
+ wrapper = self._send
+ elif attr.startswith("fetch_"):
+ command = attr.replace("fetch_", "", 1)
+ wrapper = self._fetch
+ else:
+ command = attr
+ wrapper = self._execute
+ if command not in self._commands:
raise AttributeError("'%s' object has no attribute '%s'" %
(self.__class__.__name__, attr))
- return lambda *args: self._execute(attr, args, retval)
+ return lambda *args: wrapper(command, args)
- def _execute(self, command, args, retval):
+ def _send(self, command, args):
+ if self._command_list is not None:
+ raise CommandListError("Cannot use send_%s in a command list" %
+ command)
+ self._write_command(command, args)
+ self._pending.append(command)
+
+ def _fetch(self, command, args=None):
+ if self._command_list is not None:
+ raise CommandListError("Cannot use fetch_%s in a command list" %
+ command)
+ if not self._pending:
+ raise PendingCommandError("No pending commands to fetch")
+ if self._pending[0] != command:
+ raise PendingCommandError("%s is not the currently "
+ "pending command" % command)
+ del self._pending[0]
+ retval = self._commands[command]
+ if callable(retval):
+ return retval()
+
+ def _execute(self, command, args):
+ if self._pending:
+ raise PendingCommandError("Cannot execute %s with "
+ "pending commands" % command)
+ retval = self._commands[command]
if self._command_list is not None and not callable(retval):
raise CommandListError("%s not allowed in command list" % command)
self._write_command(command, args)
@@ -293,6 +328,7 @@ class MPDClient(object):
def _reset(self):
self.mpd_version = None
+ self._pending = []
self._command_list = None
self._sock = None
self._rfile = _NotConnected()
@@ -353,6 +389,9 @@ class MPDClient(object):
def command_list_ok_begin(self):
if self._command_list is not None:
raise CommandListError("Already in command list")
+ if self._pending:
+ raise PendingCommandError("Cannot begin command list "
+ "with pending commands")
self._write_command("command_list_ok_begin")
self._command_list = []
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mpd/python-mpd.git
More information about the Pkg-mpd-commits
mailing list