resetting manifest requested domain to floor
[platform/upstream/gst-common.git] / scangobj-merge.py
index 4917255..4a9f1fc 100755 (executable)
@@ -3,10 +3,10 @@
 # vi:si:et:sw=4:sts=4:ts=4
 
 """
-parse, update and write .signals and .args files
+parse, merge and write gstdoc-scanobj files
 """
 
-from twisted.python import util
+from __future__ import print_function, unicode_literals
 
 import sys
 import os
@@ -14,25 +14,79 @@ import os
 def debug(*args):
     pass
 
+# OrderedDict class based on
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
+# Licensed under the Python License
+class OrderedDict(dict):
+    def __init__(self):
+        self._keys = []
+        dict.__init__(self)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        self._keys.remove(key)
+
+    def __setitem__(self, key, item):
+        dict.__setitem__(self, key, item)
+        if key not in self._keys: self._keys.append(key)
+
+    def clear(self):
+        dict.clear(self)
+        self._keys = []
+
+    def copy(self):
+        dict = dict.copy(self)
+        dict._keys = self._keys[:]
+        return dict
+
+    def items(self):
+        return zip(self._keys, self.values())
+
+    def keys(self):
+        return self._keys
+
+    def popitem(self):
+        try:
+            key = self._keys[-1]
+        except IndexError:
+            raise KeyError('dictionary is empty')
+
+        val = self[key]
+        del self[key]
+
+        return (key, val)
+
+    def setdefault(self, key, failobj = None):
+        dict.setdefault(self, key, failobj)
+        if key not in self._keys: self._keys.append(key)
+
+    def update(self, dict):
+        dict.update(self, dict)
+        for key in dict.keys():
+            if key not in self._keys: self._keys.append(key)
+
+    def values(self):
+        return map(self.get, self._keys)
+
 class Object:
     def __init__(self, name):
-        self._signals = util.OrderedDict()
-        self._args = util.OrderedDict()
+        self._signals = OrderedDict()
+        self._args = OrderedDict()
         self.name = name
 
     def __repr__(self):
         return "<Object %s>" % self.name
 
     def add_signal(self, signal, overwrite=True):
-        if not overwrite and self._signals.has_key(signal.name):
-            raise IndexError, "signal %s already in %r" % (signal.name, self)
+        if not overwrite and signal.name in self._signals:
+            raise IndexError("signal %s already in %r" % (signal.name, self))
         self._signals[signal.name] = signal
 
     def add_arg(self, arg, overwrite=True):
-        if not overwrite and self._args.has_key(arg.name):
-            raise IndexError, "arg %s already in %r" % (arg.name, self)
+        if not overwrite and arg.name in self._args:
+            raise IndexError("arg %s already in %r" % (arg.name, self))
         self._args[arg.name] = arg
-        
+
 class Docable:
     def __init__(self, **kwargs):
         for key in self.attrs:
@@ -54,19 +108,18 @@ class GDoc:
             lines = open(filename).readlines()
             self.load_data("".join(lines))
         except IOError:
-            print "WARNING - could not read from %s" % filename
+            print ("WARNING - could not read from %s" % filename)
 
     def save_file(self, filename, backup=False):
         """
-        Save the signals information to the given .signals file if the
-        file content changed.
+        Save the information to the given file if the file content changed.
         """
         olddata = None
         try:
             lines = open(filename).readlines()
             olddata = "".join(lines)
         except IOError:
-            print "WARNING - could not read from %s" % filename
+            print ("WARNING - could not read from %s" % filename)
         newdata = self.get_data()
         if olddata and olddata == newdata:
             return
@@ -81,7 +134,7 @@ class GDoc:
 
 class Signals(GDoc):
     def __init__(self):
-        self._objects = util.OrderedDict()
+        self._objects = OrderedDict()
 
     def load_data(self, data):
         """
@@ -110,7 +163,7 @@ class Signals(GDoc):
                 o = nmatch.group('object')
                 debug("Found object", o)
                 debug("Found signal", nmatch.group('signal'))
-                if not self._objects.has_key(o):
+                if o not in self._objects:
                     object = Object(o)
                     self._objects[o] = object
 
@@ -138,7 +191,7 @@ class Signals(GDoc):
 
 class Args(GDoc):
     def __init__(self):
-        self._objects = util.OrderedDict()
+        self._objects = OrderedDict()
 
     def load_data(self, data):
         """
@@ -171,7 +224,7 @@ class Args(GDoc):
                 o = nmatch.group('object')
                 debug("Found object", o)
                 debug("Found arg", nmatch.group('arg'))
-                if not self._objects.has_key(o):
+                if o not in self._objects:
                     object = Object(o)
                     self._objects[o] = object
 
@@ -182,7 +235,7 @@ class Args(GDoc):
                     arg = Arg(**dict)
                     self._objects[o].add_arg(arg)
                 else:
-                    print "ERROR: could not match arg from block %s" % block
+                    print ("ERROR: could not match arg from block %s" % block)
 
     def get_data(self):
         lines = []
@@ -204,23 +257,55 @@ class Args(GDoc):
 
         return "\n".join(lines) + '\n'
 
+class SingleLine(GDoc):
+    def __init__(self):
+        self._objects = []
+
+    def load_data(self, data):
+        """
+        Load the .interfaces/.prerequisites lines, merge duplicates
+        """
+        # split data on '\n'
+        lines = data.splitlines();
+        # merge them into self._objects
+        for line in lines:
+            if line not in self._objects:
+                self._objects.append(line)
+
+    def get_data(self):
+        lines = sorted(self._objects)
+        return "\n".join(lines) + '\n'
+
 def main(argv):
     modulename = None
     try:
         modulename = argv[1]
     except IndexError:
-        sys.stderr.write('Pleae provide a documentation module name\n')
+        sys.stderr.write('Please provide a documentation module name\n')
         sys.exit(1)
 
-    print "Merging scangobj output for %s" % modulename
     signals = Signals()
     signals.load_file(modulename + '.signals')
     signals.load_file(modulename + '.signals.new')
     signals.save_file(modulename + '.signals', backup=True)
+    os.unlink(modulename + '.signals.new')
 
     args = Args()
     args.load_file(modulename + '.args')
     args.load_file(modulename + '.args.new')
     args.save_file(modulename + '.args', backup=True)
+    os.unlink(modulename + '.args.new')
+
+    ifaces = SingleLine()
+    ifaces.load_file(modulename + '.interfaces')
+    ifaces.load_file(modulename + '.interfaces.new')
+    ifaces.save_file(modulename + '.interfaces', backup=True)
+    os.unlink(modulename + '.interfaces.new')
+
+    prereq = SingleLine()
+    prereq.load_file(modulename + '.prerequisites')
+    prereq.load_file(modulename + '.prerequisites.new')
+    prereq.save_file(modulename + '.prerequisites', backup=True)
+    os.unlink(modulename + '.prerequisites.new')
 
 main(sys.argv)