|  | #!/usr/bin/python | 
|  |  | 
|  | import sys | 
|  | import time | 
|  |  | 
|  | class ProgressBar(object): | 
|  | """ProgressBar class holds the options of the progress bar. | 
|  | The options are: | 
|  | start   State from which start the progress. For example, if start is | 
|  | 5 and the end is 10, the progress of this state is 50% | 
|  | end     State in which the progress has terminated. | 
|  | width   -- | 
|  | fill    String to use for "filled" used to represent the progress | 
|  | blank   String to use for "filled" used to represent remaining space. | 
|  | format  Format | 
|  | incremental | 
|  | """ | 
|  | light_block = unichr(0x2591).encode("utf-8") | 
|  | solid_block = unichr(0x2588).encode("utf-8") | 
|  | solid_right_arrow = unichr(0x25BA).encode("utf-8") | 
|  |  | 
|  | def __init__(self, | 
|  | start=0, | 
|  | end=10, | 
|  | width=12, | 
|  | fill=unichr(0x25C9).encode("utf-8"), | 
|  | blank=unichr(0x25CC).encode("utf-8"), | 
|  | marker=unichr(0x25CE).encode("utf-8"), | 
|  | format='[%(fill)s%(marker)s%(blank)s] %(progress)s%%', | 
|  | incremental=True): | 
|  | super(ProgressBar, self).__init__() | 
|  |  | 
|  | self.start = start | 
|  | self.end = end | 
|  | self.width = width | 
|  | self.fill = fill | 
|  | self.blank = blank | 
|  | self.marker = marker | 
|  | self.format = format | 
|  | self.incremental = incremental | 
|  | self.step = 100 / float(width) #fix | 
|  | self.reset() | 
|  |  | 
|  | def __add__(self, increment): | 
|  | increment = self._get_progress(increment) | 
|  | if 100 > self.progress + increment: | 
|  | self.progress += increment | 
|  | else: | 
|  | self.progress = 100 | 
|  | return self | 
|  |  | 
|  | def complete(self): | 
|  | self.progress = 100 | 
|  | return self | 
|  |  | 
|  | def __str__(self): | 
|  | progressed = int(self.progress / self.step) #fix | 
|  | fill = progressed * self.fill | 
|  | blank = (self.width - progressed) * self.blank | 
|  | return self.format % {'fill': fill, 'blank': blank, 'marker': self.marker, 'progress': int(self.progress)} | 
|  |  | 
|  | __repr__ = __str__ | 
|  |  | 
|  | def _get_progress(self, increment): | 
|  | return float(increment * 100) / self.end | 
|  |  | 
|  | def reset(self): | 
|  | """Resets the current progress to the start point""" | 
|  | self.progress = self._get_progress(self.start) | 
|  | return self | 
|  |  | 
|  |  | 
|  | class AnimatedProgressBar(ProgressBar): | 
|  | """Extends ProgressBar to allow you to use it straighforward on a script. | 
|  | Accepts an extra keyword argument named `stdout` (by default use sys.stdout) | 
|  | and may be any file-object to which send the progress status. | 
|  | """ | 
|  | def __init__(self, | 
|  | start=0, | 
|  | end=10, | 
|  | width=12, | 
|  | fill=unichr(0x25C9).encode("utf-8"), | 
|  | blank=unichr(0x25CC).encode("utf-8"), | 
|  | marker=unichr(0x25CE).encode("utf-8"), | 
|  | format='[%(fill)s%(marker)s%(blank)s] %(progress)s%%', | 
|  | incremental=True, | 
|  | stdout=sys.stdout): | 
|  | super(AnimatedProgressBar, self).__init__(start,end,width,fill,blank,marker,format,incremental) | 
|  | self.stdout = stdout | 
|  |  | 
|  | def show_progress(self): | 
|  | if hasattr(self.stdout, 'isatty') and self.stdout.isatty(): | 
|  | self.stdout.write('\r') | 
|  | else: | 
|  | self.stdout.write('\n') | 
|  | self.stdout.write(str(self)) | 
|  | self.stdout.flush() | 
|  |  | 
|  | class ProgressWithEvents(AnimatedProgressBar): | 
|  | """Extends AnimatedProgressBar to allow you to track a set of events that | 
|  | cause the progress to move. For instance, in a deletion progress bar, you | 
|  | can track files that were nuked and files that the user doesn't have access to | 
|  | """ | 
|  | def __init__(self, | 
|  | start=0, | 
|  | end=10, | 
|  | width=12, | 
|  | fill=unichr(0x25C9).encode("utf-8"), | 
|  | blank=unichr(0x25CC).encode("utf-8"), | 
|  | marker=unichr(0x25CE).encode("utf-8"), | 
|  | format='[%(fill)s%(marker)s%(blank)s] %(progress)s%%', | 
|  | incremental=True, | 
|  | stdout=sys.stdout): | 
|  | super(ProgressWithEvents, self).__init__(start,end,width,fill,blank,marker,format,incremental,stdout) | 
|  | self.events = {} | 
|  |  | 
|  | def add_event(self,event): | 
|  | if event in self.events: | 
|  | self.events[event] += 1 | 
|  | else: | 
|  | self.events[event] = 1 | 
|  |  | 
|  | def show_progress(self): | 
|  | isatty = hasattr(self.stdout, 'isatty') and self.stdout.isatty() | 
|  | if isatty: | 
|  | self.stdout.write('\r') | 
|  | else: | 
|  | self.stdout.write('\n') | 
|  | self.stdout.write(str(self)) | 
|  | if len(self.events) == 0: | 
|  | return | 
|  | self.stdout.write('\n') | 
|  | for key in self.events.keys(): | 
|  | self.stdout.write(str(key) + ' = ' + str(self.events[key]) + ' ') | 
|  | if isatty: | 
|  | self.stdout.write('\033[1A') | 
|  | self.stdout.flush() | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | p = AnimatedProgressBar(end=200, width=200) | 
|  |  | 
|  | while True: | 
|  | p + 5 | 
|  | p.show_progress() | 
|  | time.sleep(0.3) | 
|  | if p.progress == 100: | 
|  | break | 
|  | print #new line |