Introduce UnformattedWarning to keep warning types and messages in _pytest.deprecated

This commit is contained in:
Bruno Oliveira 2018-09-14 14:49:05 -03:00
parent 32ee0b9c88
commit da6830f19b
6 changed files with 56 additions and 37 deletions

View File

@ -16,3 +16,7 @@ The following accesses have been documented as deprecated for years, but are now
This issue should affect only advanced plugins who create new collection types, so if you see this warning This issue should affect only advanced plugins who create new collection types, so if you see this warning
message please contact the authors so they can change the code. message please contact the authors so they can change the code.
* The warning that produces the message below has changed to ``RemovedInPytest4Warning``::
getfuncargvalue is deprecated, use getfixturevalue

View File

@ -103,21 +103,18 @@ def determine_setup(inifile, args, rootdir_cmd_arg=None, config=None):
if inifile: if inifile:
iniconfig = py.iniconfig.IniConfig(inifile) iniconfig = py.iniconfig.IniConfig(inifile)
is_cfg_file = str(inifile).endswith(".cfg") is_cfg_file = str(inifile).endswith(".cfg")
# TODO: [pytest] section in *.cfg files is depricated. Need refactoring.
sections = ["tool:pytest", "pytest"] if is_cfg_file else ["pytest"] sections = ["tool:pytest", "pytest"] if is_cfg_file else ["pytest"]
for section in sections: for section in sections:
try: try:
inicfg = iniconfig[section] inicfg = iniconfig[section]
if is_cfg_file and section == "pytest" and config is not None: if is_cfg_file and section == "pytest" and config is not None:
from _pytest.deprecated import CFG_PYTEST_SECTION from _pytest.deprecated import CFG_PYTEST_SECTION
from _pytest.warning_types import RemovedInPytest4Warning
from _pytest.warnings import _issue_config_warning from _pytest.warnings import _issue_config_warning
# TODO: [pytest] section in *.cfg files is deprecated. Need refactoring once
# the deprecation expires.
_issue_config_warning( _issue_config_warning(
RemovedInPytest4Warning( CFG_PYTEST_SECTION.format(filename=str(inifile)), config
CFG_PYTEST_SECTION.format(filename=str(inifile))
),
config,
) )
break break
except KeyError: except KeyError:

View File

