def __call__(self, *args, **kwargs): """Call method on server.""" data = dumps((CALL, self._name, args, kwargs)) self._conn.write(data) response = self._conn.read() value, error = loads(response) if error is None: return value try: name, args = error except TypeError: # Handle old way of returning error as repr. logging.warning('Unknown error returned by proxy, error=%s.', error) raise ServerError(error) logging.warning('Error returned by proxy, name=%s, args=%s.', name, args) # Raise built-in exceptions sent by server. if name in BUILTIN_EXCEPTIONS_NAMES: e = getattr(builtins, name)() e.args = args raise e # Exception sent from server. Original traceback unavailable. self._on_exception(name, args)
def _dispatch(self, handler, conn, n=1000): """Serve single call.""" for i in range(n): data = conn.read() type, name, args, kwargs = loads(data) try: foo = handler._methods.get(name, None) or handler._get_method(name) result = foo(*args, **kwargs) error = None except Exception: logging.debug('Caught exception raised by callable.', exc_info=True) # Use exc_info for py2.x py3.x compatibility. t, v, tb = sys.exc_info() if t in BUILTIN_EXCEPTIONS: error = (t.__name__, v.args) else: error = (repr(t), v.args) result = None if type == CALL: response = dumps((result, error)) conn.write(response)
def process(self, data=None): """Process buffered incoming calls The data parameter is ignored, it's there for compatibility with init/update from the Entity/Components classes as this function is going to be called within a greenlet """ if self.inBuf and not self.staticglobals: # We change the namespace available on each call, kinda hacky and certainly slow...but hey, it works and the scene is dinamically available to you from ignifuga.Gilbert import Gilbert from ignifuga.rfoo.utils.rconsole import BufferedInterpreter import rlcompleter gilbert = Gilbert() while self.inBuf: handler, conn, type, name, args, kwargs = self.inBuf.pop(0) try: if not self.staticglobals: if gilbert.scene is not None: self._handler_context = gilbert.scene.runEnv else: self._handler_context = globals() handler._namespace = self._handler_context handler._interpreter = BufferedInterpreter( handler._namespace) handler._completer = rlcompleter.Completer( handler._namespace) foo = handler._methods.get(name, None) or handler._get_method(name) result = foo(*args, **kwargs) error = None except Exception: print 'Caught exception raised by callable.' # Use exc_info for py2.x py3.x compatibility. t, v, tb = sys.exc_info() if t in BUILTIN_EXCEPTIONS: error = (t.__name__, v.args) else: error = (repr(t), v.args) result = None if type == CALL: response = dumps((result, error)) conn.write(response)
def process(self, data=None): """Process buffered incoming calls The data parameter is ignored, it's there for compatibility with init/update from the Entity/Components classes as this function is going to be called within a greenlet """ if self.inBuf and not self.staticglobals: # We change the namespace available on each call, kinda hacky and certainly slow...but hey, it works and the scene is dinamically available to you from ignifuga.Gilbert import Gilbert from ignifuga.rfoo.utils.rconsole import BufferedInterpreter import rlcompleter gilbert = Gilbert() while self.inBuf: handler, conn, type, name, args, kwargs = self.inBuf.pop(0) try: if not self.staticglobals: if gilbert.scene is not None: self._handler_context = gilbert.scene.runEnv else: self._handler_context = globals() handler._namespace = self._handler_context handler._interpreter = BufferedInterpreter(handler._namespace) handler._completer = rlcompleter.Completer(handler._namespace) foo = handler._methods.get(name, None) or handler._get_method(name) result = foo(*args, **kwargs) error = None except Exception: print 'Caught exception raised by callable.' # Use exc_info for py2.x py3.x compatibility. t, v, tb = sys.exc_info() if t in BUILTIN_EXCEPTIONS: error = (t.__name__, v.args) else: error = (repr(t), v.args) result = None if type == CALL: response = dumps((result, error)) conn.write(response)
def __call__(self, *args, **kwargs): """Call method on server, don't wait for response.""" data = dumps((NOTIFY, self._name, args, kwargs)) self._conn.write(data)