Merged in hpk42/pytest-hpk/conftest-clean (pull request #148)
cleanup internal conftest handling and avoid the strange None entry in the conftest cache.
This commit is contained in:
		
						commit
						b4fe91943d
					
				|  | @ -492,7 +492,7 @@ class Conftest(object): | ||||||
|             self._try_load_conftest(current) |             self._try_load_conftest(current) | ||||||
| 
 | 
 | ||||||
|     def _try_load_conftest(self, anchor): |     def _try_load_conftest(self, anchor): | ||||||
|         self._path2confmods[None] = self.getconftestmodules(anchor) |         self.getconftestmodules(anchor) | ||||||
|         # let's also consider test* subdirs |         # let's also consider test* subdirs | ||||||
|         if anchor.check(dir=1): |         if anchor.check(dir=1): | ||||||
|             for x in anchor.listdir("test*"): |             for x in anchor.listdir("test*"): | ||||||
|  | @ -501,10 +501,8 @@ class Conftest(object): | ||||||
| 
 | 
 | ||||||
|     def getconftestmodules(self, path): |     def getconftestmodules(self, path): | ||||||
|         try: |         try: | ||||||
|             clist = self._path2confmods[path] |             return self._path2confmods[path] | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             if path is None: |  | ||||||
|                 raise ValueError("missing default conftest.") |  | ||||||
|             clist = [] |             clist = [] | ||||||
|             for parent in path.parts(): |             for parent in path.parts(): | ||||||
|                 if self._confcutdir and self._confcutdir.relto(parent): |                 if self._confcutdir and self._confcutdir.relto(parent): | ||||||
|  | @ -516,14 +514,9 @@ class Conftest(object): | ||||||
|             self._path2confmods[path] = clist |             self._path2confmods[path] = clist | ||||||
|             return clist |             return clist | ||||||
| 
 | 
 | ||||||
|     def rget(self, name, path=None): |     def rget_with_confmod(self, name, path): | ||||||
|         mod, value = self.rget_with_confmod(name, path) |  | ||||||
|         return value |  | ||||||
| 
 |  | ||||||
|     def rget_with_confmod(self, name, path=None): |  | ||||||
|         modules = self.getconftestmodules(path) |         modules = self.getconftestmodules(path) | ||||||
|         modules.reverse() |         for mod in reversed(modules): | ||||||
|         for mod in modules: |  | ||||||
|             try: |             try: | ||||||
|                 return mod, getattr(mod, name) |                 return mod, getattr(mod, name) | ||||||
|             except AttributeError: |             except AttributeError: | ||||||
|  | @ -531,7 +524,6 @@ class Conftest(object): | ||||||
|         raise KeyError(name) |         raise KeyError(name) | ||||||
| 
 | 
 | ||||||
|     def importconftest(self, conftestpath): |     def importconftest(self, conftestpath): | ||||||
|         assert conftestpath.check(), conftestpath |  | ||||||
|         try: |         try: | ||||||
|             return self._conftestpath2mod[conftestpath] |             return self._conftestpath2mod[conftestpath] | ||||||
|         except KeyError: |         except KeyError: | ||||||
|  | @ -549,14 +541,11 @@ class Conftest(object): | ||||||
|                     if path and path.relto(dirpath) or path == dirpath: |                     if path and path.relto(dirpath) or path == dirpath: | ||||||
|                         assert mod not in mods |                         assert mod not in mods | ||||||
|                         mods.append(mod) |                         mods.append(mod) | ||||||
|             self._postimport(mod) |  | ||||||
|             return mod |  | ||||||
| 
 |  | ||||||
|     def _postimport(self, mod): |  | ||||||
|             if self._onimport: |             if self._onimport: | ||||||
|                 self._onimport(mod) |                 self._onimport(mod) | ||||||
|             return mod |             return mod | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| def _ensure_removed_sysmodule(modname): | def _ensure_removed_sysmodule(modname): | ||||||
|     try: |     try: | ||||||
|         del sys.modules[modname] |         del sys.modules[modname] | ||||||
|  | @ -570,6 +559,7 @@ class CmdOptions(object): | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return "<CmdOptions %r>" %(self.__dict__,) |         return "<CmdOptions %r>" %(self.__dict__,) | ||||||
| 
 | 
 | ||||||
|  | notset = object() | ||||||
| FILE_OR_DIR = 'file_or_dir' | FILE_OR_DIR = 'file_or_dir' | ||||||
| class Config(object): | class Config(object): | ||||||
|     """ access to configuration values, pluginmanager and plugin hooks.  """ |     """ access to configuration values, pluginmanager and plugin hooks.  """ | ||||||
|  | @ -787,7 +777,7 @@ class Config(object): | ||||||
|             assert type is None |             assert type is None | ||||||
|             return value |             return value | ||||||
| 
 | 
 | ||||||
|     def _getconftest_pathlist(self, name, path=None): |     def _getconftest_pathlist(self, name, path): | ||||||
|         try: |         try: | ||||||
|             mod, relroots = self._conftest.rget_with_confmod(name, path) |             mod, relroots = self._conftest.rget_with_confmod(name, path) | ||||||
|         except KeyError: |         except KeyError: | ||||||
|  | @ -801,47 +791,31 @@ class Config(object): | ||||||
|             l.append(relroot) |             l.append(relroot) | ||||||
|         return l |         return l | ||||||
| 
 | 
 | ||||||
|     def _getconftest(self, name, path=None, check=False): |     def getoption(self, name, default=notset, skip=False): | ||||||
|         if check: |  | ||||||
|             self._checkconftest(name) |  | ||||||
|         return self._conftest.rget(name, path) |  | ||||||
| 
 |  | ||||||
|     def getoption(self, name): |  | ||||||
|         """ return command line option value. |         """ return command line option value. | ||||||
| 
 | 
 | ||||||
|         :arg name: name of the option.  You may also specify |         :arg name: name of the option.  You may also specify | ||||||
|             the literal ``--OPT`` option instead of the "dest" option name. |             the literal ``--OPT`` option instead of the "dest" option name. | ||||||
|  |         :arg default: default value if no option of that name exists. | ||||||
|  |         :arg skip: if True raise pytest.skip if not option exists. | ||||||
|         """ |         """ | ||||||
|         name = self._opt2dest.get(name, name) |         name = self._opt2dest.get(name, name) | ||||||
|         try: |         try: | ||||||
|             return getattr(self.option, name) |             return getattr(self.option, name) | ||||||
|         except AttributeError: |         except AttributeError: | ||||||
|  |             if default is not notset: | ||||||
|  |                 return default | ||||||
|  |             if skip: | ||||||
|  |                 py.test.skip("no %r option found" %(name,)) | ||||||
|             raise ValueError("no option named %r" % (name,)) |             raise ValueError("no option named %r" % (name,)) | ||||||
| 
 | 
 | ||||||
|     def getvalue(self, name, path=None): |     def getvalue(self, name, path=None): | ||||||
|         """ return command line option value. |         """ (deprecated, use getoption()) """ | ||||||
| 
 |         return self.getoption(name) | ||||||
|         :arg name: name of the command line option |  | ||||||
| 
 |  | ||||||
|         (deprecated) if we can't find the option also lookup |  | ||||||
|         the name in a matching conftest file. |  | ||||||
|         """ |  | ||||||
|         try: |  | ||||||
|             return getattr(self.option, name) |  | ||||||
|         except AttributeError: |  | ||||||
|             return self._getconftest(name, path, check=False) |  | ||||||
| 
 | 
 | ||||||
|     def getvalueorskip(self, name, path=None): |     def getvalueorskip(self, name, path=None): | ||||||
|         """ (deprecated) return getvalue(name) or call |         """ (deprecated, use getoption(skip=True)) """ | ||||||
|         pytest.skip if no value exists. """ |         return self.getoption(name, skip=True) | ||||||
|         __tracebackhide__ = True |  | ||||||
|         try: |  | ||||||
|             val = self.getvalue(name, path) |  | ||||||
|             if val is None: |  | ||||||
|                 raise KeyError(name) |  | ||||||
|             return val |  | ||||||
|         except KeyError: |  | ||||||
|             py.test.skip("no %r value found" %(name,)) |  | ||||||
| 
 | 
 | ||||||
| def exists(path, ignore=EnvironmentError): | def exists(path, ignore=EnvironmentError): | ||||||
|     try: |     try: | ||||||
|  |  | ||||||
|  | @ -144,7 +144,7 @@ def pytest_ignore_collect(path, config): | ||||||
|     p = path.dirpath() |     p = path.dirpath() | ||||||
|     ignore_paths = config._getconftest_pathlist("collect_ignore", path=p) |     ignore_paths = config._getconftest_pathlist("collect_ignore", path=p) | ||||||
|     ignore_paths = ignore_paths or [] |     ignore_paths = ignore_paths or [] | ||||||
|     excludeopt = config.getvalue("ignore") |     excludeopt = config.getoption("ignore") | ||||||
|     if excludeopt: |     if excludeopt: | ||||||
|         ignore_paths.extend([py.path.local(x) for x in excludeopt]) |         ignore_paths.extend([py.path.local(x) for x in excludeopt]) | ||||||
|     return path in ignore_paths |     return path in ignore_paths | ||||||
|  |  | ||||||
|  | @ -89,20 +89,6 @@ class TestConfigAPI: | ||||||
|         assert len(l) == 1 |         assert len(l) == 1 | ||||||
|         assert l[0] == "hello [config]\n" |         assert l[0] == "hello [config]\n" | ||||||
| 
 | 
 | ||||||
|     def test_config_getvalue_honours_conftest(self, testdir): |  | ||||||
|         testdir.makepyfile(conftest="x=1") |  | ||||||
|         testdir.mkdir("sub").join("conftest.py").write("x=2 ; y = 3") |  | ||||||
|         config = testdir.parseconfig() |  | ||||||
|         o = testdir.tmpdir |  | ||||||
|         assert config.getvalue("x") == 1 |  | ||||||
|         assert config.getvalue("x", o.join('sub')) == 2 |  | ||||||
|         pytest.raises(KeyError, "config.getvalue('y')") |  | ||||||
|         config = testdir.parseconfigure(str(o.join('sub'))) |  | ||||||
|         assert config.getvalue("x") == 2 |  | ||||||
|         assert config.getvalue("y") == 3 |  | ||||||
|         assert config.getvalue("x", o) == 1 |  | ||||||
|         pytest.raises(KeyError, 'config.getvalue("y", o)') |  | ||||||
| 
 |  | ||||||
|     def test_config_getoption(self, testdir): |     def test_config_getoption(self, testdir): | ||||||
|         testdir.makeconftest(""" |         testdir.makeconftest(""" | ||||||
|             def pytest_addoption(parser): |             def pytest_addoption(parser): | ||||||
|  | @ -130,34 +116,20 @@ class TestConfigAPI: | ||||||
|             "config.getvalueorskip('hello')") |             "config.getvalueorskip('hello')") | ||||||
|         verbose = config.getvalueorskip("verbose") |         verbose = config.getvalueorskip("verbose") | ||||||
|         assert verbose == config.option.verbose |         assert verbose == config.option.verbose | ||||||
|         config.option.hello = None |  | ||||||
|         try: |  | ||||||
|             config.getvalueorskip('hello') |  | ||||||
|         except KeyboardInterrupt: |  | ||||||
|             raise |  | ||||||
|         except: |  | ||||||
|             excinfo = py.code.ExceptionInfo() |  | ||||||
|         frame = excinfo.traceback[-2].frame |  | ||||||
|         assert frame.code.name == "getvalueorskip" |  | ||||||
|         assert frame.eval("__tracebackhide__") |  | ||||||
| 
 | 
 | ||||||
