[svn r62256] getting rid of "--session", you can do it by
creating a plugin and calling setsessionclass from "pytest_configure". --HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									6f145b7c3c
								
							
						
					
					
						commit
						3561d2e9ff
					
				|  | @ -26,6 +26,7 @@ class Config(object): | ||||||
|     """ central bus for dealing with configuration/initialization data. """  |     """ central bus for dealing with configuration/initialization data. """  | ||||||
|     Option = py.compat.optparse.Option # deprecated |     Option = py.compat.optparse.Option # deprecated | ||||||
|     _initialized = False |     _initialized = False | ||||||
|  |     _sessionclass = None | ||||||
| 
 | 
 | ||||||
|     def __init__(self, pytestplugins=None):  |     def __init__(self, pytestplugins=None):  | ||||||
|         self.option = CmdOptions() |         self.option = CmdOptions() | ||||||
|  | @ -79,7 +80,6 @@ class Config(object): | ||||||
|         self.topdir = py.path.local(topdir) |         self.topdir = py.path.local(topdir) | ||||||
|         self._mergerepr(self._repr) |         self._mergerepr(self._repr) | ||||||
|         del self._repr  |         del self._repr  | ||||||
|         self.pytestplugins.configure(config=self) |  | ||||||
| 
 | 
 | ||||||
|     def _makerepr(self): |     def _makerepr(self): | ||||||
|         l = [] |         l = [] | ||||||
|  | @ -155,40 +155,19 @@ class Config(object): | ||||||
|         except AttributeError: |         except AttributeError: | ||||||
|             return self._conftest.rget(name, path) |             return self._conftest.rget(name, path) | ||||||
| 
 | 
 | ||||||
|  |     def setsessionclass(self, cls): | ||||||
|  |         if self._sessionclass is not None: | ||||||
|  |             raise ValueError("sessionclass already set to: %r" %( | ||||||
|  |                 self._sessionclass)) | ||||||
|  |         self._sessionclass = cls | ||||||
|  | 
 | ||||||
|     def initsession(self): |     def initsession(self): | ||||||
|         """ return an initialized session object. """ |         """ return an initialized session object. """ | ||||||
|         cls = self._getsessionclass() |         cls = self._sessionclass  | ||||||
|         session = cls(self) |         if cls is None: | ||||||
|         session.fixoptions() |             from py.__.test.session import Session | ||||||
|         return session |             cls = Session | ||||||
| 
 |         return cls(self) | ||||||
|     def _getsessionclass(self):  |  | ||||||
|         """ return Session class determined from cmdline options |  | ||||||
|             and looked up in initial config modules.  |  | ||||||
|         """ |  | ||||||
|         if self.option.session is not None: |  | ||||||
|             return self._conftest.rget(self.option.session) |  | ||||||
|         else: |  | ||||||
|             name = self._getsessionname() |  | ||||||
|             try: |  | ||||||
|                 return self._conftest.rget(name) |  | ||||||
|             except KeyError: |  | ||||||
|                 pass |  | ||||||
|             importpath = globals()[name] |  | ||||||
|             mod = __import__(importpath, None, None, '__doc__') |  | ||||||
|             return getattr(mod, name) |  | ||||||
| 
 |  | ||||||
|     def _getsessionname(self): |  | ||||||
|         """ return default session name as determined from options. """ |  | ||||||
|         if self.option.collectonly: |  | ||||||
|             name = 'Session' |  | ||||||
|         elif self.option.looponfailing: |  | ||||||
|             name = 'LooponfailingSession' |  | ||||||
|         elif self.option.numprocesses or self.option.dist or self.option.executable:  |  | ||||||
|             name = 'DSession' |  | ||||||
|         else: |  | ||||||
|             name = 'Session' |  | ||||||
|         return name |  | ||||||
| 
 | 
 | ||||||
