[SCM] morituri/master: * morituri/common/task.py: Document better. Create an ITaskListener interface where we can document. Log some more.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:09:10 UTC 2014


The following commit has been merged in the master branch:
commit b9bc3ba1544cb56543e9fde771d855f93c4a5c16
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Thu Jul 2 20:34:50 2009 +0000

    	* morituri/common/task.py:
    	  Document better.
    	  Create an ITaskListener interface where we can document.
    	  Log some more.

diff --git a/ChangeLog b/ChangeLog
index 321fdda..63f0baa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-07-02  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+	* morituri/common/task.py:
+	  Document better.
+	  Create an ITaskListener interface where we can document.
+	  Log some more.
+
 2009-06-24  Thomas Vander Stichele  <thomas at apestaart dot org>
 
 	* morituri/test/test_common_program.py:
diff --git a/morituri/common/task.py b/morituri/common/task.py
index 4a3681d..d884e0a 100644
--- a/morituri/common/task.py
+++ b/morituri/common/task.py
@@ -29,11 +29,16 @@ from morituri.common import log
 class Task(object, log.Loggable):
     """
     I wrap a task in an asynchronous interface.
-    I can be listened to for starting, stopping, and progress updates.
+    I can be listened to for starting, stopping, description changes
+    and progress updates.
+
+    I communicate an error by setting self.exception to an exception and
+    stopping myself from running.
+    The listener can then handle the Task.exception.
 
     @ivar  description: what am I doing
     @ivar  exception:   set if an exception happened during the task
-                        execution.
+                        execution.  Will be raised through run() at the end.
     """
     description = 'I am doing something.'
 
@@ -63,6 +68,9 @@ class Task(object, log.Loggable):
         Stop the task.
 
         Subclasses should chain up to me at the end.
+
+        Listeners will get notified that the task is stopped,
+        whether successfully or with an exception.
         """
         self.debug('stopping')
         self.running = False
@@ -100,7 +108,42 @@ class Task(object, log.Loggable):
             for l in self._listeners:
                 getattr(l, methodName)(self, *args, **kwargs)
 
-# this is a Dummy task that can be used if this works at all
+# FIXME: should this become a real interface, like in zope ?
+class ITaskListener(object):
+    """
+    I am an interface for objects listening to tasks.
+    """
+    ### listener callbacks
+    def progressed(self, task, value):
+        """
+        Implement me to be informed about progress.
+
+        @type  value: float
+        @param value: progress, from 0.0 to 1.0
+        """
+
+    def described(self, task, description):
+        """
+        Implement me to be informed about description changes.
+
+        @type  description: str
+        @param description: description
+        """
+
+    def started(self, task):
+        """
+        Implement me to be informed about the task starting.
+        """
+
+    def stopped(self, task):
+        """
+        Implement me to be informed about the task stopping.
+        If the task had an error, task.exception will be set.
+        """
+
+
+
+# this is a Dummy task that can be used to test if this works at all
 class DummyTask(Task):
     def start(self, runner):
         Task.start(self, runner)
@@ -115,7 +158,7 @@ class DummyTask(Task):
 
         self.runner.schedule(1.0, self._wind)
 
-class BaseMultiTask(Task):
+class BaseMultiTask(Task, ITaskListener):
     """
     I perform multiple tasks.
 
@@ -176,7 +219,7 @@ class BaseMultiTask(Task):
             self.stop()
             return
         
-    ### listener methods
+    ### ITaskListener methods
     def started(self, task):
         pass
 
@@ -184,16 +227,24 @@ class BaseMultiTask(Task):
         pass
 
     def stopped(self, task):
+        """
+        Subclasses should chain up to me at the end of their implementation.
+        They should fall through to chaining up if there is an exception.
+        """
+        self.log('BaseMultiTask.stopped: task %r', task)
         if task.exception:
+            self.log('BaseMultiTask.stopped: exception %r', task.exception)
             self.exception = task.exception
             self.stop()
             return
 
         if self._task == len(self.tasks):
+            self.log('BaseMultiTask.stopped: all tasks done')
             self.stop()
             return
 
         # pick another
+        self.log('BaseMultiTask.stopped: pick next task')
         self.next()
 
 
@@ -214,7 +265,7 @@ class MultiSeparateTask(BaseMultiTask):
         self.progress = 0.0 # reset progress for each task
         BaseMultiTask.next(self)
         
-    ### listener methods
+    ### ITaskListener methods
     def progressed(self, task, value):
         self.setProgress(value)
 
@@ -231,7 +282,7 @@ class MultiCombinedTask(BaseMultiTask):
     description = 'Doing various tasks combined'
     _stopped = 0
        
-    ### listener methods
+    ### ITaskListener methods
     def progressed(self, task, value):
         self.setProgress(float(self._stopped + value) / len(self.tasks))
 
@@ -267,35 +318,8 @@ class TaskRunner(object, log.Loggable):
         """
         raise NotImplementedError
 
-    ### listener callbacks
-    def progressed(self, task, value):
-        """
-        Implement me to be informed about progress.
-
-        @type  value: float
-        @param value: progress, from 0.0 to 1.0
-        """
-
-    def described(self, task, description):
-        """
-        Implement me to be informed about description changes.
-
-        @type  description: str
-        @param description: description
-        """
-
-    def started(self, task):
-        """
-        Implement me to be informed about the task starting.
-        """
-
-    def stopped(self, task):
-        """
-        Implement me to be informed about the task starting.
-        """
-
 
-class SyncRunner(TaskRunner):
+class SyncRunner(TaskRunner, ITaskListener):
     """
     I run the task synchronously in a gobject MainLoop.
     """
@@ -331,6 +355,7 @@ class SyncRunner(TaskRunner):
             return False
         gobject.timeout_add(int(delta * 1000L), c)
 
+    ### ITaskListener methods
     def progressed(self, task, value):
         if not self._verboseRun:
             return

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list