Thread: SF.net SVN: fclient: [120] trunk/sandbox/fcp/fcp_lib/events.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-02-02 18:29:16
|
Revision: 120
http://fclient.svn.sourceforge.net/fclient/?rev=120&view=rev
Author: jurner
Date: 2008-02-02 10:29:09 -0800 (Sat, 02 Feb 2008)
Log Message:
-----------
fixed some docstrings for epydoc
Modified Paths:
--------------
trunk/sandbox/fcp/fcp_lib/events.py
Modified: trunk/sandbox/fcp/fcp_lib/events.py
===================================================================
--- trunk/sandbox/fcp/fcp_lib/events.py 2008-02-02 18:28:43 UTC (rev 119)
+++ trunk/sandbox/fcp/fcp_lib/events.py 2008-02-02 18:29:09 UTC (rev 120)
@@ -10,13 +10,14 @@
"""Metaclass for events"""
class Event(object):
- """Event handler"""
+ """Event handler
+ @ivar observers: list of observers of the event
+ """
+
def __init__(self, name):
"""
- @param name: name of the event
- @attr name: name of the event
- @attr observers: list of observers of the event
+ @param name: (str) name of the event
"""
self.name = name
self.observers = []
@@ -66,14 +67,7 @@
always called with the event as first argument, followed by additional
arguments, depending on the event.
- Events have the following methods:
-
- 'name': name of the event
- 'observers': list of observers listening to the event
-
-
- Note:
- Always make shure to disconnnect when event notification is no longer desired
+ @note: always make shure to disconnnect when event notification is no longer desired
>>> class MyEvents(Events):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-04 11:49:35
|
Revision: 134
http://fclient.svn.sourceforge.net/fclient/?rev=134&view=rev
Author: jurner
Date: 2008-02-04 03:49:28 -0800 (Mon, 04 Feb 2008)
Log Message:
-----------
reworked events
Modified Paths:
--------------
trunk/sandbox/fcp/fcp_lib/events.py
Modified: trunk/sandbox/fcp/fcp_lib/events.py
===================================================================
--- trunk/sandbox/fcp/fcp_lib/events.py 2008-02-04 03:17:38 UTC (rev 133)
+++ trunk/sandbox/fcp/fcp_lib/events.py 2008-02-04 11:49:28 UTC (rev 134)
@@ -1,104 +1,63 @@
"""Signals and events"""
-#***********************************************************************
+#*********************************************************************
#
-# event handler. Mostly taken from
-#http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/410686
-#
-#***********************************************************************
-class EventMeta(type):
- """Metaclass for events"""
-
- class Event(object):
- """Event handler
-
- @ivar observers: list of observers of the event
- """
-
- def __init__(self, name):
- """
- @param name: (str) name of the event
- """
- self.name = name
- self.observers = []
-
- def __call__(self, *args, **kwargs):
- """Dispatches the event and additional parameters to all observers registerd"""
- for o in self.observers:
- o(self, *args, **kwargs)
-
- def __contains__(self, observer):
- """Checks if an observer is aleady registered
- @return: bool
- """
- return observer in self.observers
-
- def __iadd__(self, observer):
- """Adds an observer to the event
- @note: the observer will be called with the event as first paraeter,
- followed by any number of *args or **kwargs passed by the caller of an event
- """
- self.observers.append(observer)
- return self
-
- def __isub__(self, observer):
- """Removes the first occurence of an observer from the event"""
- self.observers.remove(observer)
- return self
-
- def __new__(clss, name, bases, kws):
- events = kws.get('_events_', None)
- if events is None:
- raise ValueError('Event classes must implement an "_event_" attribute')
- for event_name in events:
- kws[event_name] = clss.Event(event_name)
- return type.__new__(clss, name, bases, kws)
-
-
+#*********************************************************************
class Events(object):
- """Base class for events
+ """Events
- Derrived classes should list events they support in the "_events_" tuple.
- Each event name is automagically set as attribute of the event
- class.
+ Class to bundle events. Usually you would add events to it by
+ adding one or more event classes as inner classes. As soon
+ as the class is instantiated the events will be auto initialized
+ and available as callable objects.
- Listeners may register to receiving events by calling __iadd__,
- unregister by calling __isub__ on these attributes. Callback are
- always called with the event as first argument, followed by additional
- arguments, depending on the event.
+ >>> class MyEvents(Events):
+ ... class event1(Event): pass
+ ... class event2(Event): pass
- @note: always make shure to disconnnect when event notification is no longer desired
-
-
- >>> class MyEvents(Events):
- ... _events_ = ('FooEvent', 'BarEvent')
- ...
>>> events = MyEvents()
- >>> def cb(event):
- ... print 'Received: %s' % event.name
+ >>> sorted([event.name for event in events])
+ ['event1', 'event2']
- >>> events.FooEvent += cb
- >>> events.FooEvent()
- Received: FooEvent
+ >>> def myCallback(event, arg): print arg
+ >>> events += (events.event1, myCallback), (events.event2, myCallback)
+ >>> events.event1('foo')
+ foo
+ >>> events.event2('bar')
+ bar
- >>> events.FooEvent -= cb
- >>> events.FooEvent()
+ >>> events -= (events.event1, myCallback), (events.event2, myCallback)
+ >>> events.event1('foo')
- >>> events += ( (events.FooEvent, cb), (events.BarEvent, cb) )
- >>> events.FooEvent()
- Received: FooEvent
- >>> events.BarEvent()
- Received: BarEvent
+ >>> events.event1 += myCallback
+ >>> events.event1('foo')
+ foo
- >>> events -= ( (events.FooEvent, cb), (events.BarEvent, cb) )
- >>> events.FooEvent()
+ >>> events.event1 -= myCallback
+ >>> events.event1('foo')
+
+ @note: this class is a bit of a hack. You may not add any (not with underscore starting)
+ attrs, methods to it except from events
+ """
- >>> events.BarEvent()
+ def __init__(self):
+ """"""
+ for name in dir(self):
+ if not name.startswith('_'):
+ event = getattr(self, name)
+ setattr(self, name, event(name))
+
+
- """
- __metaclass__ = EventMeta
- _events_ = ()
-
+ def __iter__(self):
+ """Iterator over all events of the instance
+ @return: (L{Event}) next event in turn
+ """
+ for name in dir(self):
+ if not name.startswith('_'):
+ event = getattr(self, name)
+ yield getattr(self, name)
+
def __iadd__(self, events):
"""Adds one or more events / observers at once
@param events: tuple( (event, observer), (event, observer), ...)
@@ -114,8 +73,60 @@
for event, observer in events:
event -= observer
return self
+
+#*********************************************************************
+#
+#*********************************************************************
+class Event(object):
+ """Event class
+
+ @ivar name: name of the event
+ @ivar observers: observers listening to the event
+
+ >>> event = Event('myEventsName')
+ >>> event.name
+ 'myEventsName'
+
+ >>> def myCallback(event, arg): print arg
+ >>> event += myCallback
+ >>> event('foo')
+ foo
+
+ >>> event -= myCallback
+ >>> event('foo')
+ """
+
+ def __init__(self, name):
+ """
+ @param name: name of the event
+ """
+ self.name = name
+ self.observers = []
+
+ def __call__(self, *args, **kwargs):
+ """Dispatches the event and additional parameters to all observers registerd"""
+ for o in self.observers:
+ o(self, *args, **kwargs)
+
+ def __contains__(self, observer):
+ """Checks if an observer is aleady registered
+ @return: bool
+ """
+ return observer in self.observers
-
+ def __iadd__(self, observer):
+ """Adds an observer to the event
+ @note: the observer will be called with the event as first paraeter,
+ followed by any number of *args or **kwargs passed by the caller of an event
+ """
+ self.observers.append(observer)
+ return self
+
+ def __isub__(self, observer):
+ """Removes the first occurence of an observer from the event"""
+ self.observers.remove(observer)
+ return self
+
#*********************************************************************
#
#*********************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-08 09:11:37
|
Revision: 179
http://fclient.svn.sourceforge.net/fclient/?rev=179&view=rev
Author: jurner
Date: 2008-02-08 01:11:42 -0800 (Fri, 08 Feb 2008)
Log Message:
-----------
added a note
Modified Paths:
--------------
trunk/sandbox/fcp/fcp_lib/events.py
Modified: trunk/sandbox/fcp/fcp_lib/events.py
===================================================================
--- trunk/sandbox/fcp/fcp_lib/events.py 2008-02-08 08:39:39 UTC (rev 178)
+++ trunk/sandbox/fcp/fcp_lib/events.py 2008-02-08 09:11:42 UTC (rev 179)
@@ -104,7 +104,11 @@
self.observers = []
def __call__(self, *args, **kwargs):
- """Dispatches the event and additional parameters to all observers registerd"""
+ """Dispatches the event and additional parameters to all observers registerd
+
+ @note: all listeners will be called with the event a first parameter, followed
+ by optional args and kwargs
+ """
for o in self.observers:
o(self, *args, **kwargs)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 09:08:52
|
Revision: 251
http://fclient.svn.sourceforge.net/fclient/?rev=251&view=rev
Author: jurner
Date: 2008-02-26 01:08:58 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautification
Modified Paths:
--------------
trunk/sandbox/fcp/fcp_lib/events.py
Modified: trunk/sandbox/fcp/fcp_lib/events.py
===================================================================
--- trunk/sandbox/fcp/fcp_lib/events.py 2008-02-26 09:08:23 UTC (rev 250)
+++ trunk/sandbox/fcp/fcp_lib/events.py 2008-02-26 09:08:58 UTC (rev 251)
@@ -109,8 +109,8 @@
@note: all listeners will be called with the event a first parameter, followed
by optional args and kwargs
"""
- for o in self.observers:
- o(self, *args, **kwargs)
+ for observer in self.observers:
+ observer(self, *args, **kwargs)
def __contains__(self, observer):
"""Checks if an observer is aleady registered
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|