Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / utils.py @ 489a1047

History | View | Annotate | Download (5.2 kB)

1 7493ccb6 Stavros Sachtouris
# Copyright 2011 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 7493ccb6 Stavros Sachtouris
#      disclaimer.
10 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 7493ccb6 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7493ccb6 Stavros Sachtouris
#      provided with the distribution.
15 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7493ccb6 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 7493ccb6 Stavros Sachtouris
# or implied, of GRNET S.A.
33 dfee2caf Stavros Sachtouris
try:
34 dfee2caf Stavros Sachtouris
    from colors import magenta, red, yellow, bold
35 dfee2caf Stavros Sachtouris
except ImportError:
36 dfee2caf Stavros Sachtouris
    #No colours? No worries, use dummy foo instead
37 dfee2caf Stavros Sachtouris
    def bold(val):
38 dfee2caf Stavros Sachtouris
        return val
39 dfee2caf Stavros Sachtouris
    red = yellow = magenta = bold
40 f997679d Stavros Sachtouris
41 f997679d Stavros Sachtouris
42 7493ccb6 Stavros Sachtouris
43 7493ccb6 Stavros Sachtouris
def pretty_keys(d, delim='_', recurcive=False):
44 7493ccb6 Stavros Sachtouris
    """Transform keys of a dict from the form
45 7493ccb6 Stavros Sachtouris
    str1_str2_..._strN to the form strN
46 7493ccb6 Stavros Sachtouris
    where _ is the delimeter
47 7493ccb6 Stavros Sachtouris
    """
48 7493ccb6 Stavros Sachtouris
    new_d = {}
49 7493ccb6 Stavros Sachtouris
    for key, val in d.items():
50 7493ccb6 Stavros Sachtouris
        new_key = key.split(delim)[-1]
51 7493ccb6 Stavros Sachtouris
        if recurcive and isinstance(val, dict):
52 7493ccb6 Stavros Sachtouris
            new_val = pretty_keys(val, delim, recurcive) 
53 7493ccb6 Stavros Sachtouris
        else:
54 7493ccb6 Stavros Sachtouris
            new_val = val
55 7493ccb6 Stavros Sachtouris
        new_d[new_key] = new_val
56 7493ccb6 Stavros Sachtouris
    return new_d
57 7493ccb6 Stavros Sachtouris
58 7493ccb6 Stavros Sachtouris
def print_dict(d, exclude=(), ident= 0):
59 7493ccb6 Stavros Sachtouris
    if not isinstance(d, dict):
60 7493ccb6 Stavros Sachtouris
        raise CLIError(message='Cannot dict_print a non-dict object')
61 7493ccb6 Stavros Sachtouris
    try:
62 7493ccb6 Stavros Sachtouris
        margin = max(
63 7493ccb6 Stavros Sachtouris
            1 + max(len(unicode(key).strip()) for key in d.keys() \
64 7493ccb6 Stavros Sachtouris
                if not isinstance(key, dict) and not isinstance(key, list)),
65 7493ccb6 Stavros Sachtouris
            ident)
66 7493ccb6 Stavros Sachtouris
    except ValueError:
67 7493ccb6 Stavros Sachtouris
        margin = ident
68 7493ccb6 Stavros Sachtouris
69 7493ccb6 Stavros Sachtouris
    for key, val in sorted(d.items()):
70 7493ccb6 Stavros Sachtouris
        if key in exclude:
71 7493ccb6 Stavros Sachtouris
            continue
72 7493ccb6 Stavros Sachtouris
        print_str = '%s:' % unicode(key).strip()
73 7493ccb6 Stavros Sachtouris
        if isinstance(val, dict):
74 7493ccb6 Stavros Sachtouris
            print(print_str.rjust(margin)+' {')
75 7493ccb6 Stavros Sachtouris
            print_dict(val, exclude = exclude, ident = margin + 6)
76 7493ccb6 Stavros Sachtouris
            print '}'.rjust(margin)
77 7493ccb6 Stavros Sachtouris
        elif isinstance(val, list):
78 7493ccb6 Stavros Sachtouris
            print(print_str.rjust(margin)+' [')
79 7493ccb6 Stavros Sachtouris
            print_list(val, exclude = exclude, ident = margin + 6)
80 7493ccb6 Stavros Sachtouris
            print ']'.rjust(margin)
81 7493ccb6 Stavros Sachtouris
        else:
82 7493ccb6 Stavros Sachtouris
            print print_str.rjust(margin)+' '+unicode(val).strip()
83 7493ccb6 Stavros Sachtouris
84 7493ccb6 Stavros Sachtouris
def print_list(l, exclude=(), ident = 0):
85 7493ccb6 Stavros Sachtouris
    if not isinstance(l, list):
86 7493ccb6 Stavros Sachtouris
        raise CLIError(message='Cannot list_print a non-list object')
87 7493ccb6 Stavros Sachtouris
    try:
