Beispiel #1
0
 def process_ended(self, reason):
     log.warning(f"renderer | process ended: {reason}")
     if not self.terminated:
         # Clear the filename on crash so it works when reset
         #self.document = None
         self.restart()
     log.warning("renderer | stdout closed")
Beispiel #2
0
 def refresh_view(self, change):
     """ Refresh the compiled view object.
 
     This method will (re)compile the view for the given view text
     and update the 'compiled_view' attribute. If a compiled model
     is available and the view has a member named 'model', the model
     will be applied to the view.
 
     """
     viewer = self.workbench.get_plugin('declaracad.viewer')
     doc = self.active_document
     try:
         ast = parse(doc.source, filename=doc.name)
         code = EnamlCompiler.compile(ast, doc.name)
         module = ModuleType('__main__')
         module.__file__ = doc.name
         namespace = module.__dict__
         with enaml.imports():
             exec_(code, namespace)
         assembly = namespace.get('Assembly', lambda: None)()
         viewer.parts = [assembly] if assembly else []
     except Exception as e:
         errors = doc.errors[:]
         log.warning(traceback.format_exc())
         tb = traceback.format_exc().strip().split("\n")
         print(tb[-3])
         m = re.search(r'File "(.+)", line (\d+),', tb[-3])
         if m:
             errors.append("{}:{}: {}".format(m.group(1), m.group(2),
                                              tb[-1]))
         doc.errors = errors
         viewer.parts = []
Beispiel #3
0
    def data_received(self, data):
        line = data.decode()
        try:
            response = jsonpickle.loads(line)
            # log.debug(f"viewer | resp | {response}")
        except Exception as e:
            log.debug(f"viewer | out | {line.rstrip()}")
            response = {}

        doc = self.document

        if not isinstance(response, dict):
            log.debug(f"viewer | out | {response.rstrip()}")
            return

        #: Special case for startup
        response_id = response.get('id')
        if response_id == 'window_id':
            self.window_id = response['result']
            self.restarts = 0  # Clear the restart count
            return
        elif response_id == 'keep_alive':
            return
        elif response_id == 'invoke_command':
            command_id = response.get('command_id')
            parameters = response.get('parameters', {})
            log.debug(f"viewer | out | {command_id}({parameters})")
            self.plugin.workbench.invoke_command(command_id, parameters)
        elif response_id == 'render_error':
            if doc:
                doc.errors.extend(response['error']['message'].split("\n"))
            return
        elif response_id == 'render_success':
            if doc:
                doc.errors = []
            return
        elif response_id == 'capture_output':
            # Script output capture it
            if doc:
                doc.output = response['result'].split("\n")
            return
        elif response_id == 'shape_selection':
            #: TODO: Do something with this?
            if doc:
                doc.output.append(str(response['result']))
            return
        elif response_id is not None:
            # Lookup the deferred object that should be stored for this id
            # when it is called and invoke the callback or errback based on the
            # result
            d = self._responses.get(response_id)
            if d is not None:
                del self._responses[response_id]
                try:
                    error = response.get('error')
                    if error is not None:
                        if doc:
                            doc.errors.extend(
                                error.get('message', '').split("\n"))
                        d.add_done_callback(error)
                    else:
                        d.add_done_callback(response.get('result'))
                    return
                except Exception as e:
                    log.warning("RPC response not properly handled!")
                    log.exception(e)

            else:
                log.warning("Got unexpected reply")
            # else we got a response from something else, possibly an error?
        if 'error' in response and doc:
            doc.errors.extend(response['error'].get('message', '').split("\n"))
            doc.output.append(line)
        elif 'message' in response and doc:
            doc.output.extend(response['message'].split("\n"))
        elif doc:
            # Append to output
            doc.output.extend(line.split("\n"))
Beispiel #4
0
 def processEnded(self, reason):
     super(ViewerProcess, self).processEnded(reason)
     log.warning(f"renderer | process ended: {reason}")
Beispiel #5
0
 def errConnectionLost(self):
     log.warning("renderer | stderr closed")
Beispiel #6
0
 def outConnectionLost(self):
     if not self.terminated:
         # Clear the filename on crash so it works when reset
         #self.document = None
         self.restart()
     log.warning("renderer | stdout closed")
Beispiel #7
0
 def inConnectionLost(self):
     log.warning("renderer | stdio closed (we probably did it)")
Beispiel #8
0
 def outConnectionLost(self):
     if not self.terminated:
         self.restart()
     log.warning("renderer | stdout closed")