fix merge conflicts
authorGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Thu, 7 Oct 2010 12:40:19 +0000 (14:40 +0200)
committerGiovanni Gherdovich <ggherdov@brentaal.inria.fr>
Thu, 7 Oct 2010 12:40:19 +0000 (14:40 +0200)
1  2 
sface/sfiprocess.py

diff --combined sface/sfiprocess.py
@@@ -2,14 -2,9 +2,14 @@@
  import os
  import sys
  import time
 +import re
  
  from PyQt4.QtCore import *
 +from PyQt4.QtXml import QDomDocument
  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"""
@@@ -28,12 -23,6 +28,12 @@@ 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()"),
@@@ -41,9 -30,6 +41,9 @@@
  
      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)
  
          return self.process.state() != QProcess.NotRunning
  
      def processStandardOutput(self):
 -        output = self.process.readAllStandardOutput()
 +        # 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 output
 +            print tmpOut        
 +        self.output += tmpOut
  
      def processStandardError(self):
          print self.process.readAllStandardError()
  
          if config.verbose:
              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.output)
 +
 +class XmlTracker():
 +    def __init__(self):
 +        self.xmlrpcWindow = XmlrpcWindow()
 +
 +    def getAndPrint(self, rawOutput):
 +        self.store(rawOutput)
 +        self.extractXml()
 +        self.xmlrpcWindow.setData(self.xml)
 +        self.showXmlrpc()
 +
 +    def showXmlrpc(self):
 +        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("'\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 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