def __init__(self, *anon, **mval): #{{{ prop, values = self.p, self.v if not isinstance(prop, MultiValueProperties): raise TypeError("%s object is not a valid properties object" %prop.__class__.__name__) elif not isinstance(values, MultiValueValues): raise TypeError("%s object is not a valid values object" %values.__class__.__name__) if not anon and not mval: raise ValueError("Cannot create empty mval") block = ['__get__', '__getitem__'] reserved = [n for n in mval if n in block + dir(object)] if reserved: raise AttributeError("The following attribute names are reserved: %s" %', '.join(reserved)) tfunc, eqfunc = self._mktfunc(), self._mkeqfunc() if [a for a in (tfunc, eqfunc) if not iscallable(a)]: raise TypeError("Attempt to set transform or equals function to a non-callable") anon = ((k, v) for k, v in enumerate(anon)) mval = mdict(anon, mval) mval.clearmerged() # object.__setattr__(self, '_mval', mval) # object.__setattr__(self, '_tfunc', tfunc) # object.__setattr__(self, '_eqfunc', eqfunc) osetattr(self, '_mval', mval) osetattr(self, '_tfunc', tfunc) osetattr(self, '_eqfunc', eqfunc)
def testNormalArgs(self): #{{{ '''Normal dict args''' test = mdict() self.assertTrue(isinstance(test.merged, tuple)) self.assertFalse(test.merged) # Single dict a = {'1':1} test.merge(a) self.assertEqual(len(test), 1) self.assertEqual(test.items()[0], a.items()[0]) self.assertEqual(test.merged, tuple([a])) test.clear() # Sequence seq1 = 'abcdefghijk' a = zip(seq1, range(len(seq1))) expected = dict(a) test.merge(a) self.assertEqual(len(test.merged), 1) self.assertEqual(test, expected) self.assertEqual(test.merged[0], expected) test.clear() # kwargs test.merge(**expected) self.assertEqual(len(test.merged), 1) self.assertEqual(test, expected) self.assertEqual(test.merged[0], expected) test.clear()
def testKWOverrides(self): #{{{ '''kwargs overrides values''' a = {'hello': 'world'} b = {'boo': 'ya'} override = {'hello': 'MY world'} expected = dict(a) expected.update(b) expected.update(**override) test = mdict(a, b, **override) self.assertEqual(test.merged[-1], override) self.assertEqual(test, expected)
def testMixedArgs(self): #{{{ '''Mixed args''' test = mdict() # Mix only args a1 = {'1':1} seq1 = 'abcdefghijk' a2 = zip(seq1, range(len(seq1))) a3 = zip(range(10), range(10)) a4 = {'hello': 'world'} a5 = {'nice': 'you', 'how': 'doody'} test.merge(a1, a2, a3, a4, a5) self.assertEqual(len(test.merged), 5) count = 0 m = test.merged expected = dict() while count < 5: a = dict(eval('a%i' %(count+1))) self.assertEqual(m[count], a) expected.update(a) count += 1 self.assertEqual(test, expected)