88 7493ccb6 Stavros Sachtouris
        margin = max(
89 7493ccb6 Stavros Sachtouris
            1 + max(len(unicode(item).strip()) for item in l \
90 7493ccb6 Stavros Sachtouris
                if not isinstance(item, dict) and not isinstance(item, list)),
91 7493ccb6 Stavros Sachtouris
            ident)
92 7493ccb6 Stavros Sachtouris
    except ValueError:
93 7493ccb6 Stavros Sachtouris
        margin = ident
94 7493ccb6 Stavros Sachtouris
95 7493ccb6 Stavros Sachtouris
    for item in sorted(l):
96 7493ccb6 Stavros Sachtouris
        if item in exclude:
97 7493ccb6 Stavros Sachtouris
            continue
98 7493ccb6 Stavros Sachtouris
        if isinstance(item, dict):
99 7493ccb6 Stavros Sachtouris
            print('{'.rjust(margin))
100 7493ccb6 Stavros Sachtouris
            print_dict(item, exclude = exclude, ident = margin + 6)
101 7493ccb6 Stavros Sachtouris
            print '}'.rjust(margin)
102 7493ccb6 Stavros Sachtouris
        elif isinstance(item, list):
103 7493ccb6 Stavros Sachtouris
            print '['.rjust(margin)
104 7493ccb6 Stavros Sachtouris
            print_list(item, exclude = exclude, ident = margin + 6)
105 7493ccb6 Stavros Sachtouris
            print ']'.rjust(margin)
106 7493ccb6 Stavros Sachtouris
        else:
107 7493ccb6 Stavros Sachtouris
            print unicode(item).rjust(margin)
108 7493ccb6 Stavros Sachtouris
109 7493ccb6 Stavros Sachtouris
def print_items(items, title=('id', 'name')):
110 7493ccb6 Stavros Sachtouris
    for item in items:
111 7493ccb6 Stavros Sachtouris
        if isinstance(item, dict) or isinstance(item, list):
112 7493ccb6 Stavros Sachtouris
            print ' '.join(unicode(item.pop(key)) for key in title if key in item)
113 7493ccb6 Stavros Sachtouris
        if isinstance(item, dict):
114 7493ccb6 Stavros Sachtouris
            print_dict(item)
115 7493ccb6 Stavros Sachtouris
116 7493ccb6 Stavros Sachtouris
def format_size(size):
117 7493ccb6 Stavros Sachtouris
    units = ('B', 'K', 'M', 'G', 'T')
118 7493ccb6 Stavros Sachtouris
    try:
119 7493ccb6 Stavros Sachtouris
        size = float(size)
120 7493ccb6 Stavros Sachtouris
    except ValueError:
121 7493ccb6 Stavros Sachtouris
        raise CLIError(message='Cannot format %s in bytes'%size)
122 7493ccb6 Stavros Sachtouris
    for unit in units:
123 7493ccb6 Stavros Sachtouris
        if size < 1024:
124 7493ccb6 Stavros Sachtouris
            break
125 7493ccb6 Stavros Sachtouris
        size /= 1024
126 7493ccb6 Stavros Sachtouris
    s = ('%.1f' % size)
127 7493ccb6 Stavros Sachtouris
    if '.0' == s[-2:]:
128 7493ccb6 Stavros Sachtouris
        s = s[:-2]
129 7493ccb6 Stavros Sachtouris
    return s + unit
130 7493ccb6 Stavros Sachtouris
131 7493ccb6 Stavros Sachtouris
def dict2file(d, f, depth = 0):
132 7493ccb6 Stavros Sachtouris
    for k, v in d.items():
133 7493ccb6 Stavros Sachtouris
        f.write('%s%s: '%('\t'*depth, k))
134 926d6863 Stavros Sachtouris
        if isinstance(v,dict):
135 7493ccb6 Stavros Sachtouris
            f.write('\n')
136 7493ccb6 Stavros Sachtouris
            dict2file(v, f, depth+1)
137 926d6863 Stavros Sachtouris
        elif isinstance(v,list):
138 7493ccb6 Stavros Sachtouris
            f.write('\n')
139 7493ccb6 Stavros Sachtouris
            list2file(v, f, depth+1)
140 7493ccb6 Stavros Sachtouris
        else:
141 7493ccb6 Stavros Sachtouris
            f.write(' %s\n'%unicode(v))
142 7493ccb6 Stavros Sachtouris
143 7493ccb6 Stavros Sachtouris
def list2file(l, f, depth = 1):
144 7493ccb6 Stavros Sachtouris
    for item in l:
145 926d6863 Stavros Sachtouris
        if isinstance(item,dict):
146 7493ccb6 Stavros Sachtouris
            dict2file(item, f, depth+1)
147 926d6863 Stavros Sachtouris
        elif isinstance(item,list):
148 7493ccb6 Stavros Sachtouris
            list2file(item, f, depth+1)
149 7493ccb6 Stavros Sachtouris
        else:
150 7493ccb6 Stavros Sachtouris
            f.write('%s%s\n'%('\t'*depth, unicode(item)))