rhazdon/django-sonic-screwdriver

View on GitHub
django_sonic_screwdriver/utils/shell.py

Summary

Maintainability
A
0 mins
Test Coverage
import re
from codecs import getwriter
from sys import stderr, stdout

ANSCI_ESCAPE = re.compile(r"\x1b[^m]*m")
STDERR_WRITER = getwriter("utf-8")(stderr.buffer)
STDOUT_WRITER = getwriter("utf-8")(stdout.buffer)


def ansi_clean(string):
    return ANSCI_ESCAPE.sub("", string)


def write_to_stream(stream, msg):
    try:
        if STDOUT_WRITER.isatty():
            stream.write(msg)
        else:
            stream.write(ansi_clean(msg))
        stream.flush()
    except Exception:
        pass


class Shell:
    __HEADER = "\033[95m"
    __OK_BLUE = "\033[94m"
    __OK_GREEN = "\033[92m"
    __WARNING = "\033[93m"
    __FAIL = "\033[91m"
    __ENDC = "\033[0m"
    __BOLD = "\033[1m"
    __UNDERLINE = "\033[4m"

    def msg(self, msg, append_new_line=True):
        self.__out(msg, self.__OK_BLUE, append_new_line)

    def success(self, msg, append_new_line=True):
        self.__out(msg, self.__OK_GREEN, append_new_line)

    def warn(self, msg, append_new_line=True):
        self.__out(msg, self.__WARNING, append_new_line)

    def fail(self, msg, append_new_line=True):
        self.__out(msg, self.__FAIL, append_new_line)

    def debug(self, msg, append_new_line=True):
        self.__out(msg, self.__WARNING, append_new_line)

    def __text(self, msg, color):
        return "{}Sonic: {}{}".format(color, msg, self.__ENDC)

    def __out(self, msg, color=None, append_new_line=False):
        if msg is not None:
            msg = self.__text(msg, color)
            if append_new_line:
                msg += "\n"
            write_to_stream(STDOUT_WRITER, msg)


shell = Shell()