creole/creole/utils.py

198 lines
5.4 KiB
Python

# -*- coding: UTF-8 -*-
"""
utilitaires créole
"""
import sys
from .error import NoneError, OutOfRange
from .config import charset
try:
from pyeole.ansiprint import *
except:
pass
import time, hashlib, random, unicodedata
# définition des classes d'adresse IP existantes
classes = {
u'128.0.0.0' : u'1'
, u'192.0.0.0' : u'2'
, u'224.0.0.0' : u'3'
, u'240.0.0.0' : u'4'
, u'248.0.0.0' : u'5'
, u'252.0.0.0' : u'6'
, u'254.0.0.0' : u'7'
, u'255.0.0.0' : u'8'
, u'255.128.0.0' : u'9'
, u'255.192.0.0' : u'10'
, u'255.224.0.0' : u'11'
, u'255.240.0.0' : u'12'
, u'255.248.0.0' : u'13'
, u'255.252.0.0' : u'14'
, u'255.254.0.0' : u'15'
, u'255.255.0.0' : u'16'
, u'255.255.128.0' : u'17'
, u'255.255.192.0' : u'18'
, u'255.255.224.0' : u'19'
, u'255.255.240.0' : u'20'
, u'255.255.248.0' : u'21'
, u'255.255.252.0' : u'22'
, u'255.255.254.0' : u'23'
, u'255.255.255.0' : u'24'
, u'255.255.255.128' : u'25'
, u'255.255.255.192' : u'26'
, u'255.255.255.224' : u'27'
, u'255.255.255.240' : u'28'
, u'255.255.255.248' : u'29'
, u'255.255.255.252' : u'30'
, u'255.255.255.254' : u'31'
, u'255.255.255.255' : u'32'
}
def string_to_bool(string):
"""
Transforme les chaines 'True' ou 'False' en valeurs booléennes
"""
if string == "":
raise ValueError('empty string')
result = eval(string)
if result not in [True, False]:
raise TypeError("string must be like 'True' or 'False'")
else: return result
def get_text_node(node):
"""
@param node: node minidom contenant du texte
Utilitaire minidom permettant de récupérer le texte d'un node texte
"""
texte = ""
nodelist = node.childNodes
for textnode in nodelist:
if textnode.nodeType == textnode.TEXT_NODE:
texte = texte + textnode.data
return texte
# utilitaires pour la
# ligne de commande
def raw(text):
"""
Question en ligne de commande : permet de repérer si l'utilisateur a renvoyé quelque chose
@param text: le libellé de message
@return: la variable demandée
"""
var = raw_input(text + " : ")
if var:
return var
else:
raise NoneError
def stringify(string):
"""
Encodage des chaînes avec le charset local
"""
try:
return string.encode(charset)
except:
return string
def encode_list(_list):
""" encode une liste en utf-8 si les éléments sont de type dico ou str ou liste, unicode"""
encoded_list = []
for element in _list:
if type(element) == str:
encoded_list.append(encode_str(element))
elif type(element) == dict:
encoded_list.append(encode_dico(element))
elif type(element) == list:
encoded_list.append(encode_list(element))
elif type(element) == unicode:
encoded_list.append(encode_str(element))
else:
encoded_list.append(element)
return encoded_list
def encode_str(string):
""" encode une string ou un unicode en utf8 """
try:
string = string.encode(charset)
except:
pass
return string
def encode_dico(dico):
""" encode un dico en utf8 dans le cas ou les valeurs soient de type dico, liste, str, unicode """
for key in dico.keys():
if type(dico[key]) == str:
dico[key] = encode_str(dico[key])
elif type(dico[key]) == unicode:
dico[key] = encode_str(dico[key])
elif type(dico[key]) == dict:
dico[key] = encode_dico(dico[key])
elif type(dico[key]) == list:
dico[key] = encode_list(dico[key])
return dico
def select_list(selection):
"""
Utilitaire de construction d'une sélection en ligne de commande
@param selection : liste
@return : l'identifiant sélectionné (entier)
"""
# affichage de la liste (ordonnée)
for i in selection:
print(selection.index(i) , ':', stringify(i))
# print selection.index(i) , ':', i[0]
# recuperation du numero
try:
number = int(raw(stringify(_("Choose a number in the list"))))
except:
raise OutOfRange
if number not in range(len(selection)):
raise OutOfRange
return number
def gen_random(length=None):
"""
length: longueur de la chaine aléatoire attendu
"""
try:
random_id = str(time.time()).split('.')[0]
random_str = hashlib.sha224('{}/{}'.format(random_id, str(random.randrange(2**100))).encode('utf-8')).hexdigest()
return random_str[:length]
except:
import traceback
traceback.print_exc()
def normalize_family(family_name, check_name=True):
"""
il ne faut pas d'espace, d'accent, de majuscule, de tiré, ...
dans le nom des familles
"""
if sys.version_info[0] < 3:
f = unicode(family_name)
else:
f = family_name
f = f.replace('-', '_')
#f = f.replace(u'é', 'e')
#f = f.replace(u'è', 'e')
nfkd_form = unicodedata.normalize('NFKD', f)
f = u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
f = f.replace(' ', '_')
f = f.lower()
try:
int(f[0])
except ValueError:
pass
else:
raise ValueError(u'Le nom de la famille ne doit pas commencer par un chiffre : {0}'.format(f))
if check_name and f.lower() in ['containers']:
raise ValueError(u'nom de la famille interdit {0}'.format(f))
return f