Newer
Older
#!/usr/bin/env python
#coding=utf8
'''
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",
}
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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):
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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):
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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()