Allow debug.log_time to be used as decorator.

This commit is contained in:
Florian Bruhin 2015-09-16 22:50:19 +02:00
parent 545d82a04d
commit 0745de647b
2 changed files with 50 additions and 14 deletions

View File

@ -225,23 +225,44 @@ def format_call(func, args=None, kwargs=None, full=True):
return '{}({})'.format(name, format_args(args, kwargs))
@contextlib.contextmanager
def log_time(logger, action='operation'):
"""Log the time the operation in the with-block takes.
class log_time: # pylint: disable=invalid-name
Args:
logger: The logging.Logger to use for logging, or a logger name.
action: A description of what's being done.
"""Log the time an operation takes.
Usable as context manager or as decorator.
"""
if isinstance(logger, str):
logger = logging.getLogger(logger)
started = datetime.datetime.now()
try:
yield
finally:
def __init__(self, logger, action='operation'):
"""Constructor.
Args:
logger: The logging.Logger to use for logging, or a logger name.
action: A description of what's being done.
"""
if isinstance(logger, str):
self._logger = logging.getLogger(logger)
else:
self._logger = logger
self._started = None
self._action = action
def __enter__(self):
self._started = datetime.datetime.now()
def __exit__(self, _exc_type, _exc_val, _exc_tb):
assert self._started is not None
finished = datetime.datetime.now()
delta = (finished - started).total_seconds()
logger.debug("{} took {} seconds.".format(action.capitalize(), delta))
delta = (finished - self._started).total_seconds()
self._logger.debug(
"{} took {} seconds.".format(self._action.capitalize(), delta))
def __call__(self, func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
with self:
func(*args, **kwargs)
return wrapped
def _get_widgets():

View File

@ -110,6 +110,21 @@ class TestLogTime:
assert len(caplog.records()) == 1
def test_decorator(self, caplog):
logger_name = 'qt-tests'
@debug.log_time(logger_name, action='foo')
def func(arg, *, kwarg):
assert arg == 1
assert kwarg == 2
with caplog.atLevel(logging.DEBUG, logger_name):
func(1, kwarg=2)
records = caplog.records()
assert len(records) == 1
assert records[0].msg.startswith('Foo took')
class TestQEnumKey: