Skip to content
Snippets Groups Projects
printer.py 4.03 KiB
Newer Older
#!/usr/bin/env python
#coding=utf8

'''
Seblu's avatar
Seblu committed
CloudControl CLI Printer module
Seblu's avatar
Seblu committed
import os
Seblu's avatar
Seblu committed
import getpass

Seblu's avatar
Seblu committed
import cccli

color = {
    # regular
    "red": "\033[0;31m",
    "green": "\033[0;32m",
    "yellow": "\033[0;33m",
    "blue": "\033[0;34m",
    "purple": "\033[0;35m",
    "cyan": "\033[0;36m",
    "white": "\033[0;37m",
    # lighted
    "lred": "\033[1;31m",
    "lgreen": "\033[1;32m",
    "lyellow": "\033[1;33m",
    "lblue": "\033[1;34m",
    "lpurple": "\033[1;35m",
    "lcyan": "\033[1;36m",
    "lwhite": "\033[1;37m",
    # underline
    "ured": "\033[4;31m",
    "ugreen": "\033[4;32m",
    "uyellow": "\033[4;33m",
    "ublue": "\033[4;34m",
    "upurple": "\033[4;35m",
    "ucyan": "\033[4;36m",
    # others
    "reset": "\033[m",
    }

Seblu's avatar
Seblu committed

class Printer(object):
    '''Print relative class'''
    def __init__(self, interactive=False):
        self.readline = None
        if interactive:
            import readline
            self.readline = readline
        self.history = History(self.readline)

    def isinteractive(self):
        '''Return if printer is in interactive mode'''
        return self.readline is not None

    def out(self, message, fd=sys.stdout, nl=os.linesep, flush=True):
        '''Print a message in fd ended by nl'''
        fd.write("%s%s"%(message, nl))
        if flush:
            fd.flush()

    def err(self, message, fd=sys.stderr, nl=os.linesep):
        self.out(message, fd, nl)

    def fatal(self, message, exitcode=42, fd=sys.stderr, nl=os.linesep):
        self.out("%sFatal%s: %s%s"%(color["lred"],color["red"],message, color["reset"]),
            fd,
            nl)
        if exitcode >= 0:
            os._exit(exitcode)

    def error(self, message, fd=sys.stderr, nl=os.linesep):
        self.out("%sError%s: %s%s"%(color["lred"],color["red"],message,color["reset"]),
                 fd,
                 nl)

    def warn(self, message, fd=sys.stderr, nl=os.linesep):
        self.out("%sWarning%s: %s%s"%(color["lyellow"],color["yellow"],message,color["reset"]),
                 fd,
                 nl)

    def debug(self, message, fd=sys.stderr, nl=os.linesep):
Seblu's avatar
Seblu committed
        if cccli.debug:
Seblu's avatar
Seblu committed
            self.out(message, fd, nl)

    def getline(self, msg, history=True):
        s = raw_input(msg)
        if not history:
            self.history.removelast()
        return s

    def getpass(self, msg):
        '''Ask for a password. No echo. Not in history'''
        return getpass.getpass(msg)

    def ask(self, msg):
        '''Used to ask a question. Default answer not saved to history'''
        return self.getline(msg, history=False)


class History(object):
    '''History class'''
    def __init__(self, readline):
        self.readline = readline

    def __nonzero__(self):
        return not self.readline is None

    def __getattribute__(self, name):
        r = object.__getattribute__(self, "readline")
        if name == "readline":
            return r
        if r is None:
            return lambda *a,**k: None
        return object.__getattribute__(self, name)

    def __iter__(self):
        for i in range(1, len(self)):
            yield self.readline.get_history_item(i)

    def __len__(self):
Seblu's avatar
Seblu committed
        if self.readline is None:
            return 0
Seblu's avatar
Seblu committed
        return self.readline.get_current_history_length()

    def load(self, path):
        '''Load history from a file'''
        try:
            self.readline.read_history_file(path)
        except IOError:
            pass

    def save(self, path):
        '''Save history into path'''
        try:
            self.readline.write_history_file(path)
        except IOError:
            pass

    def maxsize(self, size=None):
        '''Set or return max history size'''
        if size is not None:
            self.readline.set_history_length(size)
        return self.readline.get_history_length()

    def removelast(self):
        '''Remove last history line'''
        self.readline.remove_history_item(self.cli.readline.get_current_history_length())

    def clear(self):
        '''Clear history'''
        self.readline.clear_history()