|     def test_config_overwrite(self, testdir): |     def test_getoption(self, testdir): | ||||||
|         o = testdir.tmpdir |         config = testdir.parseconfig() | ||||||
|         o.ensure("conftest.py").write("x=1") |         with pytest.raises(ValueError): | ||||||
|         config = testdir.parseconfig(str(o)) |             config.getvalue('x') | ||||||
|         assert config.getvalue('x') == 1 |         assert config.getoption("x", 1) == 1 | ||||||
|         config.option.x = 2 |  | ||||||
|         assert config.getvalue('x') == 2 |  | ||||||
|         config = testdir.parseconfig(str(o)) |  | ||||||
|         assert config.getvalue('x') == 1 |  | ||||||
| 
 | 
 | ||||||
|     def test_getconftest_pathlist(self, testdir, tmpdir): |     def test_getconftest_pathlist(self, testdir, tmpdir): | ||||||
|         somepath = tmpdir.join("x", "y", "z") |         somepath = tmpdir.join("x", "y", "z") | ||||||
|         p = tmpdir.join("conftest.py") |         p = tmpdir.join("conftest.py") | ||||||
|         p.write("pathlist = ['.', %r]" % str(somepath)) |         p.write("pathlist = ['.', %r]" % str(somepath)) | ||||||
|         config = testdir.parseconfigure(p) |         config = testdir.parseconfigure(p) | ||||||
|         assert config._getconftest_pathlist('notexist') is None |         assert config._getconftest_pathlist('notexist', path=tmpdir) is None | ||||||
|         pl = config._getconftest_pathlist('pathlist') |         pl = config._getconftest_pathlist('pathlist', path=tmpdir) | ||||||
|         print(pl) |         print(pl) | ||||||
|         assert len(pl) == 2 |         assert len(pl) == 2 | ||||||
|         assert pl[0] == tmpdir |         assert pl[0] == tmpdir | ||||||
|  |  | ||||||
|  | @ -1,22 +1,17 @@ | ||||||
| import py, pytest | import py, pytest | ||||||
| from _pytest.config import Conftest | from _pytest.config import Conftest | ||||||
| 
 | 
 | ||||||
