def _build_value(self, entries, deep=False): """ Constructs a DataObject from list of tree entries @param entries list of TreeEntry instances with values @param deep boolean flag, indicates whether subtree value should be loaded or kept as ValueRef @retval a DataObject """ if not entries: return dobj = DataObject() for entry in entries: valname = entry.entry['name'] value = entry.value if isinstance(value, TreeValue): if deep: tentries = yield self.vs.get_tree_entriesvalues(value) # @todo Should this maybe a container DataObject? vdo = self._build_value(tentries, deep) if vdo: dobj.set_attr(valname, vdo) else: # Put only a the tree value object in # @todo Check if this is OK in a DataObject dobj.set_attr(valname, value) elif isinstance(value, ValueObject): if type(value.value) is dict: # case where a DataObject was encoded vdo = DataObject.from_encoding(value.value) vdo.identity = value.identity else: # case where value is a simple value vdo = DataObject() vdo.identity = value.identity vdo.set_attr('value', value.value) if len(entries) == 1: defer.returnValue(vdo) return dobj.set_attr(valname, vdo) else: raise RuntimeError('Unknown value type in store: '+repr(value)) defer.returnValue(dobj)
def test_dataobject(self): dobj = DataObject() dobj.set_attr('thing1','thing2') self.assertIsInstance(dobj.__dict__, dict) self.assertIsInstance(dobj.encode(),dict) self.assertEqual(dobj.get_attr('thing1'),'thing2') # test a simple dictionary d = dict() d['a']=1 d['b']='b' d['c']=3.14159 dobj.decode(d) self.assertEqual(dobj.get_attr('a'),1) self.assertEqual(dobj.get_attr('b'),'b') self.assertEqual(dobj.get_attr('c'),3.14159) dobj2=DataObject.from_encoding(d) self.assertEqual(dobj2.get_attr('a'),1) self.assertEqual(dobj2.get_attr('b'),'b') self.assertEqual(dobj2.get_attr('c'),3.14159) self.assertIdentical(dobj,dobj) # The Uniquie ID makes these two not equal self.assertNotEqual(dobj,dobj2) self.assertEqual(dobj2,DataObject.from_encoding(dobj2.encode())) self.assertRaises(AssertionError,dobj.set_attr, 6, 6) # Put a list, tuple, dict, DataObject and set in a dictionary # List d = dict() l=[1,'f',3.4] d['a']=l dobj3=DataObject.from_encoding(d) self.assertIsInstance(dobj3.get_attr('a'),list) self.assertEqual(dobj3.get_attr('a'),l) # For now, Assuming Lists are protected Blobs! ## Can't put complex things in a list #lx = list(l) #lx.append({6:5}) #dlx={'a':lx} #self.assertRaises(AssertionError,DataObject.from_encoding,dlx) # Tuple t=('t','u','p','l','e') dt={'b':t} self.assertRaises(AssertionError,DataObject.from_encoding,dt) #dobj3=DataObject.from_encoding(dt) ## Made Tuple an error! #self.assertIsInstance(dobj3.get_attr('b'),tuple) #self.assertEqual(dobj3.get_attr('b'),t) # Can't use tuple as Dict Key in DataObject dt={'b':t,(9,8):5} self.assertRaises(AssertionError,DataObject.from_encoding,dt) # Set s=set() for i in t: s.add(i) ds={'s':s} self.assertRaises(AssertionError,DataObject.from_encoding,ds) #self.assertIsInstance(dobj3.get_attr('c'),set) #self.assertEqual(dobj3.get_attr('c'),s) # Dictionary in a dictionary e=dict() f=dict() e['d']=d f['e']=e dobj3=DataObject.from_encoding(f) self.assertIsInstance(dobj3.get_attr('e'),DataObject) de=dobj3.get_attr('e') self.assertIsInstance(de.get_attr('d'),DataObject) dd=de.get_attr('d') self.assertEqual(dd.get_attr('a'),l) # Data Object a=DataObject.from_encoding(d) b=DataObject.from_encoding(d) c=DataObject.from_encoding(d) do=DataObject() do.set_attr('a',a) do.set_attr('b',b) do.set_attr('c',c) self.assertIsInstance(do.get_attr('a'),DataObject) self.assertEqual(do.get_attr('a'),a) print 'obja',a print 'objref',do.get_attr('a') blob = do.encode() d0 = DataObject.from_encoding(blob) #print '===a',d0.get_attr('a').__dict__ #print '===b',d0.get_attr('b').__dict__ #print '===c',d0.get_attr('c').__dict__ self.assertEqual(d0.get_attr('a'),a) # Recover the tuple # dt=d0.get_attr('a') # ti=dt.get_attr('b') # self.assertEqual(ti,t) # Recover the set # ds=d0.get_attr('a') # si=dt.get_attr('c') # self.assertEqual(si,s) self.assertEqual(do,d0) # Test Memory leak issue: # http://code.activestate.com/recipes/52308-the-simple-but-handy-collector-of-a-bunch-of-named/ for i in range(10**2): # try 10**9 a = DataObject()