Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/humanfriendly/cli.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/humanfriendly/cli.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,291 +0,0 @@ -# Human friendly input/output in Python. -# -# Author: Peter Odding <peter@peterodding.com> -# Last Change: March 1, 2020 -# URL: https://humanfriendly.readthedocs.io - -""" -Usage: humanfriendly [OPTIONS] - -Human friendly input/output (text formatting) on the command -line based on the Python package with the same name. - -Supported options: - - -c, --run-command - - Execute an external command (given as the positional arguments) and render - a spinner and timer while the command is running. The exit status of the - command is propagated. - - --format-table - - Read tabular data from standard input (each line is a row and each - whitespace separated field is a column), format the data as a table and - print the resulting table to standard output. See also the --delimiter - option. - - -d, --delimiter=VALUE - - Change the delimiter used by --format-table to VALUE (a string). By default - all whitespace is treated as a delimiter. - - -l, --format-length=LENGTH - - Convert a length count (given as the integer or float LENGTH) into a human - readable string and print that string to standard output. - - -n, --format-number=VALUE - - Format a number (given as the integer or floating point number VALUE) with - thousands separators and two decimal places (if needed) and print the - formatted number to standard output. - - -s, --format-size=BYTES - - Convert a byte count (given as the integer BYTES) into a human readable - string and print that string to standard output. - - -b, --binary - - Change the output of -s, --format-size to use binary multiples of bytes - (base-2) instead of the default decimal multiples of bytes (base-10). - - -t, --format-timespan=SECONDS - - Convert a number of seconds (given as the floating point number SECONDS) - into a human readable timespan and print that string to standard output. - - --parse-length=VALUE - - Parse a human readable length (given as the string VALUE) and print the - number of metres to standard output. - - --parse-size=VALUE - - Parse a human readable data size (given as the string VALUE) and print the - number of bytes to standard output. - - --demo - - Demonstrate changing the style and color of the terminal font using ANSI - escape sequences. - - -h, --help - - Show this message and exit. -""" - -# Standard library modules. -import functools -import getopt -import pipes -import subprocess -import sys - -# Modules included in our package. -from humanfriendly import ( - Timer, - format_length, - format_number, - format_size, - format_timespan, - parse_length, - parse_size, -) -from humanfriendly.tables import format_pretty_table, format_smart_table -from humanfriendly.terminal import ( - ANSI_COLOR_CODES, - ANSI_TEXT_STYLES, - HIGHLIGHT_COLOR, - ansi_strip, - ansi_wrap, - enable_ansi_support, - find_terminal_size, - output, - usage, - warning, -) -from humanfriendly.terminal.spinners import Spinner - -# Public identifiers that require documentation. -__all__ = ( - 'demonstrate_256_colors', - 'demonstrate_ansi_formatting', - 'main', - 'print_formatted_length', - 'print_formatted_number', - 'print_formatted_size', - 'print_formatted_table', - 'print_formatted_timespan', - 'print_parsed_length', - 'print_parsed_size', - 'run_command', -) - - -def main(): - """Command line interface for the ``humanfriendly`` program.""" - enable_ansi_support() - try: - options, arguments = getopt.getopt(sys.argv[1:], 'cd:l:n:s:bt:h', [ - 'run-command', 'format-table', 'delimiter=', 'format-length=', - 'format-number=', 'format-size=', 'binary', 'format-timespan=', - 'parse-length=', 'parse-size=', 'demo', 'help', - ]) - except Exception as e: - warning("Error: %s", e) - sys.exit(1) - actions = [] - delimiter = None - should_format_table = False - binary = any(o in ('-b', '--binary') for o, v in options) - for option, value in options: - if option in ('-d', '--delimiter'): - delimiter = value - elif option == '--parse-size': - actions.append(functools.partial(print_parsed_size, value)) - elif option == '--parse-length': - actions.append(functools.partial(print_parsed_length, value)) - elif option in ('-c', '--run-command'): - actions.append(functools.partial(run_command, arguments)) - elif option in ('-l', '--format-length'): - actions.append(functools.partial(print_formatted_length, value)) - elif option in ('-n', '--format-number'): - actions.append(functools.partial(print_formatted_number, value)) - elif option in ('-s', '--format-size'): - actions.append(functools.partial(print_formatted_size, value, binary)) - elif option == '--format-table': - should_format_table = True - elif option in ('-t', '--format-timespan'): - actions.append(functools.partial(print_formatted_timespan, value)) - elif option == '--demo': - actions.append(demonstrate_ansi_formatting) - elif option in ('-h', '--help'): - usage(__doc__) - return - if should_format_table: - actions.append(functools.partial(print_formatted_table, delimiter)) - if not actions: - usage(__doc__) - return - for partial in actions: - partial() - - -def run_command(command_line): - """Run an external command and show a spinner while the command is running.""" - timer = Timer() - spinner_label = "Waiting for command: %s" % " ".join(map(pipes.quote, command_line)) - with Spinner(label=spinner_label, timer=timer) as spinner: - process = subprocess.Popen(command_line) - while True: - spinner.step() - spinner.sleep() - if process.poll() is not None: - break - sys.exit(process.returncode) - - -def print_formatted_length(value): - """Print a human readable length.""" - if '.' in value: - output(format_length(float(value))) - else: - output(format_length(int(value))) - - -def print_formatted_number(value): - """Print large numbers in a human readable format.""" - output(format_number(float(value))) - - -def print_formatted_size(value, binary): - """Print a human readable size.""" - output(format_size(int(value), binary=binary)) - - -def print_formatted_table(delimiter): - """Read tabular data from standard input and print a table.""" - data = [] - for line in sys.stdin: - line = line.rstrip() - data.append(line.split(delimiter)) - output(format_pretty_table(data)) - - -def print_formatted_timespan(value): - """Print a human readable timespan.""" - output(format_timespan(float(value))) - - -def print_parsed_length(value): - """Parse a human readable length and print the number of metres.""" - output(parse_length(value)) - - -def print_parsed_size(value): - """Parse a human readable data size and print the number of bytes.""" - output(parse_size(value)) - - -def demonstrate_ansi_formatting(): - """Demonstrate the use of ANSI escape sequences.""" - # First we demonstrate the supported text styles. - output('%s', ansi_wrap('Text styles:', bold=True)) - styles = ['normal', 'bright'] - styles.extend(ANSI_TEXT_STYLES.keys()) - for style_name in sorted(styles): - options = dict(color=HIGHLIGHT_COLOR) - if style_name != 'normal': - options[style_name] = True - style_label = style_name.replace('_', ' ').capitalize() - output(' - %s', ansi_wrap(style_label, **options)) - # Now we demonstrate named foreground and background colors. - for color_type, color_label in (('color', 'Foreground colors'), - ('background', 'Background colors')): - intensities = [ - ('normal', dict()), - ('bright', dict(bright=True)), - ] - if color_type != 'background': - intensities.insert(0, ('faint', dict(faint=True))) - output('\n%s' % ansi_wrap('%s:' % color_label, bold=True)) - output(format_smart_table([ - [color_name] + [ - ansi_wrap( - 'XXXXXX' if color_type != 'background' else (' ' * 6), - **dict(list(kw.items()) + [(color_type, color_name)]) - ) for label, kw in intensities - ] for color_name in sorted(ANSI_COLOR_CODES.keys()) - ], column_names=['Color'] + [ - label.capitalize() for label, kw in intensities - ])) - # Demonstrate support for 256 colors as well. - demonstrate_256_colors(0, 7, 'standard colors') - demonstrate_256_colors(8, 15, 'high-intensity colors') - demonstrate_256_colors(16, 231, '216 colors') - demonstrate_256_colors(232, 255, 'gray scale colors') - - -def demonstrate_256_colors(i, j, group=None): - """Demonstrate 256 color mode support.""" - # Generate the label. - label = '256 color mode' - if group: - label += ' (%s)' % group - output('\n' + ansi_wrap('%s:' % label, bold=True)) - # Generate a simple rendering of the colors in the requested range and - # check if it will fit on a single line (given the terminal's width). - single_line = ''.join(' ' + ansi_wrap(str(n), color=n) for n in range(i, j + 1)) - lines, columns = find_terminal_size() - if columns >= len(ansi_strip(single_line)): - output(single_line) - else: - # Generate a more complex rendering of the colors that will nicely wrap - # over multiple lines without using too many lines. - width = len(str(j)) + 1 - colors_per_line = int(columns / width) - colors = [ansi_wrap(str(n).rjust(width), color=n) for n in range(i, j + 1)] - blocks = [colors[n:n + colors_per_line] for n in range(0, len(colors), colors_per_line)] - output('\n'.join(''.join(b) for b in blocks))