[py-svn] r62122 - in py/branch/pytestplugin/py/test: . plugin testing

hpk at codespeak.net hpk at codespeak.net
Tue Feb 24 20:07:31 CET 2009


Author: hpk
Date: Tue Feb 24 20:07:28 2009
New Revision: 62122

Modified:
   py/branch/pytestplugin/py/test/config.py
   py/branch/pytestplugin/py/test/plugin/pytest_eventlog.py
   py/branch/pytestplugin/py/test/plugin/pytest_plugintester.py
   py/branch/pytestplugin/py/test/plugin/pytest_terminal.py
   py/branch/pytestplugin/py/test/pytestplugin.py
   py/branch/pytestplugin/py/test/testing/test_conftesthandle.py
   py/branch/pytestplugin/py/test/testing/test_pytestplugin.py
Log:
refined plugin/conftest option parsing interface


Modified: py/branch/pytestplugin/py/test/config.py
==============================================================================
--- py/branch/pytestplugin/py/test/config.py	(original)
+++ py/branch/pytestplugin/py/test/config.py	Tue Feb 24 20:07:28 2009
@@ -38,7 +38,7 @@
         assert isinstance(pytestplugins, py.test._PytestPlugins)
         self.bus = pytestplugins.pyplugins
         self.pytestplugins = pytestplugins
-        self._conftest = Conftest(onimport=self.pytestplugins.consider_module)
+        self._conftest = Conftest(onimport=self.pytestplugins.consider_conftest)
 
     def parse(self, args): 
         """ parse cmdline arguments into this config object. 
@@ -145,6 +145,9 @@
                     )
         return self._addoptions(groupname, *specs)
 
+    def addoption(self, *args, **kwargs):
+        return self.addoptions("misc", self.Option(*args, **kwargs))
+
     def _addoptions(self, groupname, *specs):
         optgroup = optparse.OptionGroup(self._parser, groupname) 
         optgroup.add_options(specs) 

Modified: py/branch/pytestplugin/py/test/plugin/pytest_eventlog.py
==============================================================================
--- py/branch/pytestplugin/py/test/plugin/pytest_eventlog.py	(original)
+++ py/branch/pytestplugin/py/test/plugin/pytest_eventlog.py	Tue Feb 24 20:07:28 2009
@@ -2,10 +2,15 @@
 
 class EventlogPlugin:
     """ log pytest events to a file. """
+    def pytest_option(self, config):
+        config.addoption("--eventlog", dest="eventlog", 
+            help="write all pytest events to the given file.")
+
     pytest_cmdlineoptions = [ 
         py.test.config.Option('--eventlog', dest="eventlog", 
             help="write all pytest events to a specific file")
     ]
+
     def pytest_configure(self, config):
         eventlog = config.option.eventlog
         if eventlog:

Modified: py/branch/pytestplugin/py/test/plugin/pytest_plugintester.py
==============================================================================
--- py/branch/pytestplugin/py/test/plugin/pytest_plugintester.py	(original)
+++ py/branch/pytestplugin/py/test/plugin/pytest_plugintester.py	Tue Feb 24 20:07:28 2009
@@ -96,6 +96,9 @@
 
     pytest_cmdlineoptions = []
 
+    def pytest_option(self, config):
+        """ called before commandline parsing.  """
+
     def pytest_configure(self, config):
         """ called after command line options have been parsed. 
             and all plugins and initial conftest files been loaded. 

Modified: py/branch/pytestplugin/py/test/plugin/pytest_terminal.py
==============================================================================
--- py/branch/pytestplugin/py/test/plugin/pytest_terminal.py	(original)
+++ py/branch/pytestplugin/py/test/plugin/pytest_terminal.py	Tue Feb 24 20:07:28 2009
@@ -164,7 +164,13 @@
         rev = py.__pkg__.getrev()
         self.write_line("using py lib: %s <rev %s>" % (
                        py.path.local(py.__file__).dirpath(), rev))
-        plugins = ", ".join(list(self.config.pytestplugins._plugins))
+        plugins = []
+        for x in self.config.pytestplugins._plugins:
+            if isinstance(x, str) and x.startswith("pytest_"):
+                plugins.append(x[7:])
+            else:
+                plugins.append(str(x)) # XXX display conftest plugins more nicely 
+        plugins = ", ".join(plugins) 
         self.write_line("active plugins: %s" %(plugins,))
         for i, testarg in py.builtin.enumerate(self.config.args):
             self.write_line("test object %d: %s" %(i+1, testarg))

Modified: py/branch/pytestplugin/py/test/pytestplugin.py
==============================================================================
--- py/branch/pytestplugin/py/test/pytestplugin.py	(original)
+++ py/branch/pytestplugin/py/test/pytestplugin.py	Tue Feb 24 20:07:28 2009
@@ -27,14 +27,17 @@
         impname, clsname = canonical_names(importname)
         return self._plugins[impname]
     
-    def setinitial(self, modules):
-        for module in modules:
-            self.consider_module(module)
-    
     def consider_env(self):
         for spec in self.pyplugins._envlist("PYTEST_PLUGINS"):
             self.import_plugin(spec)
 
+    def consider_conftest(self, conftestmodule):
+        cls = getattr(conftestmodule, 'ConftestPlugin', None)
+        if cls is not None and cls not in self._plugins:
+            self._plugins[cls] = True
+            self.register(cls())
+        self.consider_module(conftestmodule)
+
     def consider_module(self, mod):
         attr = getattr(mod, "pytest_plugins", ())
         if attr:
