Merge "Improve deprecation warnings"

This commit is contained in:
Jenkins 2017-07-21 18:31:47 +00:00 committed by Gerrit Code Review
commit 8b967c8a8c
2 changed files with 39 additions and 26 deletions

View File

@ -14,6 +14,7 @@
# under the License.
import functools
import traceback
from oslo_config import cfg
from oslo_log import handlers
@ -223,17 +224,23 @@ def log_deprecated(message, rally_version, log_function=None, once=False):
:param once: Show only once (default is each)
"""
log_function = log_function or LOG.warning
msg = ("`%(func)s()' is deprecated in v%(version)s: %(msg)s."
" Used at %(caller)s")
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
if (not once) or (not getattr(f, "_warned_dep_method", False)):
log_function("'%(func)s' is deprecated in Rally v%(version)s: "
"%(msg)s" % {"msg": message,
"version": rally_version,
"func": f.__name__})
setattr(f, "_warned_dep_method", once)
if not (once and getattr(f, "_warned_dep_method", False)):
log_function(msg % {
"msg": message,
"version": rally_version,
"func": f.__name__,
"caller": str(traceback.extract_stack()[-2])
})
f._warned_dep_method = True
return f(*args, **kwargs)
return wrapper
return decorator
@ -249,22 +256,28 @@ def log_deprecated_args(message, rally_version, deprecated_args,
:param once: Show only once (default is each)
"""
log_function = log_function or LOG.warning
msg = ("Argument(s): %(args)s of `%(func)s()' are deprecated in "
"v%(version)s: %(msg)s. Used at %(caller)s")
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
if (not once) or (not getattr(f, "_warned_dep_args", False)):
if not (once and getattr(f, "_warned_dep_args", False)):
deprecated = ", ".join([
"`%s'" % x for x in deprecated_args if x in kwargs])
if deprecated:
log_function(
"%(msg)s (args %(args)s deprecated in Rally "
"v%(version)s)" %
{"msg": message, "version": rally_version,
"args": deprecated})
setattr(f, "_warned_dep_args", once)
result = f(*args, **kwargs)
return result
log_function(msg % {
"msg": message,
"version": rally_version,
"args": deprecated,
"func": f.__name__,
"caller": str(traceback.extract_stack()[-2])
})
f._warned_dep_args = True
return f(*args, **kwargs)
return wrapper
return decorator

View File

@ -48,40 +48,40 @@ class LogTestCase(test.TestCase):
def test_log_deprecated(self):
mock_log = mock.MagicMock()
@logging.log_deprecated("some alternative", "0.0.1", mock_log)
@logging.log_deprecated("depr42", "1.1.1", mock_log)
def some_method(x, y):
return x + y
self.assertEqual(some_method(2, 2), 4)
mock_log.assert_called_once_with("'some_method' is deprecated in "
"Rally v0.0.1: some alternative")
self.assertIn("some_method()", mock_log.call_args[0][0])
self.assertIn("depr42", mock_log.call_args[0][0])
self.assertIn("1.1.1", mock_log.call_args[0][0])
def test_log_deprecated_args(self):
mock_log = mock.MagicMock()
@logging.log_deprecated_args("Deprecated test", "0.0.1", ("z",),
@logging.log_deprecated_args("ABC42", "0.0.1", ("z",),
mock_log, once=True)
def some_method(x, y, z):
return x + y + z
self.assertEqual(some_method(2, 2, z=3), 7)
mock_log.assert_called_once_with(
"Deprecated test (args `z' deprecated in Rally v0.0.1)")
self.assertIn("ABC42", mock_log.call_args[0][0])
self.assertIn("`z' of `some_method()'", mock_log.call_args[0][0])
self.assertIn("0.0.1", mock_log.call_args[0][0])
mock_log.reset_mock()
self.assertEqual(some_method(2, 2, z=3), 7)
self.assertFalse(mock_log.called)
@logging.log_deprecated_args("Deprecated test", "0.0.1", ("z",),
@logging.log_deprecated_args("CBA42", "0.0.1", ("z",),
mock_log, once=False)
def some_method(x, y, z):
return x + y + z
self.assertEqual(some_method(2, 2, z=3), 7)
mock_log.assert_called_once_with(
"Deprecated test (args `z' deprecated in Rally v0.0.1)")
self.assertIn("CBA42", mock_log.call_args[0][0])
mock_log.reset_mock()
self.assertEqual(some_method(2, 2, z=3), 7)
mock_log.assert_called_once_with(
"Deprecated test (args `z' deprecated in Rally v0.0.1)")
self.assertIn("CBA42", mock_log.call_args[0][0])