cascade status: work on broken tree, show node type
authorMarko Kreen <markokr@gmail.com>
Wed, 13 May 2009 11:15:13 +0000 (14:15 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 1 Jun 2009 07:13:47 +0000 (10:13 +0300)
- Show node type after name

- Allow several roots, take nodes with missing parents as roots

It still cannot work on cycles.  But as the change-provider code
should avoid making those, maybe it's not worth worrying about.

python/pgq/cascade/nodeinfo.py

index 6b661c07b1536f98edcf3a4256115bed84d77d30..9bd1cead077be51ae5d0261a77939bc3a1687a2a 100644 (file)
@@ -59,6 +59,9 @@ class NodeInfo:
             raise Exception("no target queue")
         return qname
 
+    def get_title(self):
+        return "%s (%s)" % (self.name, self.type)
+
     def get_infolines(self):
         lst = self._info_lines
 
@@ -141,11 +144,12 @@ class QueueInfo:
         """Print ascii-tree for set.
         Expects that data for all nodes is filled in."""
 
-        root = self._prepare_tree()
-        self._tree_calc(root)
-        datalines = self._print_node(root, '', [])
-        for ln in datalines:
-            print(self._DATAFMT % (' ', ln))
+        root_list = self._prepare_tree()
+        for root in root_list:
+            self._tree_calc(root)
+            datalines = self._print_node(root, '', [])
+            for ln in datalines:
+                print(self._DATAFMT % (' ', ln))
 
     def _print_node(self, node, pfx, datalines):
         # print a tree fragment for node and info
@@ -153,7 +157,7 @@ class QueueInfo:
         for ln in datalines:
             print(self._DATAFMT % (_setpfx(pfx, '|'), ln))
         datalines = node.get_infolines()
-        print("%s%s" % (_setpfx(pfx, '+--'), node.name))
+        print("%s%s" % (_setpfx(pfx, '+--'), node.get_title()))
 
         for i, n in enumerate(node.child_list):
             sfx = ((i < len(node.child_list) - 1) and '  |' or '   ')
@@ -163,25 +167,26 @@ class QueueInfo:
 
     def _prepare_tree(self):
         # reset vars, fill parent and child_list for each node
-        # returns root
-        root = None
+        # returns list of root nodes (mostly 1)
+
         for node in self.node_map.values():
             node.total_childs = 0
             node.levels = 0
             node.child_list = []
-            if node.type == ROOT:
-                root = node
+            node.parent = None
+
+        root_list = []
         for node in self.node_map.values():
-            if node.provider_node and node.provider_node != node.name:
+            if node.provider_node \
+                    and node.provider_node != node.name \
+                    and node.provider_node in self.node_map:
                 p = self.node_map[node.provider_node]
                 p.child_list.append(node)
                 node.parent = p
             else:
                 node.parent = None
-
-        if root is None:
-            raise Exception("root node not found")
-        return root
+                root_list.append(node)
+        return root_list
 
     def _tree_calc(self, node):
         # calculate levels and count total childs