tracking xmlrpc. refactory needed: abstract xml stuff common to rspec and xmltracker.
authorGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Thu, 7 Oct 2010 12:38:10 +0000 (14:38 +0200)
committerGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Thu, 7 Oct 2010 12:38:10 +0000 (14:38 +0200)
1  2 
sface/sfiprocess.py

@@@ -28,11 -23,13 +28,22 @@@ class SfiProcess(QObject)
          self.process = QProcess()
          self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
                       self.processFinished)
 +        
 +        self.xmltracker = XmlTracker()
++        # in case self.output is read by the XmlTracker before any
++        # readyReadStandardOutput signal
++        self.output = ''
++
+         self.connect(self.process, SIGNAL("readyReadStandardOutput()"),
+                      self.processStandardOutput)
+         self.connect(self.process, SIGNAL("readyReadStandardError()"),
+                      self.processStandardError)
  
      def __init_command(self, args):
          self.args = QStringList()
++        if config.debug:
++            # this shows xmlrpc conversation, see sfi.py docs.
++            self.args << QString('-D')
          for arg in args:
              self.args << QString(arg)
  
      def isRunning(self):
          return self.process.state() != QProcess.NotRunning
  
 -        output = self.process.readAllStandardOutput()
 -        if self.debug:
 -            print output
+     def processStandardOutput(self):
++        # NOTE: The signal readyReadStandardOutput is emitted when
++        # the process has made new data available through its standard output channel.
++        # But the process is not necessarily finished.
++        # It's cool to have this method wo we print the stdOut live,
++        # but we must be carefull with self.output, used by xmlTracker too.
++        print "SETTING SELF.OUTPUT"
++        tmpOut = self.process.readAllStandardOutput()
++        if config.debug:
++            print tmpOut        
++        self.output += tmpOut
++
+     def processStandardError(self):
+         print self.process.readAllStandardError()
      def processFinished(self):
          if self.process.exitStatus() == QProcess.CrashExit:
              print self.readOutput()
  
      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'
-             self.xmltracker.getAndPrint(self.process.readAllStandardOutput())
++            self.xmltracker.getAndPrint(self.output)
 +
 +class XmlTracker():
 +    def __init__(self):
-         self.xmlrpcwindow = XmlrpcWindow()
++        self.xmlrpcWindow = XmlrpcWindow()
 +
 +    def getAndPrint(self, rawOutput):
 +        self.store(rawOutput)
 +        self.extractXml()
-         self.xmlrpcwindow.setData(self.xml)
++        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()
++        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)
++        replies = map(lambda x: x.replace('\\n','\n').replace("'\nbody: '", ''), replies)
++        replies.reverse() # so that I use pop() as popleft
 +        # 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