Expand source code
class Context(_Progress):
def __init__(self, name=None, timer=True, etc=True):
self.timer = timer
self.etc = etc
self._cache = {}
if name is not None:
self._cache["name"] = name
def __enter__(self, name=""):
self._cache = {
"name": self._cache.get("name", name),
"percent": 0,
"start": time.perf_counter(),
"last": None,
"dur": None,
"est": None,
"itr": 0,
"message": ""
}
return self
def __exit__(self, *args, **kwargs):
self.show(1.0)
print()
self._cache = {}
def update(self, percent, message=""):
self._cache["percent"] = percent
self._cache["message"] = message
def show(self, percent=None, message=None):
if percent is not None:
self._cache["percent"] = percent
if message is not None:
self._cache["message"] = message
self._cache["itr"] += 1
if self.timer is True:
cur = time.perf_counter()
if self._cache["last"] is not None:
if cur - self._cache["last"] < 0.2:
return
self._cache["last"] = cur
if self.etc is True:
self._cache["dur"] = self._cache["last"] - self._cache["start"]
perc_per_itr = self._cache["percent"] / self._cache["itr"]
time_per_itr = self._cache["dur"] / self._cache["itr"]
est_itr_tot = 1 / perc_per_itr
self._cache["est"] = est_itr_tot * time_per_itr
print(type(self)._fmt(self._cache["percent"], self._cache["message"], self._cache["dur"], self._cache["est"]), end="\r")