Changeset 30

Show
Ignore:
Timestamp:
02/18/02 22:05:30 (7 years ago)
Author:
sholloway
Message:

More orthogonal code for Subject / Observers

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBJabber/RBJabber/Client.py

    r28 r30  
    7373 
    7474    def __init__(self, *args, **kw): 
    75         self.stream = SubjectObserver.CategorySubject() 
     75        self.stream = SubjectObserver.BidableCategorySubject() 
    7676        apply(Base.Client.__init__, (self,) + args, kw) 
    7777         
  • trunk/RBJabber/RBJabber/SubjectObserver/BidableSubject.py

    r29 r30  
    1212def t_BidableSubject(BaseSubject): 
    1313    class BidableSubjectMixin(BaseSubject): 
    14         _bids = None 
    15  
    1614        def UpdateObserversEx(self, kw): 
    17             self._bids = None 
     15            self._bids = 0, [] 
    1816            result = BaseSubject.UpdateObserversEx(self, kw) 
    19             if result: 
    20                 for each in self._bids: 
    21                     each(self, kw) 
    22             self._bids = None 
     17            if result and self._bids: 
     18                for each in self._bids[-1]: 
     19                    each.Update(self, kw) 
    2320            return result 
    2421         
    25         def Bid(self, priority, callback): 
    26             if self._bids: 
    27                 if priority > self._bids[0]: 
    28                     self._bids = priority, [callback] 
     22        def UpdateObserver(self, observer, UpdateDict): 
     23            if observer: 
     24                priority = getattr(observer, 'Bid', 0) 
     25                if callable(priority): 
     26                    priority = priority(self, UpdateDict) 
     27                if not self._bids or (priority > self._bids[0]): 
     28                    self._bids = priority, [observer] 
    2929                elif priority == self._bids[0]: 
    30                     self._bids[-1].append(callback) 
    31             else: 
    32                 self._bids = priority, [callback] 
     30                    self._bids[-1].append(observer) 
    3331    return BidableSubjectMixin 
    3432 
  • trunk/RBJabber/RBJabber/SubjectObserver/CategorySubject.py

    r29 r30  
    6767            def __del__(self): 
    6868                self.subject._locked.remove(id(self)) 
    69                 self.subject.UpdateObservers() 
     69                if self.subject._cachedUpdates: 
     70                    self.subject.UpdateObservers() 
    7071        return lock(self) 
    7172 
  • trunk/RBJabber/RBJabber/SubjectObserver/Observer.py

    r29 r30  
    1515        print "On Update:", UpdateDict 
    1616 
    17 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    18  
    19 class AssociativeObserver: 
    20     def __init__(self): 
    21         self._associations = {} 
    22  
    23     def AddAssociation(self, Association, Callback): 
    24         self._associations.setdefault(Association, []).append(Callback) 
    25         return self 
    26  
    27     def Update(self, subject, UpdateDict): 
    28         for each in UpdateDict: 
    29             for callback in self._associations.get(each, []): 
    30                 callback(subject, each, UpdateDict[each]) 
    31  
    32  
  • trunk/RBJabber/RBJabber/SubjectObserver/Subject.py

    r29 r30  
    6363            def __del__(self): 
    6464                self.subject._locked.remove(id(self)) 
    65                 self.subject.UpdateObservers() 
     65                if self.subject._cachedUpdates: 
     66                    self.subject.UpdateObservers() 
    6667        return lock(self) 
    6768 
  • trunk/RBJabber/RBJabber/SubjectObserver/__init__.py

    r29 r30  
    55from Subject import Subject 
    66from CategorySubject import CategorySubject 
    7 from Observer import Observer, AssociativeObserver 
     7from Observer import Observer 
     8from AssociativeObserver import AssociativeObserver 
     9from BidObserver import BidObserver  
    810from AttributedSubject import AttributedSubject, AttributedCategorySubject, t_AttributedSubject 
    911from BidableSubject import BidableSubject, BidableCategorySubject, t_BidableSubject