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