|     def _reparse(self, args): |     def _reparse(self, args): | ||||||
|         """ this is used from tests that want to re-invoke parse(). """ |         """ this is used from tests that want to re-invoke parse(). """ | ||||||
|  | @ -222,12 +201,6 @@ config_per_process = Config( | ||||||
|     pytestplugins=py.test._PytestPlugins(py._com.pyplugins) |     pytestplugins=py.test._PytestPlugins(py._com.pyplugins) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| # default import paths for sessions  |  | ||||||
| 
 |  | ||||||
| Session = 'py.__.test.session' |  | ||||||
| LooponfailingSession = 'py.__.test.looponfail.remote' |  | ||||||
| DSession = 'py.__.test.dsession.dsession' |  | ||||||
| 
 |  | ||||||
| # | # | ||||||
| # helpers | # helpers | ||||||
| # | # | ||||||
|  |  | ||||||
|  | @ -41,6 +41,9 @@ class DSession(Session): | ||||||
|         self.host2pending = {} |         self.host2pending = {} | ||||||
|         self.item2host = {} |         self.item2host = {} | ||||||
|         self._testsfailed = False |         self._testsfailed = False | ||||||
|  |         if self.config.getvalue("executable") and \ | ||||||
|  |            not self.config.getvalue("numprocesses"): | ||||||
|  |             self.config.option.numprocesses = 1 | ||||||
| 
 | 
 | ||||||
|     def fixoptions(self): |     def fixoptions(self): | ||||||
|         """ check, fix and determine conflicting options. """ |         """ check, fix and determine conflicting options. """ | ||||||
|  |  | ||||||
|  | @ -113,6 +113,7 @@ class SlaveNode(object): | ||||||
|         self.channel.send((eventname, args, kwargs)) |         self.channel.send((eventname, args, kwargs)) | ||||||
| 
 | 
 | ||||||
|     def run(self): |     def run(self): | ||||||
|  |         self.config.pytestplugins.configure(self.config) | ||||||
|         from py.__.test.dsession.hostmanage import makehostup |         from py.__.test.dsession.hostmanage import makehostup | ||||||
|         channel = self.channel |         channel = self.channel | ||||||
|         self.host = host = channel.receive() |         self.host = host = channel.receive() | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ def dumpqueue(queue): | ||||||
| class TestDSession: | class TestDSession: | ||||||
|     def test_fixoptions(self, testdir): |     def test_fixoptions(self, testdir): | ||||||
|         config = testdir.parseconfig("--exec=xxx") |         config = testdir.parseconfig("--exec=xxx") | ||||||
|  |         config.pytestplugins.configure(config) | ||||||
|         config.initsession().fixoptions() |         config.initsession().fixoptions() | ||||||
|         assert config.option.numprocesses == 1 |         assert config.option.numprocesses == 1 | ||||||
|         config = testdir.parseconfig("--exec=xxx", '-n3') |         config = testdir.parseconfig("--exec=xxx", '-n3') | ||||||
|  |  | ||||||
|  | @ -11,10 +11,6 @@ import os | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class TestAsyncFunctional: | class TestAsyncFunctional: | ||||||
|     def test_dist_no_disthost(self, testdir): |  | ||||||
|         config = testdir.parseconfig(testdir.tmpdir, '-d') |  | ||||||
|         py.test.raises(SystemExit, "config.initsession()") |  | ||||||
| 
 |  | ||||||
|     def test_conftest_options(self, testdir): |     def test_conftest_options(self, testdir): | ||||||
|         testdir.makepyfile(conftest=""" |         testdir.makepyfile(conftest=""" | ||||||
|             print "importing conftest" |             print "importing conftest" | ||||||
|  |  | ||||||
|  | @ -129,7 +129,7 @@ def slave_runsession(channel, config, fullwidth, hasmarkup): | ||||||
|     config.option.usepdb = False  |     config.option.usepdb = False  | ||||||
|     config.option.executable = None |     config.option.executable = None | ||||||
|     trails = channel.receive() |     trails = channel.receive() | ||||||
|          |     config.pytestplugins.configure(config) | ||||||
|     DEBUG("SLAVE: initsession()") |     DEBUG("SLAVE: initsession()") | ||||||
|     session = config.initsession() |     session = config.initsession() | ||||||
|     # XXX configure the reporter object's terminal writer more directly |     # XXX configure the reporter object's terminal writer more directly | ||||||
|  |  | ||||||
|  | @ -1,3 +1,5 @@ | ||||||
|  | import py | ||||||
|  | 
 | ||||||
| class DefaultPlugin: | class DefaultPlugin: | ||||||
|     """ Plugin implementing defaults and general options. """  |     """ Plugin implementing defaults and general options. """  | ||||||
| 
 | 
 | ||||||
|  | @ -72,12 +74,40 @@ class DefaultPlugin: | ||||||
|                    action="store_true", dest="runbrowser", default=False, |                    action="store_true", dest="runbrowser", default=False, | ||||||
|                    help="run browser (implies --startserver)." |                    help="run browser (implies --startserver)." | ||||||
|                    ), |                    ), | ||||||
|         group._addoption('', '--boxed', |         group._addoption('--boxed', | ||||||
|                    action="store_true", dest="boxed", default=False, |                    action="store_true", dest="boxed", default=False, | ||||||
|                    help="box each test run in a separate process"),  |                    help="box each test run in a separate process"),  | ||||||
|         group._addoption('', '--rest', |         group._addoption('--rest', | ||||||
|                    action='store_true', dest="restreport", default=False, |                    action='store_true', dest="restreport", default=False, | ||||||
|                    help="restructured text output reporting."), |                    help="restructured text output reporting."), | ||||||
|         group._addoption('', '--session', | 
 | ||||||
|                    action="store", dest="session", default=None, |     def pytest_configure(self, config): | ||||||
|                    help="lookup given sessioname in conftest.py files and use it."), |         self.setsession(config) | ||||||
|  | 
 | ||||||
