- try:
- retval = self._commands[attr]
- except KeyError:
- raise AttributeError("'%s' object has no attribute '%s'" %
- (self.__class__.__name__, attr))
- return lambda *args: self._docommand(attr, args, retval)
-
- def _docommand(self, command, args, retval):
- if self._commandlist is not None and not callable(retval):
- raise CommandListError("%s not allowed in command list" % command)
- self._writecommand(command, args)
- if self._commandlist is None:
+ 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:
+ command = command.replace("_", " ")
+ if command not in self._commands:
+ raise AttributeError("'%s' object has no attribute '%s'" %
+ (self.__class__.__name__, attr))
+ return lambda *args: wrapper(command, args)
+
+ def _send(self, command, args):
+ if self._command_list is not None:
+ raise CommandListError("Cannot use send_%s in a command list" %
+ command.replace(" ", "_"))
+ 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.replace(" ", "_"))
+ if self._iterating:
+ raise IteratingError("Cannot use fetch_%s while iterating" %
+ command.replace(" ", "_"))
+ 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._iterating:
+ raise IteratingError("Cannot execute '%s' while iterating" %
+ command)
+ if self._pending:
+ raise PendingCommandError("Cannot execute '%s' with "
+ "pending commands" % command)
+ retval = self._commands[command]
+ if self._command_list is not None:
+ if not callable(retval):
+ raise CommandListError("'%s' not allowed in command list" %
+ command)
+ self._write_command(command, args)
+ self._command_list.append(retval)
+ else:
+ self._write_command(command, args)