Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
 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)