Mercurial > libervia-backend
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 |