| def pytest_generate_tests(metafunc): |  | ||||||
|     if "basedir" in metafunc.fixturenames: |  | ||||||
|         metafunc.addcall(param="global") |  | ||||||
|         metafunc.addcall(param="inpackage") |  | ||||||
| 
 | 
 | ||||||
| def pytest_funcarg__basedir(request): | @pytest.fixture(scope="module", params=["global", "inpackage"]) | ||||||
|     def basedirmaker(request): | def basedir(request): | ||||||
|         d = request.getfuncargvalue("tmpdir") |     from _pytest.tmpdir import tmpdir | ||||||
|         d.ensure("adir/conftest.py").write("a=1 ; Directory = 3") |     tmpdir = tmpdir(request) | ||||||
|         d.ensure("adir/b/conftest.py").write("b=2 ; a = 1.5") |     tmpdir.ensure("adir/conftest.py").write("a=1 ; Directory = 3") | ||||||
|  |     tmpdir.ensure("adir/b/conftest.py").write("b=2 ; a = 1.5") | ||||||
|     if request.param == "inpackage": |     if request.param == "inpackage": | ||||||
|             d.ensure("adir/__init__.py") |         tmpdir.ensure("adir/__init__.py") | ||||||
|             d.ensure("adir/b/__init__.py") |         tmpdir.ensure("adir/b/__init__.py") | ||||||
|         return d |     return tmpdir | ||||||
|     return request.cached_setup( |  | ||||||
|         lambda: basedirmaker(request), extrakey=request.param) |  | ||||||
| 
 | 
 | ||||||