@@ -73,6 +76,9 @@
     def notify(self, eventname, *args, **kwargs):
         return self.pyplugins.notify(eventname, *args, **kwargs)
 
+    def do_option(self, config):
+        self.pyplugins.call_each('pytest_option', config=config)
+
     def add_cmdlineoptions(self, config):
         # XXX think about sorting/grouping of options from user-perspective 
         #assert self.pyplugins.list

Modified: py/branch/pytestplugin/py/test/testing/test_conftesthandle.py
==============================================================================
--- py/branch/pytestplugin/py/test/testing/test_conftesthandle.py	(original)
+++ py/branch/pytestplugin/py/test/testing/test_conftesthandle.py	Tue Feb 24 20:07:28 2009
@@ -24,7 +24,6 @@
         assert conftest.rget("a") == 1
         assert conftest.rget("b", self.basedir.join("adir", "b")) == 2
         assert len(l) == 3
-        
 
     def test_immediate_initialiation_and_incremental_are_the_same(self):
         conftest = Conftest()

Modified: py/branch/pytestplugin/py/test/testing/test_pytestplugin.py
==============================================================================
--- py/branch/pytestplugin/py/test/testing/test_pytestplugin.py	(original)
+++ py/branch/pytestplugin/py/test/testing/test_pytestplugin.py	Tue Feb 24 20:07:28 2009
@@ -22,7 +22,7 @@
         l3 = len(plugins.getplugins())
         assert l2 == l3
 
-    def test_pytestplugin_environment_variable(self, testdir, monkeypatch):
+    def test_pytestplugin_ENV_startup(self, testdir, monkeypatch):
         testdir.makepyfile(pytest_x500="class X500Plugin: pass")
         p = testdir.makepyfile("""
             import py
@@ -36,16 +36,6 @@
         assert result.ret == 0
         extra = result.stdout.fnmatch_lines(["*1 passed in*"])
 
-    def test_setinitial(self):
-        pp = PytestPlugins()
-        mod = py.std.new.module("hello")
-        mod.pytest_plugins = "helloworldmod_42"
-        py.test.raises(ImportError, "pp.setinitial([mod])")
-
-    @py.test.keywords(xfail=True)
-    def test_setinitial_conftest_plugins(self, testdir):
-        assert 0
-
     def test_import_plugin_importname(self, testdir):
         plugins = PytestPlugins()
         py.test.raises(ImportError, 'plugins.import_plugin("x.y")')
@@ -96,6 +86,27 @@
         evlist = evrec.getnamed("plugin_registered")
         assert len(evlist) == 1 
 
+    def test_consider_conftest(self, testdir):
+        pp = PytestPlugins()
+        mod = testdir.makepyfile("class ConftestPlugin: hello = 1").pyimport()
+        pp.consider_conftest(mod)
+        l = [x for x in pp.getplugins() if isinstance(x, mod.ConftestPlugin)]
+        assert len(l) == 1
+        assert l[0].hello == 1
+
+        pp.consider_conftest(mod)
+        l = [x for x in pp.getplugins() if isinstance(x, mod.ConftestPlugin)]
+        assert len(l) == 1
+
+    def test_config_sets_conftesthandle_onimport(self, testdir):
+        config = testdir.parseconfig([])
+        assert config._conftest._onimport == config.pytestplugins.consider_conftest 
+
+    def test_consider_conftest_deps(self, testdir):
+        mod = testdir.makepyfile("pytest_plugins='xyz'").pyimport()
+        pp = PytestPlugins()
+        py.test.raises(ImportError, "pp.consider_conftest(mod)")
+
     def test_registry(self):
         pp = PytestPlugins()
         a1, a2 = object(), object()
@@ -130,6 +141,20 @@
 
 
 class TestPytestPluginInteractions:
+    def test_do_option_conftestplugin(self, testdir):
+        from py.__.test.config import Config 
+        p = testdir.makepyfile("""
+            class ConftestPlugin:
+                def pytest_option(self, config):
+                    config.addoption('--test123', action="store_true")
+        """)
+        config = Config() 
+        config._conftest.importconftest(p)
+        print config.pytestplugins.getplugins()
+        config.pytestplugins.do_option(config=config)
+        config.parse([])
+        assert not config.option.test123
+
     def test_configure(self, testdir):
         config = testdir.parseconfig()
         l = []
@@ -156,27 +181,12 @@
         config.bus.register(A())
         assert len(l) == 2
 
-    def test_addcmdlineoptions(self):
-        class PseudoConfig:
-            opts = []
-            def addoptions(self, *opts):
-                self.opts.append(opts) 
-        config = PseudoConfig()
-        pc = PytestPlugins()
-        class A:
-            pytest_cmdlineoptions = [42]
-        pc.pyplugins.register(A)
-        pc.add_cmdlineoptions(config)
-        assert len(config.opts) == 1
-        assert config.opts[0][1] == 42
-
     def test_MultiCall(self):
         pp = PytestPlugins()
         assert hasattr(pp, 'MultiCall')
 
+    # lower level API
 
-
-class TestPluginInteraction:
     def test_getfirst(self):
         plugins = PytestPlugins()
         class My1:



More information about the pytest-commit mailing list