]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - bde/pretty_print.py
[bde/pretty_print] Il y avait une conversion en unicode *in place* de tous les champs…
[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 import copy
7
8 def sql_pretty_print(liste, keys=None):
9 """Affiche (presque) la même chose que la sortie obtenue dans un prompt psql
10 si keys n'est pas fourni, l'ordre des champs ne sera pas toujours le même
11 crashe si liste est vide"""
12 # Histoire d'éviter les effets de bord
13 liste = copy.deepcopy(liste)
14 if len(liste) == 0:
15 raise ExceptionsNote.EmptyResult("Impossible d'afficher un résultat vide.")
16 if keys == None:
17 keys = liste[0].keys()
18 # On unicodifie
19 for iligne in range(len(liste)):
20 for k, v in liste[iligne].items():
21 obj = dict(liste[iligne])
22 obj[k] = ("%s" % v).decode("utf8")
23 liste[iligne] = obj
24 # On cherche la largeur des colonnes
25 didi = dict([(k,k) for k in keys])
26 liste_plus_keys = liste + [didi]
27 maxs = dict([
28 (champ, max([
29 len(i[champ]) for i in liste_plus_keys
30 ])
31 )
32 for champ in keys
33 ])
34 # On aligne à gauche par défaut, mais pas si c'est un nombre
35 nombres = [int, float, long]
36 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"
37 output = templateline % didi
38 didi2 = dict([(k, "") for k in keys])
39 output += (templateline % didi2).replace(" ", "-").replace("|", "+")
40 for ligne in liste:
41 output += templateline % ligne
42 return output