`str.format`-able bar with format specifiers: `[width][type]` - `width` + unspecified (default): use `self.default_len` + `int >= 0`: overrides `self.default_len` + `int < 0`: subtract from `self.default_len` - `type` + `a`: ascii (`charset=self.ASCII` override)
| 129 | |
| 130 | |
| 131 | class Bar: |
| 132 | """ |
| 133 | `str.format`-able bar with format specifiers: `[width][type]` |
| 134 | |
| 135 | - `width` |
| 136 | + unspecified (default): use `self.default_len` |
| 137 | + `int >= 0`: overrides `self.default_len` |
| 138 | + `int < 0`: subtract from `self.default_len` |
| 139 | - `type` |
| 140 | + `a`: ascii (`charset=self.ASCII` override) |
| 141 | + `u`: unicode (`charset=self.UTF` override) |
| 142 | + `b`: blank (`charset=" "` override) |
| 143 | """ |
| 144 | ASCII = " 123456789#" |
| 145 | UTF = " " + ''.join(map(chr, range(0x258F, 0x2587, -1))) |
| 146 | BLANK = " " |
| 147 | COLOUR_RESET = '\x1b[0m' |
| 148 | COLOUR_RGB = '\x1b[38;2;%d;%d;%dm' |
| 149 | COLOURS = {'BLACK': '\x1b[30m', 'RED': '\x1b[31m', 'GREEN': '\x1b[32m', |
| 150 | 'YELLOW': '\x1b[33m', 'BLUE': '\x1b[34m', 'MAGENTA': '\x1b[35m', |
| 151 | 'CYAN': '\x1b[36m', 'WHITE': '\x1b[37m'} |
| 152 | |
| 153 | def __init__(self, frac, default_len=10, charset=UTF, colour=None): |
| 154 | if not 0 <= frac <= 1: |
| 155 | warn("clamping frac to range [0, 1]", TqdmWarning, stacklevel=2) |
| 156 | frac = max(0, min(1, frac)) |
| 157 | assert default_len > 0 |
| 158 | self.frac = frac |
| 159 | self.default_len = default_len |
| 160 | self.charset = charset |
| 161 | self.colour = colour |
| 162 | |
| 163 | @property |
| 164 | def colour(self): |
| 165 | return self._colour |
| 166 | |
| 167 | @colour.setter |
| 168 | def colour(self, value): |
| 169 | if not value: |
| 170 | self._colour = None |
| 171 | return |
| 172 | try: |
| 173 | if value.upper() in self.COLOURS: |
| 174 | self._colour = self.COLOURS[value.upper()] |
| 175 | elif value[0] == '#' and len(value) == 7: |
| 176 | self._colour = self.COLOUR_RGB % tuple( |
| 177 | int(i, 16) for i in (value[1:3], value[3:5], value[5:7])) |
| 178 | else: |
| 179 | raise KeyError |
| 180 | except (KeyError, AttributeError): |
| 181 | warn(f"Unknown colour ({value}); valid choices:" |
| 182 | f" [hex (#00ff00), {', '.join(self.COLOURS)}]", TqdmWarning, stacklevel=2) |
| 183 | self._colour = None |
| 184 | |
| 185 | def __format__(self, format_spec): |
| 186 | if format_spec: |
| 187 | _type = format_spec[-1].lower() |
| 188 | try: |