108 border-style: solid; |
109 border-style: solid; |
109 vertical-align: top; |
110 vertical-align: top; |
110 font: Tahoma, Verdana, Arial; |
111 font: Tahoma, Verdana, Arial; |
111 _font-size: 0.8em; |
112 _font-size: 0.8em; |
112 } |
113 } |
113 |
114 div.popup { |
|
115 background-color: #f9fafd; |
|
116 font: #595a5f Tahoma, Verdana, Arial bold; |
|
117 font-size: 0.8em; |
|
118 border-top: 1px #9d9da1; |
|
119 border-bottom: 1px #9d9da1; |
|
120 } |
|
121 div.floater { |
|
122 text-align: left; |
|
123 width: 50%; |
|
124 float: left; |
|
125 } |
|
126 div.floater-right { |
|
127 text-align: right; |
|
128 width: 50%; |
|
129 float: right; |
|
130 } |
|
131 table.log { |
|
132 word-wrap: break-word; |
|
133 border: 1px #EBEBEB; |
|
134 padding: 5px; |
|
135 border-style: solid; |
|
136 vertical-align: top; |
|
137 font: #595a5f Tahoma, Verdana, Arial; |
|
138 font-size: 0.8em; |
|
139 } |
114 .currentValue { |
140 .currentValue { |
115 background-color: #e8f2fe; |
141 background-color: #e8f2fe; |
116 } |
142 } |
117 </style> |
143 </style> |
|
144 <script language="javascript" type="text/javascript"> |
|
145 //<![CDATA[ |
|
146 {% include 'tablefilter.js' without context %} |
|
147 //]]> |
|
148 </script> |
|
149 |
|
150 <script language="javascript" type="text/javascript"> |
|
151 //<![CDATA[ |
|
152 {% include 'popup.js' without context %} |
|
153 //]]> |
|
154 </script> |
|
155 |
118 </head> |
156 </head> |
119 <body> |
157 <body> |
120 |
158 |
121 <h1>Generation summary:</h1> |
159 <h1>Generation summary:</h1> |
122 <table class="summary"> |
160 <table class="summary"> |
123 <tr> |
161 <tr> |
124 <th class="featureName" colspan="2">Statistics</th> |
162 <th class="featureName">Statistics</th> |
125 </tr> |
163 {% for report in rep_data -%} |
126 <tr> |
164 <th class="featureName">{{ report.label }}</th> |
|
165 {% endfor -%} |
|
166 </tr> |
|
167 <tr> |
127 <td>Refs in files</td> |
168 <td>Refs in files</td> |
128 <td>{{ rep_data.nbr_of_refs }}</td> |
169 {% for report in rep_data -%} |
129 </tr> |
170 <td>{{ report.context.changed_refs|length }}</td> |
130 <tr> |
171 {% endfor -%} |
131 <td>Refs with no implementation</td> |
172 </tr> |
132 <td>{{ rep_data.nbr_of_refs_noimpl }}</td> |
173 <tr> |
133 </tr> |
174 <td>Not generated Refs</td> |
134 <tr> |
175 {% for report in rep_data -%} |
135 <th class="featureName" colspan="2">Details</th> |
176 <td>{{ report.context.get_refs_with_no_output()|length }}</td> |
136 </tr> |
177 {% endfor -%} |
|
178 </tr> |
|
179 <tr> |
|
180 <th class="featureName" colspan="{{ rep_data|length + 1 }}">Details</th> |
|
181 </tr> |
137 <tr> |
182 <tr> |
138 <td>Report generated</td> |
183 <td>Report generated</td> |
139 <td>{{ rep_data.generation_time }}</td> |
184 {% for report in rep_data -%} |
|
185 <td>{{ report.generation_time }}</td> |
|
186 {% endfor -%} |
140 </tr> |
187 </tr> |
141 <tr> |
188 <tr> |
142 <td>Generation duration</td> |
189 <td>Generation duration</td> |
143 <td>{{ rep_data.duration }}</td> |
190 {% for report in rep_data -%} |
|
191 <td>{{ report.duration }}</td> |
|
192 {% endfor -%} |
144 </tr> |
193 </tr> |
145 <tr> |
194 <tr> |
146 <td>Generation log</td> |
195 <td>Generation log</td> |
147 <td><a href="file:{{ rep_data.cwd|pathname_to_url }}/cone.log">cone.log</a></td> |
196 {% for report in rep_data -%} |
148 </tr> |
197 <td><a href="file:{{ report.context.log_file|pathname_to_url }}">cone log</a></td> |
149 <tr> |
198 {% endfor -%} |
150 <th class="featureName" colspan="2">Generation options</th> |
199 </tr> |
|
200 <tr> |
|
201 <th class="featureName" colspan="{{ rep_data|length + 1 }}">Generation options</th> |
151 </tr> |
202 </tr> |
152 <tr> |
203 <tr> |
153 <td align="left">Layers</td> |
204 <td align="left">Layers</td> |
154 <td align="left">{{ rep_data.options.layers }}</td> |
205 {% for report in rep_data -%} |
|
206 <td align="left">{{ report.options.layers }}</td> |
|
207 {% endfor -%} |
155 </tr> |
208 </tr> |
156 <tr> |
209 <tr> |
157 <td align="left">Added</td> |
210 <td align="left">Added</td> |
158 <td align="left">{{ rep_data.options.added }}</td> |
211 {% for report in rep_data -%} |
|
212 <td align="left">{{ report.options.added }}</td> |
|
213 {% endfor -%} |
159 </tr> |
214 </tr> |
160 <tr> |
215 <tr> |
161 <td align="left">Dryrun</td> |
216 <td align="left">Dryrun</td> |
162 <td align="left">{{ rep_data.options.dryrun }}</td> |
217 {% for report in rep_data -%} |
|
218 <td align="left">{{ report.options.dryrun }}</td> |
|
219 {% endfor -%} |
163 </tr> |
220 </tr> |
164 <tr> |
221 <tr> |
165 <td align="left">Verbose</td> |
222 <td align="left">Verbose</td> |
166 <td align="left">{{ rep_data.options.verbose }}</td> |
223 {% for report in rep_data -%} |
|
224 <td align="left">{{ report.options.verbose }}</td> |
|
225 {% endfor -%} |
167 </tr> |
226 </tr> |
168 <tr> |
227 <tr> |
169 <td align="left">Overrides</td> |
228 <td align="left">Overrides</td> |
170 <td align="left">{{ rep_data.options.overrides }}</td> |
229 {% for report in rep_data -%} |
|
230 <td align="left">{{ report.options.overrides }}</td> |
|
231 {% endfor -%} |
171 </tr> |
232 </tr> |
172 <tr> |
233 <tr> |
173 <td align="left">Project</td> |
234 <td align="left">Project</td> |
174 <td align="left">{{ rep_data.options.project }}</td> |
235 {% for report in rep_data -%} |
|
236 <td align="left">{{ report.options.project }}</td> |
|
237 {% endfor -%} |
175 </tr> |
238 </tr> |
176 <tr> |
239 <tr> |
177 <td align="left">Report</td> |
240 <td align="left">Report</td> |
178 <td align="left">{{ rep_data.options.report }}</td> |
241 {% for report in rep_data -%} |
|
242 <td align="left">{{ report.options.report }}</td> |
|
243 {% endfor -%} |
179 </tr> |
244 </tr> |
180 <tr> |
245 <tr> |
181 <td align="left">Impls</td> |
246 <td align="left">Impls</td> |
182 <td align="left">{{ rep_data.options.impls }}</td> |
247 {% for report in rep_data -%} |
|
248 <td align="left">{{ report.options.impls }}</td> |
|
249 {% endfor -%} |
|
250 </tr> |
|
251 <tr> |
|
252 <td align="left">Tags</td> |
|
253 {% for report in rep_data -%} |
|
254 <td align="left">{{ report.context.tags }}</td> |
|
255 {% endfor -%} |
183 </tr> |
256 </tr> |
184 <tr> |
257 <tr> |
185 <td align="left">Output</td> |
258 <td align="left">Output</td> |
186 <td align="left">{{ rep_data.options.output }}</td> |
259 {% for report in rep_data -%} |
|
260 <td align="left">{{ report.options.output }}</td> |
|
261 {% endfor -%} |
187 </tr> |
262 </tr> |
188 <tr> |
263 <tr> |
189 <td align="left">Configuration</td> |
264 <td align="left">Configuration</td> |
190 <td align="left">{{ rep_data.options.configuration }}</td> |
265 {% for report in rep_data -%} |
191 </tr> |
266 <td align="left">{{ report.options.configuration }}</td> |
192 <tr> |
267 {% endfor -%} |
193 <td align="left">Working directory</td> |
|
194 <td align="left">{{ rep_data.cwd }}</td> |
|
195 </tr> |
268 </tr> |
196 </table> |
269 </table> |
197 |
270 |
198 <h1>Rule execution results:</h1><br> |
271 <h1>Generation Outputs:</h1><br> |
|
272 <p>Predefined filters:<br> |
|
273 <FORM> |
|
274 <INPUT type="button" value="Refs with no implementation" onclick="tf_outputs.SetFilterValue(1,'None');tf_outputs.SetFilterValue(0, '');tf_outputs.SetFilterValue(2, '');tf_outputs.Filter();return false;" name="Refs with no implementation""> |
|
275 <br> |
|
276 <INPUT type="button" value="Refs with not output" onclick="tf_outputs.SetFilterValue(2, 'None');tf_outputs.SetFilterValue(0, '');tf_outputs.SetFilterValue(1, '');tf_outputs.Filter();return false;" name="Refs with not output"> |
|
277 </FORM> |
|
278 </p> |
|
279 <table class="report" id="outputs"> |
|
280 <tr> |
|
281 <th class="featureName">Settings</th> |
|
282 <th class="featureName">Impl. file</th> |
|
283 <th class="featureName">Outputs</th> |
|
284 </tr> |
|
285 |
|
286 {% macro popup_link(source, linkid, linkname) -%} |
|
287 {% if 'all' in report_options %} |
|
288 <a href="#" onclick="Showpopup({{source}}, '{{linkid}}');return false;">{{ linkname }}</a> |
|
289 {% else %} |
|
290 {{ linkname }} |
|
291 {% endif %} |
|
292 {%- endmacro %} |
|
293 |
|
294 {% macro get_report_colums(reports_list, report_elem) -%} |
|
295 {%- endmacro %} |
|
296 |
|
297 <!-- process the output files --> |
|
298 {% for out in merged_context.get_output() %} |
|
299 <tr> |
|
300 <td> |
|
301 {%- if out.implementation.get_refs() %} |
|
302 {%- for ref in out.implementation.get_refs() %} |
|
303 {%- if ref in merged_context.changed_refs %} |
|
304 {%- if ref in merged_context.temp_features %} |
|
305 <i>{{ popup_link('this', ref+'.apidiv',ref) }}</i><br> |
|
306 {%- else %} |
|
307 <B>{{ popup_link('this', ref+'.apidiv', ref) }}</B><br> |
|
308 {%- endif %} |
|
309 {%- else %} |
|
310 {{ ref }}<br> |
|
311 {%- endif %} |
|
312 {%- endfor %} |
|
313 {%- endif %} |
|
314 </td> |
|
315 <td> |
|
316 {%- if out.type == 'ref' %} |
|
317 Rule: |
|
318 {%- elif out.type == 'exception' %} |
|
319 Exception: |
|
320 {%- endif %} |
|
321 {{ popup_link('this',out.implementation.ref|replace("/", ".") +':'+out.implementation.lineno|string+'.impldiv',out.implementation.ref+':'+out.implementation.lineno|string) }} |
|
322 </td> |
|
323 <td> |
|
324 {%- if out.name != None and out.type != 'exception' %} |
|
325 {{ popup_link('this',out.name|replace("/", ".")|replace("\\", ".")+'.output',out.name) }} |
|
326 {%- else %} |
|
327 <span class="red">None</span><br> |
|
328 {%- endif %} |
|
329 </td> |
|
330 </tr> |
|
331 {%- endfor %} |
|
332 |
|
333 <!-- process the refs with no output --> |
|
334 {%- for ref in merged_context.get_refs_with_no_output(merged_context.get_changed_refs(operation='intersection',ignore_temps=True)) %} |
|
335 <tr> |
|
336 <td> |
|
337 <B> |
|
338 {{ popup_link('this',ref+'.apidiv',ref) }} |
|
339 </B><br> |
|
340 </td> |
|
341 <td> |
|
342 {%- if merged_context.impl_set.get_implementations_with_ref(ref) %} |
|
343 {%- for impl in merged_context.impl_set.get_implementations_with_ref(ref) %} |
|
344 {{ popup_link('this',impl.ref|replace("/", ".")|replace("\\", ".")+'.impldiv',impl.ref) }} |
|
345 {%- endfor %} |
|
346 {%- else %} |
|
347 <span class="red">None</span><br> |
|
348 {%- endif %} |
|
349 </td> |
|
350 <td> |
|
351 <span class="red">None</span><br> |
|
352 </td> |
|
353 </tr> |
|
354 {%- endfor %} |
|
355 |
|
356 </table> |
|
357 |
|
358 <!-- Create extra data divs only when debug is on --> |
|
359 {% if 'all' in report_options %} |
|
360 <!-- Create data divs for feature ref elements --> |
|
361 {%- for feat in merged_context.features.get_features(merged_context.changed_refs) %} |
|
362 <div id="{{ feat.fqr|replace("/", ".") }}.apidiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;"> |
|
363 <table class="report"> |
|
364 <tr><td> |
|
365 <div class="floater"><b>Ref:</b>{{ feat.fqr }}</div> |
|
366 <div class="floater-right"><a href="#" onclick="Popup.hide('{{ feat.fqr }}.apidiv');return false;">Close</a></div> |
|
367 </td></tr> |
|
368 <tr><td> |
|
369 <div> |
|
370 <b>Name: </b>{{ feat.name }}<br> |
|
371 <b>Type: </b>{{ feat.type }}<br> |
|
372 <b>ConfML: </b><a href="file:{{ rep_data[0].project_dir|pathname_to_url }}/{{ feat.get_proxied_obj().get_configuration_path()|pathname_to_url }}">{{ feat.get_proxied_obj().get_configuration_path() }}</a> |
|
373 </div> |
|
374 </tr></td> |
|
375 </table> |
|
376 <b>Data: </b> |
|
377 <table class="report"> |
|
378 {%- if feat.is_sequence_root() %} |
|
379 <tr> |
|
380 {%- for columnfea in feat.get_column_features() %} |
|
381 <th class="th.header">{{ columnfea.ref }}</th> |
|
382 {%- endfor %} |
|
383 </tr> |
|
384 {%- for row in feat.get_value() %} |
|
385 <tr> |
|
386 {%- for col in row %} |
|
387 <td>{{ col|e|xml_charref_replace }}</td> |
|
388 {%- endfor %} |
|
389 </tr> |
|
390 {%- endfor %} |
|
391 {%- else %} |
|
392 {%- for data in feat.get_datas() %} |
|
393 {% if loop.first %} |
|
394 <tr> |
|
395 <th class="th.header">Layer</th> |
|
396 <th class="th.header">Value</th> |
|
397 </tr> |
|
398 {% endif -%} |
|
399 {% if not data.template %} |
|
400 <tr> |
|
401 <td><a href="file:{{ rep_data[0].project_dir|pathname_to_url }}/{{ data.get_configuration_path()|pathname_to_url }}">{{ data.get_configuration_path() }}</a></td> |
|
402 <td>{{ data.get_value()|e|xml_charref_replace }}</td> |
|
403 </tr> |
|
404 {% endif -%} |
|
405 {% endfor %} |
|
406 {% endif -%} |
|
407 </table> |
|
408 </div> |
|
409 {%- endfor %} |
199 |
410 |
200 <table class="report"> |
411 <!-- Create data divs for generation output elements --> |
201 <tr> |
412 {% for output in merged_context.outputs.values() %} |
202 <th class="featureName">File</th> |
413 <div id="{{ output.name|replace("/", ".")|replace("\\", ".") }}.output" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;"> |
203 <th class="featureName">Rule No.</th> |
414 <table class="report"> |
204 <th class="featureName">Input refs</th> |
415 <tr><td> |
205 <th class="featureName">Affected refs</th> |
416 <div class="floater"><b>Ref:</b>{{ output.name }}</div> |
206 </tr> |
417 <div class="floater-right"><a href="#" onclick="Popup.hide('{{ output.name|replace("/", ".")|replace("\\", ".") }}.output');return false;">Close</a></div> |
207 |
418 </td></tr> |
208 {% for result in rep_data.rule_exec_results %} |
419 <tr><td> |
209 {#- Report only rule executions that affected something #} |
420 <div> |
210 {%- if result.affected_refs|length > 0 %} |
421 <b>Implml: </b>{{ output.implementation }}<br> |
211 <tr> |
422 <b>Type: </b>{{ output.type }}<br> |
212 <a name="rule:{{result.source}}:{{result.index}}"/> |
423 {% if output.type == 'file' %} |
213 <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ result.source|pathname_to_url }}">{{ result.source }}</a></td> |
424 <b>File: </b><a href="file:{{ output.abspath|pathname_to_url }}">{{ output.name }}</a><br> |
214 <td>{{result.index}}</td> |
425 {% elif output.type == 'ref' %} |
215 <td> |
426 <b>Target ref: </b>{{ output.name }} <a href="#" onclick="tf_outputs.SetFilterValue(0, '{{output.name}}');tf_outputs.SetFilterValue(1, '');tf_outputs.SetFilterValue(2, '');tf_outputs.Filter();return false;">filter</a><br> |
216 {%- for ref in result.input_refs -%} |
427 {% elif output.type == 'exception' %} |
217 {{ref}}<br/> |
428 <b>Exception: </b>{{ output.exception }}<br> |
218 {% endfor %} |
429 {% endif %} |
219 </td> |
430 <b>Related log entries: </b><br> |
220 <td> |
431 <table class="log"> |
221 {%- for ref in result.affected_refs -%} |
432 {% for log in merged_context.grep_log(output.filename) -%} |
222 {{ref}}<br/> |
433 <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr> |
223 {% endfor %} |
434 {% endfor -%} |
224 </td> |
435 </table> |
225 </tr> |
436 </div> |
226 {% endif -%} |
437 </tr></td> |
|
438 </table> |
|
439 </div> |
|
440 {% endfor %} |
|
441 |
|
442 <!-- Create data divs for generation specific implementation elements --> |
|
443 {% for output in merged_context.outputs.values() %} |
|
444 <div id="{{ output.implementation.ref|replace("/", ".") }}:{{ output.implementation.lineno }}.impldiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;"> |
|
445 <table class="report"> |
|
446 <tr><td> |
|
447 <div class="floater"><b>Ref:</b>{{ output.name }}</div> |
|
448 <div class="floater-right"><a href="#" onclick="Popup.hide('{{ output.implementation.ref|replace("/", ".") }}:{{ output.implementation.lineno }}.impldiv');return false;">Close</a></div> |
|
449 </td></tr> |
|
450 <tr><td> |
|
451 <div> |
|
452 <b>Implml: </b>{{ output.implementation }}<br> |
|
453 <b>Type: </b>{{ output.implementation.__class__.__name__ }}<br> |
|
454 <b>File: </b><a href="file:{{ [rep_data[0].project_dir,output.implementation.ref]|join('/')|pathname_to_url }}">{{ output.implementation.ref }}</a><br> |
|
455 <b>Line: </b>{{output.implementation.lineno}}<br> |
|
456 {% if output.type == 'exception' %} |
|
457 <b>Exception: </b>{{ output.exception }}<br> |
|
458 {% endif %} |
|
459 <b>Related log entries: </b><br> |
|
460 <table class="log"> |
|
461 {% for log in merged_context.grep_log(output.implementation.ref) -%} |
|
462 <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr> |
|
463 {% endfor -%} |
|
464 </table> |
|
465 </div> |
|
466 </tr></td> |
|
467 </table> |
|
468 </div> |
227 {% endfor %} |
469 {% endfor %} |
228 |
470 |
229 </table> |
471 <!-- Create data divs for implementation elements --> |
|
472 {% for impl in merged_context.impl_dict.values() %} |
|
473 <div id="{{ impl.ref|replace("/", ".")|replace("\\", ".") }}.impldiv" style="background-color:#f9fafd;border:1px solid black;display:none;padding:2px;width:50%;"> |
|
474 <table class="report"> |
|
475 <tr><td> |
|
476 <div class="floater"><b>Ref:</b>{{ impl.ref|replace("/", ".")|replace("\\", ".") }}}</div> |
|
477 <div class="floater-right"><a href="#" onclick="Popup.hide('{{ impl.ref|replace("/", ".")|replace("\\", ".") }}.impldiv');return false;">Close</a></div> |
|
478 </td></tr> |
|
479 <tr><td> |
|
480 <div> |
|
481 <b>Implml: </b><a href="file:{{ [rep_data[0].project_dir,impl.ref]|join('/')|pathname_to_url }}">{{ impl.ref }}</a><br> |
|
482 <b>Type: </b>{{ impl.__class__.__name__ }}<br> |
|
483 <b>Related log entries: </b><br> |
|
484 <table class="log"> |
|
485 {% for log in merged_context.grep_log(impl.ref) -%} |
|
486 <tr><td>{{ log[0] }}</td><td>{{ log[1] }}</td></tr> |
|
487 {% endfor -%} |
|
488 </table> |
230 |
489 |
231 |
490 </div> |
232 <h1>Output files:</h1><br> |
491 </tr></td> |
233 |
492 </table> |
234 <table class="report"> |
493 </div> |
235 <tr> |
494 {% endfor %} |
236 <th class="featureName">API</th> |
495 {% endif %} <!-- verbose 3 --> |
237 <th class="featureName">Data</th> |
496 |
238 <th class="featureName">Impl. file</th> |
497 <script language="javascript" type="text/javascript"> |
239 <th class="featureName">Impl. type</th> |
498 //<![CDATA[ |
240 <th class="featureName">Generated for</th> |
499 var output_Props = { |
241 <th class="featureName">Output files</th> |
500 paging: false, |
242 </tr> |
501 highlight_keywords: true, |
243 {% for feat in rep_data.lines %} |
502 rows_counter: true, |
244 |
503 rows_counter_text: "Rows:", |
245 <tr> |
504 btn_reset: true, |
246 <td align="left" rowspan={{ feat.nbr_impls }}> |
505 loader: true, |
247 {% if feat.is_temp_feature -%} |
506 loader_text: "Filtering data..." |
248 <b><i>{{ feat.ref }}</i></b><br> |
507 }; |
249 {%- else -%} |
508 setFilterGrid("outputs", output_Props); |
250 <b>{{ feat.ref }}</b><br> |
|
251 {%- endif %} |
|
252 <b>Name: </b>{{ feat.feat_name }}<br> |
|
253 <b>Type: </b>{{ feat.feat_type }}<br> |
|
254 <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a> |
|
255 </td> |
|
256 <td align="left" rowspan={{ feat.nbr_impls }}> |
|
257 <table class="report"> |
|
258 |
509 |
259 {% for data in feat.datas %} |
510 function Showpopup(item_over, popup_ref) |
260 {% if loop.first %} |
511 { |
261 <tr> |
512 Popup.show(popup_ref, item_over,'top left', {'offsetTop':20}); |
262 <th class="th.header">Layer</th> |
513 } |
263 <th class="th.header">Value</th> |
514 //]]> |
264 </tr> |
515 </script> |
265 <tr> |
516 |
266 <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td> |
|
267 <td>{{ data.value|e|xml_charref_replace }}</td> |
|
268 </tr> |
|
269 {% else %} |
|
270 <tr> |
|
271 <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td> |
|
272 <td>{{ data.value|e|xml_charref_replace }}</td> |
|
273 </tr> |
|
274 {% endif %} |
|
275 {% endfor %} |
|
276 </table> |
|
277 |
|
278 <table class="report"> |
|
279 {% for data in feat.seq_data %} |
|
280 {% if loop.first %} |
|
281 <tr> |
|
282 <th class="th.header">Setting</th> |
|
283 <th class="th.header">Value</th> |
|
284 </tr> |
|
285 <tr> |
|
286 <td><b>{{ data[0]|e|xml_charref_replace }}</b></td> |
|
287 <td> |
|
288 {% for value in data[1] %} |
|
289 {{ value|e|xml_charref_replace }}<br> |
|
290 {% endfor %} |
|
291 </td> |
|
292 </tr> |
|
293 {% else %} |
|
294 <tr> |
|
295 <td><b>{{ data[0]|e|xml_charref_replace }}</b></td> |
|
296 <td> |
|
297 {% for value in data[1] %} |
|
298 {{ value|e|xml_charref_replace }}<br> |
|
299 {% endfor %} |
|
300 </td> |
|
301 </tr> |
|
302 {% endif %} |
|
303 {% endfor %} |
|
304 </table> |
|
305 |
|
306 {% for impl in feat.impls %} |
|
307 {% if loop.first %} |
|
308 <td align="left"> |
|
309 <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a> |
|
310 </td> |
|
311 <td align="left"> |
|
312 {{ impl.type }} |
|
313 </td> |
|
314 <td align="left"> |
|
315 {{ ', '.join(impl.generation_runs) }} |
|
316 </td> |
|
317 <td align="left"> |
|
318 {% for output in impl.outputfiles -%} |
|
319 {% if output.exists %} |
|
320 <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br> |
|
321 {% else %} |
|
322 <span class="red">{{ output.filename }}</span><br> |
|
323 {% endif %} |
|
324 {%- endfor %} |
|
325 </td> |
|
326 {% else %} |
|
327 <tr> |
|
328 <td align="left"> |
|
329 <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a> |
|
330 </td> |
|
331 <td align="left"> |
|
332 {{ impl.type }} |
|
333 </td> |
|
334 <td align="left"> |
|
335 {{ ', '.join(impl.generation_runs) }} |
|
336 </td> |
|
337 <td align="left"> |
|
338 {% for output in impl.outputfiles %} |
|
339 {% if output.exists %} |
|
340 <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br> |
|
341 {% else %} |
|
342 <span class="red">{{ output.filename }}</span><br> |
|
343 {% endif %} |
|
344 {% endfor %} |
|
345 </td> |
|
346 </tr> |
|
347 {% endif %} |
|
348 |
|
349 {% endfor %} |
|
350 </tr> |
|
351 {% endfor %} |
|
352 </table> |
|
353 |
|
354 <h1>Refs with no implementation:</h1><br> |
|
355 |
|
356 <table class="report"> |
|
357 <tr> |
|
358 <th class="featureName">API</th> |
|
359 <th class="featureName">Data</th> |
|
360 </tr> |
|
361 {% for feat in rep_data.ref_noimpl %} |
|
362 <tr> |
|
363 <td align="left" > |
|
364 {% if feat.is_temp_feature -%} |
|
365 <b><i>{{ feat.ref }}</i></b><br> |
|
366 {%- else -%} |
|
367 <b>{{ feat.ref }}</b><br> |
|
368 {%- endif %} |
|
369 <b>Name: </b>{{ feat.feat_name|e|xml_charref_replace }}<br> |
|
370 <b>Type: </b>{{ feat.feat_type|e|xml_charref_replace }}<br> |
|
371 <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a> |
|
372 </td> |
|
373 <td align="left"> |
|
374 <table class="report"> |
|
375 |
|
376 {% for data in feat.datas %} |
|
377 {% if loop.first %} |
|
378 <tr> |
|
379 <th class="th.header">Layer</th> |
|
380 <th class="th.header">Value</th> |
|
381 </tr> |
|
382 <tr> |
|
383 <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td> |
|
384 <td>{{ data.value|e|xml_charref_replace }}</td> |
|
385 </tr> |
|
386 {% else %} |
|
387 <tr> |
|
388 <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td> |
|
389 <td>{{ data.value|e|xml_charref_replace }}</td> |
|
390 </tr> |
|
391 {% endif %} |
|
392 {% endfor %} |
|
393 </table> |
|
394 |
|
395 <table class="report"> |
|
396 {% for data in feat.seq_data %} |
|
397 {% if loop.first %} |
|
398 <tr> |
|
399 <th class="th.header">Setting</th> |
|
400 <th class="th.header">Value</th> |
|
401 </tr> |
|
402 <tr> |
|
403 <td><b>{{ data[0] }}</b></td> |
|
404 <td> |
|
405 {% for value in data[1] %} |
|
406 {{ value|e|xml_charref_replace }}<br> |
|
407 {% endfor %} |
|
408 </td> |
|
409 </tr> |
|
410 {% else %} |
|
411 <tr> |
|
412 <td><b>{{ data[0] }}</b></td> |
|
413 <td> |
|
414 {% for value in data[1] %} |
|
415 {{ value|e|xml_charref_replace }}<br> |
|
416 {% endfor %} |
|
417 </td> |
|
418 </tr> |
|
419 {% endif %} |
|
420 {% endfor %} |
|
421 </table> |
|
422 </tr> |
|
423 {% endfor %} |
|
424 </table> |
|
425 <h1>Not generated output files:</h1><br> |
|
426 |
|
427 <table class="report"> |
|
428 <tr> |
|
429 <th class="featureName">Output file</th> |
|
430 </tr> |
|
431 {% for file in rep_data.missing_output_files %} |
|
432 <tr> |
|
433 <td align="left" > |
|
434 {{ file.filename }} |
|
435 </td> |
|
436 {% endfor %} |
|
437 </table> |
|
438 |
517 |
439 </body> |
518 </body> |
440 </html> |
519 </html> |