Add a start method

Use it to show progress without advancing
This commit is contained in:
Giorgos Verigakis
2012-07-18 10:50:56 +08:00
parent 3a3dea7069
commit a3fb1b4fcc

View File

@@ -35,16 +35,16 @@ class Infinite(object):
self.ctx[key] = val self.ctx[key] = val
self.index = 0 self.index = 0
self.avg = None self.avg = 0
self._ts = time() self._ts = time()
def update_stats(self): def update_stats(self):
# Calculate moving average # Calculate moving average
now = time() now = time()
dt = now - self._ts dt = now - self._ts
self._ts = now
w = self.avg_window w = self.avg_window
self.avg = dt if self.avg is None else (dt + w * self.avg) / (w + 1) self.avg = dt if self.avg else (dt + w * self.avg) / (w + 1)
self._ts = now
kv = [(key, val) for key, val in self.__dict__.items() kv = [(key, val) for key, val in self.__dict__.items()
if not key.startswith('_')] if not key.startswith('_')]
@@ -53,6 +53,9 @@ class Infinite(object):
def update(self): def update(self):
pass pass
def start(self):
pass
def finish(self): def finish(self):
pass pass
@@ -74,30 +77,35 @@ class Progress(Infinite):
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.eta = None self.eta = 0
def update_stats(self): def update_stats(self):
# Calculate moving average
now = time()
dt = (now - self._ts) / self.delta
self._ts = now
w = self.avg_window
self.avg = dt if self.avg is None else (dt + w * self.avg) / (w + 1)
self.progress = min(1, self.index / self.max) self.progress = min(1, self.index / self.max)
self.percent = self.progress * 100 self.percent = self.progress * 100
self.remaining = self.max - self.index self.remaining = self.max - self.index
# Calculate moving average
now = time()
if self.delta:
dt = (now - self._ts) / self.delta
w = self.avg_window
self.avg = dt if self.avg else (dt + w * self.avg) / (w + 1)
self.eta = int(ceil(self.avg * self.remaining)) self.eta = int(ceil(self.avg * self.remaining))
self._ts = now
kv = [(key, val) for key, val in self.__dict__.items() kv = [(key, val) for key, val in self.__dict__.items()
if not key.startswith('_')] if not key.startswith('_')]
self.ctx.update(kv) self.ctx.update(kv)
def start(self):
self.delta = 0
self.update_stats()
self.update()
def next(self): def next(self):
prev = self.index prev = self.index
self.index = min(self.index + 1, self.max) self.index = min(self.index + 1, self.max)
self.delta = self.index - prev self.delta = self.index - prev
if self.delta > 0:
self.update_stats() self.update_stats()
self.update() self.update()
@@ -109,7 +117,6 @@ class Progress(Infinite):
self.index = index self.index = index
self.delta = delta self.delta = delta
if delta > 0:
self.update_stats() self.update_stats()
self.update() self.update()