Changeset 550
- Timestamp:
- 06/04/03 22:10:08 (5 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/Objects/Relations.py (modified) (6 diffs)
- trunk/RBFoundation/test/Objects/test_Relations.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/Objects/Relations.py
r549 r550 32 32 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 33 33 34 def _flattenlist(items): 35 for item in items: 36 if isinstance(item, list): 37 for i in _flattenlist(item): 38 yield i 39 else: 40 yield item 41 34 42 class RelationsCollection(object): 35 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 52 60 return item in iter(self) 53 61 54 def extend(self, relations): 55 for relation in relations: 56 self.append(relation) 57 58 def append(self, relation): 62 def add(self, *relations): 59 63 raise NotImplementedError 60 64 61 def remove(self, relation): 65 def remove(self, *relations): 66 raise NotImplementedError 67 68 def clear(self): 62 69 raise NotImplementedError 63 70 … … 79 86 return False 80 87 81 def extend(self, relations): 82 raise NotImplementedError 83 84 def append(self, relation): 88 def add(self, *relations): 85 89 raise NotImplementedError 86 90 87 def remove(self, relation): 91 def remove(self, *relations): 92 raise NotImplementedError 93 94 def clear(self): 88 95 raise NotImplementedError 89 96 … … 118 125 return self.bag[key] 119 126 120 def append(self, relation): 121 self.OnModifying(self, [relation]) 122 self.bag.append(relation) 123 self.OnModified(self, [relation]) 124 125 def remove(self, relation): 126 self.OnModifying(self, [relation]) 127 self.bag.remove(relation) 128 self.OnModified(self, [relation]) 129 130 def extend(self, relations): 127 def add(self, *relations): 128 relations = _flattenlist(relations) 131 129 self.OnModifying(self, relations) 132 130 self.bag.extend(relations) 133 131 self.OnModified(self, relations) 132 133 def remove(self, *relations): 134 relations = _flattenlist(relations) 135 self.OnModifying(self, [relations]) 136 for relation in relations: 137 try: self.bag.remove(relation) 138 except LookupError: continue 139 self.OnModified(self, [relations]) 140 141 def clear(self): 142 relations = self.bag[:] 143 self.OnModifying(self, [relations]) 144 self.bag[:] = [] 145 self.OnModified(self, [relations]) 134 146 135 147 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 181 193 return self.itervalues() 182 194 183 def getkey (self, relation):195 def getkeypairs(self, *relations): 184 196 if self.keyname is None: 185 197 raise ValueError, 'Cannot infer key for relation "%s"' % (relation,) 186 198 187 try: 188 return relation.Metadata(self.keyname) 189 except KeyError: 190 if self.defaultkey is None: 191 raise KeyError, 'Relation "%s" metadata has no key "%s"' % (relation, self.keyname) 192 else: 193 return self.defaultkey 194 195 def append(self, relation): 196 key = self.getkey(relation) 197 self.OnModifying(self, (key, relation)) 198 self.lookup[key] = relation 199 self.OnModified(self, (key, relation)) 200 201 def remove(self, relation): 202 key = self.getkey(relation) 203 self.OnModifying(self, (key, relation)) 204 del self.lookup[key] 205 self.OnModified(self, (key, relation)) 206 207 def extend(self, relations): 208 items = [(self.getkey(relation), relation) for relation in self.relations] 209 self.OnModifying(self, items) 210 self.lookup.update(items) 211 self.OnModified(self, items) 199 for relation in relations: 200 try: 201 yield relation.Metadata(self.keyname), relation 202 except KeyError: 203 if self.defaultkey is not None: 204 yield self.defaultkey, relation 205 else: 206 raise KeyError, 'Relation "%s" metadata has no key "%s"' % (relation, self.keyname) 207 208 def add(self, *relations): 209 relations = _flattenlist(relations) 210 relations = self.getkeypairs(relations) 211 self.OnModifying(self, relations) 212 self.lookup.update(relations) 213 self.OnModified(self, relations) 214 215 def remove(self, *relation): 216 relations = _flattenlist(relations) 217 relations = self.getkeypairs(relations) 218 self.OnModifying(self, relations) 219 for key, relation in relations: 220 try: del self.lookup[key] 221 except LookupError: continue 222 self.OnModified(self, relations) 223 224 def clear(self): 225 relations = self.lookup.items() 226 self.OnModifying(self, relations) 227 self.lookup.clear() 228 self.OnModified(self, relations) 212 229 213 230 #~ dict adapter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 349 366 def AddRelation(self, other, kind=None, **kw): 350 367 if kind is None: kind = self.defaultKind 351 self.relations[kind].a ppend(other, **kw)368 self.relations[kind].add(other, **kw) 352 369 353 370 def AddRelationKind(self, kind, relationcollection): trunk/RBFoundation/test/Objects/test_Relations.py
r548 r550 81 81 del self.items 82 82 83 def testAddOne(self): 84 item = Relations.Relationships(3) 85 relations = self.categoryA.Relations() 86 relations.add(item) 87 self.failUnless(item in self.categoryA) 88 self.failUnless(len(relations)==1) 89 self.failUnless(relations) 90 relations.remove(item) 91 self.failUnless(len(relations)==0) 92 self.failIf(relations) 93 94 relations.add(item) 95 self.failUnless(relations) 96 relations.clear() 97 self.failIf(relations) 98 99 def testAddMultiple(self): 100 items = [Relations.Relationships(di) for di in range(10, 13)] 101 relations = self.categoryA.Relations() 102 relations.add(items) 103 for each in self.categoryA: 104 self.failUnless(each in items) 105 for each in items: 106 self.failUnless(each in self.categoryA) 107 self.failUnless(relations) 108 self.failUnless(len(relations)==len(items)) 109 relations.remove(items) 110 self.failUnless(len(relations)==0) 111 self.failIf(relations) 112 113 relations.add(items) 114 self.failUnless(relations) 115 relations.clear() 116 self.failIf(relations) 117 118 def testAddMultipleInline(self): 119 items = [Relations.Relationships(di) for di in range(20, 23)] 120 relations = self.categoryA.Relations() 121 relations.add(*items) 122 for each in self.categoryA: 123 self.failUnless(each in items) 124 for each in items: 125 self.failUnless(each in self.categoryA) 126 self.failUnless(relations) 127 self.failUnless(len(relations)==len(items)) 128 relations.remove(items) 129 self.failUnless(len(relations)==0) 130 self.failIf(relations) 131 132 relations.add(*items) 133 self.failUnless(relations) 134 relations.clear() 135 self.failIf(relations) 136 137 def testAddMultipleNested(self): 138 items = [Relations.Relationships(di) for di in range(30, 33)] 139 items[1] = [Relations.Relationships(di) for di in range(40, 43)] 140 relations = self.categoryA.Relations() 141 relations.add(*items) 142 for each in self.categoryA: 143 self.failUnless(each in items or each in items[1]) 144 for each in items: 145 if not isinstance(each, list): 146 self.failUnless(each in self.categoryA) 147 self.failUnless(relations) 148 relations.remove(items) 149 self.failUnless(len(relations)==0) 150 self.failIf(relations) 151 152 relations.add(*items) 153 self.failUnless(relations) 154 relations.clear() 155 self.failIf(relations) 156 83 157 def testMembership(self): 84 158 self.failIf(self.items[0] in self.categoryA) … … 166 240 def AddRelation(self, other, kind=None): 167 241 if kind is None: kind = self.defaultKind 168 self.Relations(kind).a ppend(other)169 other.Relations(self.oppositeKinds[kind]).a ppend(self)242 self.Relations(kind).add(other) 243 other.Relations(self.oppositeKinds[kind]).add(self) 170 244 171 245 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 301 375 return iter(self.path) 302 376 303 def append(self, relation): 304 raise ValueError, "Cannot change a Calculated Relation" 377 def add(self, *relations): 378 raise NotImplementedError, "Cannot change a Calculated Relation" 379 380 def remove(self, *relations): 381 raise NotImplementedError, "Cannot change a Calculated Relation" 382 383 def clear(self, *relations): 384 raise NotImplementedError, "Cannot change a Calculated Relation" 305 385 306 386 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 335 415 def testExceptionsDefault(self): 336 416 self.failUnlessRaises(LookupError, self.path.Relations, 'this-is-an-invalid-key') 337 self.failUnlessRaises( ValueError, self.path.AddRelation, 1)417 self.failUnlessRaises(NotImplementedError, self.path.AddRelation, 1) 338 418 339 419 def testExceptions(self): 340 420 Relations = self.path.Relations() 341 self.failUnlessRaises(ValueError, Relations.append, 1) 342 self.failUnlessRaises(ValueError, Relations.extend, [1, 3]) 421 self.failUnlessRaises(NotImplementedError, Relations.add, 1) 422 self.failUnlessRaises(NotImplementedError, Relations.add, [1, 3]) 423 self.failUnlessRaises(NotImplementedError, Relations.remove, 1) 424 self.failUnlessRaises(NotImplementedError, Relations.remove, [1, 3]) 425 self.failUnlessRaises(NotImplementedError, Relations.clear) 343 426 344 427 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
