Source code for doxysphinx.utils.contexts
# =====================================================================================
# C O P Y R I G H T
# -------------------------------------------------------------------------------------
# Copyright (c) 2023 by Robert Bosch GmbH. All rights reserved.
#
# Author(s):
# - Markus Braun, :em engineering methods AG (contracted by Robert Bosch GmbH)
# =====================================================================================
"""The contexts module contains several python context manager related functions."""
from datetime import timedelta
from timeit import default_timer as timer
[docs]class TimedContext(object):
"""
A context manager to measure elapsed time.
Use it to measure the time taken to process the inner code.
Usage:
.. code-block: python
with TimedContext() as tc:
# do your thing here
_logger.info(f"elapsed: {tc.elapsed_humanized()}.")
"""
def __init__(self):
"""Create an instance of the TimedContext."""
self._start: float = 0
self._elapsed = timedelta()
[docs] def elapsed(self) -> timedelta:
"""
Get the elapsed time.
:return: The duration.
"""
return self._elapsed
[docs] def elapsed_humanized(self) -> str:
"""
Get the elapsed time as a "humanized" format.
:return: A humanized string of the elapsed time - Something like "3 days 5 hours 17 minutes".
"""
data = {}
data["days"], remaining = divmod(self._elapsed.total_seconds(), 86_400)
data["hours"], remaining = divmod(remaining, 3_600)
data["minutes"], data["seconds"] = divmod(remaining, 60)
time_segments = ((name, round(value)) for name, value in data.items())
time_parts = [f"{value} {name[:-1] if value == 1 else name}" for name, value in time_segments if value > 0]
if time_parts:
return " ".join(time_parts)
else:
return "below 1 second"
def __enter__(self):
"""Context manager enter method."""
self._start = timer()
return self
def __exit__(self, exc_type, exc_value, traceback):
"""Context manager exit method."""
self._elapsed = timedelta(seconds=timer() - self._start)
pass