@ -4,11 +4,32 @@ that is planned to be removed in the next pytest release.
Keeping it in a central location makes it easy to track what is deprecated and should Keeping it in a central location makes it easy to track what is deprecated and should
be removed when the time comes. be removed when the time comes.
All constants defined in this module should be either PytestWarning instances or UnformattedWarning
in case of warnings which need to format their messages.
""" """
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
import attr
from _pytest.warning_types import RemovedInPytest4Warning from _pytest.warning_types import RemovedInPytest4Warning
@attr.s
class UnformattedWarning(object):
"""Used to hold warnings that need to format their message at runtime, as opposed to a direct message.
Using this class avoids to keep all the warning types and messages in this module, avoiding misuse.
"""
category = attr.ib()
template = attr.ib()
def format(self, **kwargs):
"""Returns an instance of the warning category, formatted with given kwargs"""
return self.category(self.template.format(**kwargs))
MAIN_STR_ARGS = RemovedInPytest4Warning( MAIN_STR_ARGS = RemovedInPytest4Warning(
"passing a string to pytest.main() is deprecated, " "passing a string to pytest.main() is deprecated, "
"pass a list of arguments instead." "pass a list of arguments instead."
@ -23,36 +44,43 @@ CACHED_SETUP = RemovedInPytest4Warning(
"Use standard fixture functions instead." "Use standard fixture functions instead."
) )
COMPAT_PROPERTY = ( COMPAT_PROPERTY = UnformattedWarning(
"usage of {owner}.{name} is deprecated, please use pytest.{name} instead" RemovedInPytest4Warning,
"usage of {owner}.{name} is deprecated, please use pytest.{name} instead",
) )
CUSTOM_CLASS = ( CUSTOM_CLASS = UnformattedWarning(
RemovedInPytest4Warning,
'use of special named "{name}" objects in collectors of type "{type_name}" to ' 'use of special named "{name}" objects in collectors of type "{type_name}" to '
"customize the created nodes is deprecated. " "customize the created nodes is deprecated. "
"Use pytest_pycollect_makeitem(...) to create custom " "Use pytest_pycollect_makeitem(...) to create custom "
"collection nodes instead." "collection nodes instead.",
) )
FUNCARG_PREFIX = ( FUNCARG_PREFIX = UnformattedWarning(
RemovedInPytest4Warning,
'{name}: declaring fixtures using "pytest_funcarg__" prefix is deprecated ' '{name}: declaring fixtures using "pytest_funcarg__" prefix is deprecated '
"and scheduled to be removed in pytest 4.0. " "and scheduled to be removed in pytest 4.0. "
"Please remove the prefix and use the @pytest.fixture decorator instead." "Please remove the prefix and use the @pytest.fixture decorator instead.",
) )
FIXTURE_FUNCTION_CALL = ( FIXTURE_FUNCTION_CALL = UnformattedWarning(
RemovedInPytest4Warning,
'Fixture "{name}" called directly. Fixtures are not meant to be called directly, ' 'Fixture "{name}" called directly. Fixtures are not meant to be called directly, '
"are created automatically when test functions request them as parameters. " "are created automatically when test functions request them as parameters. "
"See https://docs.pytest.org/en/latest/fixture.html for more information." "See https://docs.pytest.org/en/latest/fixture.html for more information.",
) )
CFG_PYTEST_SECTION = ( CFG_PYTEST_SECTION = UnformattedWarning(
"[pytest] section in {filename} files is deprecated, use [tool:pytest] instead." RemovedInPytest4Warning,
"[pytest] section in {filename} files is deprecated, use [tool:pytest] instead.",
) )
GETFUNCARGVALUE = "getfuncargvalue is deprecated, use getfixturevalue" GETFUNCARGVALUE = RemovedInPytest4Warning(
"getfuncargvalue is deprecated, use getfixturevalue"
)
RESULT_LOG = ( RESULT_LOG = RemovedInPytest4Warning(
"--result-log is deprecated and scheduled for removal in pytest 4.0.\n" "--result-log is deprecated and scheduled for removal in pytest 4.0.\n"
"See https://docs.pytest.org/en/latest/usage.html#creating-resultlog-format-files for more information." "See https://docs.pytest.org/en/latest/usage.html#creating-resultlog-format-files for more information."
) )

View File

@ -32,7 +32,7 @@ from _pytest.compat import (
get_real_method, get_real_method,
_PytestWrapper, _PytestWrapper,
) )
from _pytest.deprecated import FIXTURE_FUNCTION_CALL, RemovedInPytest4Warning from _pytest.deprecated import FIXTURE_FUNCTION_CALL
from _pytest.outcomes import fail, TEST_OUTCOME from _pytest.outcomes import fail, TEST_OUTCOME
FIXTURE_MSG = 'fixtures cannot have "pytest_funcarg__" prefix and be decorated with @pytest.fixture:\n{}' FIXTURE_MSG = 'fixtures cannot have "pytest_funcarg__" prefix and be decorated with @pytest.fixture:\n{}'
@ -515,7 +515,7 @@ class FixtureRequest(FuncargnamesCompatAttr):
""" Deprecated, use getfixturevalue. """ """ Deprecated, use getfixturevalue. """
from _pytest import deprecated from _pytest import deprecated
warnings.warn(deprecated.GETFUNCARGVALUE, DeprecationWarning, stacklevel=2) warnings.warn(deprecated.GETFUNCARGVALUE, stacklevel=2)
return self.getfixturevalue(argname) return self.getfixturevalue(argname)
def _get_active_fixturedef(self, argname): def _get_active_fixturedef(self, argname):
@ -959,8 +959,9 @@ def wrap_function_to_warning_if_called_directly(function, fixture_marker):
used as an argument in a test function. used as an argument in a test function.
""" """
is_yield_function = is_generator(function) is_yield_function = is_generator(function)
msg = FIXTURE_FUNCTION_CALL.format(name=fixture_marker.name or function.__name__) warning = FIXTURE_FUNCTION_CALL.format(
warning = RemovedInPytest4Warning(msg) name=fixture_marker.name or function.__name__
)
if is_yield_function: if is_yield_function:
@ -1287,9 +1288,7 @@ class FixtureManager(object):
filename, lineno = getfslineno(obj) filename, lineno = getfslineno(obj)
warnings.warn_explicit( warnings.warn_explicit(
RemovedInPytest4Warning( deprecated.FUNCARG_PREFIX.format(name=name),
deprecated.FUNCARG_PREFIX.format(name=name)
),
category=None, category=None,
filename=str(filename), filename=str(filename),
lineno=lineno + 1, lineno=lineno + 1,

View File

@ -11,7 +11,6 @@ import _pytest._code
from _pytest.compat import getfslineno from _pytest.compat import getfslineno
from _pytest.mark.structures import NodeKeywords, MarkInfo from _pytest.mark.structures import NodeKeywords, MarkInfo
from _pytest.warning_types import RemovedInPytest4Warning
SEP = "/" SEP = "/"
@ -65,10 +64,7 @@ class _CompatProperty(object):
from _pytest.deprecated import COMPAT_PROPERTY from _pytest.deprecated import COMPAT_PROPERTY
warnings.warn( warnings.warn(
RemovedInPytest4Warning( COMPAT_PROPERTY.format(name=self.name, owner=owner.__name__), stacklevel=2
COMPAT_PROPERTY.format(name=self.name, owner=owner.__name__)
),
stacklevel=2,
) )
return getattr(__import__("pytest"), self.name) return getattr(__import__("pytest"), self.name)
@ -133,11 +129,7 @@ class Node(object):
from _pytest.deprecated import CUSTOM_CLASS from _pytest.deprecated import CUSTOM_CLASS
cls = getattr(self, name) cls = getattr(self, name)
self.warn( self.warn(CUSTOM_CLASS.format(name=name, type_name=type(self).__name__))
RemovedInPytest4Warning(
CUSTOM_CLASS.format(name=name, type_name=type(self).__name__)
)
)
return cls return cls
def __repr__(self): def __repr__(self):

View File

@ -31,10 +31,9 @@ def pytest_configure(config):
config.pluginmanager.register(config._resultlog) config.pluginmanager.register(config._resultlog)
from _pytest.deprecated import RESULT_LOG from _pytest.deprecated import RESULT_LOG
from _pytest.warning_types import RemovedInPytest4Warning
from _pytest.warnings import _issue_config_warning from _pytest.warnings import _issue_config_warning
_issue_config_warning(RemovedInPytest4Warning(RESULT_LOG), config) _issue_config_warning(RESULT_LOG, config)
def pytest_unconfigure(config): def pytest_unconfigure(config):