Changeset 550

Show
Ignore:
Timestamp:
06/04/03 22:10:08 (5 years ago)
Author:
sholloway
Message:

changed interface to relations from list style to set style...

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/Objects/Relations.py

    r549 r550  
    3232#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3333 
     34def _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 
    3442class RelationsCollection(object): 
    3543    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    5260        return item in iter(self) 
    5361 
    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):  
    5963        raise NotImplementedError 
    6064     
    61     def remove(self, relation):  
     65    def remove(self, *relations):  
     66        raise NotImplementedError 
     67 
     68    def clear(self): 
    6269        raise NotImplementedError 
    6370 
     
    7986        return False 
    8087 
    81     def extend(self, relations):  
    82         raise NotImplementedError 
    83  
    84     def append(self, relation):  
     88    def add(self, *relations):  
    8589        raise NotImplementedError 
    8690     
    87     def remove(self, relation):  
     91    def remove(self, *relations):  
     92        raise NotImplementedError 
     93 
     94    def clear(self): 
    8895        raise NotImplementedError 
    8996 
     
    118125        return self.bag[key] 
    119126 
    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) 
    131129        self.OnModifying(self, relations) 
    132130        self.bag.extend(relations) 
    133131        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]) 
    134146 
    135147#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    181193        return self.itervalues() 
    182194 
    183     def getkey(self, relation): 
     195    def getkeypairs(self, *relations): 
    184196        if self.keyname is None: 
    185197            raise ValueError, 'Cannot infer key for relation "%s"' % (relation,) 
    186198 
    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) 
    212229 
    213230    #~ dict adapter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    349366    def AddRelation(self, other, kind=None, **kw): 
    350367        if kind is None: kind = self.defaultKind 
    351         self.relations[kind].append(other, **kw) 
     368        self.relations[kind].add(other, **kw) 
    352369 
    353370    def AddRelationKind(self, kind, relationcollection): 
  • trunk/RBFoundation/test/Objects/test_Relations.py

    r548 r550  
    8181        del self.items 
    8282 
     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 
    83157    def testMembership(self): 
    84158        self.failIf(self.items[0] in self.categoryA) 
     
    166240    def AddRelation(self, other, kind=None): 
    167241        if kind is None: kind = self.defaultKind 
    168         self.Relations(kind).append(other) 
    169         other.Relations(self.oppositeKinds[kind]).append(self) 
     242        self.Relations(kind).add(other) 
     243        other.Relations(self.oppositeKinds[kind]).add(self) 
    170244 
    171245#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    301375        return iter(self.path) 
    302376 
    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" 
    305385 
    306386#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    335415    def testExceptionsDefault(self): 
    336416        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) 
    338418 
    339419    def testExceptions(self): 
    340420        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) 
    343426 
    344427#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~