| def ConftestWithSetinitial(path): | def ConftestWithSetinitial(path): | ||||||
|     conftest = Conftest() |     conftest = Conftest() | ||||||
|  | @ -33,17 +28,17 @@ def conftest_setinitial(conftest, args, confcutdir=None): | ||||||
| class TestConftestValueAccessGlobal: | class TestConftestValueAccessGlobal: | ||||||
|     def test_basic_init(self, basedir): |     def test_basic_init(self, basedir): | ||||||
|         conftest = Conftest() |         conftest = Conftest() | ||||||
|         conftest_setinitial(conftest, [basedir.join("adir")]) |         p = basedir.join("adir") | ||||||
|         assert conftest.rget("a") == 1 |         assert conftest.rget_with_confmod("a", p)[1] == 1 | ||||||
| 
 | 
 | ||||||
|     def test_onimport(self, basedir): |     def test_onimport(self, basedir): | ||||||
|         l = [] |         l = [] | ||||||
|         conftest = Conftest(onimport=l.append) |         conftest = Conftest(onimport=l.append) | ||||||
|         conftest_setinitial(conftest, [basedir.join("adir"), |         adir = basedir.join("adir") | ||||||
|             '--confcutdir=%s' % basedir]) |         conftest_setinitial(conftest, [adir], confcutdir=basedir) | ||||||
|         assert len(l) == 1 |         assert len(l) == 1 | ||||||
|         assert conftest.rget("a") == 1 |         assert conftest.rget_with_confmod("a", adir)[1] == 1 | ||||||
|         assert conftest.rget("b", basedir.join("adir", "b")) == 2 |         assert conftest.rget_with_confmod("b", adir.join("b"))[1] == 2 | ||||||
|         assert len(l) == 2 |         assert len(l) == 2 | ||||||
| 
 | 
 | ||||||
