[pypy-svn] r17882 - in pypy/dist/pypy/translator/tool: . test

pedronis at codespeak.net pedronis at codespeak.net
Mon Sep 26 21:24:05 CEST 2005


Author: pedronis
Date: Mon Sep 26 21:24:03 2005
New Revision: 17882

Added:
   pypy/dist/pypy/translator/tool/test/test_taskengine.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/tool/taskengine.py
Log:
some more work on taskengine, proper test file



Modified: pypy/dist/pypy/translator/tool/taskengine.py
==============================================================================
--- pypy/dist/pypy/translator/tool/taskengine.py	(original)
+++ pypy/dist/pypy/translator/tool/taskengine.py	Mon Sep 26 21:24:03 2005
@@ -1,11 +1,9 @@
 
 
-
-
 class SimpleTaskEngine:
 
-
     def __init__(self):
+        self._plan_cache = {}
 
         self.tasks = tasks = {}
 
@@ -18,9 +16,14 @@
 
                 tasks[task_name] = task, task_deps
 
+    def _plan(self, goals, skip=[]):
+        skip = [toskip for toskip in skip if toskip not in goals]
 
-    def _plan(self, goal, skip=[]):
-
+        key = (tuple(goals), tuple(skip))
+        try:
+            return self._plan_cache[key]
+        except KeyError:
+            pass
         constraints = []
 
         def subgoals(task_name):
@@ -32,7 +35,6 @@
                         continue
                 yield dep
 
-
         seen = {}
                         
         def consider(subgoal):
@@ -46,7 +48,8 @@
                 constraints.append([subgoal, dep])
                 consider(dep)
 
-        consider(goal)
+        for goal in goals:
+            consider(goal)
 
         #sort
 
@@ -73,34 +76,33 @@
 
         plan.reverse()
 
-        return plan
-            
-            
-
-def test_simple():
-
-    class ABC(SimpleTaskEngine):
+        self._plan_cache[key] = plan
 
-        def task_A(self):
-            pass
-
-        task_A.task_deps = ['B', '?C']
-
-        def task_B(self):
-            pass
-
-        def task_C(self):
-            pass
+        return plan
 
-        task_C.task_deps = ['B']
+    def _execute(self, goals, *args, **kwds):
+        task_skip = kwds.get('task_skip', [])
+        for goal in self._plan(goals, skip=task_skip):
+            taskcallable, _ = self.tasks[goal]
+            self._event('pre', goal, taskcallable)
+            try:
+                self._do(goal, taskcallable, *args, **kwds)
+            except (SystemExit, KeyboardInterrupt):
+                raise
+            except:
+                self._error(goal)
+                raise
+            self._event('post', goal, taskcallable)
+        
+    def _do(self, goal, func, *args, **kwds):
+        func()
 
-    abc = ABC()
+    def _event(self, kind, goal, func):
+        pass
+    
+    def _error(self, goal):
+        pass
 
-    assert abc._plan('B') == ['B']
-    assert abc._plan('C') == ['B', 'C']
-    assert abc._plan('A') == ['B', 'C', 'A']
-    assert abc._plan('A', skip=['C']) == ['B', 'A']
-   
 
 """ sketch of tasks for translation:
 

Added: pypy/dist/pypy/translator/tool/test/test_taskengine.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/tool/test/test_taskengine.py	Mon Sep 26 21:24:03 2005
@@ -0,0 +1,73 @@
+from pypy.translator.tool.taskengine import SimpleTaskEngine
+
+def test_simple():
+
+    class ABC(SimpleTaskEngine):
+
+        def task_A(self):
+            pass
+
+        task_A.task_deps = ['B', '?C']
+
+        def task_B(self):
+            pass
+
+        def task_C(self):
+            pass
+
+        task_C.task_deps = ['B']
+
+    abc = ABC()
+
+    assert abc._plan('B') == ['B']
+    assert abc._plan('C') == ['B', 'C']
+    assert abc._plan('A') == ['B', 'C', 'A']
+    assert abc._plan('A', skip=['C']) == ['B', 'A']
+   
+def test_execute():
+
+    class ABC(SimpleTaskEngine):
+
+        def __init__(self):
+            SimpleTaskEngine.__init__(self)
+            self.done = []
+
+        def task_A(self):
+            self.done.append('A')
+
+        task_A.task_deps = ['B', '?C']
+
+        def task_B(self):
+            self.done.append('B')
+
+        def task_C(self):
+            self.done.append('C')
+
+        task_C.task_deps = ['B']
+
+        def _event(self, kind, goal, taskcallable):
+            self.done.append((kind, goal))
+
+    def test(goals, task_skip=[]):
+        if isinstance(goals, str):
+            gaols = [goals]
+        abc = ABC()
+        abc._execute(goals, task_skip=task_skip)
+        return abc.done
+
+    def trace(goals):
+        t = []
+        for goal in goals:
+            t.extend([('pre', goal), goal, ('post', goal)])
+        return t
+
+    assert test('B') == trace('B')
+    assert test('C') == trace(['B', 'C'])
+    assert test('A') == trace(['B', 'C', 'A'])
+    assert test('A', ['C']) == trace(['B', 'A'])
+    assert test(['B', 'C']) == trace(['B', 'C'])
+    assert test(['C', 'B']) == trace(['B', 'C'])
+    assert test(['B', 'A']) == trace(['B', 'C', 'A'])
+    assert test(['B', 'A'], ['C']) == trace(['B', 'A'])
+    assert test(['B', 'A', 'C']) == trace(['B', 'C', 'A'])
+    assert test(['B', 'A', 'C'], ['C']) == trace(['B', 'C', 'A'])



More information about the Pypy-commit mailing list