|  |     def setsession(self, config): | ||||||
|  |         val = config.getvalue | ||||||
|  |         if val("collectonly"): | ||||||
|  |             from py.__.test.session import Session | ||||||
|  |             config.setsessionclass(Session) | ||||||
|  |         elif val("looponfailing"): | ||||||
|  |             from py.__.test.looponfail.remote import LooponfailingSession | ||||||
|  |             config.setsessionclass(LooponfailingSession) | ||||||
|  |         elif val("numprocesses") or val("dist") or val("executable"): | ||||||
|  |             from py.__.test.dsession.dsession import  DSession | ||||||
|  |             config.setsessionclass(DSession) | ||||||
|  | 
 | ||||||
|  | def test_implied_different_sessions(tmpdir): | ||||||
|  |     def x(*args): | ||||||
|  |         config = py.test.config._reparse([tmpdir] + list(args)) | ||||||
|  |         try: | ||||||
|  |             config.pytestplugins.configure(config) | ||||||
|  |         except ValueError: | ||||||
|  |             return Exception | ||||||
|  |         return getattr(config._sessionclass, '__name__', None) | ||||||
|  |     assert x() == None | ||||||
|  |     assert x('--dist') == 'DSession' | ||||||
|  |     assert x('-n3') == 'DSession' | ||||||
|  |     assert x('-f') == 'LooponfailingSession' | ||||||
|  |     assert x('--exec=x') == 'DSession' | ||||||
|  |     assert x('-f', '--exec=x') == 'LooponfailingSession' | ||||||
|  |     assert x('--dist', '--exec=x', '--collectonly') == 'Session' | ||||||
|  |  | ||||||
|  | @ -1,20 +1,6 @@ | ||||||
| import py | import py | ||||||
| 
 | 
 | ||||||
| pytest_plugins = 'pytest_iocapture' |  | ||||||
| 
 |  | ||||||
