| # -*- coding: utf-8 -*- |
| |
| # Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> |
| # |
| # Permission to use, copy, modify, and distribute this software for any |
| # purpose with or without fee is hereby granted, provided that the above |
| # copyright notice and this permission notice appear in all copies. |
| # |
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| |
| from __future__ import unicode_literals |
| |
| import sys |
| |
| from . import Progress |
| |
| |
| class Bar(Progress): |
| width = 32 |
| suffix = '%(index)d/%(max)d' |
| bar_prefix = ' |' |
| bar_suffix = '| ' |
| empty_fill = ' ' |
| fill = '#' |
| |
| def update(self): |
| filled_length = int(self.width * self.progress) |
| empty_length = self.width - filled_length |
| |
| message = self.message % self |
| bar = self.fill * filled_length |
| empty = self.empty_fill * empty_length |
| suffix = self.suffix % self |
| line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, |
| suffix]) |
| self.writeln(line) |
| |
| |
| class ChargingBar(Bar): |
| suffix = '%(percent)d%%' |
| bar_prefix = ' ' |
| bar_suffix = ' ' |
| empty_fill = '∙' |
| fill = '█' |
| |
| |
| class FillingSquaresBar(ChargingBar): |
| empty_fill = '▢' |
| fill = '▣' |
| |
| |
| class FillingCirclesBar(ChargingBar): |
| empty_fill = '◯' |
| fill = '◉' |
| |
| |
| class IncrementalBar(Bar): |
| if sys.platform.startswith('win'): |
| phases = (u' ', u'▌', u'█') |
| else: |
| phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') |
| |
| def update(self): |
| nphases = len(self.phases) |
| filled_len = self.width * self.progress |
| nfull = int(filled_len) # Number of full chars |
| phase = int((filled_len - nfull) * nphases) # Phase of last char |
| nempty = self.width - nfull # Number of empty chars |
| |
| message = self.message % self |
| bar = self.phases[-1] * nfull |
| current = self.phases[phase] if phase > 0 else '' |
| empty = self.empty_fill * max(0, nempty - len(current)) |
| suffix = self.suffix % self |
| line = ''.join([message, self.bar_prefix, bar, current, empty, |
| self.bar_suffix, suffix]) |
| self.writeln(line) |
| |
| |
| class PixelBar(IncrementalBar): |
| phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') |
| |
| |
| class ShadyBar(IncrementalBar): |
| phases = (' ', '░', '▒', '▓', '█') |