/usr/lib/python3/dist-packages/nose2/loader.py is in python3-nose2 0.7.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | # Adapted from unittest2/loader.py from the unittest2 plugins branch.
# This module contains some code copied from unittest2/loader.py and other
# code developed in reference to that module and others within unittest2.
# unittest2 is Copyright (c) 2001-2010 Python Software Foundation; All
# Rights Reserved. See: http://docs.python.org/license.html
import logging
import traceback
import six
import unittest
from nose2 import events
log = logging.getLogger(__name__)
__unittest = True
class PluggableTestLoader(object):
"""Test loader that defers all loading to plugins
:param session: Test run session.
.. attribute :: suiteClass
Suite class to use. Default: :class:`unittest.TestSuite`.
"""
suiteClass = unittest.TestSuite
def __init__(self, session):
self.session = session
def loadTestsFromModule(self, module):
"""Load tests from module.
Fires :func:`loadTestsFromModule` hook.
"""
evt = events.LoadFromModuleEvent(self, module)
result = self.session.hooks.loadTestsFromModule(evt)
if evt.handled:
suite = result or self.suiteClass()
else:
suite = self.suiteClass(evt.extraTests)
filterevt = events.ModuleSuiteEvent(self, module, suite)
result = self.session.hooks.moduleLoadedSuite(filterevt)
if result:
return result or self.suiteClass()
return filterevt.suite
def loadTestsFromNames(self, testNames, module=None):
"""Load tests from test names.
Fires :func:`loadTestsFromNames` hook.
"""
event = events.LoadFromNamesEvent(
self, testNames, module)
result = self.session.hooks.loadTestsFromNames(event)
log.debug('loadTestsFromNames event %s result %s', event, result)
if event.handled:
suites = result or []
else:
if event.names:
suites = [self.loadTestsFromName(name, module)
for name in event.names]
elif module:
suites = self.loadTestsFromModule(module)
if event.extraTests:
suites.extend(event.extraTests)
return self.suiteClass(suites)
def loadTestsFromName(self, name, module=None):
"""Load tests from test name.
Fires :func:`loadTestsFromName` hook.
"""
log.debug('loadTestsFromName %s/%s', name, module)
event = events.LoadFromNameEvent(self, name, module)
result = self.session.hooks.loadTestsFromName(event)
if event.handled:
suite = result or self.suiteClass()
return suite
return self.suiteClass(event.extraTests)
def failedImport(self, name):
"""Make test case representing a failed import."""
message = 'Failed to import test module: %s' % name
if hasattr(traceback, 'format_exc'):
# Python 2.3 compatibility
# format_exc returns two frames of discover.py as well XXX ?
message += '\n%s' % traceback.format_exc()
return self._makeFailedTest(
'ModuleImportFailure', name, ImportError(message))
def failedLoadTests(self, name, exception):
"""Make test case representing a failed test load."""
return self._makeFailedTest('LoadTestsFailure', name, exception)
def sortTestMethodsUsing(self, name):
"""Sort key for test case test methods."""
return name.lower()
def discover(self, start_dir=None, pattern=None):
"""Compatibility shim for ``load_tests`` protocol."""
try:
oldsd = self.session.startDir
self.session.startDir = start_dir
return self.loadTestsFromNames([])
finally:
self.session.startDir = oldsd
def _makeFailedTest(self, classname, methodname, exception):
def testFailure(self):
if isinstance(exception, Exception):
raise exception
else:
# exception tuple (type, value, traceback)
six.reraise(*exception)
attrs = {methodname: testFailure}
TestClass = type(classname, (unittest.TestCase,), attrs)
return self.suiteClass((TestClass(methodname),))
def __repr__(self):
return '<%s>' % self.__class__.__name__
|