Mercurial > kallithea
changeset 8748:165f81ed84e3
lib: drop unused files
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Tue, 03 Nov 2020 15:00:28 +0100 |
parents | 09826e98b064 |
children | 5dd9cf56f09e |
files | kallithea/lib/vcs/utils/progressbar.py kallithea/lib/verlib.py |
diffstat | 2 files changed, 0 insertions(+), 751 deletions(-) [+] |
line wrap: on
line diff
--- a/kallithea/lib/vcs/utils/progressbar.py Tue Nov 03 14:58:11 2020 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,422 +0,0 @@ -# encoding: UTF-8 - -import datetime -import string -import sys - -from kallithea.lib.vcs.utils.filesize import filesizeformat - - -class ProgressBarError(Exception): - pass - - -class AlreadyFinishedError(ProgressBarError): - pass - - -class ProgressBar(object): - - default_elements = ['percentage', 'bar', 'steps'] - - def __init__(self, steps=100, stream=None, elements=None): - self.step = 0 - self.steps = steps - self.stream = stream or sys.stderr - self.bar_char = '=' - self.width = 50 - self.separator = ' | ' - self.elements = elements or self.default_elements - self.started = None - self.finished = False - self.steps_label = 'Step' - self.time_label = 'Time' - self.eta_label = 'ETA' - self.speed_label = 'Speed' - self.transfer_label = 'Transfer' - - def __str__(self): - return self.get_line() - - def __iter__(self): - start = self.step - end = self.steps + 1 - for x in range(start, end): - self.render(x) - yield x - - def get_separator(self): - return self.separator - - def get_bar_char(self): - return self.bar_char - - def get_bar(self): - char = self.get_bar_char() - perc = self.get_percentage() - length = int(self.width * perc / 100) - bar = char * length - bar = bar.ljust(self.width) - return bar - - def get_elements(self): - return self.elements - - def get_template(self): - separator = self.get_separator() - elements = self.get_elements() - return string.Template(separator.join((('$%s' % e) for e in elements))) - - def get_total_time(self, current_time=None): - if current_time is None: - current_time = datetime.datetime.now() - if not self.started: - return datetime.timedelta() - return current_time - self.started - - def get_rendered_total_time(self): - delta = self.get_total_time() - if not delta: - ttime = '-' - else: - ttime = str(delta) - return '%s %s' % (self.time_label, ttime) - - def get_eta(self, current_time=None): - if current_time is None: - current_time = datetime.datetime.now() - if self.step == 0: - return datetime.timedelta() - total_seconds = self.get_total_time().total_seconds() - eta_seconds = total_seconds * self.steps / self.step - total_seconds - return datetime.timedelta(seconds=int(eta_seconds)) - - def get_rendered_eta(self): - eta = self.get_eta() - if not eta: - eta = '--:--:--' - else: - eta = str(eta).rjust(8) - return '%s: %s' % (self.eta_label, eta) - - def get_percentage(self): - return float(self.step) / self.steps * 100 - - def get_rendered_percentage(self): - perc = self.get_percentage() - return ('%s%%' % (int(perc))).rjust(5) - - def get_rendered_steps(self): - return '%s: %s/%s' % (self.steps_label, self.step, self.steps) - - def get_rendered_speed(self, step=None, total_seconds=None): - if step is None: - step = self.step - if total_seconds is None: - total_seconds = self.get_total_time().total_seconds() - if step <= 0 or total_seconds <= 0: - speed = '-' - else: - speed = filesizeformat(float(step) / total_seconds) - return '%s: %s/s' % (self.speed_label, speed) - - def get_rendered_transfer(self, step=None, steps=None): - if step is None: - step = self.step - if steps is None: - steps = self.steps - - if steps <= 0: - return '%s: -' % self.transfer_label - total = filesizeformat(float(steps)) - if step <= 0: - transferred = '-' - else: - transferred = filesizeformat(float(step)) - return '%s: %s / %s' % (self.transfer_label, transferred, total) - - def get_context(self): - return { - 'percentage': self.get_rendered_percentage(), - 'bar': self.get_bar(), - 'steps': self.get_rendered_steps(), - 'time': self.get_rendered_total_time(), - 'eta': self.get_rendered_eta(), - 'speed': self.get_rendered_speed(), - 'transfer': self.get_rendered_transfer(), - } - - def get_line(self): - template = self.get_template() - context = self.get_context() - return template.safe_substitute(**context) - - def write(self, data): - self.stream.write(data) - - def render(self, step): - if not self.started: - self.started = datetime.datetime.now() - if self.finished: - raise AlreadyFinishedError - self.step = step - self.write('\r%s' % self) - if step == self.steps: - self.finished = True - if step == self.steps: - self.write('\n') - - -""" -termcolors.py - -Grabbed from Django (http://www.djangoproject.com) -""" - -color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') -foreground = dict([(color_names[x], '3%s' % x) for x in range(8)]) -background = dict([(color_names[x], '4%s' % x) for x in range(8)]) - -RESET = '0' -opt_dict = {'bold': '1', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'} - - -def colorize(text='', opts=(), **kwargs): - """ - Returns your text, enclosed in ANSI graphics codes. - - Depends on the keyword arguments 'fg' and 'bg', and the contents of - the opts tuple/list. - - Returns the RESET code if no parameters are given. - - Valid colors: - 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white' - - Valid options: - 'bold' - 'underscore' - 'blink' - 'reverse' - 'conceal' - 'noreset' - string will not be auto-terminated with the RESET code - - Examples: - colorize('hello', fg='red', bg='blue', opts=('blink',)) - colorize() - colorize('goodbye', opts=('underscore',)) - print colorize('first line', fg='red', opts=('noreset',)) - print 'this should be red too' - print colorize('and so should this') - print 'this should not be red' - """ - code_list = [] - if text == '' and len(opts) == 1 and opts[0] == 'reset': - return '\x1b[%sm' % RESET - for k, v in kwargs.items(): - if k == 'fg': - code_list.append(foreground[v]) - elif k == 'bg': - code_list.append(background[v]) - for o in opts: - if o in opt_dict: - code_list.append(opt_dict[o]) - if 'noreset' not in opts: - text = text + '\x1b[%sm' % RESET - return ('\x1b[%sm' % ';'.join(code_list)) + text - - -def make_style(opts=(), **kwargs): - """ - Returns a function with default parameters for colorize() - - Example: - bold_red = make_style(opts=('bold',), fg='red') - print bold_red('hello') - KEYWORD = make_style(fg='yellow') - COMMENT = make_style(fg='blue', opts=('bold',)) - """ - return lambda text: colorize(text, opts, **kwargs) - - -NOCOLOR_PALETTE = 'nocolor' -DARK_PALETTE = 'dark' -LIGHT_PALETTE = 'light' - -PALETTES = { - NOCOLOR_PALETTE: { - 'ERROR': {}, - 'NOTICE': {}, - 'SQL_FIELD': {}, - 'SQL_COLTYPE': {}, - 'SQL_KEYWORD': {}, - 'SQL_TABLE': {}, - 'HTTP_INFO': {}, - 'HTTP_SUCCESS': {}, - 'HTTP_REDIRECT': {}, - 'HTTP_NOT_MODIFIED': {}, - 'HTTP_BAD_REQUEST': {}, - 'HTTP_NOT_FOUND': {}, - 'HTTP_SERVER_ERROR': {}, - }, - DARK_PALETTE: { - 'ERROR': { 'fg': 'red', 'opts': ('bold',) }, - 'NOTICE': { 'fg': 'red' }, - 'SQL_FIELD': { 'fg': 'green', 'opts': ('bold',) }, - 'SQL_COLTYPE': { 'fg': 'green' }, - 'SQL_KEYWORD': { 'fg': 'yellow' }, - 'SQL_TABLE': { 'opts': ('bold',) }, - 'HTTP_INFO': { 'opts': ('bold',) }, - 'HTTP_SUCCESS': { }, - 'HTTP_REDIRECT': { 'fg': 'green' }, - 'HTTP_NOT_MODIFIED': { 'fg': 'cyan' }, - 'HTTP_BAD_REQUEST': { 'fg': 'red', 'opts': ('bold',) }, - 'HTTP_NOT_FOUND': { 'fg': 'yellow' }, - 'HTTP_SERVER_ERROR': { 'fg': 'magenta', 'opts': ('bold',) }, - }, - LIGHT_PALETTE: { - 'ERROR': { 'fg': 'red', 'opts': ('bold',) }, - 'NOTICE': { 'fg': 'red' }, - 'SQL_FIELD': { 'fg': 'green', 'opts': ('bold',) }, - 'SQL_COLTYPE': { 'fg': 'green' }, - 'SQL_KEYWORD': { 'fg': 'blue' }, - 'SQL_TABLE': { 'opts': ('bold',) }, - 'HTTP_INFO': { 'opts': ('bold',) }, - 'HTTP_SUCCESS': { }, - 'HTTP_REDIRECT': { 'fg': 'green', 'opts': ('bold',) }, - 'HTTP_NOT_MODIFIED': { 'fg': 'green' }, - 'HTTP_BAD_REQUEST': { 'fg': 'red', 'opts': ('bold',) }, - 'HTTP_NOT_FOUND': { 'fg': 'red' }, - 'HTTP_SERVER_ERROR': { 'fg': 'magenta', 'opts': ('bold',) }, - } -} -DEFAULT_PALETTE = DARK_PALETTE - -# ---------------------------- # -# --- End of termcolors.py --- # -# ---------------------------- # - - -class ColoredProgressBar(ProgressBar): - - BAR_COLORS = ( - (10, 'red'), - (30, 'magenta'), - (50, 'yellow'), - (99, 'green'), - (100, 'blue'), - ) - - def get_line(self): - line = super(ColoredProgressBar, self).get_line() - perc = self.get_percentage() - if perc > 100: - color = 'blue' - for max_perc, color in self.BAR_COLORS: - if perc <= max_perc: - break - return colorize(line, fg=color) - - -class AnimatedProgressBar(ProgressBar): - - def get_bar_char(self): - chars = '-/|\\' - if self.step >= self.steps: - return '=' - return chars[self.step % len(chars)] - - -class BarOnlyProgressBar(ProgressBar): - - default_elements = ['bar', 'steps'] - - def get_bar(self): - bar = super(BarOnlyProgressBar, self).get_bar() - perc = self.get_percentage() - perc_text = '%s%%' % int(perc) - text = (' %s%% ' % (perc_text)).center(self.width, '=') - L = text.find(' ') - R = text.rfind(' ') - bar = ' '.join((bar[:L], perc_text, bar[R:])) - return bar - - -class AnimatedColoredProgressBar(AnimatedProgressBar, - ColoredProgressBar): - pass - - -class BarOnlyColoredProgressBar(ColoredProgressBar, - BarOnlyProgressBar): - pass - - -def main(): - import time - - print("Standard progress bar...") - bar = ProgressBar(30) - for x in range(1, 31): - bar.render(x) - time.sleep(0.02) - bar.stream.write('\n') - print() - - print("Empty bar...") - bar = ProgressBar(50) - bar.render(0) - print() - print() - - print("Colored bar...") - bar = ColoredProgressBar(20) - for x in bar: - time.sleep(0.01) - print() - - print("Animated char bar...") - bar = AnimatedProgressBar(20) - for x in bar: - time.sleep(0.01) - print() - - print("Animated + colored char bar...") - bar = AnimatedColoredProgressBar(20) - for x in bar: - time.sleep(0.01) - print() - - print("Bar only ...") - bar = BarOnlyProgressBar(20) - for x in bar: - time.sleep(0.01) - print() - - print("Colored, longer bar-only, eta, total time ...") - bar = BarOnlyColoredProgressBar(40) - bar.width = 60 - bar.elements += ['time', 'eta'] - for x in bar: - time.sleep(0.01) - print() - print() - - print("File transfer bar, breaks after 2 seconds ...") - total_bytes = 1024 * 1024 * 2 - bar = ProgressBar(total_bytes) - bar.width = 50 - bar.elements.remove('steps') - bar.elements += ['transfer', 'time', 'eta', 'speed'] - for x in range(0, bar.steps, 1024): - bar.render(x) - time.sleep(0.01) - now = datetime.datetime.now() - if now - bar.started >= datetime.timedelta(seconds=2): - break - print() - print() - - -if __name__ == '__main__': - main()
--- a/kallithea/lib/verlib.py Tue Nov 03 14:58:11 2020 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,329 +0,0 @@ -""" -"Rational" version definition and parsing for DistutilsVersionFight -discussion at PyCon 2009. -""" - -import re - - -class IrrationalVersionError(Exception): - """This is an irrational version.""" - pass - - -class HugeMajorVersionNumError(IrrationalVersionError): - """An irrational version because the major version number is huge - (often because a year or date was used). - - See `error_on_huge_major_num` option in `NormalizedVersion` for details. - This guard can be disabled by setting that option False. - """ - pass - - -# A marker used in the second and third parts of the `parts` tuple, for -# versions that don't have those segments, to sort properly. An example -# of versions in sort order ('highest' last): -# 1.0b1 ((1,0), ('b',1), ('f',)) -# 1.0.dev345 ((1,0), ('f',), ('dev', 345)) -# 1.0 ((1,0), ('f',), ('f',)) -# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345)) -# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f')) -# ^ ^ ^ -# 'b' < 'f' ---------------------/ | | -# | | -# 'dev' < 'f' < 'post' -------------------/ | -# | -# 'dev' < 'f' ----------------------------------------------/ -# Other letters would do, but 'f' for 'final' is kind of nice. -FINAL_MARKER = ('f',) - -VERSION_RE = re.compile(r''' - ^ - (?P<version>\d+\.\d+) # minimum 'N.N' - (?P<extraversion>(?:\.\d+)*) # any number of extra '.N' segments - (?: - (?P<prerel>[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate - # 'rc'= alias for release candidate - (?P<prerelversion>\d+(?:\.\d+)*) - )? - (?P<postdev>(\.post(?P<post>\d+))?(\.dev(?P<dev>\d+))?)? - $''', re.VERBOSE) - - -class NormalizedVersion(object): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # mininum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def __init__(self, s, error_on_huge_major_num=True): - """Create a NormalizedVersion instance from a version string. - - :param s {str} The version string. - :param error_on_huge_major_num {bool} Whether to consider an - apparent use of a year or full date as the major version number - an error. Default True. One of the observed patterns on PyPI before - the introduction of `NormalizedVersion` was version numbers like this: - 2009.01.03 - 20040603 - 2005.01 - This guard is here to strongly encourage the package author to - use an alternate version, because a release deployed into PyPI - and, e.g. downstream Linux package managers, will forever remove - the possibility of using a version number like "1.0" (i.e. - where the major number is less than that huge major number). - """ - self._parse(s, error_on_huge_major_num) - - @classmethod - def from_parts(cls, version, prerelease=FINAL_MARKER, - devpost=FINAL_MARKER): - return cls(cls.parts_to_str((version, prerelease, devpost))) - - def _parse(self, s, error_on_huge_major_num=True): - """Parses a string version into parts.""" - match = VERSION_RE.search(s) - if not match: - raise IrrationalVersionError(s) - - groups = match.groupdict() - parts = [] - - # main version - block = self._parse_numdots(groups['version'], s, False, 2) - extraversion = groups.get('extraversion') - if extraversion not in ('', None): - block += self._parse_numdots(extraversion[1:], s) - parts.append(tuple(block)) - - # prerelease - prerel = groups.get('prerel') - if prerel is not None: - block = [prerel] - block += self._parse_numdots(groups.get('prerelversion'), s, - pad_zeros_length=1) - parts.append(tuple(block)) - else: - parts.append(FINAL_MARKER) - - # postdev - if groups.get('postdev'): - post = groups.get('post') - dev = groups.get('dev') - postdev = [] - if post is not None: - postdev.extend([FINAL_MARKER[0], 'post', int(post)]) - if dev is None: - postdev.append(FINAL_MARKER[0]) - if dev is not None: - postdev.extend(['dev', int(dev)]) - parts.append(tuple(postdev)) - else: - parts.append(FINAL_MARKER) - self.parts = tuple(parts) - if error_on_huge_major_num and self.parts[0][0] > 1980: - raise HugeMajorVersionNumError("huge major version number, %r, " - "which might cause future problems: %r" % (self.parts[0][0], s)) - - def _parse_numdots(self, s, full_ver_str, drop_trailing_zeros=True, - pad_zeros_length=0): - """Parse 'N.N.N' sequences, return a list of ints. - - :param s {str} 'N.N.N..." sequence to be parsed - :param full_ver_str {str} The full version string from which this - comes. Used for error strings. - :param drop_trailing_zeros {bool} Whether to drop trailing zeros - from the returned list. Default True. - :param pad_zeros_length {int} The length to which to pad the - returned list with zeros, if necessary. Default 0. - """ - nums = [] - for n in s.split("."): - if len(n) > 1 and n[0] == '0': - raise IrrationalVersionError("cannot have leading zero in " - "version number segment: '%s' in %r" % (n, full_ver_str)) - nums.append(int(n)) - if drop_trailing_zeros: - while nums and nums[-1] == 0: - nums.pop() - while len(nums) < pad_zeros_length: - nums.append(0) - return nums - - def __str__(self): - return self.parts_to_str(self.parts) - - @classmethod - def parts_to_str(cls, parts): - """Transforms a version expressed in tuple into its string - representation.""" - # XXX This doesn't check for invalid tuples - main, prerel, postdev = parts - s = '.'.join(str(v) for v in main) - if prerel is not FINAL_MARKER: - s += prerel[0] - s += '.'.join(str(v) for v in prerel[1:]) - if postdev and postdev is not FINAL_MARKER: - if postdev[0] == 'f': - postdev = postdev[1:] - i = 0 - while i < len(postdev): - if i % 2 == 0: - s += '.' - s += str(postdev[i]) - i += 1 - return s - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self) - - def _cannot_compare(self, other): - raise TypeError("cannot compare %s and %s" - % (type(self).__name__, type(other).__name__)) - - def __eq__(self, other): - if not isinstance(other, NormalizedVersion): - self._cannot_compare(other) - return self.parts == other.parts - - def __lt__(self, other): - if not isinstance(other, NormalizedVersion): - self._cannot_compare(other) - return self.parts < other.parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__eq__(other) or self.__lt__(other) - - def __ge__(self, other): - return self.__eq__(other) or self.__gt__(other) - - -def suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - :param s {str} An irrational version string. - :returns: A rational version string, or None, if couldn't determine one. - """ - try: - NormalizedVersion(s) - return s # already rational - except IrrationalVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - # TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.3.post17222 - # 0.9.33-r17222 -> 0.9.3.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.3.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - NormalizedVersion(rs) - return rs # already rational - except IrrationalVersionError: - pass - return None