[py-svn] r34551 - in py/dist/py/test/rsession: . testing

fijal at codespeak.net fijal at codespeak.net
Mon Nov 13 12:22:16 CET 2006


Author: fijal
Date: Mon Nov 13 12:22:13 2006
New Revision: 34551

Added:
   py/dist/py/test/rsession/testing/test_config.py   (contents, props changed)
Modified:
   py/dist/py/test/rsession/local.py
   py/dist/py/test/rsession/master.py
   py/dist/py/test/rsession/rsession.py
Log:
Refactored session options (starting point) for having central point for those.


Modified: py/dist/py/test/rsession/local.py
==============================================================================
--- py/dist/py/test/rsession/local.py	(original)
+++ py/dist/py/test/rsession/local.py	Mon Nov 13 12:22:13 2006
@@ -33,6 +33,11 @@
     outcome.stdout, outcome.stderr = finishcapture(session)
     return outcome
 
+RunnerPolicy = {
+    'plain_runner':plain_runner,
+    'box_runner':box_runner
+}
+
 def benchmark_runner(item, session, reporter):
     raise NotImplementedError()
 

Modified: py/dist/py/test/rsession/master.py
==============================================================================
--- py/dist/py/test/rsession/master.py	(original)
+++ py/dist/py/test/rsession/master.py	Mon Nov 13 12:22:13 2006
@@ -5,8 +5,6 @@
 from py.__.test.rsession.outcome import ReprOutcome
 from py.__.test.rsession import report
 
-MAX_TASKS_PER_NODE = 15
-
 class MasterNode(object):
     def __init__(self, channel, reporter):
         self.channel = channel
@@ -29,12 +27,14 @@
         self.reporter(report.SendItem(self.channel, item))
 
 def dispatch_loop(masternodes, itemgenerator, shouldstop, 
-                  waiter = lambda: py.std.time.sleep(0.1), 
-                  maxtasks_per_node = MAX_TASKS_PER_NODE):
+                  waiter = lambda: py.std.time.sleep(0.1)):
+    from py.__.test.rsession.rsession import session_options
+    
+    max_tasks_per_node = session_options.max_tasks_per_node
     while 1:
         try:
             for node in masternodes:
-                if len(node.pending) < maxtasks_per_node:
+                if len(node.pending) < max_tasks_per_node:
                     item = itemgenerator.next()
                     if shouldstop():
                         return

Modified: py/dist/py/test/rsession/rsession.py
==============================================================================
--- py/dist/py/test/rsession/rsession.py	(original)
+++ py/dist/py/test/rsession/rsession.py	Mon Nov 13 12:22:13 2006
@@ -14,7 +14,7 @@
 from py.__.test.rsession.hostmanage import init_hosts, teardown_hosts
 
 from py.__.test.rsession.local import local_loop, plain_runner, apigen_runner,\
-    box_runner
+    box_runner, RunnerPolicy
 from py.__.test.rsession.reporter import LocalReporter, RemoteReporter
 
 class RemoteOptions(object):
@@ -31,6 +31,36 @@
 
 # XXX: Must be initialised somehow
 remote_options = RemoteOptions({'we_are_remote':False, 'exitfirst':False})
+    
+class SessionOptions:
+    defaults = {
+        'max_tasks_per_node' : 15,
+        'runner_policy' : 'plain_runner'
+    }
+    
+    config = None
+    
+    def getvalue(self, opt):
+        try:
+            return getattr(self.config.getinitialvalue('SessionOptions'), opt)
+        except (ValueError, AttributeError):
+            try:
+                return self.defaults[opt]
+            except KeyError:
+                raise AttributeError("Option %s undeclared" % opt)
+    
+    def bind_config(self, config):
+        self.config = config
+    
+    def __repr__(self):
+        return "<SessionOptions %s>" % self.config
+    
+    def __getattr__(self, attr):
+        if self.config is None:
+            raise NotImplementedError("Need to set up config first")
+        return self.getvalue(attr)
+
+session_options = SessionOptions()
 
 class AbstractSession(object):
     """
@@ -158,7 +188,8 @@
                 for y in x.tryiter(reporterror = lambda x: self.reporterror(reporter, x), keyword = keyword):
                     yield y 
         
-        itemgenerator = itemgen() 
+        itemgenerator = itemgen()
+        session_options.bind_config(self.config)
         dispatch_loop(nodes, itemgenerator, checkfun)
         teardown_hosts(reporter, [node.channel for node in nodes], nodes, 
             exitfirst=self.config.option.exitfirst)
@@ -191,6 +222,7 @@
         pkgdir = self.getpkgdir(args[0])
         colitems = self.make_colitems(args, baseon=pkgdir.dirpath())
         reporter(report.RsyncFinished())
+        session_options.bind_config(self.config)
         
         if runner is None and self.config.option.apigen:
             from py.__.apigen.tracer.docstorage import DocStorage
@@ -206,7 +238,7 @@
         #elif runner is None:
         #    runner = box_runner
         elif runner is None:
-            runner = plain_runner
+            runner = RunnerPolicy[session_options.runner_policy]
 
         keyword = self.config.option.keyword
 

Added: py/dist/py/test/rsession/testing/test_config.py
==============================================================================
--- (empty file)
+++ py/dist/py/test/rsession/testing/test_config.py	Mon Nov 13 12:22:13 2006
@@ -0,0 +1,21 @@
+
+""" test session config options
+"""
+
+import py
+from py.__.test.rsession.rsession import session_options, SessionOptions
+
+def test_session_opts():
+    tmpdir = py.test.ensuretemp("sessionopts")
+    tmpdir.ensure("conftest.py").write("""class SessionOptions:
+        max_tasks_per_node = 5
+    """)
+    tmp2 = py.test.ensuretemp("xxx")
+    args = [str(tmpdir)]
+    config, args = py.test.Config.parse(args)
+    session_options.bind_config(config)
+    assert session_options.max_tasks_per_node == 5
+    config, args = py.test.Config.parse([str(tmp2)])
+    session_options.bind_config(config)
+    assert session_options.max_tasks_per_node == \
+        SessionOptions.defaults['max_tasks_per_node']



More information about the pytest-commit mailing list