parent
							
								
									8532e991a5
								
							
						
					
					
						commit
						53cd7fd2ea
					
				|  | @ -415,10 +415,20 @@ The following warning types ares used by pytest and are part of the public API: | ||||||
| 
 | 
 | ||||||
| .. autoclass:: pytest.PytestWarning | .. autoclass:: pytest.PytestWarning | ||||||
| 
 | 
 | ||||||
| .. autoclass:: pytest.PytestDeprecationWarning | .. autoclass:: pytest.PytestAssertRewriteWarning | ||||||
| 
 | 
 | ||||||
| .. autoclass:: pytest.RemovedInPytest4Warning | .. autoclass:: pytest.PytestCacheWarning | ||||||
|  | 
 | ||||||
|  | .. autoclass:: pytest.PytestCollectionWarning | ||||||
|  | 
 | ||||||
|  | .. autoclass:: pytest.PytestConfigWarning | ||||||
|  | 
 | ||||||
|  | .. autoclass:: pytest.PytestDeprecationWarning | ||||||
| 
 | 
 | ||||||
| .. autoclass:: pytest.PytestExperimentalApiWarning | .. autoclass:: pytest.PytestExperimentalApiWarning | ||||||
| 
 | 
 | ||||||
|  | .. autoclass:: pytest.PytestUnhandledCoroutineWarning | ||||||
|  | 
 | ||||||
| .. autoclass:: pytest.PytestUnknownMarkWarning | .. autoclass:: pytest.PytestUnknownMarkWarning | ||||||
|  | 
 | ||||||
|  | .. autoclass:: pytest.RemovedInPytest4Warning | ||||||
|  |  | ||||||
|  | @ -268,11 +268,13 @@ class AssertionRewritingHook(object): | ||||||
|         self._marked_for_rewrite_cache.clear() |         self._marked_for_rewrite_cache.clear() | ||||||
| 
 | 
 | ||||||
|     def _warn_already_imported(self, name): |     def _warn_already_imported(self, name): | ||||||
|         from _pytest.warning_types import PytestWarning |         from _pytest.warning_types import PytestAssertRewriteWarning | ||||||
|         from _pytest.warnings import _issue_warning_captured |         from _pytest.warnings import _issue_warning_captured | ||||||
| 
 | 
 | ||||||
|         _issue_warning_captured( |         _issue_warning_captured( | ||||||
|             PytestWarning("Module already imported so cannot be rewritten: %s" % name), |             PytestAssertRewriteWarning( | ||||||
|  |                 "Module already imported so cannot be rewritten: %s" % name | ||||||
|  |             ), | ||||||
|             self.config.hook, |             self.config.hook, | ||||||
|             stacklevel=5, |             stacklevel=5, | ||||||
|         ) |         ) | ||||||
|  | @ -819,11 +821,13 @@ class AssertionRewriter(ast.NodeVisitor): | ||||||
| 
 | 
 | ||||||
|         """ |         """ | ||||||
|         if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) >= 1: |         if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) >= 1: | ||||||
|             from _pytest.warning_types import PytestWarning |             from _pytest.warning_types import PytestAssertRewriteWarning | ||||||
|             import warnings |             import warnings | ||||||
| 
 | 
 | ||||||
