Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: Source/bindings/scripts/interface_to_json.py

Issue 1323493002: Collect IDL files and exract interface node object's information (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add explanation of each function Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/bindings/scripts/interface_node_path.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2
Yuki 2015/09/04 10:07:57 Need copyright notice.
natsukoa 2015/09/07 08:37:55 Done.
3 """Usage: interface_to_json.py path_file.txt json_file.json
Yuki 2015/09/04 10:07:57 filename: "collect_idls_into_json.py"
natsukoa 2015/09/07 08:37:55 Done.
4
5 path_textfile: output of interface_nodo_path.py
6
7 The goal of this script is to integrate and dump interface node information to j son file.
8 """
9
10 import os
11 import sys
12 import json
13
14 from blink_idl_parser import parse_file, BlinkIDLParser
15
16
17 def load_filepaths(path_file):
18 """Returns a generator which yields absolute path of IDL files written in te xt file.
Yuki 2015/09/04 10:07:57 written in |path_file|.
natsukoa 2015/09/07 08:37:55 Done.
19 Args:
20 path_file: text file
21 Return:
Yuki 2015/09/04 10:07:57 s/Return/Returns/
natsukoa 2015/09/07 08:37:55 Done.
22 path: generator, absolute file path
23 """
24 for line in open(path_file, 'r'):
25 path = line.strip()
26 yield path
27
28
29 def get_interfaces(path_file):
Yuki 2015/09/04 10:07:57 s/path_file/idl_paths/
natsukoa 2015/09/07 08:37:55 Done.
30 """Returns generator which yields interface IDL nodes.
31 Args:
32 path_file: text file
33 Return:
34 definition: generator, interface node objects
35 """
36 parser = BlinkIDLParser(debug=False)
37 class_name = 'Interface'
38 for node_path in load_filepaths(path_file):
Yuki 2015/09/04 10:07:57 s/load_file_paths(path_file)/idl_paths/
natsukoa 2015/09/07 08:37:55 Done.
39 definitions = parse_file(parser, node_path)
40 for definition in definitions.GetChildren():
41 if definition.GetClass() == class_name:
42 yield definition
43
44
45 def get_filepath(interface_node):
46 """Returns relative path which is contained in interface_node.
47 Args:
48 interface_node: interface node class object
49 Return:
50 os.path.relpath(filename): str, interface_node's file path
51 """
52 filename = interface_node.GetProperty('FILENAME')
53 return os.path.relpath(filename)
54
55
56 def get_partial(interface_node_list):
57 """Returns generator which yields partial interface node.
58 Args:
59 interface_node_list: generator, interface node class object
60 Return:
61 interface_node: generator, interface node class object
62 """
63 for interface_node in interface_node_list:
64 if interface_node.GetProperty('Partial', default=False):
65 yield interface_node
66
67
68 def get_non_partial(interface_node_list):
69 """Returns generator which yields interface node.
70 Args:
71 interface_node_list: generator interface node class object
72 Return:
73 interface_node: generator, interface node class object
74 """
75 for interface_node in interface_node_list:
76 if not interface_node.GetProperty('Partial', default=False):
77 yield interface_node
78
79
80 def get_attributes(interface_node):
81 """Returns list of Attribute object.
82 Args:
83 interface_node: interface node object
84 Return:
85 interface_node.GetListOf('Attribute'): list, Attribute object list
86 """
87 return interface_node.GetListOf('Attribute')
88
89
90 def get_type(node):
91 """Returns type of attribute or operation's type.
92 Args:
93 node: interface node object
94 """
95 return node.GetListOf('Type')[0].GetChildren()[0].GetName()
Yuki 2015/09/04 10:07:57 def get_attribute_type(attribute_node): ....
natsukoa 2015/09/07 08:37:55 Done.
96
97
98 def get_extattirbutes(node):
99 """Returns generator which yields list of Extattribute object.
100 Args:
101 node: interface node object
102 Return:
103 extattribute_list: generator, extattribute object list
104 """
105 for extattributes in node.GetListOf('ExtAttributes'):
106 for extattribute_list in extattributes.GetChildren():
107 yield extattribute_list
108
109
110 def extattr_dict(node):
111 """Returns generator which yields Extattribute's information dictionary.
112 Args:
113 node: interface node object
114 Return:
115 {'Name': extattribute.GetName()}: generator, extattribute dictionary
116 """
Yuki 2015/09/04 10:07:57 def get_extattrs(node): def get_extattr_nodes(
natsukoa 2015/09/07 08:37:55 Done.
117 for extattribute in get_extattirbutes(node):
118 yield {
119 'Name': extattribute.GetName()
120 }
121
122
123 def attributes_dict(interface_node):
124 """Returns generator which yields dictioary of Extattribute object informati on.
125 Args:
126 interface_node: interface node object
127 Return:
128 attr_dict: generator, dictionary of attribite information
129 """
130 for attribute in get_attributes(interface_node):
131 attr_dict = {}
132 attr_dict['Name'] = attribute.GetName()
133 attr_dict['Type'] = get_type(attribute)
134 attr_dict['ExtAttributes'] = [extattr for extattr in extattr_dict(attrib ute)]
135 yield attr_dict
136
137
138 def get_operations(interface_node):
139 """Returns list of Operations object under the interface_node.
140 Args:
141 interface_node: interface node object
142 Return:
143 interface_node.GetListOf('Operation'): list, list of oparation object
144 """
145 return interface_node.GetListOf('Operation')
146
147
148 def get_arguments(operation):
149 """Returns list of Arguments object under the operation object.
150 Args:
151 operation: interface node object
152 Return:
153 argument_node.GetListOf('Argument'): list, list of argument object
154 """
155 argument_node = operation.GetListOf('Arguments')[0]
156 return argument_node.GetListOf('Argument')
157
158
159 def argument_dict(argument):
160 """Returns generator which yields dictionary of Argument object information.
161 Args:
162 argument: interface node object
163 Return:
164 arg_dict: dict, generator of argument information's dictionary
165 """
166 for arg_name in get_arguments(argument):
167 arg_dict = {}
168 arg_dict['Name'] = arg_name.GetName()
169 arg_dict['Type'] = get_type(arg_name)
170 yield arg_dict
171
172
173 def get_operation_name(operation):
174 """Returns openration object name.
175 Args:
176 operation: operation object in interface node object
177 Return:
178 str, operation's name
179 """
180 if operation.GetProperty('GETTER', default=None):
181 return '__getter__'
182 elif operation.GetProperty('SETTER', default=None):
183 return '__setter__'
184 elif operation.GetProperty('DELETER', default=None):
185 return '__deleter__'
186 else:
187 return operation.GetName()
188
189
190 def operation_dict(interface_node):
191 """Returns generator which yields dictionary of Operation object information .
192 Args:
193 interface_node: interface node object
194 Return:
195 operate_dict: generator of operation dictionary
196 """
197 for operation in get_operations(interface_node):
198 operate_dict = {}
199 operate_dict['Name'] = get_operation_name(operation)
200 operate_dict['Argument'] = [args for args in argument_dict(operation)]
201 operate_dict['Type'] = get_type(operation)
202 operate_dict['ExtAttributes'] = [extattr for extattr in extattr_dict(ope ration)]
203 yield operate_dict
204
205
206 def get_consts(interface_node):
207 """Returns list of Constant object.
208 Args:
209 interface_node: interface node object
210 Return:
211 interface_node.GetListOf('Const'): list, list of constant object
212 """
213 return interface_node.GetListOf('Const')
214
215
216 def get_const_type(node):
217 """Returns constant's type.
218 Args:
219 node: interface node's attribute or operation object
220 Return:
221 node.GetChildren()[0].GetName(): str, constant object's name
222 """
223 return node.GetChildren()[0].GetName()
224
225
226 def get_const_value(node):
227 """Returns constant's value.
228 Args:
229 node: interface node's attribute or operation object
230 Return:
231 node.GetChildren()[1].GetName(): list, list of oparation object
232 """
233 return node.GetChildren()[1].GetName()
234
235
236 def const_dict(interface_node):
237 """Returns generator which yields dictionary of constant object information.
238 Args:
239 interface_node: interface node object
240 Return:
241 {}: generator, dict of constant object information
242 """
243 for const in get_consts(interface_node):
244 yield {
245 'Name': const.GetName(),
246 'Type': get_const_type(const),
247 'Value': get_const_value(const)
248 }
249
250
251 def format_interface_dict(interface_node):
252 """Returns dictioanry of each interface_node information.
253 Args:
254 interface_node: interface node object
255 Return:
256 interface_dict: dict, dictionary of interface node information
257 """
258 interface_dict = {}
259 interface_dict['Name'] = interface_node.GetName()
260 interface_dict['FilePath'] = get_filepath(interface_node)
261 interface_dict['Attribute'] = [attr for attr in attributes_dict(interface_no de)]
262 interface_dict['Operation'] = [operation for operation in operation_dict(int erface_node)]
263 interface_dict['ExtAttributes'] = [extattr for extattr in extattr_dict(inter face_node)]
264 interface_dict['Constant'] = [const for const in const_dict(interface_node) if const]
265 return interface_dict
266
267
268 def merge_partial_interface(interface_dict_list, partial_dict_list):
269 """Returns list of interface_node information dictioary.
270 Args:
271 interface_dict_list: list
272 partial_dict_list: list
273 Return:
274 interface_dict_list: list, list of interface node's dictionry merged with partial interface node
275 """
276 for partial in partial_dict_list:
277 for interface in interface_dict_list:
278 if interface['Name'] == partial['Name']:
279 interface['Attribute'].append(partial['Attribute'])
280 interface['Operation'].append(partial['Operation'])
281 interface['ExtAttributes'].append(partial['ExtAttributes'])
282 interface.setdefault('Partial_FilePath', []).append(partial['Fil ePath'])
283 if interface['Constant']:
284 interface.setdefault('Constant', []).append(partial['Constan t'])
285 return interface_dict_list
286
287
288 def format_dictionary(dictionary_list):
289 """Returns dictioary which is changed structure of interface_dict_list.
290 Args:
291 dictirary_list: list, list of interface node dictionary
292 Return:
293 dictionary: dict, {interface_node name: interface node dictionary}
294 """
295 dictionary = {}
296 for interface_dict in dictionary_list:
297 dictionary.setdefault(interface_dict['Name'], interface_dict)
298 return dictionary
299
300
301 def export_jsonfile(dictionary, json_file):
Yuki 2015/09/04 10:07:57 path = "foo/bar/baz.ext" filepath = "foo/bar/baz.e
natsukoa 2015/09/07 08:37:55 Done.
302 """Returns jsonfile which is dumped each interface_node information dictiona ry to json.
303 Args:
304 dictioary: dict, output of format_dictinatry
305 json_file: json file for output
306 Return:
307 json file which is contained each interface node dictionary
308 """
309 filename = json_file
310 indent_size = None
311 with open(filename, 'w') as f:
312 json.dump(dictionary, f, sort_keys=True, indent=indent_size)
313
314
315 def main(args):
316 path_file = args[0]
317 json_file = args[1]
318 interface_dict_list = [format_interface_dict(interface_node) for interface_n ode in get_non_partial(get_interfaces(path_file))]
319 partial_dict_list = [format_interface_dict(interface_node) for interface_nod e in get_partial(get_interfaces(path_file))]
320 dictionary_list = merge_partial_interface(interface_dict_list, partial_dict_ list)
321 dictionary = format_dictionary(dictionary_list)
322 export_jsonfile(dictionary, json_file)
323
324
325 if __name__ == '__main__':
326 main(sys.argv[1:])
OLDNEW
« no previous file with comments | « Source/bindings/scripts/interface_node_path.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698