introduce a new pytest_ignore_collect_path(path, config) hook -
returning a true value will prevent considering the path for collection The hook is called for both files and directory paths. --HG-- branch : trunk
This commit is contained in:
parent
25ed74a77a
commit
811408959f
|
@ -8,6 +8,12 @@ Changes between 1.2.1 and 1.2.2 (release pending)
|
||||||
- fixes for handling of unicode exception values and unprintable objects
|
- fixes for handling of unicode exception values and unprintable objects
|
||||||
- (issue87) fix unboundlocal error in assertionold code
|
- (issue87) fix unboundlocal error in assertionold code
|
||||||
- (issue86) improve documentation for looponfailing
|
- (issue86) improve documentation for looponfailing
|
||||||
|
- add a new pytest_ignore_collect_path(path, config) hook to allow projects and
|
||||||
|
plugins to define exclusion behaviour for their directory structure -
|
||||||
|
for example you may define in a conftest.py this method:
|
||||||
|
def pytest_ignore_collect_path(path):
|
||||||
|
return path.check(link=1)
|
||||||
|
to prevent even a collection try of any tests in symlinked dirs.
|
||||||
- expose previously internal commonly useful methods:
|
- expose previously internal commonly useful methods:
|
||||||
py.io.get_terminal_with() -> return terminal width
|
py.io.get_terminal_with() -> return terminal width
|
||||||
py.io.ansi_print(...) -> print colored/bold text on linux/win32
|
py.io.ansi_print(...) -> print colored/bold text on linux/win32
|
||||||
|
|
|
@ -27,6 +27,13 @@ def pytest_unconfigure(config):
|
||||||
# collection hooks
|
# collection hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def pytest_ignore_collect_path(path, config):
|
||||||
|
""" return true value to prevent considering this path for collection.
|
||||||
|
This hook is consulted for all files and directories prior to considering
|
||||||
|
collection hooks.
|
||||||
|
"""
|
||||||
|
pytest_ignore_collect_path.firstresult = True
|
||||||
|
|
||||||
def pytest_collect_directory(path, parent):
|
def pytest_collect_directory(path, parent):
|
||||||
""" return Collection node or None for the given path. """
|
""" return Collection node or None for the given path. """
|
||||||
pytest_collect_directory.firstresult = True
|
pytest_collect_directory.firstresult = True
|
||||||
|
|
|
@ -24,6 +24,20 @@ def pytest_funcarg__pytestconfig(request):
|
||||||
""" the pytest config object with access to command line opts."""
|
""" the pytest config object with access to command line opts."""
|
||||||
return request.config
|
return request.config
|
||||||
|
|
||||||
|
def pytest_ignore_collect_path(path, config):
|
||||||
|
ignore_paths = config.getconftest_pathlist("collect_ignore", path=path)
|
||||||
|
ignore_paths = ignore_paths or []
|
||||||
|
excludeopt = config.getvalue("ignore")
|
||||||
|
if excludeopt:
|
||||||
|
ignore_paths.extend([py.path.local(x) for x in excludeopt])
|
||||||
|
return path in ignore_paths
|
||||||
|
# XXX more refined would be:
|
||||||
|
if ignore_paths:
|
||||||
|
for p in ignore_paths:
|
||||||
|
if path == p or path.relto(p):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def pytest_collect_directory(path, parent):
|
def pytest_collect_directory(path, parent):
|
||||||
# XXX reconsider the following comment
|
# XXX reconsider the following comment
|
||||||
# not use parent.Directory here as we generally
|
# not use parent.Directory here as we generally
|
||||||
|
|
|
@ -296,28 +296,15 @@ class Directory(FSCollector):
|
||||||
l.append(res)
|
l.append(res)
|
||||||
return l
|
return l
|
||||||
|
|
||||||
def _ignore(self, path):
|
|
||||||
ignore_paths = self.config.getconftest_pathlist("collect_ignore",
|
|
||||||
path=path) or []
|
|
||||||
excludeopt = self.config.getvalue("ignore")
|
|
||||||
if excludeopt:
|
|
||||||
ignore_paths.extend([py.path.local(x) for x in excludeopt])
|
|
||||||
return path in ignore_paths
|
|
||||||
# XXX more refined would be:
|
|
||||||
if ignore_paths:
|
|
||||||
for p in ignore_paths:
|
|
||||||
if path == p or path.relto(p):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def consider(self, path):
|
def consider(self, path):
|
||||||
if self._ignore(path):
|
if self.ihook.pytest_ignore_collect_path(path=path, config=self.config):
|
||||||
return
|
return
|
||||||
if path.check(file=1):
|
if path.check(file=1):
|
||||||
res = self.consider_file(path)
|
res = self.consider_file(path)
|
||||||
elif path.check(dir=1):
|
elif path.check(dir=1):
|
||||||
res = self.consider_dir(path)
|
res = self.consider_dir(path)
|
||||||
else:
|
else:
|
||||||
res = None
|
res = None
|
||||||
if isinstance(res, list):
|
if isinstance(res, list):
|
||||||
# throw out identical results
|
# throw out identical results
|
||||||
l = []
|
l = []
|
||||||
|
|
|
@ -157,6 +157,21 @@ class TestPrunetraceback:
|
||||||
])
|
])
|
||||||
|
|
||||||
class TestCustomConftests:
|
class TestCustomConftests:
|
||||||
|
def test_ignore_collect_path(self, testdir):
|
||||||
|
testdir.makeconftest("""
|
||||||
|
def pytest_ignore_collect_path(path, config):
|
||||||
|
return path.basename.startswith("x") or \
|
||||||
|
path.basename == "test_one.py"
|
||||||
|
""")
|
||||||
|
testdir.mkdir("xy123").ensure("test_hello.py").write(
|
||||||
|
"syntax error"
|
||||||
|
)
|
||||||
|
testdir.makepyfile("def test_hello(): pass")
|
||||||
|
testdir.makepyfile(test_one="syntax error")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
assert result.ret == 0
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
|
||||||
def test_collectignore_exclude_on_option(self, testdir):
|
def test_collectignore_exclude_on_option(self, testdir):
|
||||||
testdir.makeconftest("""
|
testdir.makeconftest("""
|
||||||
collect_ignore = ['hello', 'test_world.py']
|
collect_ignore = ['hello', 'test_world.py']
|
||||||
|
|
Loading…
Reference in New Issue