|             warnings.warn_explicit( |             warnings.warn_explicit( | ||||||
|                 PytestWarning("assertion is always true, perhaps remove parentheses?"), |                 PytestAssertRewriteWarning( | ||||||
|  |                     "assertion is always true, perhaps remove parentheses?" | ||||||
|  |                 ), | ||||||
|                 category=None, |                 category=None, | ||||||
|                 filename=str(self.module_path), |                 filename=str(self.module_path), | ||||||
|                 lineno=assert_.lineno, |                 lineno=assert_.lineno, | ||||||
|  | @ -887,10 +891,10 @@ class AssertionRewriter(ast.NodeVisitor): | ||||||
|         val_is_none = ast.Compare(node, [ast.Is()], [AST_NONE]) |         val_is_none = ast.Compare(node, [ast.Is()], [AST_NONE]) | ||||||
|         send_warning = ast.parse( |         send_warning = ast.parse( | ||||||
|             """ |             """ | ||||||
| from _pytest.warning_types import PytestWarning | from _pytest.warning_types import PytestAssertRewriteWarning | ||||||
| from warnings import warn_explicit | from warnings import warn_explicit | ||||||
| warn_explicit( | warn_explicit( | ||||||
|     PytestWarning('asserting the value None, please use "assert is None"'), |     PytestAssertRewriteWarning('asserting the value None, please use "assert is None"'), | ||||||
|     category=None, |     category=None, | ||||||
|     filename={filename!r}, |     filename={filename!r}, | ||||||
|     lineno={lineno}, |     lineno={lineno}, | ||||||
|  |  | ||||||
|  | @ -60,10 +60,10 @@ class Cache(object): | ||||||
| 
 | 
 | ||||||
|     def warn(self, fmt, **args): |     def warn(self, fmt, **args): | ||||||
|         from _pytest.warnings import _issue_warning_captured |         from _pytest.warnings import _issue_warning_captured | ||||||
|         from _pytest.warning_types import PytestWarning |         from _pytest.warning_types import PytestCacheWarning | ||||||
| 
 | 
 | ||||||
|         _issue_warning_captured( |         _issue_warning_captured( | ||||||
|             PytestWarning(fmt.format(**args) if args else fmt), |             PytestCacheWarning(fmt.format(**args) if args else fmt), | ||||||
|             self._config.hook, |             self._config.hook, | ||||||
|             stacklevel=3, |             stacklevel=3, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ from _pytest.compat import lru_cache | ||||||
| from _pytest.compat import safe_str | from _pytest.compat import safe_str | ||||||
| from _pytest.outcomes import fail | from _pytest.outcomes import fail | ||||||
| from _pytest.outcomes import Skipped | from _pytest.outcomes import Skipped | ||||||
| from _pytest.warning_types import PytestWarning | from _pytest.warning_types import PytestConfigWarning | ||||||
| 
 | 
 | ||||||
| hookimpl = HookimplMarker("pytest") | hookimpl = HookimplMarker("pytest") | ||||||
| hookspec = HookspecMarker("pytest") | hookspec = HookspecMarker("pytest") | ||||||
|  | @ -307,7 +307,7 @@ class PytestPluginManager(PluginManager): | ||||||
|     def register(self, plugin, name=None): |     def register(self, plugin, name=None): | ||||||
|         if name in ["pytest_catchlog", "pytest_capturelog"]: |         if name in ["pytest_catchlog", "pytest_capturelog"]: | ||||||
|             warnings.warn( |             warnings.warn( | ||||||
|                 PytestWarning( |                 PytestConfigWarning( | ||||||
|                     "{} plugin has been merged into the core, " |                     "{} plugin has been merged into the core, " | ||||||
|                     "please remove it from your requirements.".format( |                     "please remove it from your requirements.".format( | ||||||
|                         name.replace("_", "-") |                         name.replace("_", "-") | ||||||
|  | @ -574,7 +574,7 @@ class PytestPluginManager(PluginManager): | ||||||
|             from _pytest.warnings import _issue_warning_captured |             from _pytest.warnings import _issue_warning_captured | ||||||
| 
 | 
 | ||||||
|             _issue_warning_captured( |             _issue_warning_captured( | ||||||
|                 PytestWarning("skipped plugin %r: %s" % (modname, e.msg)), |                 PytestConfigWarning("skipped plugin %r: %s" % (modname, e.msg)), | ||||||
|                 self.hook, |                 self.hook, | ||||||
|                 stacklevel=1, |                 stacklevel=1, | ||||||
|             ) |             ) | ||||||
|  | @ -863,7 +863,7 @@ class Config(object): | ||||||
|                 from _pytest.warnings import _issue_warning_captured |                 from _pytest.warnings import _issue_warning_captured | ||||||
| 
 | 
 | ||||||
|                 _issue_warning_captured( |                 _issue_warning_captured( | ||||||
|                     PytestWarning( |                     PytestConfigWarning( | ||||||
|                         "could not load initial conftests: {}".format(e.path) |                         "could not load initial conftests: {}".format(e.path) | ||||||
|                     ), |                     ), | ||||||
|                     self.hook, |                     self.hook, | ||||||
|  |  | ||||||
|  | @ -307,9 +307,11 @@ def record_xml_attribute(request): | ||||||
|     The fixture is callable with ``(name, value)``, with value being |     The fixture is callable with ``(name, value)``, with value being | ||||||
|     automatically xml-encoded |     automatically xml-encoded | ||||||
|     """ |     """ | ||||||
|     from _pytest.warning_types import PytestWarning |     from _pytest.warning_types import PytestExperimentalApiWarning, PytestWarning | ||||||
| 
 | 
 | ||||||
|     request.node.warn(PytestWarning("record_xml_attribute is an experimental feature")) |     request.node.warn( | ||||||
|  |         PytestExperimentalApiWarning("record_xml_attribute is an experimental feature") | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     # Declare noop |     # Declare noop | ||||||
|     def add_attr_noop(name, value): |     def add_attr_noop(name, value): | ||||||
|  |  | ||||||
|  | @ -45,7 +45,8 @@ from _pytest.mark.structures import normalize_mark_list | ||||||
| from _pytest.outcomes import fail | from _pytest.outcomes import fail | ||||||
| from _pytest.outcomes import skip | from _pytest.outcomes import skip | ||||||
| from _pytest.pathlib import parts | from _pytest.pathlib import parts | ||||||
| from _pytest.warning_types import PytestWarning | from _pytest.warning_types import PytestCollectionWarning | ||||||
|  | from _pytest.warning_types import PytestUnhandledCoroutineWarning | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def pyobj_property(name): | def pyobj_property(name): | ||||||
|  | @ -171,7 +172,7 @@ def pytest_pyfunc_call(pyfuncitem): | ||||||
|         msg += "  - pytest-asyncio\n" |         msg += "  - pytest-asyncio\n" | ||||||
|         msg += "  - pytest-trio\n" |         msg += "  - pytest-trio\n" | ||||||
|         msg += "  - pytest-tornasync" |         msg += "  - pytest-tornasync" | ||||||
|         warnings.warn(PytestWarning(msg.format(pyfuncitem.nodeid))) |         warnings.warn(PytestUnhandledCoroutineWarning(msg.format(pyfuncitem.nodeid))) | ||||||
|         skip(msg="coroutine function and no async plugin installed (see warnings)") |         skip(msg="coroutine function and no async plugin installed (see warnings)") | ||||||
|     funcargs = pyfuncitem.funcargs |     funcargs = pyfuncitem.funcargs | ||||||
|     testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} |     testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} | ||||||
|  | @ -221,7 +222,7 @@ def pytest_pycollect_makeitem(collector, name, obj): | ||||||
|         if not (isfunction(obj) or isfunction(get_real_func(obj))): |         if not (isfunction(obj) or isfunction(get_real_func(obj))): | ||||||
|             filename, lineno = getfslineno(obj) |             filename, lineno = getfslineno(obj) | ||||||
|             warnings.warn_explicit( |             warnings.warn_explicit( | ||||||
|                 message=PytestWarning( |                 message=PytestCollectionWarning( | ||||||
|                     "cannot collect %r because it is not a function." % name |                     "cannot collect %r because it is not a function." % name | ||||||
|                 ), |                 ), | ||||||
|                 category=None, |                 category=None, | ||||||
|  | @ -233,7 +234,7 @@ def pytest_pycollect_makeitem(collector, name, obj): | ||||||
|                 res = Function(name, parent=collector) |                 res = Function(name, parent=collector) | ||||||
|                 reason = deprecated.YIELD_TESTS.format(name=name) |                 reason = deprecated.YIELD_TESTS.format(name=name) | ||||||
|                 res.add_marker(MARK_GEN.xfail(run=False, reason=reason)) |                 res.add_marker(MARK_GEN.xfail(run=False, reason=reason)) | ||||||
|                 res.warn(PytestWarning(reason)) |                 res.warn(PytestCollectionWarning(reason)) | ||||||
|             else: |             else: | ||||||
|                 res = list(collector._genfunctions(name, obj)) |                 res = list(collector._genfunctions(name, obj)) | ||||||
|             outcome.force_result(res) |             outcome.force_result(res) | ||||||
|  | @ -721,7 +722,7 @@ class Class(PyCollector): | ||||||
|             return [] |             return [] | ||||||
|         if hasinit(self.obj): |         if hasinit(self.obj): | ||||||
|             self.warn( |             self.warn( | ||||||
|                 PytestWarning( |                 PytestCollectionWarning( | ||||||
|                     "cannot collect test class %r because it has a " |                     "cannot collect test class %r because it has a " | ||||||
|                     "__init__ constructor" % self.obj.__name__ |                     "__init__ constructor" % self.obj.__name__ | ||||||
|                 ) |                 ) | ||||||
|  | @ -729,7 +730,7 @@ class Class(PyCollector): | ||||||
|             return [] |             return [] | ||||||
|         elif hasnew(self.obj): |         elif hasnew(self.obj): | ||||||
|             self.warn( |             self.warn( | ||||||
|                 PytestWarning( |                 PytestCollectionWarning( | ||||||
|                     "cannot collect test class %r because it has a " |                     "cannot collect test class %r because it has a " | ||||||
|                     "__new__ constructor" % self.obj.__name__ |                     "__new__ constructor" % self.obj.__name__ | ||||||
|                 ) |                 ) | ||||||
|  |  | ||||||
|  | @ -9,12 +9,35 @@ class PytestWarning(UserWarning): | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PytestUnknownMarkWarning(PytestWarning): | class PytestAssertRewriteWarning(PytestWarning): | ||||||
|     """ |     """ | ||||||
|     Bases: :class:`PytestWarning`. |     Bases: :class:`PytestWarning`. | ||||||
| 
 | 
 | ||||||
|     Warning emitted on use of unknown markers. |     Warning emitted by the pytest assert rewrite module. | ||||||
|     See https://docs.pytest.org/en/latest/mark.html for details. |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PytestCacheWarning(PytestWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`PytestWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning emitted by the cache plugin in various situations. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PytestConfigWarning(PytestWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`PytestWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning emitted for configuration issues. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PytestCollectionWarning(PytestWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`PytestWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning emitted when pytest is not able to collect a file or symbol in a module. | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -26,14 +49,6 @@ class PytestDeprecationWarning(PytestWarning, DeprecationWarning): | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class RemovedInPytest4Warning(PytestDeprecationWarning): |  | ||||||
|     """ |  | ||||||
|     Bases: :class:`pytest.PytestDeprecationWarning`. |  | ||||||
| 
 |  | ||||||
|     Warning class for features scheduled to be removed in pytest 4.0. |  | ||||||
|     """ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class PytestExperimentalApiWarning(PytestWarning, FutureWarning): | class PytestExperimentalApiWarning(PytestWarning, FutureWarning): | ||||||
|     """ |     """ | ||||||
|     Bases: :class:`pytest.PytestWarning`, :class:`FutureWarning`. |     Bases: :class:`pytest.PytestWarning`, :class:`FutureWarning`. | ||||||
|  | @ -51,6 +66,33 @@ class PytestExperimentalApiWarning(PytestWarning, FutureWarning): | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class PytestUnhandledCoroutineWarning(PytestWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`PytestWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning emitted when pytest encounters a test function which is a coroutine, | ||||||
|  |     but it was not handled by any async-aware plugin. Coroutine test functions | ||||||
|  |     are not natively supported. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PytestUnknownMarkWarning(PytestWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`PytestWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning emitted on use of unknown markers. | ||||||
|  |     See https://docs.pytest.org/en/latest/mark.html for details. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class RemovedInPytest4Warning(PytestDeprecationWarning): | ||||||
|  |     """ | ||||||
|  |     Bases: :class:`pytest.PytestDeprecationWarning`. | ||||||
|  | 
 | ||||||
|  |     Warning class for features scheduled to be removed in pytest 4.0. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @attr.s | @attr.s | ||||||
| class UnformattedWarning(object): | class UnformattedWarning(object): | ||||||
|     """Used to hold warnings that need to format their message at runtime, as opposed to a direct message. |     """Used to hold warnings that need to format their message at runtime, as opposed to a direct message. | ||||||
|  |  | ||||||
|  | @ -35,8 +35,13 @@ from _pytest.python_api import approx | ||||||
| from _pytest.python_api import raises | from _pytest.python_api import raises | ||||||
| from _pytest.recwarn import deprecated_call | from _pytest.recwarn import deprecated_call | ||||||
| from _pytest.recwarn import warns | from _pytest.recwarn import warns | ||||||
|  | from _pytest.warning_types import PytestAssertRewriteWarning | ||||||
|  | from _pytest.warning_types import PytestCacheWarning | ||||||
|  | from _pytest.warning_types import PytestCollectionWarning | ||||||
|  | from _pytest.warning_types import PytestConfigWarning | ||||||
| from _pytest.warning_types import PytestDeprecationWarning | from _pytest.warning_types import PytestDeprecationWarning | ||||||
| from _pytest.warning_types import PytestExperimentalApiWarning | from _pytest.warning_types import PytestExperimentalApiWarning | ||||||
|  | from _pytest.warning_types import PytestUnhandledCoroutineWarning | ||||||
| from _pytest.warning_types import PytestUnknownMarkWarning | from _pytest.warning_types import PytestUnknownMarkWarning | ||||||
| from _pytest.warning_types import PytestWarning | from _pytest.warning_types import PytestWarning | ||||||
| from _pytest.warning_types import RemovedInPytest4Warning | from _pytest.warning_types import RemovedInPytest4Warning | ||||||
|  | @ -67,13 +72,18 @@ __all__ = [ | ||||||
|     "Module", |     "Module", | ||||||
|     "Package", |     "Package", | ||||||
|     "param", |     "param", | ||||||
|  |     "PytestAssertRewriteWarning", | ||||||
|  |     "PytestCacheWarning", | ||||||
|  |     "PytestCollectionWarning", | ||||||
|  |     "PytestConfigWarning", | ||||||
|     "PytestDeprecationWarning", |     "PytestDeprecationWarning", | ||||||
|     "PytestExperimentalApiWarning", |     "PytestExperimentalApiWarning", | ||||||
|  |     "PytestUnhandledCoroutineWarning", | ||||||
|  |     "PytestUnknownMarkWarning", | ||||||
|     "PytestWarning", |     "PytestWarning", | ||||||
|     "raises", |     "raises", | ||||||
|     "register_assert_rewrite", |     "register_assert_rewrite", | ||||||
|     "RemovedInPytest4Warning", |     "RemovedInPytest4Warning", | ||||||
|     "PytestUnknownMarkWarning", |  | ||||||
|     "Session", |     "Session", | ||||||
|     "set_trace", |     "set_trace", | ||||||
|     "skip", |     "skip", | ||||||
|  |  | ||||||
|  | @ -630,7 +630,7 @@ def test_removed_in_pytest4_warning_as_error(testdir, change_default): | ||||||
| class TestAssertionWarnings: | class TestAssertionWarnings: | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def assert_result_warns(result, msg): |     def assert_result_warns(result, msg): | ||||||
|         result.stdout.fnmatch_lines(["*PytestWarning: %s*" % msg]) |         result.stdout.fnmatch_lines(["*PytestAssertRewriteWarning: %s*" % msg]) | ||||||
| 
 | 
 | ||||||
|     def test_tuple_warning(self, testdir): |     def test_tuple_warning(self, testdir): | ||||||
|         testdir.makepyfile( |         testdir.makepyfile( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue