[pypy-svn] r44262 - in pypy/branch/graphserver-dist/dotviewer: . test

arigo at codespeak.net arigo at codespeak.net
Fri Jun 15 10:04:18 CEST 2007


Author: arigo
Date: Fri Jun 15 10:04:10 2007
New Revision: 44262

Modified:
   pypy/branch/graphserver-dist/dotviewer/graphclient.py
   pypy/branch/graphserver-dist/dotviewer/graphdisplay.py
   pypy/branch/graphserver-dist/dotviewer/graphpage.py
   pypy/branch/graphserver-dist/dotviewer/graphparse.py
   pypy/branch/graphserver-dist/dotviewer/graphserver.py
   pypy/branch/graphserver-dist/dotviewer/msgstruct.py
   pypy/branch/graphserver-dist/dotviewer/test/test_interactive.py
Log:
Safer error handling.  Fix the display of colors.


Modified: pypy/branch/graphserver-dist/dotviewer/graphclient.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/graphclient.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/graphclient.py	Fri Jun 15 10:04:10 2007
@@ -63,6 +63,9 @@
                         reload(graph_id)
         except EOFError:
             pass
+        except Exception, e:
+            send_error(io, e)
+            raise
         io.close()
 
 def page_messages(page, graph_id):
@@ -88,6 +91,17 @@
     if ioerror is not None:
         raise ioerror
 
+def send_error(io, e):
+    try:
+        errmsg = str(e)
+        if errmsg:
+            errmsg = '%s: %s' % (e.__class__.__name__, errmsg)
+        else:
+            errmsg = '%s' % (e.__class__.__name__,)
+        io.sendmsg(msgstruct.CMSG_SAY, errmsg)
+    except Exception:
+        pass
+
 def spawn_handler():
     gsvar = os.environ.get('GRAPHSERVER')
     if not gsvar:

Modified: pypy/branch/graphserver-dist/dotviewer/graphdisplay.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/graphdisplay.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/graphdisplay.py	Fri Jun 15 10:04:10 2007
@@ -650,10 +650,13 @@
         self.quit()
      
     def process_UserEvent(self, event): # new layout request
-        if event.layout is None:
-            self.setstatusbar('cannot follow this link')
-        else:
-            self.setlayout(event.layout)
+        if hasattr(event, 'layout'):
+            if event.layout is None:
+                self.setstatusbar('cannot follow this link')
+            else:
+                self.setlayout(event.layout)
+        elif hasattr(event, 'say'):
+            self.setstatusbar(event.say)
     
     def quit(self):
         raise StopIteration

Modified: pypy/branch/graphserver-dist/dotviewer/graphpage.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/graphpage.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/graphpage.py	Fri Jun 15 10:04:10 2007
@@ -1,5 +1,5 @@
 
-class GraphPage:
+class GraphPage(object):
     """Base class for the client-side content of one of the 'pages'
     (one graph) sent over to and displayed by the external process.
     """
@@ -27,6 +27,11 @@
         import graphclient
         graphclient.display_page(self)
 
+    def display_background(self):
+        "Display a graph page in a background thread."
+        import graphclient, thread
+        thread.start_new_thread(graphclient.display_page, (self,))
+
 
 class DotFileGraphPage(GraphPage):
     def compute(self, dotfile):

Modified: pypy/branch/graphserver-dist/dotviewer/graphparse.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/graphparse.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/graphparse.py	Fri Jun 15 10:04:10 2007
@@ -101,7 +101,7 @@
                         color = None
                     if color is not None:
                         yield (msgstruct.CMSG_ADD_LINK, word,
-                               statusbartext, color)
+                               statusbartext, color[0], color[1], color[2])
                     else:
                         yield (msgstruct.CMSG_ADD_LINK, word, statusbartext)
                     seen[word] = True

Modified: pypy/branch/graphserver-dist/dotviewer/graphserver.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/graphserver.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/graphserver.py	Fri Jun 15 10:04:10 2007
@@ -82,6 +82,8 @@
     def cmsg_add_link(self, word, *info):
         if len(info) == 1:
             info = info[0]
+        elif len(info) >= 4:
+            info = (info[0], info[1:4])
         self.newlayout.links[word] = info
 
     def cmsg_stop_graph(self, *rest):
@@ -92,6 +94,10 @@
     def cmsg_missing_link(self, *rest):
         self.setlayout(None)
 
+    def cmsg_say(self, errmsg, *rest):
+        from drawgraph import display_async_cmd
+        display_async_cmd(say=errmsg)
+
     MESSAGES = {
         msgstruct.CMSG_START_GRAPH: cmsg_start_graph,
         msgstruct.CMSG_ADD_NODE:    cmsg_add_node,
@@ -99,6 +105,7 @@
         msgstruct.CMSG_ADD_LINK:    cmsg_add_link,
         msgstruct.CMSG_STOP_GRAPH:  cmsg_stop_graph,
         msgstruct.CMSG_MISSING_LINK:cmsg_missing_link,
+        msgstruct.CMSG_SAY:         cmsg_say,
         }
 
 

Modified: pypy/branch/graphserver-dist/dotviewer/msgstruct.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/msgstruct.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/msgstruct.py	Fri Jun 15 10:04:10 2007
@@ -10,6 +10,7 @@
 CMSG_ADD_LINK    = 'l'
 CMSG_STOP_GRAPH  = ']'
 CMSG_MISSING_LINK= 'm'
+CMSG_SAY         = 's'
 
 MSG_OK           = 'O'
 MSG_ERROR        = 'E'
@@ -23,6 +24,7 @@
 
 
 def message(tp, *values):
+    #print >> sys.stderr, tp, values
     typecodes = ['']
     for v in values:
         if type(v) is str:

Modified: pypy/branch/graphserver-dist/dotviewer/test/test_interactive.py
==============================================================================
--- pypy/branch/graphserver-dist/dotviewer/test/test_interactive.py	(original)
+++ pypy/branch/graphserver-dist/dotviewer/test/test_interactive.py	Fri Jun 15 10:04:10 2007
@@ -135,3 +135,15 @@
             del os.environ['GRAPHSERVER']
     finally:
         os.kill(pid, signal.SIGTERM)
+
+def test_colors():
+    from dotviewer import graphpage, graphclient
+    class MyPage(graphpage.DotFileGraphPage):
+        def compute(self, dotfile):
+            super(MyPage, self).compute(dotfile)
+            self.links = {'v2721': 'Hello world',
+                          'v2720': ('Something green', (0, 192, 0)),
+                          }
+    dotfile = udir.join('graph1.dot')
+    page = MyPage(str(dotfile))
+    graphclient.display_page(page)


More information about the pypy-svn mailing list