Package TEES :: Package Utils :: Module ProgressCounter
[hide private]

Source Code for Module TEES.Utils.ProgressCounter

 1  import sys, time 
 2   
3 -class ProgressCounter:
4 - def __init__(self, total=None, id="UNKNOWN", step=None):
5 self.total = total 6 if self.total != None: 7 self.total = float(self.total) 8 self.current = 0 9 self.progress = 0.0 10 self.prevProgress = -99.0 11 self.id = id 12 self.prevUpdateString = "None" 13 self.step = step 14 if total != None and step == None: 15 self.step = 5.0 # If the total is known, update at 5 percentage point intervals 16 self.showMilliseconds = False 17 18 self.prevPrintTime = 0 19 self.timeStep = 30 20 self.startTime = time.time() 21 self.prevUpdateStringLen = 0
22
23 - def endUpdate(self):
24 if self.total == None: 25 print >> sys.stderr, ""
26
27 - def markFinished(self):
28 """ 29 Mark as finished to suppress the error message, regardless of actual status 30 """ 31 self.progress = 100.0
32
33 - def __del__(self):
34 # If this counter didn't finish, show the info about the last update 35 if self.total != None and not self.progress >= 100.0: 36 import sys 37 print >> sys.stderr, "Counter \"" + self.id + "\" did not finish" 38 self.showLastUpdate()
39
40 - def update(self, amount=1, string="Processing: "):
41 self.current += amount 42 if self.total != None: 43 self.progress = self.current / self.total * 100.0 44 self.prevUpdateString = string + "%.2f" % self.progress + " %" 45 else: 46 self.progress += amount 47 self.prevUpdateString = string + str(self.current) 48 49 currentTime = time.time() 50 timeStepExceeded = currentTime - self.prevPrintTime > self.timeStep 51 stepExceeded = (self.step != None) and (self.progress - self.prevProgress >= self.step) 52 53 self.prevUpdateString += " (" + self.getElapsedTimeString(currentTime) + ")" 54 55 if self.total != None: 56 if self.progress >= 100.0 or stepExceeded or timeStepExceeded: 57 print >> sys.stderr, "\r" + self.prevUpdateString + max(0, self.prevUpdateStringLen-len(self.prevUpdateString)) * " ", 58 self.prevProgress = self.progress 59 self.prevPrintTime = currentTime 60 self.prevUpdateStringLen = len(self.prevUpdateString) 61 if self.progress >= 100.0: 62 print >> sys.stderr 63 else: 64 if stepExceeded or timeStepExceeded: 65 self.progress = 0 66 print >> sys.stderr, "\r" + self.prevUpdateString + max(0, self.prevUpdateStringLen-len(self.prevUpdateString)) * " ", 67 self.prevProgress = self.progress 68 self.prevPrintTime = currentTime 69 self.prevUpdateStringLen = len(self.prevUpdateString)
70
71 - def getElapsedTimeString(self, currentTime):
72 elapsedTime = currentTime - self.startTime 73 hours = elapsedTime / 3600.0 74 elapsedTime = elapsedTime % 3600.0 75 minutes = elapsedTime / 60.0 76 seconds = elapsedTime % 60.0 77 if self.showMilliseconds: 78 seconds = "%.3f" % seconds 79 else: 80 seconds = str(int(seconds)) 81 return str(int(hours)) + ":" + str(int(minutes)) + ":" + seconds
82
83 - def showLastUpdate(self):
84 if self.total != None: 85 print >> sys.stderr, "Last count: " + str(self.current) + "/" + str(int(self.total)) 86 else: 87 print >> sys.stderr, "Last count: " + str(self.current) 88 print >> sys.stderr, "Last update: " + self.prevUpdateString
89