1 | |
---|
2 | import array as arr |
---|
3 | import collections |
---|
4 | import glob |
---|
5 | import os |
---|
6 | import sys |
---|
7 | import subprocess |
---|
8 | import socket |
---|
9 | import os.path |
---|
10 | from os import path |
---|
11 | |
---|
12 | from collections import Counter |
---|
13 | |
---|
14 | |
---|
15 | def filename_list_generator(file_to_open): |
---|
16 | word = "" |
---|
17 | with open(file_to_open, "r") as file: |
---|
18 | file.read(0) |
---|
19 | for line in file: |
---|
20 | if not line.startswith("#"): |
---|
21 | for word in line.split(" "): |
---|
22 | if word.endswith(".nc") or word.endswith("_nc_files"): |
---|
23 | yield word |
---|
24 | break |
---|
25 | |
---|
26 | def configname_list_generator(file_to_open): |
---|
27 | word = "" |
---|
28 | with open(file_to_open, "r") as file: |
---|
29 | file.read(0) |
---|
30 | for line in file: |
---|
31 | if not line.startswith("#"): |
---|
32 | for word in line.split(" "): |
---|
33 | if "config_" in word: |
---|
34 | yield word |
---|
35 | break |
---|
36 | |
---|
37 | def foldername_list_generator(file_to_open): |
---|
38 | word = "" |
---|
39 | |
---|
40 | with open(file_to_open, "r") as file: |
---|
41 | file.read(0) |
---|
42 | for line in file: |
---|
43 | if not line.startswith("#"): |
---|
44 | for word in line.split(" "): |
---|
45 | if word.startswith("test_"): |
---|
46 | yield word |
---|
47 | break |
---|
48 | |
---|
49 | def result_list_generator(file_to_open): |
---|
50 | word = "" |
---|
51 | with open(file_to_open, "r") as file: |
---|
52 | file.read(0) |
---|
53 | for line in file: |
---|
54 | if not line.startswith("#"): |
---|
55 | for word in line.split(" "): |
---|
56 | if word == '-1' or word == '0' or word == '1': |
---|
57 | yield(word) |
---|
58 | break |
---|
59 | |
---|
60 | def OSinfo(runthis): |
---|
61 | red = lambda text: '\033[0;31m' + text + '\033[0m' |
---|
62 | osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) |
---|
63 | theInfo = osstdout.communicate()[0].strip() |
---|
64 | if osstdout.returncode!=0: |
---|
65 | print(red(runthis+" FAILED")) |
---|
66 | print >> sys.stderr, osstdout.returncode |
---|
67 | sys.exit() |
---|
68 | # else: |
---|
69 | # print(runthis+" OK") |
---|
70 | |
---|
71 | def main(): |
---|
72 | unfold_icon = '⮯' |
---|
73 | fold_icon = '⮭' |
---|
74 | |
---|
75 | current_revision_report = sys.argv[1] |
---|
76 | |
---|
77 | if os.path.exists(current_revision_report) : |
---|
78 | file_to_open=current_revision_report |
---|
79 | else : |
---|
80 | file_to_open="plein_report_example.txt" |
---|
81 | |
---|
82 | |
---|
83 | f=open(file_to_open, "r") |
---|
84 | for line in f : |
---|
85 | if line.startswith("#revision"): |
---|
86 | revision_number = line.split(" ")[1].replace("\n", "") |
---|
87 | elif line.startswith("#build_dir"): |
---|
88 | build_dir = line.split(" ")[1].replace("\n", "") |
---|
89 | elif line.startswith("#arch"): |
---|
90 | arch = line.split(" ")[1].replace("\n", "") |
---|
91 | elif line.startswith("#machine"): |
---|
92 | machine = line.split(" ")[1].replace("\n", "") |
---|
93 | if machine == "jeanzay": |
---|
94 | machine = "Jean-Zay" |
---|
95 | elif machine == "irene": |
---|
96 | machine = "Irene" |
---|
97 | else : |
---|
98 | machine = "other" |
---|
99 | elif line.startswith("#relurl"): |
---|
100 | words = line.split("/") |
---|
101 | words_size = len(words) |
---|
102 | branch = words[words_size-1].replace("\n", "") |
---|
103 | |
---|
104 | folderlist=[] |
---|
105 | for x in foldername_list_generator(file_to_open): |
---|
106 | folderlist.append(x) |
---|
107 | |
---|
108 | configlist=[] |
---|
109 | for x in configname_list_generator(file_to_open): |
---|
110 | configlist.append(x) |
---|
111 | |
---|
112 | filelist=[] |
---|
113 | for x in filename_list_generator(file_to_open): |
---|
114 | filelist.append(x) |
---|
115 | |
---|
116 | resultlist=[] |
---|
117 | for x in result_list_generator(file_to_open): |
---|
118 | resultlist.append(x) |
---|
119 | |
---|
120 | total_records = len(resultlist) |
---|
121 | |
---|
122 | c = Counter(folderlist) |
---|
123 | nb_level1 = len(c) |
---|
124 | |
---|
125 | my_struncture = dict() |
---|
126 | |
---|
127 | for i in range(nb_level1): |
---|
128 | my_key1 = list(c.keys())[i] # algo_name |
---|
129 | my_struncture.update({my_key1 : dict()}) |
---|
130 | min_range=-1 |
---|
131 | for index in range(total_records) : |
---|
132 | if my_key1 == folderlist[index] : |
---|
133 | if min_range == -1 : |
---|
134 | min_range = index |
---|
135 | max_range = index |
---|
136 | else : |
---|
137 | max_range = index |
---|
138 | cc = Counter(configlist[min_range: max_range+1]) |
---|
139 | nb_level2 = len(cc) |
---|
140 | |
---|
141 | for j in range(nb_level2) : |
---|
142 | my_key2 = list(cc.keys())[j] #config_name |
---|
143 | my_struncture[my_key1].update({my_key2:dict()}) |
---|
144 | min_range = -1 |
---|
145 | for index in range(total_records) : |
---|
146 | if my_key2 == configlist[index] : |
---|
147 | if min_range == -1 : |
---|
148 | min_range = index |
---|
149 | max_range = index |
---|
150 | else : |
---|
151 | max_range = index |
---|
152 | |
---|
153 | ccc = Counter(filelist[min_range: max_range+1]) |
---|
154 | nb_level3 = len(ccc) |
---|
155 | |
---|
156 | for k in range(nb_level3) : |
---|
157 | my_key3 = list(ccc.keys())[k] #filename |
---|
158 | |
---|
159 | min_range = -1 |
---|
160 | for index in range(total_records) : |
---|
161 | if my_key3 == filelist[index] : |
---|
162 | if min_range == -1 : |
---|
163 | min_range = index |
---|
164 | max_range = index |
---|
165 | else : |
---|
166 | max_range = index |
---|
167 | my_struncture[my_key1][my_key2].update({my_key3:resultlist[min_range]}) |
---|
168 | |
---|
169 | |
---|
170 | |
---|
171 | nb_algo = len(my_struncture) |
---|
172 | |
---|
173 | for x in range(nb_algo) : |
---|
174 | algo_name = list(my_struncture.keys())[x] |
---|
175 | nb_config = len(my_struncture[algo_name]) |
---|
176 | for y in range(nb_config) : |
---|
177 | config_name = list(my_struncture[algo_name].keys())[y] |
---|
178 | nb_file = len(my_struncture[algo_name][config_name]) |
---|
179 | |
---|
180 | |
---|
181 | algo_names=list(my_struncture.keys()) |
---|
182 | |
---|
183 | nb_files = [0]*nb_algo |
---|
184 | nb_configs = [0]*nb_algo |
---|
185 | |
---|
186 | for x in range(nb_algo) : |
---|
187 | nb_files[x] = len(my_struncture[list(my_struncture.keys())[x]][list(my_struncture[list(my_struncture.keys())[x]].keys())[0]]) |
---|
188 | nb_configs[x] = len(my_struncture[list(my_struncture.keys())[x]]) |
---|
189 | |
---|
190 | |
---|
191 | level1_answer=1 |
---|
192 | level2_answer=[1]*nb_algo |
---|
193 | |
---|
194 | level3_answer = [[]]*nb_algo |
---|
195 | for x in range(nb_algo) : |
---|
196 | level3_answer[x] = [1]*nb_configs[x] |
---|
197 | |
---|
198 | level4_answer = [[[]]]*nb_algo |
---|
199 | for x in range(nb_algo) : |
---|
200 | level4_answer[x] = [[]]*nb_configs[x] |
---|
201 | for y in range(nb_configs[x]) : |
---|
202 | level4_answer[x][y] = [1]*nb_files[x] |
---|
203 | for z in range(nb_files[x]) : |
---|
204 | x_dict = my_struncture |
---|
205 | y_dict = x_dict[list(x_dict.keys())[x]] |
---|
206 | z_dict = y_dict[list(y_dict.keys())[y]] |
---|
207 | level4_answer[x][y][z] = int(z_dict[list(z_dict.keys())[z]]) |
---|
208 | |
---|
209 | index=0 |
---|
210 | for x in range(nb_algo): |
---|
211 | for y in range(len(level3_answer[x])): |
---|
212 | for z in range(len(level4_answer[x][y])): |
---|
213 | level3_answer[x][y] = min(level4_answer[x][y][z], level3_answer[x][y]) |
---|
214 | index+=1 |
---|
215 | |
---|
216 | index=0 |
---|
217 | for x in range(len(level2_answer)): |
---|
218 | for y in range(len(level3_answer[x])): |
---|
219 | level2_answer[x] = min(level2_answer[x], level3_answer[x][y]) |
---|
220 | index+=1 |
---|
221 | |
---|
222 | for x in range(len(level2_answer)): |
---|
223 | level1_answer = min(level1_answer, level2_answer[x]) |
---|
224 | |
---|
225 | # ans_dict = {-1: 'Failed', 0: 'Initialized', 1: 'Passed'} |
---|
226 | ans_dict = {-1: '❌', 0: '❎', 1: '✅'} |
---|
227 | |
---|
228 | algo_list = list(my_struncture.keys()) |
---|
229 | |
---|
230 | |
---|
231 | config_list=[] |
---|
232 | for x in range(nb_algo) : |
---|
233 | my_list = list(my_struncture[list(my_struncture.keys())[x]].keys()) |
---|
234 | for y in range(len(my_list)) : |
---|
235 | config_list.append(my_list[y]) |
---|
236 | |
---|
237 | |
---|
238 | file_list=[] |
---|
239 | for x in range(nb_algo) : |
---|
240 | l = list(my_struncture.keys())[x] |
---|
241 | ll = list(my_struncture[l].keys())[0] |
---|
242 | lll = list(my_struncture[l][ll].keys()) |
---|
243 | for y in range(len(lll)) : |
---|
244 | file_list.append(lll[y]) |
---|
245 | |
---|
246 | |
---|
247 | old_config_list=config_list[:] |
---|
248 | for x in range(len(config_list)) : |
---|
249 | word = config_list[x] |
---|
250 | new_word='' |
---|
251 | for i in range(len(word)) : |
---|
252 | if word[i]=="@" : |
---|
253 | new_word = word[i+1:] |
---|
254 | break |
---|
255 | # old_config_list.append(new_word) |
---|
256 | old_config_list[x]=new_word |
---|
257 | word = new_word.replace("config_", "CONFIG: ") |
---|
258 | new_word = word.replace("_", " ") |
---|
259 | config_list[x] = new_word |
---|
260 | |
---|
261 | |
---|
262 | for x in range(len(file_list)) : |
---|
263 | word = file_list[x] |
---|
264 | new_word='' |
---|
265 | for i in range(len(word)) : |
---|
266 | if word[i]=="@" : |
---|
267 | new_word = word[i+1:] |
---|
268 | break |
---|
269 | file_list[x] = new_word |
---|
270 | |
---|
271 | for x in range(len(file_list)) : |
---|
272 | word = file_list[x] |
---|
273 | new_word='' |
---|
274 | for i in range(len(word)) : |
---|
275 | if word[i]=="@" : |
---|
276 | new_word = word[i+1:] |
---|
277 | break |
---|
278 | file_list[x] = new_word |
---|
279 | |
---|
280 | if os.path.exists("xios_table_"+revision_number+".js") : |
---|
281 | print("table for revision "+revision_number+" exists already") |
---|
282 | else : |
---|
283 | f=open("xios_table_"+revision_number+".js", "w") |
---|
284 | f.write("document.write(`\n") |
---|
285 | f.write("<html>\n") |
---|
286 | f.write("<head>\n") |
---|
287 | f.write("</head>\n") |
---|
288 | f.write("<body>\n") |
---|
289 | f.write(" <div id=\"navborder_"+revision_number+"\" class=\"class_navborder\">\n") |
---|
290 | f.write(" <p id=\"xiosinfo\">Information of XIOS source:</p>\n") |
---|
291 | f.write(" <table id=\"xiosinfotable\">\n") |
---|
292 | f.write(" <tr><td>Branch</td><td><em>"+branch+"</em></td></tr>\n") |
---|
293 | f.write(" <tr><td>Revision</td><td><em>"+revision_number+"</em></td></tr>\n") |
---|
294 | f.write(" <tr><td>Machine</td><td><em>"+machine+"</em></td></tr>\n") |
---|
295 | f.write(" <tr><td>Architecture</td><td><em>"+arch+"</em></td></tr>\n") |
---|
296 | f.write(" <tr><td>Compile mode</td><td><em>prod</em></td></tr>\n") |
---|
297 | f.write(" <tr><td>Build directory</td><td><em>"+build_dir+"</em></td></tr>\n") |
---|
298 | f.write(" </table>\n") |
---|
299 | f.write(" </div>\n") |
---|
300 | f.write(" <table id=\"xiostable_"+revision_number+"\" class=\"class_xiostable\">\n") |
---|
301 | f.write(" <thead></thead>\n") |
---|
302 | f.write(" <tfoot></tfoot>\n") |
---|
303 | f.write(" <tbody>\n") |
---|
304 | f.write(" <tr class=\"level1\" style=\"background-color:#85c1e9;font-size:1.6em;\" >\n") |
---|
305 | f.write(" <td>"+revision_number+" XIOS Unit tests <span id=\""+revision_number+"_icon_level1_1\" onclick=\"level1_unfold(\'"+revision_number+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
306 | f.write(" <span id=\""+revision_number+"_icon_level1_2\" onclick=\"level1_fold(\'"+revision_number+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
307 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
308 | f.write(" <div class=\"dropdown-content\">\n") |
---|
309 | f.write(" <a href=\"#\" onclick=\"show_xios_info(\'"+revision_number+"\')\">show/hide XIOS info</a>\n") |
---|
310 | f.write(" <a href=\"#\" onclick=\"show_plein_report(\'"+revision_number+"\')\">show plein report</a>\n") |
---|
311 | f.write(" </div></div></td>\n") |
---|
312 | f.write(" <td></td>\n") |
---|
313 | f.write(" <td></td>\n") |
---|
314 | f.write(" <td style=\"border-left: 0px\" class=\"testanswer\">"+ ans_dict[level1_answer]+"</td>\n") |
---|
315 | f.write(" <td></td>\n") |
---|
316 | f.write(" <td></td>\n") |
---|
317 | f.write(" <td></td>\n") |
---|
318 | f.write(" </tr>\n") |
---|
319 | |
---|
320 | |
---|
321 | x_offset = 0 |
---|
322 | y_offset = 0 |
---|
323 | for x in range(nb_algo): |
---|
324 | f.write(" <tr class=\"level2\" data-algo-type=\""+algo_list[x]+"\" style=\"display:none;background-color:#aed6f1;font-size:1.4em;\">\n") |
---|
325 | f.write(" <td></td>\n") |
---|
326 | f.write(" <td>"+algo_list[x]+" <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_1\" onClick=\"level2_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
327 | f.write(" <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_2\" onClick=\"level2_fold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
328 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
329 | f.write(" <div class=\"dropdown-content\">\n") |
---|
330 | f.write(" <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"(\'"+revision_number+"\')\">show user_params.def</a>\n") |
---|
331 | f.write(" </div></div></td>\n") |
---|
332 | f.write(" <td> </td>\n") |
---|
333 | f.write(" <td> </td>\n") |
---|
334 | f.write(" <td class=\"testanswer\">"+ans_dict[level2_answer[x]]+"</td>\n") |
---|
335 | f.write(" <td> </td>\n") |
---|
336 | f.write(" <td> </td>\n") |
---|
337 | f.write(" </tr>\n") |
---|
338 | |
---|
339 | for y in range(nb_configs[x]): |
---|
340 | f.write(" <tr class=\"level3_"+algo_list[x]+"\" data-algoconfig-type=\""+algo_list[x]+"_"+old_config_list[y_offset]+"\" style=\"display:none;background-color:#d6eaf8;font-size:1.2em;\">\n") |
---|
341 | f.write(" <td></td>\n") |
---|
342 | f.write(" <td></td>\n") |
---|
343 | f.write(" <td>"+config_list[y_offset]+" <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_1\" onClick=\"level3_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
344 | f.write(" <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_2\" onClick=\"level3_fold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
345 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
346 | f.write(" <div class=\"dropdown-content\">\n") |
---|
347 | f.write(" <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show all_param.def</a>\n") |
---|
348 | f.write(" <a href=\"#\" onclick=\"show_user_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show user_param.def</a>\n") |
---|
349 | f.write(" </div></div></td>\n") |
---|
350 | y_position=y_offset |
---|
351 | y_offset+=1 |
---|
352 | f.write(" <td></td>\n") |
---|
353 | f.write(" <td></td>\n") |
---|
354 | f.write(" <td class=\"testanswer\">"+ ans_dict[level3_answer[x][y]]+"</td>\n") |
---|
355 | f.write(" <td></td>\n") |
---|
356 | f.write(" </tr>\n") |
---|
357 | |
---|
358 | for z in range(nb_files[x]): |
---|
359 | f.write(" <tr class=\"level4_"+algo_list[x]+"_"+old_config_list[y_position]+"\" style=\"display:none;background-color:#ebf5fb;\">\n") |
---|
360 | f.write(" <td></td>\n") |
---|
361 | f.write(" <td></td>\n") |
---|
362 | f.write(" <td></td>\n") |
---|
363 | f.write(" <td>"+file_list[x_offset+z]+"</td>\n") |
---|
364 | f.write(" <td></td>\n") |
---|
365 | f.write(" <td></td>\n") |
---|
366 | f.write(" <td></td>\n") |
---|
367 | f.write(" <td class=\"testanswer\">"+ ans_dict[level4_answer[x][y][z]]+"</td>\n") |
---|
368 | f.write(" </tr>\n") |
---|
369 | |
---|
370 | x_offset = x_offset+nb_files[x] |
---|
371 | |
---|
372 | f.write(" </tbody>\n") |
---|
373 | f.write(" </table>\n") |
---|
374 | # f.write("<script>\n") |
---|
375 | # f.write(" var ans = document.getElementsByClassName('testanswer')\n") |
---|
376 | # f.write(" for (var i = 0; i < ans.length; i++) {\n") |
---|
377 | # f.write(" var cell = ans[i]\n") |
---|
378 | # f.write(" if (cell.textContent == 'Passed') {\n") |
---|
379 | # f.write(" cell.classList.add('green') }\n") |
---|
380 | # f.write(" else if (cell.textContent == 'Failed') {\n") |
---|
381 | # f.write(" cell.classList.add('red') }\n") |
---|
382 | # f.write(" else if (cell.textContent == 'Initialized') {\n") |
---|
383 | # f.write(" cell.classList.add('goldenrod') }\n") |
---|
384 | # f.write(" }\n") |
---|
385 | |
---|
386 | # f.write("\n\n") |
---|
387 | |
---|
388 | # f.write("</script>\n") |
---|
389 | |
---|
390 | f.write("</body>\n") |
---|
391 | f.write("</html>\n") |
---|
392 | f.write("`);\n") |
---|
393 | |
---|
394 | |
---|
395 | |
---|
396 | f.close() |
---|
397 | |
---|
398 | |
---|
399 | if __name__== "__main__": |
---|
400 | main() |
---|
401 | |
---|
402 | |
---|