|     def test_immediate_initialiation_and_incremental_are_the_same(self, basedir): |     def test_immediate_initialiation_and_incremental_are_the_same(self, basedir): | ||||||
|  | @ -57,37 +52,16 @@ class TestConftestValueAccessGlobal: | ||||||
|         conftest.getconftestmodules(basedir.join('b')) |         conftest.getconftestmodules(basedir.join('b')) | ||||||
|         assert len(conftest._path2confmods) == snap1 + 2 |         assert len(conftest._path2confmods) == snap1 + 2 | ||||||
| 
 | 
 | ||||||
|     def test_default_has_lower_prio(self, basedir): |  | ||||||
|         conftest = ConftestWithSetinitial(basedir.join("adir")) |  | ||||||
|         assert conftest.rget('Directory') == 3 |  | ||||||
|         #assert conftest.lget('Directory') == pytest.Directory |  | ||||||
| 
 |  | ||||||
|     def test_value_access_not_existing(self, basedir): |     def test_value_access_not_existing(self, basedir): | ||||||
|         conftest = ConftestWithSetinitial(basedir) |         conftest = ConftestWithSetinitial(basedir) | ||||||
|         pytest.raises(KeyError, lambda: conftest.rget('a')) |         with pytest.raises(KeyError): | ||||||
|         #pytest.raises(KeyError, "conftest.lget('a')") |             conftest.rget_with_confmod('a', basedir) | ||||||
| 
 | 
 | ||||||
|     def test_value_access_by_path(self, basedir): |     def test_value_access_by_path(self, basedir): | ||||||
|         conftest = ConftestWithSetinitial(basedir) |         conftest = ConftestWithSetinitial(basedir) | ||||||
|         assert conftest.rget("a", basedir.join('adir')) == 1 |         adir = basedir.join("adir") | ||||||
|         #assert conftest.lget("a", basedir.join('adir')) == 1 |         assert conftest.rget_with_confmod("a", adir)[1] == 1 | ||||||
|         assert conftest.rget("a", basedir.join('adir', 'b')) == 1.5 |         assert conftest.rget_with_confmod("a", adir.join("b"))[1] == 1.5 | ||||||
|         #assert conftest.lget("a", basedir.join('adir', 'b')) == 1 |  | ||||||
|         #assert conftest.lget("b", basedir.join('adir', 'b')) == 2 |  | ||||||
|         #assert pytest.raises(KeyError, |  | ||||||
|         #    'conftest.lget("b", basedir.join("a"))' |  | ||||||
|         #) |  | ||||||
| 
 |  | ||||||
|     def test_value_access_with_init_one_conftest(self, basedir): |  | ||||||
|         conftest = ConftestWithSetinitial(basedir.join('adir')) |  | ||||||
|         assert conftest.rget("a") == 1 |  | ||||||
|         #assert conftest.lget("a") == 1 |  | ||||||
| 
 |  | ||||||
|     def test_value_access_with_init_two_conftests(self, basedir): |  | ||||||
|         conftest = ConftestWithSetinitial(basedir.join("adir", "b")) |  | ||||||
|         conftest.rget("a") == 1.5 |  | ||||||
|         #conftest.lget("a") == 1 |  | ||||||
|         #conftest.lget("b") == 1 |  | ||||||
| 
 | 
 | ||||||
|     def test_value_access_with_confmod(self, basedir): |     def test_value_access_with_confmod(self, basedir): | ||||||
|         startdir = basedir.join("adir", "b") |         startdir = basedir.join("adir", "b") | ||||||
|  | @ -111,7 +85,7 @@ def test_doubledash_considered(testdir): | ||||||
|     conf.join("conftest.py").ensure() |     conf.join("conftest.py").ensure() | ||||||
|     conftest = Conftest() |     conftest = Conftest() | ||||||
|     conftest_setinitial(conftest, [conf.basename, conf.basename]) |     conftest_setinitial(conftest, [conf.basename, conf.basename]) | ||||||
|     l = conftest.getconftestmodules(None) |     l = conftest.getconftestmodules(conf) | ||||||
|     assert len(l) == 1 |     assert len(l) == 1 | ||||||
| 
 | 
 | ||||||
| def test_issue151_load_all_conftests(testdir): | def test_issue151_load_all_conftests(testdir): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue