Source code for benchbuild.utils.progress

"""
A progress bar based on the plumbum cli.progress.Progress bar, but
with a changed string representation to adjust the design.
"""
import sys

import attr
from plumbum import cli


[docs]@attr.s class ProgressBar(cli.progress.ProgressBase): """Class that modifies the progress bar.""" width = attr.ib(default=cli.termsize.get_terminal_size(default=(0, 0))[0]) pg_char = attr.ib(default='*') iterator = attr.ib(default=None) length = attr.ib(default=None) timer = attr.ib(default=True) body = attr.ib(default=False) has_output = attr.ib(default=False) clear = attr.ib(default=True) value = attr.ib(default=None) width = attr.ib(default=None) def __attrs_post_init__(self): if self.length and (self.iterator is None): self.iterator = range(self.length) if self.iterator and (self.length is None): self.length = len(self.iterator) def __str__(self): """ The string representation of the progress bar displayed in the console. Almost identical as the one provided by plumbum, but adjusted in the width of the progress bar. """ width = self.width if self.length == 0: percent = 1 else: percent = max(self.value, 0) / self.length pg_char = self.pg_char ending = ' ' + (self.str_time_remaining() if self.timer else '{0} of {1} complete'.format( self.value, self.length)) if width - len(ending) < 10 or self.has_output: self.width = 0 if self.timer: return "{0:.0%} complete: {1}".format( percent, self.str_time_remaining()) return "{0:.0%} complete".format(percent) num_of_chars = int(percent * self.width) pbar = '[' + pg_char*num_of_chars + \ ' '*(self.width-num_of_chars) + ']' + ending str_percent = ' {0:.0%} '.format(percent) return pbar[:self.width//2 - 2] \ + str_percent + pbar[self.width//2+len(str_percent) - 2:]
[docs] def start(self): """Completely identical to the Progress class from plumbum.""" super(ProgressBar, self).start() self.display()
[docs] def done(self): """Completely identical to the Progress class from plumbum.""" self.value = self.length self.display() if self.clear and not self.has_output: print("\r", len(str(self)) * " ", "\r", end='', sep='') else: print()
[docs] def display(self): """Completely identical to the Progress class from plumbum.""" disptxt = str(self) if self.width == 0 or self.has_output: print(disptxt) else: print("\r", end='') print(disptxt, end='') sys.stdout.flush()