| class TestConfigCmdlineParsing: | class TestConfigCmdlineParsing: | ||||||
|     @py.test.mark(xfail="commit parser") |  | ||||||
|     def test_config_addoption(self, stdcapture): |  | ||||||
|         from py.__.test.config import Config |  | ||||||
|         config = Config() |  | ||||||
|         config.addoption("cat1", "--option1", action="store_true") |  | ||||||
|         config.addoption("cat1", "--option2", action="store_true") |  | ||||||
|         config.parse(["-h"]) |  | ||||||
|         out, err = stdcapture.reset() |  | ||||||
|         assert out.count("cat1") == 1 |  | ||||||
|         assert out.find("option1") != -1  |  | ||||||
|         assert out.find("option2") != -1  |  | ||||||
|          |  | ||||||
|     def test_config_cmdline_options(self, testdir): |     def test_config_cmdline_options(self, testdir): | ||||||
|         testdir.makepyfile(conftest=""" |         testdir.makepyfile(conftest=""" | ||||||
|             import py |             import py | ||||||
|  | @ -71,9 +57,8 @@ class TestConfigCmdlineParsing: | ||||||
|             opts = spec.split() |             opts = spec.split() | ||||||
|             yield check_conflict_option, opts |             yield check_conflict_option, opts | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| class TestConfigAPI:  | class TestConfigAPI:  | ||||||
|     @py.test.mark(issue="ensuretemp should call config.maketemp(basename)") |     @py.test.mark.issue("ensuretemp should call config.maketemp(basename)") | ||||||
|     def test_tmpdir(self): |     def test_tmpdir(self): | ||||||
|         d1 = py.test.ensuretemp('hello')  |         d1 = py.test.ensuretemp('hello')  | ||||||
|         d2 = py.test.ensuretemp('hello')  |         d2 = py.test.ensuretemp('hello')  | ||||||
|  | @ -120,6 +105,20 @@ class TestConfigAPI: | ||||||
|         pl = config.getvalue_pathlist('mypathlist') |         pl = config.getvalue_pathlist('mypathlist') | ||||||
|         assert pl == [py.path.local()] |         assert pl == [py.path.local()] | ||||||
| 
 | 
 | ||||||
|  |     def test_setsessionclass_and_initsession(self, testdir): | ||||||
|  |         from py.__.test.config import Config  | ||||||
|  |         config = Config() | ||||||
|  |         class Session1:  | ||||||
|  |             def __init__(self, config): | ||||||
|  |                 self.config = config  | ||||||
|  |         config.setsessionclass(Session1) | ||||||
|  |         session = config.initsession() | ||||||
|  |         assert isinstance(session, Session1) | ||||||
|  |         assert session.config is config | ||||||
|  |         py.test.raises(ValueError, "config.setsessionclass(Session1)") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class TestConfigApi_getcolitems: | class TestConfigApi_getcolitems: | ||||||
|     def test_getcolitems_onedir(self, tmpdir): |     def test_getcolitems_onedir(self, tmpdir): | ||||||
|         config = py.test.config._reparse([tmpdir]) |         config = py.test.config._reparse([tmpdir]) | ||||||
|  | @ -395,63 +394,21 @@ class TestConfigPickling: | ||||||
|         assert newcol2.fspath.basename == dir1.basename |         assert newcol2.fspath.basename == dir1.basename | ||||||
|         assert newcol2.fspath.relto(topdir) |         assert newcol2.fspath.relto(topdir) | ||||||
| 
 | 
 | ||||||
| class TestSessionAndOptions: | def test_options_on_small_file_do_not_blow_up(testdir): | ||||||
|     def test_implied_dsession(self, testdir): |     def runfiletest(opts): | ||||||
|         for x in 'startserver runbrowser rest'.split(): |         sorter = testdir.inline_run(*opts) | ||||||
|             config = testdir.parseconfig(testdir.tmpdir, '--dist', '--%s' % x) |         passed, skipped, failed = sorter.countoutcomes() | ||||||
|             assert config._getsessionname() == 'DSession' |         assert failed == 2  | ||||||
|  |         assert skipped == passed == 0 | ||||||
|  |     path = testdir.makepyfile(""" | ||||||
|  |         def test_f1(): assert 0 | ||||||
|  |         def test_f2(): assert 0 | ||||||
|  |     """) | ||||||
| 
 | 
 | ||||||
|     def test_implied_different_sessions(self, tmpdir): |     for opts in ([], ['-l'], ['-s'], ['--tb=no'], ['--tb=short'],  | ||||||
|         config = py.test.config._reparse([tmpdir]) |                  ['--tb=long'], ['--fulltrace'], ['--nomagic'],  | ||||||
|         assert config._getsessionname() == 'Session' |                  ['--traceconfig'], ['-v'], ['-v', '-v']): | ||||||
|         config = py.test.config._reparse([tmpdir, '--dist']) |         runfiletest(opts + [path]) | ||||||
|         assert config._getsessionname() == 'DSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '-n3']) |  | ||||||
|         assert config._getsessionname() == 'DSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '--looponfailing']) |  | ||||||
|         assert config._getsessionname() == 'LooponfailingSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '--exec=x']) |  | ||||||
|         assert config._getsessionname() == 'DSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '--dist', '--exec=x']) |  | ||||||
|         assert config._getsessionname() == 'DSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '-f',  |  | ||||||
|                                           '--dist', '--exec=x']) |  | ||||||
|         assert config._getsessionname() == 'LooponfailingSession' |  | ||||||
|         config = py.test.config._reparse([tmpdir, '-f', '-n3', |  | ||||||
|                                           '--dist', '--exec=x',  |  | ||||||
|                                           '--collectonly']) |  | ||||||
|         assert config._getsessionname() == 'Session' |  | ||||||
| 
 |  | ||||||
