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):
|
||||||
|
@ -514,16 +512,11 @@ class Conftest(object):
|
||||||
mod = self.importconftest(conftestpath)
|
mod = self.importconftest(conftestpath)
|
||||||
clist.append(mod)
|
clist.append(mod)
|
||||||
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,13 +541,10 @@ 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)
|
if self._onimport:
|
||||||
|
self._onimport(mod)
|
||||||
return mod
|
return mod
|
||||||
|
|
||||||
def _postimport(self, mod):
|
|
||||||
if self._onimport:
|
|
||||||
self._onimport(mod)
|
|
||||||
return mod
|
|
||||||
|
|
||||||
def _ensure_removed_sysmodule(modname):
|
def _ensure_removed_sysmodule(modname):
|
||||||
try:
|
try:
|
||||||
|
@ -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")
|
||||||
if request.param == "inpackage":
|
tmpdir.ensure("adir/b/conftest.py").write("b=2 ; a = 1.5")
|
||||||
d.ensure("adir/__init__.py")
|
if request.param == "inpackage":
|
||||||
d.ensure("adir/b/__init__.py")
|
tmpdir.ensure("adir/__init__.py")
|
||||||
return d
|
tmpdir.ensure("adir/b/__init__.py")
|
||||||
return request.cached_setup(
|
return tmpdir
|
||||||
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