Rev 123: Start playing around with an ObjProxy that can give prettier output. in http://bazaar.launchpad.net/~jameinel/meliae/proxy

John Arbash Meinel john at arbash-meinel.com
Wed Dec 23 23:30:10 GMT 2009


At http://bazaar.launchpad.net/~jameinel/meliae/proxy

------------------------------------------------------------
revno: 123
revision-id: john at arbash-meinel.com-20091223232954-lrxen6n7murpgnah
parent: john at arbash-meinel.com-20091223230144-benkylfi7yaof907
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: proxy
timestamp: Wed 2009-12-23 17:29:54 -0600
message:
  Start playing around with an ObjProxy that can give prettier output.
  
  
  Using a proxy object, we can look up extra info in the ObjManager
  and generally give quick-info.
-------------- next part --------------
=== modified file 'meliae/loader.py'
--- a/meliae/loader.py	2009-12-23 16:55:05 +0000
+++ b/meliae/loader.py	2009-12-23 23:29:54 +0000
@@ -196,7 +196,7 @@
         self.show_progress = show_progress
 
     def __getitem__(self, address):
-        return self.objs[address]
+        return ObjProxy(self, self.objs[address])
 
     def compute_referrers(self):
         """For each object, figure out who is referencing it."""
@@ -341,6 +341,7 @@
 
     def get_all(self, type_str):
         """Return all objects that match a given type."""
+        # TODO: This should probably return ObjProxy instances
         all = [o for o in self.objs.itervalues() if o.type_str == type_str]
         all.sort(key=lambda x:(x.size, x.num_refs, x.num_referrers),
                  reverse=True)
@@ -455,6 +456,68 @@
 
 
 
+class ObjProxy(object):
+    """Used when browsing the object list.
+
+    The idea is that a proxy is used as you walk around a subset of the graph,
+    so it can be a bit more expensive and do transformations that we don't want
+    to do to everything.
+    """
+
+    __slots__ = ('_manager', '_obj')
+
+    def __init__(self, manager, obj):
+        self._manager = manager
+        self._obj = obj
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def __getitem__(self, offset):
+        return self._manager[self._obj[offset]]
+
+    def __repr__(self):
+        o = self._obj
+        name = o.name
+        if name is None:
+            name = ''
+        else:
+            name = '%r ' % name
+        if o.num_refs > 0:
+            refs = ' %drefs' % (o.num_refs,)
+        else:
+            refs = ''
+        if o.num_referrers > 0:
+            referrers = ' %dpar' % (o.num_referrers,)
+        else:
+            referrers = ''
+        val = o.value
+        if val is not None:
+            val = ' %r' % (val,)
+        else:
+            val = ''
+        return '%s(%s%d %dB%s%s%s)' % (
+            o.type_str, name, o.address, o.size,
+            refs, referrers, val)
+
+    def refs_as_dict(self):
+        return self._manager.refs_as_dict(self._obj)
+
+    @property
+    def r(self):
+        """Get the nodes that this node refers to."""
+        return [self._manager[r] for r in self._obj.ref_list]
+        
+    @property
+    def p(self):
+        """Get the parent array.
+
+        Parents are nodes that refer to this node.
+        """
+        return [self._manager[p] for p in self._obj.referrers]
+
+
+
 def load(source, using_json=None, show_prog=True):
     """Load objects from the given source.
 

=== modified file 'meliae/tests/test_loader.py'
--- a/meliae/tests/test_loader.py	2009-10-22 22:05:00 +0000
+++ b/meliae/tests/test_loader.py	2009-12-23 23:29:54 +0000
@@ -262,8 +262,9 @@
         manager.compute_referrers()
         manager.collapse_instance_dicts()
         self.assertEqual({1: 'c', 'b': 'c'}, manager.refs_as_dict(manager[14]))
-        self.assertEqual({'a': 1, 'c': manager[7], 'b': 'string',
-                          'd': manager[12]}, manager.refs_as_dict(manager[1]))
+        self.assertEqual({'a': 1, 'c': manager.objs[7], 'b': 'string',
+                          'd': manager.objs[12]},
+                         manager.refs_as_dict(manager[1]))
 
     def test_expand_refs_as_list(self):
         manager = loader.load(_instance_dump, show_prog=False)



More information about the bazaar-commits mailing list