[meld] Adapt SchedulerBase to explicitly support iterables as tasks



commit d13eae3bf79d66ee88df87754c21bf685fa864fe
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Fri Oct 26 07:30:44 2012 +1000

    Adapt SchedulerBase to explicitly support iterables as tasks
    
    This change deals with the fact that it's unpleasant to compatibly pass
    a generator's next()/__next__() method for Python 2/3. Instead, we
    allow iterables to be passed in as-is, and adapt the task runner to
    call next() itself where appropriate.

 meld/dirdiff.py  |    2 +-
 meld/filediff.py |    4 ++--
 meld/task.py     |   42 ++++++++++++++----------------------------
 meld/vcview.py   |   19 ++++++++++---------
 4 files changed, 27 insertions(+), 40 deletions(-)
---
diff --git a/meld/dirdiff.py b/meld/dirdiff.py
index 08d784e..1b96ae3 100644
--- a/meld/dirdiff.py
+++ b/meld/dirdiff.py
@@ -505,7 +505,7 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.model.remove(child)
             child = self.model.iter_children( it )
         self._update_item_state(it)
-        self.scheduler.add_task( self._search_recursively_iter( path ).next )
+        self.scheduler.add_task(self._search_recursively_iter(path))
 
     def _search_recursively_iter(self, rootpath):
         self.actiongroup.get_action("Hide").set_sensitive(False)
diff --git a/meld/filediff.py b/meld/filediff.py
index ec3f01c..69bc512 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -965,7 +965,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         self.recompute_label()
         self.textview[len(files) >= 2].grab_focus()
         self._connect_buffer_handlers()
-        self.scheduler.add_task( self._set_files_internal(files).next )
+        self.scheduler.add_task(self._set_files_internal(files))
 
     def _load_files(self, files, textbuffers):
         self.undosequence.clear()
@@ -1101,7 +1101,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         self._disconnect_buffer_handlers()
         self.linediffer.clear()
         self.queue_draw()
-        self.scheduler.add_task(self._diff_files().next)
+        self.scheduler.add_task(self._diff_files())
 
     def _set_merge_action_sensitivity(self):
         pane = self._get_focused_pane()
diff --git a/meld/task.py b/meld/task.py
index b3216b2..15b710e 100644
--- a/meld/task.py
+++ b/meld/task.py
@@ -128,7 +128,10 @@ class SchedulerBase(object):
         except StopIteration:
             return 0
         try:
-            ret = task()
+            if hasattr(task, "__iter__"):
+                ret = next(task)
+            else:
+                ret = task()
         except StopIteration:
             pass
         except Exception:
@@ -177,47 +180,30 @@ class RoundRobinScheduler(SchedulerBase):
             raise StopIteration
 
 
-
-if __name__=="__main__":
+if __name__ == "__main__":
     import time
     import random
     m = LifoScheduler()
+
     def timetask(t):
         while time.time() - t < 1:
             print "***"
             time.sleep(0.1)
         print "!!!"
+
     def sayhello(x):
-        for i in range(random.randint(2,8)):
+        for i in range(random.randint(2, 8)):
             print "hello", x
             time.sleep(0.1)
             yield 1
         print "end", x
+
     s = RoundRobinScheduler()
     m.add_task(s)
-    h = sayhello(10).next
-    #m.add_task(h)
-    #m.add_task(h)
-    s.add_task( sayhello(10).next )
-    s.add_task( sayhello(20).next )
-    s.add_task( sayhello(30).next )
-    #s.add_task( sayhello(40).next )
-    #s.add_task( sayhello(50).next )
-    #s.add_task( sayhello(60).next )
-    #m.add_task( s )
-    #time.sleep(.71)
-    #m.add_task( s )#sayhello(2).next )
-    #m.add_task( sayhello(3).next )
-    #m.add_task( lambda t=time.time() : timetask(t) )
-    #m.add_task( sayhello(4).next )
-    #m.add_task( sayhello(5).next )
-    #m.mainloop()
-    while s.tasks_pending(): s.iteration()
+    s.add_task(sayhello(10))
+    s.add_task(sayhello(20))
+    s.add_task(sayhello(30))
+    while s.tasks_pending():
+        s.iteration()
     time.sleep(2)
     print "***"
-    #print "***"
-    #m.add_task( sayhello(20).next )
-    #m.add_task( s )
-    #s.complete_tasks()
-    #time.sleep(3)
-
diff --git a/meld/vcview.py b/meld/vcview.py
index 98f2e1f..e89057c 100644
--- a/meld/vcview.py
+++ b/meld/vcview.py
@@ -314,7 +314,8 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
         # If the user is just diffing a file (ie not a directory), there's no
         # need to scan the rest of the repository
         if os.path.isdir(self.vc.location):
-            self.scheduler.add_task(self._search_recursively_iter(self.model.get_iter_root()).next)
+            root = self.model.get_iter_root()
+            self.scheduler.add_task(self._search_recursively_iter(root))
             self.scheduler.add_task(self.on_treeview_cursor_changed)
 
     def recompute_label(self):
@@ -403,11 +404,10 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
             retry_diff = False
 
             yield _("[%s] Fetching differences") % self.label_text
-            difffunc = self._command_iter(self.vc.diff_command(),
-                                          path_list, 0).next
+            diffiter = self._command_iter(self.vc.diff_command(), path_list, 0)
             diff = None
             while type(diff) != type(()):
-                diff = difffunc()
+                diff = next(diffiter)
                 yield 1
             prefix, patch = diff[0], diff[1]
 
@@ -429,7 +429,7 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
 
     def run_diff(self, path_list):
         for path in path_list:
-            self.scheduler.add_task(self.run_diff_iter([path]).next, atfront=1)
+            self.scheduler.add_task(self.run_diff_iter([path]), atfront=1)
 
     def on_treeview_popup_menu(self, treeview):
         time = gtk.get_current_event_time()
@@ -497,10 +497,11 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
         files = [ relpath(workdir, f) for f in files ]
         r = None
         self.consolestream.write( misc.shelljoin(command+files) + " (in %s)\n" % workdir)
-        readfunc = misc.read_pipe_iter(command + files, self.consolestream, workdir=workdir).next
+        readiter = misc.read_pipe_iter(command + files, self.consolestream,
+                                       workdir=workdir)
         try:
             while r is None:
-                r = readfunc()
+                r = next(readiter)
                 self.consolestream.write(r)
                 yield 1
         except IOError as e:
@@ -513,7 +514,7 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
     def _command(self, command, files, refresh=1):
         """Run 'command' on 'files'.
         """
-        self.scheduler.add_task( self._command_iter(command, files, refresh).next )
+        self.scheduler.add_task(self._command_iter(command, files, refresh))
         
     def _command_on_selected(self, command, refresh=1):
         files = self._get_selected_files()
@@ -639,7 +640,7 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
                 self.model.set_value(newiter, self.model.column_index( tree.COL_PATH, 0), where)
                 self.model.set_path_state(newiter, 0, tree.STATE_NORMAL, True)
                 self.model.remove(it)
-                self.scheduler.add_task( self._search_recursively_iter(newiter).next )
+                self.scheduler.add_task(self._search_recursively_iter(newiter))
         else: # XXX fixme
             self.refresh()
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]