You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-2.2-lib/pym/cl_utils2.py

362 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#-*- coding: utf-8 -*-
#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Version = "calculate-server 0.0.1"
import sys
sys.path.append('/var/tmp/calculate2/calculate-lib/trunk/pym')
import cStringIO
import cl_base
import struct
import termios
import fcntl
import cl_utils
pcs = cl_utils.prettyColumnStr
CONWIDTH = 100
class cl_params:
def __init__(self, cmdName):
self.column_width = 30
self.cmdName = cmdName
#короткие опции командной строки
self.shortOpt = []
#длинные опции командной строки
self.longOpt = []
#optEnd = ""
#if "user" in self.cmdName and not "mod" in self.cmdName:
#optEnd = _("user")
#elif "group" in self.cmdName and not "mod" in self.cmdName:
#optEnd = _("group")
self.__setParamHelp()
def getChapterNumber(self,NameChapter):
# Показать номер раздела по его имени
num = 0
for i in self.chapter:
if i[0] == NameChapter:
return num
num += 1
return False
def __setParamHelp(self):
# записать параметры в справку
sp = []
for par in self.data:
if par.has_key("shortOption"):
if self.access(par):
sp.append(par["shortOption"])
sp.sort()
for shortOption in sp:
for par in self.data:
if par.has_key("shortOption") and self.access(par):
if par["shortOption"] == shortOption:
if par.has_key("optVal"):
longOption = par["longOption"] + " " +\
par["optVal"]
else:
longOption = par["longOption"]
numChapter = self.getChapterNumber(par['helpChapter'])
helpTxt = pcs(
" -%s, --%s "%(par["shortOption"],longOption),
self.column_width, par['help'],
CONWIDTH-self.column_width)
self.addChapterHelp(numChapter,helpTxt)
break
for par in self.data:
if not par.has_key("shortOption") and \
self.access(par):
helpTxt = par['help']
numChapter = self.getChapterNumber(par['helpChapter'])
self.addChapterHelp(numChapter,helpTxt)
def getHelp(self):
# Выдать справку
help = ""
for numChapter in range(len(self.chapter)):
chapter = self.chapter[numChapter]
nameChapter = chapter[0]
visibleChapter = chapter[1]
beforeStrChapter = chapter[2]
afterStrChapter = chapter[3]
bef = ""
for i in range(beforeStrChapter):
bef += "\n"
aft = ""
for i in range(afterStrChapter):
aft += "\n"
if visibleChapter:
help += nameChapter + ": " + bef
help += self.chapterBloc[numChapter] + aft
return help
def addChapterHelp(self,numChapter,helpTxt):
# Добавить в раздел помощи numChapteк тектстовую строку helpTxt
self.chapterBloc[numChapter] += helpTxt
return True
def addData(self,dataHash):
# На будущее (добавляет опции)
self.data.append(dataHash)
return True
def access(self,dataHash):
# доступна ли опция вызывающей программе
numProg = self.progName[self.cmdName]
if dataHash.has_key('progAccess'):
if numProg in dataHash['progAccess']:
return True
else:
return False
else:
return True
def getAllOpt(self,typeOpt="short"):
# Выдать все действующие опции
if typeOpt=="short":
if len(self.shortOpt) == 0:
for par in self.data:
if par.has_key("shortOption") and self.access(par):
if par.has_key("optVal"):
self.shortOpt.append(par["shortOption"]+':')
else:
self.shortOpt.append(par["shortOption"])
return "".join(self.shortOpt)
if typeOpt=="long":
if len(self.longOpt) == 0:
for par in self.data:
if par.has_key("longOption") and self.access(par):
if par.has_key("optVal"):
self.longOpt.append(par["longOption"]+'=')
else:
self.longOpt.append(par["longOption"])
return self.longOpt
def getShortOpt(self,option):
# Из любой опции получаем короткую опцию
for par in self.data:
if par.has_key("shortOption") and self.access(par):
if par["longOption"] == option or \
par["shortOption"] == option:
return par["shortOption"]
break
return ""
BG_BLACK = "40"
BG_RED = "41"
BG_GREEN = "42"
BG_YELLOW = "43"
BG_BLUE = "44"
BG_PURPLE = "45"
BG_CYAN = "46"
BG_WHITE = "47"
FG_BLACK = "30"
FG_RED = "31"
FG_GREEN = "32"
FG_YELLOW = "33"
FG_BLUE = "34"
FG_PURPLE = "35"
FG_CYAN = "36"
FG_WHITE = "37"
ATTR_RESET = "0"
ATTR_BRIGHTOFF = "1"
ATTR_BRIGHTON = "2"
ATTR_UNDERLINE = "3"
ATTR_FLASH = "5"
ATTR_REVERSE = "7"
ATTR_INVISIBLE = "8"
def colorstr(s, *attrs):
return "\033[%sm" % ";".join(attrs) + s
def colorwrite(s, *attrs):
print colorstr(s, *attrs)
class cl_smartconsole:
def printRight(self, offsetLeft, offsetRight):
"""Добавляет необходимое количество пробелов:
количество пробелов = (ширина консоли - offsetLeft - offsetRight)
"""
s = struct.pack("HHHH", 0, 0, 0, 0)
fd_stdout = sys.stdout.fileno()
x = fcntl.ioctl(fd_stdout, termios.TIOCGWINSZ, s)
#(rows, cols, x pixels, y pixels)
cols = struct.unpack("HHHH", x)[1]
for i in range(cols - offsetLeft - offsetRight):
sys.stdout.write(" ")
def colorPrint(self,attr,fg,bg,string):
"""Раскрашивает выводимое сообщение
Параметры:
attr - это атрибут
fg - цвет символа
bg - цвет фона
в случае если параметр равен "" то он не изменяется
attr может принимать следующие значения:
0 сбросить все атрибуты (вернуться в нормальный режим)
1 яркий (обычно включает толстый шрифт)
2 тусклый
3 подчёркнутый
5 мигающий
7 реверсный
8 невидимый
fg может принимать следующие значения:
30 чёрный
31 красный
32 зелёный
33 жёлтый
34 синий
35 фиолетовый
36 голубой
37 белый
bg может принимать следующие значения:
40 чёрный
41 красный
42 зелёный
43 жёлтый
44 синий
45 фиолетовый
46 голубой
47 белый
"""
lst = []
if attr:
lst.append(attr)
if fg:
lst.append(fg)
if bg:
lst.append(bg)
sys.stdout.write("\033[%sm%s\033[0m" %(";".join(lst),string))
def redBrightPrint(self, string):
"""Печатает яркое красное сообщение"""
self.colorPrint("1","31","",string)
def greenBrightPrint(self, string):
"""Печатает яркое зеленое сообщение"""
self.colorPrint("1","32","",string)
def yellowBrightPrint(self, string):
"""Печатает яркое желтое сообщение"""
self.colorPrint("1","33","",string)
def blueBrightPrint(self, string):
"""Печатает яркое cинее сообщение"""
self.colorPrint("1","34","",string)
def lenString(self, string):
"""Получаем длинну строки"""
stringUnicode = cl_utils._toUNICODE(string)
lenString = len(stringUnicode)
return lenString
def defaultPrint(self, string):
sys.stdout.write(string)
sys.stdout.flush()
def printLine(self, argL, argR):
"""Печатает справа и слева консоли цветные сообщения"""
#Допустимые цвета
colorDict = {\
# цвет по умолчанию
'':self.defaultPrint,
# ярко зеленый
'greenBr':self.greenBrightPrint,
# ярко голубой
'blueBr':self.blueBrightPrint,
# ярко красный
'redBr':self.redBrightPrint,
# ярко желтый
'yellowBr':self.yellowBrightPrint,
}
# cмещение от левого края консоли
offsetL = 0
for color,leftString in argL:
offsetL += self.lenString(leftString)
if colorDict.has_key(color):
# печатаем и считаем смещение
colorDict[color](leftString)
else:
colorDict[''](leftString)
# cмещение от правого края консоли
offsetR = 0
for color,rightString in argR:
offsetR += self.lenString(rightString)
# Добавляем пробелы
self.printRight(offsetL, offsetR)
for color,rightString in argR:
if colorDict.has_key(color):
# печатаем и считаем смещение
colorDict[color](rightString)
else:
colorDict[''](rightString)
print ""
def printNotOK(self, string):
"""Вывод на печать в случае сбоя"""
self.printLine((('greenBr',' * '),
('',string),
),
(('blueBr','['),
('redBr',' !! '),
('blueBr',']'),
)
)
def printOK(self, string):
"""Вывод на печать в случае успеха"""
self.printLine((('greenBr',' * '),
('',string),
),
(('blueBr','['),
('greenBr',' ok '),
('blueBr',']'),
)
)
def printWARNING(self, string):
"""Вывод на печать предупреждения"""
self.printLine((('yellowBr',' * '),
('',string),
),
(('',''),
)
)
def printERROR(self, string):
"""Вывод на печать предупреждения"""
self.printLine((('redBr',' * '),
('',string),
),
(('',''),
)
)
def printSUCCESS(self, string):
"""Вывод на печать в случае успеха без [ok] справа"""
self.printLine((('greenBr',' * '),
('',string),
),
(('',''),
)
)