126 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| """ default hooks and general py.test options. """ 
 | |
| 
 | |
| import sys
 | |
| import py
 | |
| 
 | |
| def pytest_pyfunc_call(__multicall__, pyfuncitem):
 | |
|     if not __multicall__.execute():
 | |
|         testfunction = pyfuncitem.obj 
 | |
|         if pyfuncitem._isyieldedfunction():
 | |
|             testfunction(*pyfuncitem._args)
 | |
|         else:
 | |
|             funcargs = pyfuncitem.funcargs
 | |
|             testfunction(**funcargs)
 | |
| 
 | |
| def pytest_collect_file(path, parent):
 | |
|     ext = path.ext 
 | |
|     pb = path.purebasename
 | |
|     if pb.startswith("test_") or pb.endswith("_test") or \
 | |
|        path in parent.config._argfspaths:
 | |
|         if ext == ".py":
 | |
|             return parent.ihook.pytest_pycollect_makemodule(
 | |
|                 path=path, parent=parent)
 | |
| 
 | |
| def pytest_pycollect_makemodule(path, parent):
 | |
|     return parent.Module(path, parent)
 | |
| 
 | |
| def pytest_funcarg__pytestconfig(request):
 | |
|     """ the pytest config object with access to command line opts."""
 | |
|     return request.config
 | |
| 
 | |
| def pytest_ignore_collect(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):
 | |
|     # XXX reconsider the following comment 
 | |
|     # not use parent.Directory here as we generally 
 | |
|     # want dir/conftest.py to be able to 
 | |
|     # define Directory(dir) already 
 | |
|     if not parent.recfilter(path): # by default special ".cvs", ... 
 | |
|         # check if cmdline specified this dir or a subdir directly
 | |
|         for arg in parent.config._argfspaths:
 | |
|             if path == arg or arg.relto(path):
 | |
|                 break
 | |
|         else:
 | |
|             return 
 | |
|     Directory = parent.config._getcollectclass('Directory', path) 
 | |
|     return Directory(path, parent=parent)
 | |
| 
 | |
| def pytest_report_iteminfo(item):
 | |
|     return item.reportinfo()
 | |
| 
 | |
| def pytest_addoption(parser):
 | |
|     group = parser.getgroup("general", "running and selection options")
 | |
|     group._addoption('-x', '--exitfirst',
 | |
|                action="store_true", dest="exitfirst", default=False,
 | |
|                help="exit instantly on first error or failed test."),
 | |
|     group._addoption('-k',
 | |
|         action="store", dest="keyword", default='',
 | |
|         help="only run test items matching the given "
 | |
|              "space separated keywords.  precede a keyword with '-' to negate. "
 | |
|              "Terminate the expression with ':' to treat a match as a signal "
 | |
|              "to run all subsequent tests. ")
 | |
| 
 | |
|     group = parser.getgroup("collect", "collection")
 | |
|     group.addoption('--collectonly',
 | |
|         action="store_true", dest="collectonly",
 | |
|         help="only collect tests, don't execute them."),
 | |
|     group.addoption("--ignore", action="append", metavar="path", 
 | |
|         help="ignore path during collection (multi-allowed).")
 | |
|     group.addoption('--confcutdir', dest="confcutdir", default=None, 
 | |
|         metavar="dir",
 | |
|         help="only load conftest.py's relative to specified dir.")
 | |
| 
 | |
|     group = parser.getgroup("debugconfig", 
 | |
|         "test process debugging and configuration")
 | |
|     group.addoption('--basetemp', dest="basetemp", default=None, metavar="dir",
 | |
|                help="base temporary directory for this test run.")
 | |
| 
 | |
| def pytest_configure(config):
 | |
|     setsession(config)
 | |
| 
 | |
| def setsession(config):
 | |
|     val = config.getvalue
 | |
|     if val("collectonly"):
 | |
|         from py._test.session import Session
 | |
|         config.setsessionclass(Session)
 | |
|       
 | |
| # pycollect related hooks and code, should move to pytest_pycollect.py
 | |
|  
 | |
| def pytest_pycollect_makeitem(__multicall__, collector, name, obj):
 | |
|     res = __multicall__.execute()
 | |
|     if res is not None:
 | |
|         return res
 | |
|     if collector._istestclasscandidate(name, obj):
 | |
|         res = collector._deprecated_join(name)
 | |
|         if res is not None:
 | |
|             return res 
 | |
|         return collector.Class(name, parent=collector)
 | |
|     elif collector.funcnamefilter(name) and hasattr(obj, '__call__'):
 | |
|         res = collector._deprecated_join(name)
 | |
|         if res is not None:
 | |
|             return res 
 | |
|         if is_generator(obj):
 | |
|             # XXX deprecation warning 
 | |
|             return collector.Generator(name, parent=collector)
 | |
|         else:
 | |
|             return collector._genfunctions(name, obj) 
 | |
| 
 | |
| def is_generator(func):
 | |
|     try:
 | |
|         return py.code.getrawcode(func).co_flags & 32 # generator function 
 | |
|     except AttributeError: # builtin functions have no bytecode
 | |
|         # assume them to not be generators
 | |
|         return False 
 |