|     def test_sessionname_lookup_custom(self, testdir): |  | ||||||
|         testdir.makepyfile(conftest=""" |  | ||||||
|             from py.__.test.session import Session |  | ||||||
|             class MySession(Session): |  | ||||||
|                 pass |  | ||||||
|         """)  |  | ||||||
|         config = testdir.parseconfig("--session=MySession", testdir.tmpdir) |  | ||||||
|         session = config.initsession() |  | ||||||
|         assert session.__class__.__name__ == 'MySession' |  | ||||||
| 
 |  | ||||||
|     def test_initsession(self, tmpdir): |  | ||||||
|         config = py.test.config._reparse([tmpdir]) |  | ||||||
|         session = config.initsession() |  | ||||||
|         assert session.config is config  |  | ||||||
|      |  | ||||||
|     def test_default_session_options(self, testdir): |  | ||||||
|         def runfiletest(opts): |  | ||||||
|             sorter = testdir.inline_run(*opts) |  | ||||||
|             passed, skipped, failed = sorter.countoutcomes() |  | ||||||
|             assert failed == 2  |  | ||||||
|             assert skipped == passed == 0 |  | ||||||
|         path = testdir.makepyfile(""" |  | ||||||
|             def test_f1(): assert 0 |  | ||||||
|             def test_f2(): assert 0 |  | ||||||
|         """) |  | ||||||
|      |  | ||||||
|         for opts in ([], ['-l'], ['-s'], ['--tb=no'], ['--tb=short'],  |  | ||||||
|                      ['--tb=long'], ['--fulltrace'], ['--nomagic'],  |  | ||||||
|                      ['--traceconfig'], ['-v'], ['-v', '-v']): |  | ||||||
|             runfiletest(opts + [path]) |  | ||||||
| 
 | 
 | ||||||
| def test_default_bus(): | def test_default_bus(): | ||||||
|     assert py.test.config.bus is py._com.pyplugins |     assert py.test.config.bus is py._com.pyplugins | ||||||
|  |  | ||||||
|  | @ -1,6 +1,11 @@ | ||||||
| import py | import py | ||||||
| 
 | 
 | ||||||
| class SessionTests: | class SessionTests: | ||||||
|  |     def test_initsession(self, tmpdir): | ||||||
|  |         config = py.test.config._reparse([tmpdir]) | ||||||
|  |         session = config.initsession() | ||||||
|  |         assert session.config is config  | ||||||
|  |      | ||||||
|     def test_basic_testitem_events(self, testdir): |     def test_basic_testitem_events(self, testdir): | ||||||
|         tfile = testdir.makepyfile(""" |         tfile = testdir.makepyfile(""" | ||||||
|             def test_one():  |             def test_one():  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue