xmlrpc viewer. Refactoring needed: abstract the xml stuff common to rspec and xmlrpc...
authorGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Wed, 6 Oct 2010 15:09:39 +0000 (17:09 +0200)
committerGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Wed, 6 Oct 2010 15:09:39 +0000 (17:09 +0200)
sface/sfiprocess.py

index 6101889..227a35b 100644 (file)
@@ -2,9 +2,14 @@
 import os
 import sys
 import time
 import os
 import sys
 import time
+import re
 
 from PyQt4.QtCore import *
 
 from PyQt4.QtCore import *
+from PyQt4.QtXml import QDomDocument
 from sface.config import config
 from sface.config import config
+from sface.logwindow import LogIO
+from sface.rspecwindow import RSpecWindow, DomModel
+
 
 def find_executable(exec_name):
     """find the given executable in $PATH"""
 
 def find_executable(exec_name):
     """find the given executable in $PATH"""
@@ -23,6 +28,8 @@ class SfiProcess(QObject):
         self.process = QProcess()
         self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
                      self.processFinished)
         self.process = QProcess()
         self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
                      self.processFinished)
+        
+        self.xmltracker = XmlTracker()
 
     def __init_command(self, args):
         self.args = QStringList()
 
     def __init_command(self, args):
         self.args = QStringList()
@@ -95,8 +102,10 @@ class SfiProcess(QObject):
         return filename
 
     def start(self):
         return filename
 
     def start(self):
+        self.args.prepend(QString('-D'))
         self.trace_command()
         self.process.start(self.exe, self.args)
         self.trace_command()
         self.process.start(self.exe, self.args)
+        print self.args
 
     def readOutput(self):
         if self.process.state() == QProcess.NotRunning:
 
     def readOutput(self):
         if self.process.state() == QProcess.NotRunning:
@@ -107,8 +116,82 @@ class SfiProcess(QObject):
             self._trace=time.time()
             command = "%s %s" % (self.exe, self.args.join(" "))
             print time.strftime('%M:%S'),'Invoking',command
             self._trace=time.time()
             command = "%s %s" % (self.exe, self.args.join(" "))
             print time.strftime('%M:%S'),'Invoking',command
+            #self.xmltracker.startTracking()
+            #print "tracking"
 
     def trace_end (self):
         if config.verbose:
 
     def trace_end (self):
         if config.verbose:
+            #print "stop tracking"
+            #self.xmltracker.stopTracking()
             command = "%s %s" % (self.exe, self.args.join(" "))
             print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),command,'Done'
             command = "%s %s" % (self.exe, self.args.join(" "))
             print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),command,'Done'
+            self.xmltracker.getAndPrint(self.process.readAllStandardOutput())
+
+class XmlTracker():
+    def __init__(self):
+        self.xmlrpcwindow = XmlrpcWindow()
+
+    def getAndPrint(self, rawOutput):
+        self.store(rawOutput)
+        self.extractXml()
+        self.xmlrpcwindow.setData(self.xml)
+        self.showXmlrpc()
+        self.test()
+
+    def showXmlrpc(self):
+        # set all camel case
+        self.xmlrpcwindow.show()
+        self.xmlrpcwindow.resize(500, 640)
+        self.xmlrpcwindow.raise_()
+        self.xmlrpcwindow.activateWindow()
+
+    def store(self, rawOutput):
+        self.rawOutput = rawOutput
+
+    def extractXml(self):
+        pttrnAsk = '<methodCall>.*?</methodCall>'
+        pttrnAns = '<methodResponse>.*?</methodResponse>'
+        answers = re.compile(pttrnAsk, re.DOTALL).findall(self.rawOutput)
+        replies = re.compile(pttrnAns, re.DOTALL).findall(self.rawOutput)
+        # cleaning
+        answers = map(lambda x: x.replace('\\n','\n'), answers)
+        replies = map(lambda x: x.replace('\\n','\n').replace("'body: '", ''), replies)
+        # A well-formed XML document must have one, and only one, top-level element
+        self.xml = '<debug>'
+        for ans in answers:
+            self.xml += ans + replies.pop()
+        self.xml += '</debug>'
+
+    def test(self):
+        print self.xml
+        
+    def stats(self):
+        # statistics: round-trip time, size of the com
+        pass
+
+    def prettyPrint(self, XmlComs):
+        # just for testing
+        print XmlComs
+
+class XmlrpcWindow(RSpecWindow):
+    def __init__(self, parent=None):
+        # super __init__() calls updateView,
+        # which assumes you have some data
+        self.data = '<debug/>'
+        RSpecWindow.__init__(self, parent)
+
+    def setData(self, XmlrpcCom):
+        self.data = XmlrpcCom
+
+    def updateView(self):
+        del self.document
+        del self.model
+        self.document = None
+        self.model = None
+
+        self.document = QDomDocument("RSpec")
+        self.document.setContent(self.data)
+        self.model = DomModel(self.document, self)
+
+        self.view.setModel(self.model)
+        self.view.expand(self.model.index(0, 0)) #expand first level only