Rev 182: Use a set() to ensure we don't repeat parents. in http://bazaar.launchpad.net/~meliae-dev/meliae/trunk

John Arbash Meinel john at arbash-meinel.com
Mon Aug 9 16:47:58 BST 2010


At http://bazaar.launchpad.net/~meliae-dev/meliae/trunk

------------------------------------------------------------
revno: 182
revision-id: john at arbash-meinel.com-20100809154752-ah3vho249qprf4ky
parent: john at arbash-meinel.com-20100809153521-gm462m88g98er01u
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: trunk
timestamp: Mon 2010-08-09 10:47:52 -0500
message:
  Use a set() to ensure we don't repeat parents.
  
  Repeated children is useful, because stuff like dicts can do it, and it
  lets you know the key:value. Repeated parents doesn't seem to do
  anything but waste a lot of memory.
-------------- next part --------------
=== modified file 'meliae/loader.py'
--- a/meliae/loader.py	2010-08-05 19:29:18 +0000
+++ b/meliae/loader.py	2010-08-09 15:47:52 +0000
@@ -286,7 +286,8 @@
                     elif type(refs) in (int, long):
                         obj.parents = (refs,)
                     else:
-                        obj.parents = refs
+                        # We use a set() to remove duplicate parents
+                        obj.parents = set(refs)
         finally:
             if enabled:
                 gc.enable()

=== modified file 'meliae/tests/test_loader.py'
--- a/meliae/tests/test_loader.py	2010-08-05 19:54:17 +0000
+++ b/meliae/tests/test_loader.py	2010-08-09 15:47:52 +0000
@@ -246,8 +246,8 @@
         objs = manager.objs
         self.assertEqual((), objs[1].parents)
         self.assertEqual([1, 3], objs[3].parents)
-        self.assertEqual([3, 7, 8], objs[4].parents)
-        self.assertEqual([3, 7, 8], objs[5].parents)
+        self.assertEqual([3, 7, 8], sorted(objs[4].parents))
+        self.assertEqual([3, 7, 8], sorted(objs[5].parents))
         self.assertEqual([8], objs[6].parents)
         self.assertEqual([8], objs[7].parents)
         self.assertEqual((), objs[8].parents)
@@ -270,12 +270,20 @@
             warn.trap_warnings(old_func)
         self.assertEqual((), objs[1].parents)
         self.assertEqual([1, 3], objs[3].parents)
-        self.assertEqual([3, 7, 8], objs[4].parents)
-        self.assertEqual([3, 7, 8], objs[5].parents)
+        self.assertEqual([3, 7, 8], sorted(objs[4].parents))
+        self.assertEqual([3, 7, 8], sorted(objs[5].parents))
         self.assertEqual([8], objs[6].parents)
         self.assertEqual([8], objs[7].parents)
         self.assertEqual((), objs[8].parents)
 
+    def test_compute_parents_ignore_repeated(self):
+        manager = loader.load(_intern_dict_dump, show_prog=False)
+        str_5 = manager[5]
+        manager.compute_parents()
+        # Each of these refers to str_5 multiple times, but they should only
+        # show up 1 time in the parent list.
+        self.assertEqual([6, 7, 8], sorted(str_5.parents))
+
     def test_compute_total_size(self):
         manager = loader.load(_example_dump, show_prog=False)
         objs = manager.objs



More information about the bazaar-commits mailing list