]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - bde/pretty_print.py
e0b525cb38178077982c07282cc567690c57be21
[scripts-20-100.git] / bde / pretty_print.py
1 #!/usr/bin/python
2 # -*- encoding: utf-8 -*-
3
4 """ Module pour afficher une sortie SQL «Comme si on y était». """
5
6 def sql_pretty_print(liste, keys=None):
7 """Affiche (presque) la même chose que la sortie obtenue dans un prompt psql
8 si keys n'est pas fourni, l'ordre des champs ne sera pas toujours le même
9 crashe si liste est vide"""
10 if len(liste) == 0:
11 raise ExceptionsNote.EmptyResult("Impossible d'afficher un résultat vide.")
12 if keys == None:
13 keys = liste[0].keys()
14 # On unicodifie
15 for iligne in range(len(liste)):
16 for k, v in liste[iligne].items():
17 obj = dict(liste[iligne])
18 obj[k] = ("%s" % v).decode("utf8")
19 liste[iligne] = obj
20 # On cherche la largeur des colonnes
21 didi = dict([(k,k) for k in keys])
22 liste_plus_keys = liste + [didi]
23 maxs = dict([
24 (champ, max([
25 len(i[champ]) for i in liste_plus_keys
26 ])
27 )
28 for champ in keys
29 ])
30 # On aligne à gauche par défaut, mais pas si c'est un nombre
31 nombres = [int, float, long]
32 templateline = u" "+ u" | ".join([u"%%(%s)%s%ss" % (key, u"-"*(not type(liste[0][key]) in nombres), maxs[key]) for key in keys]) + u" \n"
33 output = templateline % didi
34 didi2 = dict([(k, "") for k in keys])
35 output += (templateline % didi2).replace(" ", "-").replace("|", "+")
36 for ligne in liste:
37 output += templateline % ligne
38 return output