changeset 4151:cb22fcb2e2fc

missing file
author Gilles Duboscq <gilles.m.duboscq@gmail.com>
date Tue, 20 Dec 2011 15:48:29 +0100
parents c78bace5086a
children 38c782b84ac2
files mx/outputparser.py
diffstat 1 files changed, 66 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mx/outputparser.py	Tue Dec 20 15:48:29 2011 +0100
@@ -0,0 +1,66 @@
+import mx
+import commands
+
+class OutputParser:
+    
+    def __init__(self, nonZeroIsFatal=True):
+        self.matchers = []
+        self.nonZeroIsFatal = nonZeroIsFatal
+        
+    def addMatcher(self, matcher):
+        self.matchers.append(matcher)
+    
+    def parse(self, cmd, cwd=None):
+        ret = [{}]
+        
+        def parseLine(line):
+            line = line.strip()
+            anyMatch = False
+            for matcher in self.matchers:
+                parsed = matcher.parse(line)
+                if parsed:
+                    anyMatch = True
+                    if matcher.startNewLine and len(ret[0]) > 0:
+                        ret.append({})
+                    ret[len(ret)-1].update(parsed)
+            if anyMatch :
+                mx.log(line)
+            else :
+                mx.log('# ' + line)
+        
+        commands.vm(cmd, nonZeroIsFatal=self.nonZeroIsFatal, out=parseLine, err=parseLine, cwd=cwd)
+        return ret
+
+class Matcher:
+    
+    def __init__(self, regex, valuesToParse, startNewLine=False):
+        assert isinstance(valuesToParse, dict)
+        self.regex = regex
+        self.valuesToParse = valuesToParse
+        self.startNewLine = startNewLine
+        
+    def parse(self, line):
+        match = self.regex.search(line)
+        if not match:
+            return False
+        ret = {}
+        for key, value in self.valuesToParse.items():
+            ret[self.parsestr(match, key)] = self.parsestr(match, value)
+        return ret
+        
+    def parsestr(self, match, key):
+        if isinstance(key, tuple):
+            if len(key) != 2:
+                raise Exception('Tuple arguments must have a lenght of 2')
+            tup1, tup2 = key
+            # check if key is a function
+            if hasattr(tup1, '__call__'):
+                return tup1(self.parsestr(match, tup2))
+            elif hasattr(tup2, '__call__'):
+                return tup2(self.parsestr(match, tup1))
+            else:
+                raise Exception('Tuple must contain a function pointer')
+        elif key.startswith('const:'):
+            return key.split(':')[1]
+        else:
+            return match.group(key)