comparison sat/tools/common/data_format.py @ 2624:56f94936df1e

code style reformatting using black
author Goffi <goffi@goffi.org>
date Wed, 27 Jun 2018 20:14:46 +0200
parents 26edcf3a30eb
children 8cacf7929f3c
comparison
equal deleted inserted replaced
2623:49533de4540b 2624:56f94936df1e
16 16
17 # You should have received a copy of the GNU Affero General Public License 17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20 """ tools common to backend and frontends """ 20 """ tools common to backend and frontends """
21 # FIXME: json may be more appropriate than manual serialising like done here 21 #  FIXME: json may be more appropriate than manual serialising like done here
22 22
23 from sat.core import exceptions 23 from sat.core import exceptions
24
24 25
25 def dict2iter(name, dict_, pop=False): 26 def dict2iter(name, dict_, pop=False):
26 """iterate into a list serialised in a dict 27 """iterate into a list serialised in a dict
27 28
28 name is the name of the key. 29 name is the name of the key.
34 @param dict_(dict): dictionary with the serialised list 35 @param dict_(dict): dictionary with the serialised list
35 @param pop(bool): if True, remove the value from dict 36 @param pop(bool): if True, remove the value from dict
36 @return iter: iterate through the deserialised list 37 @return iter: iterate through the deserialised list
37 """ 38 """
38 if pop: 39 if pop:
39 get=lambda d,k: d.pop(k) 40 get = lambda d, k: d.pop(k)
40 else: 41 else:
41 get=lambda d,k: d[k] 42 get = lambda d, k: d[k]
42 43
43 try: 44 try:
44 yield get(dict_,name) 45 yield get(dict_, name)
45 except KeyError: 46 except KeyError:
46 return 47 return
47 else: 48 else:
48 idx = 1 49 idx = 1
49 while True: 50 while True:
50 try: 51 try:
51 yield get(dict_,u'{}#{}'.format(name, idx)) 52 yield get(dict_, u"{}#{}".format(name, idx))
52 except KeyError: 53 except KeyError:
53 return 54 return
54 else: 55 else:
55 idx += 1 56 idx += 1
57
56 58
57 def dict2iterdict(name, dict_, extra_keys, pop=False): 59 def dict2iterdict(name, dict_, extra_keys, pop=False):
58 """like dict2iter but yield dictionaries 60 """like dict2iter but yield dictionaries
59 61
60 params are like in [dict2iter], extra_keys is used for extra dict keys. 62 params are like in [dict2iter], extra_keys is used for extra dict keys.
61 e.g. dict2iterdict(comments, mb_data, ('node', 'service')) will yield dicts like: 63 e.g. dict2iterdict(comments, mb_data, ('node', 'service')) will yield dicts like:
62 {u'comments': u'value1', u'node': u'value2', u'service': u'value3'} 64 {u'comments': u'value1', u'node': u'value2', u'service': u'value3'}
63 """ 65 """
64 # FIXME: this format seem overcomplicated, it may be more appropriate to use json here 66 #  FIXME: this format seem overcomplicated, it may be more appropriate to use json here
65 if pop: 67 if pop:
66 get=lambda d,k: d.pop(k) 68 get = lambda d, k: d.pop(k)
67 else: 69 else:
68 get=lambda d,k: d[k] 70 get = lambda d, k: d[k]
69 for idx, main_value in enumerate(dict2iter(name, dict_, pop=pop)): 71 for idx, main_value in enumerate(dict2iter(name, dict_, pop=pop)):
70 ret = {name: main_value} 72 ret = {name: main_value}
71 for k in extra_keys: 73 for k in extra_keys:
72 ret[k] = get(dict_, u'{}{}_{}'.format(name, (u'#' + unicode(idx)) if idx else u'', k)) 74 ret[k] = get(
75 dict_, u"{}{}_{}".format(name, (u"#" + unicode(idx)) if idx else u"", k)
76 )
73 yield ret 77 yield ret
78
74 79
75 def iter2dict(name, iter_, dict_=None, check_conflict=True): 80 def iter2dict(name, iter_, dict_=None, check_conflict=True):
76 """Fill a dict with values from an iterable 81 """Fill a dict with values from an iterable
77 82
78 name is used to serialise iter_, in the same way as in [dict2iter] 83 name is used to serialise iter_, in the same way as in [dict2iter]
90 dict_ = {} 95 dict_ = {}
91 for idx, value in enumerate(iter_): 96 for idx, value in enumerate(iter_):
92 if idx == 0: 97 if idx == 0:
93 key = name 98 key = name
94 else: 99 else:
95 key = u'{}#{}'.format(name, idx) 100 key = u"{}#{}".format(name, idx)
96 if check_conflict and key in dict_: 101 if check_conflict and key in dict_:
97 raise exceptions.ConflictError 102 raise exceptions.ConflictError
98 dict_[key] = value 103 dict_[key] = value
99 return dict 104 return dict
100 105
101 def getSubDict(name, dict_, sep=u'_'): 106
107 def getSubDict(name, dict_, sep=u"_"):
102 """get a sub dictionary from a serialised dictionary 108 """get a sub dictionary from a serialised dictionary
103 109
104 look for keys starting with name, and create a dict with it 110 look for keys starting with name, and create a dict with it
105 eg.: if "key" is looked for, {'html': 1, 'key_toto': 2, 'key_titi': 3} will return: 111 eg.: if "key" is looked for, {'html': 1, 'key_toto': 2, 'key_titi': 3} will return:
106 {None: 1, toto: 2, titi: 3} 112 {None: 1, toto: 2, titi: 3}
107 @param name(unicode): name of the key 113 @param name(unicode): name of the key
108 @param dict_(dict): dictionary with the serialised list 114 @param dict_(dict): dictionary with the serialised list
109 @param sep(unicode): separator used between name and subkey 115 @param sep(unicode): separator used between name and subkey
110 @return iter: iterate through the deserialised items 116 @return iter: iterate through the deserialised items
111 """ 117 """
112 for k,v in dict_.iteritems(): 118 for k, v in dict_.iteritems():
113 if k.startswith(name): 119 if k.startswith(name):
114 if k == name: 120 if k == name:
115 yield None, v 121 yield None, v
116 else: 122 else:
117 if k[len(name)] != sep: 123 if k[len(name)] != sep:
118 continue 124 continue
119 else: 125 else:
120 yield k[len(name)+1:], v 126 yield k[len(name) + 1 :], v