mirror of
https://github.com/verigak/progress.git
synced 2025-12-09 03:43:24 +00:00
Refactor
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
|
|
||||||
|
from collections import deque
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from math import ceil
|
from math import ceil
|
||||||
from sys import stderr
|
from sys import stderr
|
||||||
@@ -25,12 +26,13 @@ __version__ = '1.1'
|
|||||||
|
|
||||||
class Infinite(object):
|
class Infinite(object):
|
||||||
file = stderr
|
file = stderr
|
||||||
|
sma_window = 10
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.avg = 0
|
|
||||||
self.index = 0
|
self.index = 0
|
||||||
self.start_ts = time()
|
self.start_ts = time()
|
||||||
self._ts = self.start_ts
|
self._ts = self.start_ts
|
||||||
|
self._dt = deque(maxlen=self.sma_window)
|
||||||
for key, val in kwargs.items():
|
for key, val in kwargs.items():
|
||||||
setattr(self, key, val)
|
setattr(self, key, val)
|
||||||
|
|
||||||
@@ -39,6 +41,10 @@ class Infinite(object):
|
|||||||
return None
|
return None
|
||||||
return getattr(self, key, None)
|
return getattr(self, key, None)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def avg(self):
|
||||||
|
return sum(self._dt) / len(self._dt) if self._dt else 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def elapsed(self):
|
def elapsed(self):
|
||||||
return int(time() - self.start_ts)
|
return int(time() - self.start_ts)
|
||||||
@@ -47,13 +53,6 @@ class Infinite(object):
|
|||||||
def elapsed_td(self):
|
def elapsed_td(self):
|
||||||
return timedelta(seconds=self.elapsed)
|
return timedelta(seconds=self.elapsed)
|
||||||
|
|
||||||
def update_stats(self):
|
|
||||||
# Calculate moving average
|
|
||||||
now = time()
|
|
||||||
dt = now - self._ts
|
|
||||||
self.avg = (dt + self.index * self.avg) / (self.index + 1) if self.avg else dt
|
|
||||||
self._ts = now
|
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -64,8 +63,13 @@ class Infinite(object):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def next(self, n=1):
|
def next(self, n=1):
|
||||||
|
if n > 0:
|
||||||
|
now = time()
|
||||||
|
dt = (now - self._ts) / n
|
||||||
|
self._dt.append(dt)
|
||||||
|
self._ts = now
|
||||||
|
|
||||||
self.index = self.index + n
|
self.index = self.index + n
|
||||||
self.update_stats()
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def iter(self, it):
|
def iter(self, it):
|
||||||
@@ -76,12 +80,9 @@ class Infinite(object):
|
|||||||
|
|
||||||
|
|
||||||
class Progress(Infinite):
|
class Progress(Infinite):
|
||||||
backtrack = False
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(Progress, self).__init__(*args, **kwargs)
|
super(Progress, self).__init__(*args, **kwargs)
|
||||||
self.max = kwargs.get('max', 100)
|
self.max = kwargs.get('max', 100)
|
||||||
self.remaining = self.max
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def eta(self):
|
def eta(self):
|
||||||
@@ -91,40 +92,24 @@ class Progress(Infinite):
|
|||||||
def eta_td(self):
|
def eta_td(self):
|
||||||
return timedelta(seconds=self.eta)
|
return timedelta(seconds=self.eta)
|
||||||
|
|
||||||
def update_stats(self):
|
@property
|
||||||
self.progress = min(1, self.index / self.max)
|
def percent(self):
|
||||||
self.percent = self.progress * 100
|
return self.progress * 100
|
||||||
self.remaining = self.max - self.index
|
|
||||||
|
|
||||||
# Calculate moving average
|
@property
|
||||||
now = time()
|
def progress(self):
|
||||||
if self.delta:
|
return min(1, self.index / self.max)
|
||||||
dt = (now - self._ts) / self.delta
|
|
||||||
self.avg = (dt + self.index * self.avg) / (self.index + 1) if self.avg else dt
|
@property
|
||||||
self._ts = now
|
def remaining(self):
|
||||||
|
return max(self.max - self.index, 0)
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.delta = 0
|
|
||||||
self.update_stats()
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
def next(self, n=1):
|
|
||||||
prev = self.index
|
|
||||||
self.index = min(self.index + n, self.max)
|
|
||||||
self.delta = self.index - prev
|
|
||||||
self.update_stats()
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def goto(self, index):
|
def goto(self, index):
|
||||||
index = min(index, self.max)
|
incr = index - self.index
|
||||||
delta = index - self.index
|
self.next(incr)
|
||||||
if delta <= 0 and not self.backtrack:
|
|
||||||
return
|
|
||||||
|
|
||||||
self.index = index
|
|
||||||
self.delta = delta
|
|
||||||
self.update_stats()
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
def iter(self, it):
|
def iter(self, it):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ for singleton in (Counter, Countdown, Stack, Pie):
|
|||||||
sleep(0.03)
|
sleep(0.03)
|
||||||
print()
|
print()
|
||||||
|
|
||||||
bar = IncrementalBar('Random', backtrack=True, suffix='')
|
bar = IncrementalBar('Random', suffix='%(index)d')
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
bar.goto(randint(0, 100))
|
bar.goto(randint(0, 100))
|
||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|||||||
Reference in New Issue
Block a user