Source code for stakkr.command

"""
A command wrapper to get a live output displayed.
Useful when you need to write a plugin that outputs some progress or info.
"""

import subprocess
import sys
from io import BufferedReader
from click import echo, style


[docs]def launch_cmd_displays_output(cmd: list, print_msg: bool = True, print_err: bool = True, err_to_out: bool = False): """Launch a command and displays conditionnaly messages and / or errors""" try: stderr = subprocess.PIPE if err_to_out is False else subprocess.STDOUT result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=stderr) except Exception as error: raise SystemError('Cannot run the command: {}'.format(error)) _read_messages(result, print_msg) if print_err is True and err_to_out is False: _print_errors(result) return result
[docs]def verbose(display: bool, message: str): """Display a message if verbose is On""" if display is True: echo(style('[VERBOSE]', fg='green') + ' {}'.format(message), file=sys.stderr)
def _read_messages(result: BufferedReader, display: bool = False): """Print messages sent to the STDOUT""" for line in result.stdout: line = line.decode() line = line if display is True else '.' print(line, end='') sys.stdout.flush() print() def _print_errors(result: BufferedReader): """Print messages sent to the STDERR""" num = 0 for line in result.stderr: err = line.decode() if num is 0: print(style("Command returned errors :", fg='red')) if num < 5: print(err, end='') elif num is 5: print(style('... and more', fg='red')) num += 1