Source code for alphatwirl.progressbar.ProgressPrint

# Tai Sakuma <tai.sakuma@gmail.com>
import time
import sys, collections

##__________________________________________________________________||
[docs]class ProgressPrint(object):
[docs] def __init__(self): self.reports = collections.OrderedDict() self.lines = [ ] self.interval = 60.0 # [second] self._readTime() self.last = [ ]
def __repr__(self): return '{}()'.format( self.__class__.__name__ ) def nreports(self): return len(self.reports) def present(self, report): self.reports[report.taskid] = report if not self._need_to_update(report): return self._create_lines() self._print_lines() self._readTime() def _create_lines(self): self.lines = [ ] for taskid, report in self.reports.items(): line = self.createLine(report) if report.done >= report.total: del self.reports[report.taskid] self.last.append(line) else: self.lines.append(line) def _print_lines(self): sys.stdout.write("\n") sys.stdout.write(time.asctime(time.localtime(time.time()))) sys.stdout.write("\n") if len(self.last) > 0: sys.stdout.write("\n".join(self.last) + "\n") sys.stdout.write("\n".join(self.lines) + "\n") sys.stdout.flush() def createLine(self, report): percent = float(report.done)/report.total if report.total > 0 else 1 bar = (':' * int(percent * 40)).ljust(40, " ") percent = round(percent * 100, 2) return " {1:8d} / {2:8d} ({0:6.2f}%) {3} ".format(percent, report.done, report.total, report.name) def _need_to_update(self, report): if self._time() - self.lastTime > self.interval: return True if report.done == report.total: return True if report.done == 0: return True return False def _time(self): return time.time() def _readTime(self): self.lastTime = self._time()
##__________________________________________________________________||