report_builder_fix 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/report_builder +1 -1
- data/bin/report_builder_fix +1 -1
- data/lib/.DS_Store +0 -0
- data/lib/report_builder/builder.rb +284 -0
- data/lib/report_builder/core-ext/hash.rb +10 -0
- data/lib/report_builder.rb +429 -0
- data/template/error.erb +21 -0
- data/template/errors.erb +5 -0
- data/template/feature.erb +16 -0
- data/template/features.erb +6 -0
- data/template/footer.erb +46 -0
- data/template/group_errors.erb +18 -0
- data/template/group_features.erb +18 -0
- data/template/group_overview.erb +33 -0
- data/template/group_report.erb +39 -0
- data/template/group_summary.erb +25 -0
- data/template/head.erb +22 -0
- data/template/header.erb +29 -0
- data/template/hook.erb +31 -0
- data/template/overview.erb +29 -0
- data/template/report.erb +37 -0
- data/template/scenario.erb +35 -0
- data/template/scenarios.erb +14 -0
- data/template/step.erb +32 -0
- data/template/summary.erb +27 -0
- data/template/summary_row.erb +35 -0
- metadata +29 -14
@@ -0,0 +1,429 @@
|
|
1
|
+
require_relative 'report_builder/builder'
|
2
|
+
|
3
|
+
##
|
4
|
+
# ReportBuilder Main module
|
5
|
+
#
|
6
|
+
module ReportBuilder
|
7
|
+
|
8
|
+
##
|
9
|
+
# ReportBuilder options
|
10
|
+
#
|
11
|
+
def self.options
|
12
|
+
@options ||= {
|
13
|
+
input_path: Dir.pwd,
|
14
|
+
report_types: [:html],
|
15
|
+
report_title: 'Test Results',
|
16
|
+
include_images: true,
|
17
|
+
voice_commands: false,
|
18
|
+
additional_info: {},
|
19
|
+
report_path: 'test_report',
|
20
|
+
color: 'brown'
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Configure ReportBuilder
|
26
|
+
#
|
27
|
+
# Example:
|
28
|
+
#
|
29
|
+
# ReportBuilder.configure do |config|
|
30
|
+
# config.input_path = 'cucumber_sample/logs'
|
31
|
+
# config.report_path = 'my_test_report'
|
32
|
+
# config.report_types = [:RETRY, :HTML]
|
33
|
+
# config.report_title = 'My Test Results'
|
34
|
+
# config.include_images = true
|
35
|
+
# config.voice_commands = true
|
36
|
+
# config.additional_info = {Browser: 'Chrome', Environment: 'Stage 5'}
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
def self.configure
|
40
|
+
options
|
41
|
+
more_options = OpenStruct.new
|
42
|
+
yield more_options if block_given?
|
43
|
+
@options.merge! more_options.marshal_dump
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Build Report
|
48
|
+
#
|
49
|
+
# @param [Hash] more_options override the default and configured options.
|
50
|
+
#
|
51
|
+
# Example:
|
52
|
+
#
|
53
|
+
# options = {
|
54
|
+
# json_path: 'cucumber_sample/logs',
|
55
|
+
# report_path: 'my_test_report',
|
56
|
+
# report_types: ['retry', 'html'],
|
57
|
+
# report_title: 'My Test Results',
|
58
|
+
# include_images: true,
|
59
|
+
# voice_commands: true,
|
60
|
+
# color: 'deep-purple',
|
61
|
+
# additional_info: {'browser' => 'Chrome', 'environment' => 'Stage 5'}
|
62
|
+
# }
|
63
|
+
#
|
64
|
+
# ReportBuilder.build_report options
|
65
|
+
#
|
66
|
+
def self.build_report(more_options = {})
|
67
|
+
options
|
68
|
+
if more_options.is_a? String
|
69
|
+
@options[:input_path] = more_options
|
70
|
+
elsif more_options.is_a? Hash
|
71
|
+
@options.merge! more_options
|
72
|
+
end
|
73
|
+
@options[:input_path] = @options[:json_path] if @options[:json_path]
|
74
|
+
@options[:report_types] = [@options[:report_types]] unless @options[:report_types].is_a? Array
|
75
|
+
@options[:report_types].map!(&:to_s).map!(&:upcase)
|
76
|
+
Builder.new.build_report
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Set Report Builder input json files path / array of json files or path / hash of json files or path
|
81
|
+
#
|
82
|
+
# @param [String/Array/Hash] json_path input json files path / array of json files or path / hash of json files or path
|
83
|
+
#
|
84
|
+
# Example:
|
85
|
+
#
|
86
|
+
# ReportBuilder.json_path = 'my_project/cucumber_json'
|
87
|
+
#
|
88
|
+
def self.json_path=(json_path)
|
89
|
+
options
|
90
|
+
@options[:input_path] = json_path
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Returns Report Builder input json files path / array of json files or path / hash of json files or path
|
95
|
+
#
|
96
|
+
# @return [String/Array/Hash] json_path input json files path / array of json files or path / hash of json files or path
|
97
|
+
#
|
98
|
+
def self.json_path
|
99
|
+
options[:input_path]
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Set Report Builder input json files path / array of json files or path / hash of json files or path
|
104
|
+
#
|
105
|
+
# @param [String/Array/Hash] input_path input json files path / array of json files or path / hash of json files or path
|
106
|
+
#
|
107
|
+
# Example:
|
108
|
+
#
|
109
|
+
# ReportBuilder.input_path = 'my_project/cucumber_json'
|
110
|
+
#
|
111
|
+
def self.input_path=(input_path)
|
112
|
+
options
|
113
|
+
@options[:input_path] = input_path
|
114
|
+
end
|
115
|
+
|
116
|
+
##
|
117
|
+
# Returns Report Builder input json files path / array of json files or path / hash of json files or path
|
118
|
+
#
|
119
|
+
# @return [String/Array/Hash] input_path input json files path / array of json files or path / hash of json files or path
|
120
|
+
#
|
121
|
+
def self.input_path
|
122
|
+
options[:input_path]
|
123
|
+
end
|
124
|
+
|
125
|
+
##
|
126
|
+
# Set Report Builder report_types :json, :html, :retry (output file types)
|
127
|
+
#
|
128
|
+
# @param [Array] report_types :json, :html, :retry (output file types)
|
129
|
+
#
|
130
|
+
# Example:
|
131
|
+
#
|
132
|
+
# ReportBuilder.report_types = [:html, :retry]
|
133
|
+
#
|
134
|
+
def self.report_types=(report_types)
|
135
|
+
options
|
136
|
+
@options[:report_types] = report_types.is_a? Array ? report_types : [report_types]
|
137
|
+
end
|
138
|
+
|
139
|
+
##
|
140
|
+
# Returns Report Builder report_types :json, :html, :retry (output file types)
|
141
|
+
#
|
142
|
+
# @return [Array] report_types :json, :html, :retry (output file types)
|
143
|
+
#
|
144
|
+
def self.report_types
|
145
|
+
options[:report_types]
|
146
|
+
end
|
147
|
+
|
148
|
+
##
|
149
|
+
# Set Report Builder HTML report title
|
150
|
+
#
|
151
|
+
# @param [String] report_title HTML report title
|
152
|
+
#
|
153
|
+
# Example:
|
154
|
+
#
|
155
|
+
# ReportBuilder.report_title = 'My Report'
|
156
|
+
#
|
157
|
+
def self.report_title=(report_title)
|
158
|
+
options
|
159
|
+
@options[:report_title] = report_title if report_title.is_a? String
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Returns Report Builder HTML report title
|
164
|
+
#
|
165
|
+
# @return [String] report_title HTML report title
|
166
|
+
#
|
167
|
+
def self.report_title
|
168
|
+
options[:report_title]
|
169
|
+
end
|
170
|
+
|
171
|
+
##
|
172
|
+
# Set Report Builder include or excluding embedded images
|
173
|
+
#
|
174
|
+
# @param [Boolean] include_images include or excluding embedded images
|
175
|
+
#
|
176
|
+
# Example:
|
177
|
+
#
|
178
|
+
# ReportBuilder.include_images = false
|
179
|
+
#
|
180
|
+
def self.include_images=(include_images)
|
181
|
+
options
|
182
|
+
@options[:include_images] = include_images if !!include_images == include_images
|
183
|
+
end
|
184
|
+
|
185
|
+
##
|
186
|
+
# Returns Report Builder include or excluding embedded images
|
187
|
+
#
|
188
|
+
# @return [Boolean] include_images include or excluding embedded images
|
189
|
+
#
|
190
|
+
def self.include_images
|
191
|
+
options[:include_images]
|
192
|
+
end
|
193
|
+
|
194
|
+
##
|
195
|
+
# Set Report Builder enable or disable voice commands
|
196
|
+
#
|
197
|
+
# @param [Boolean] voice_commands enable or disable voice commands
|
198
|
+
#
|
199
|
+
# Example:
|
200
|
+
#
|
201
|
+
# ReportBuilder.voice_commands = true
|
202
|
+
#
|
203
|
+
def self.voice_commands=(voice_commands)
|
204
|
+
options
|
205
|
+
@options[:voice_commands] = voice_commands if !!voice_commands == voice_commands
|
206
|
+
end
|
207
|
+
|
208
|
+
##
|
209
|
+
# Returns Report Builder enable or disable voice commands
|
210
|
+
#
|
211
|
+
# @return [Boolean] voice_commands enable or disable voice commands
|
212
|
+
#
|
213
|
+
def self.voice_commands
|
214
|
+
options[:voice_commands]
|
215
|
+
end
|
216
|
+
|
217
|
+
##
|
218
|
+
# Set Report Builder additional info for report summary
|
219
|
+
#
|
220
|
+
# @param [Hash] additional_info additional info for report summary
|
221
|
+
#
|
222
|
+
# Example:
|
223
|
+
#
|
224
|
+
# ReportBuilder.additional_info = {'Environment' => 'Abc Environment', 'Browser' => 'Chrome'}
|
225
|
+
#
|
226
|
+
def self.additional_info=(additional_info)
|
227
|
+
options
|
228
|
+
@options[:additional_info] = additional_info if additional_info.is_a? Hash
|
229
|
+
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Returns Report Builder additional info for report summary
|
233
|
+
#
|
234
|
+
# @return [Hash] additional_info additional info for report summary
|
235
|
+
#
|
236
|
+
def self.additional_info
|
237
|
+
options[:additional_info]
|
238
|
+
end
|
239
|
+
|
240
|
+
##
|
241
|
+
# Set Report Builder reports output file path with file name without extension
|
242
|
+
#
|
243
|
+
# @param [String] report_path reports output file path with file name without extension
|
244
|
+
#
|
245
|
+
# Example:
|
246
|
+
#
|
247
|
+
# ReportBuilder.report_path = 'reports/report'
|
248
|
+
#
|
249
|
+
def self.report_path=(report_path)
|
250
|
+
options
|
251
|
+
options[:report_path] = report_path if report_path.is_a? String
|
252
|
+
end
|
253
|
+
|
254
|
+
##
|
255
|
+
# Returns Report Builder reports output file path with file name without extension
|
256
|
+
#
|
257
|
+
# @return [String] report_path reports output file path with file name without extension
|
258
|
+
#
|
259
|
+
def self.report_path
|
260
|
+
options[:report_path]
|
261
|
+
end
|
262
|
+
|
263
|
+
##
|
264
|
+
# Set Report Builder json report output file path with file name without extension
|
265
|
+
#
|
266
|
+
# @param [String] json_report_path json report output file path with file name without extension
|
267
|
+
#
|
268
|
+
# Example:
|
269
|
+
#
|
270
|
+
# ReportBuilder.json_report_path = 'reports/report'
|
271
|
+
#
|
272
|
+
def self.json_report_path=(json_report_path)
|
273
|
+
options
|
274
|
+
@options[:json_report_path] = json_report_path if json_report_path.is_a? String
|
275
|
+
end
|
276
|
+
|
277
|
+
##
|
278
|
+
# Returns Report Builder json report output file path with file name without extension
|
279
|
+
#
|
280
|
+
# @return [String] json_report_path json report output file path with file name without extension
|
281
|
+
#
|
282
|
+
def self.json_report_path
|
283
|
+
options[:json_report_path] || options[:report_path]
|
284
|
+
end
|
285
|
+
|
286
|
+
##
|
287
|
+
# Set Report Builder html report output file path with file name without extension
|
288
|
+
#
|
289
|
+
# @param [String] html_report_path html report output file path with file name without extension
|
290
|
+
#
|
291
|
+
# Example:
|
292
|
+
#
|
293
|
+
# ReportBuilder.html_report_path = 'reports/report'
|
294
|
+
#
|
295
|
+
def self.html_report_path=(html_report_path)
|
296
|
+
options
|
297
|
+
@options[:html_report_path] = html_report_path if html_report_path.is_a? String
|
298
|
+
end
|
299
|
+
|
300
|
+
##
|
301
|
+
# Returns Report Builder html report output file path with file name without extension
|
302
|
+
#
|
303
|
+
# @return [String] html_report_path html report output file path with file name without extension
|
304
|
+
#
|
305
|
+
def self.html_report_path
|
306
|
+
options[:html_report_path] || options[:report_path]
|
307
|
+
end
|
308
|
+
|
309
|
+
##
|
310
|
+
# Set Report Builder retry report output file path with file name without extension
|
311
|
+
#
|
312
|
+
# @param [String] retry_report_path retry report output file path with file name without extension
|
313
|
+
#
|
314
|
+
# Example:
|
315
|
+
#
|
316
|
+
# ReportBuilder.retry_report_path = 'reports/report'
|
317
|
+
#
|
318
|
+
def self.retry_report_path=(retry_report_path)
|
319
|
+
options
|
320
|
+
@options[:retry_report_path] = retry_report_path if retry_report_path.is_a? String
|
321
|
+
end
|
322
|
+
|
323
|
+
##
|
324
|
+
# Returns Report Builder retry report output file path with file name without extension
|
325
|
+
#
|
326
|
+
# @return [String] retry_report_path retry report output file path with file name without extension
|
327
|
+
#
|
328
|
+
def self.retry_report_path
|
329
|
+
options[:retry_report_path] || options[:report_path]
|
330
|
+
end
|
331
|
+
|
332
|
+
##
|
333
|
+
# Set Report Builder additional CSS string or CSS file path or CSS file url for customizing html report
|
334
|
+
#
|
335
|
+
# @param [String] additional_css additional CSS string or CSS file path or CSS file url for customizing html report
|
336
|
+
#
|
337
|
+
# Example:
|
338
|
+
#
|
339
|
+
# ReportBuilder.additional_css = 'css/style.css'
|
340
|
+
#
|
341
|
+
def self.additional_css=(additional_css)
|
342
|
+
options
|
343
|
+
@options[:additional_css] = additional_css if additional_css.is_a? String
|
344
|
+
end
|
345
|
+
|
346
|
+
##
|
347
|
+
# Returns Report Builder additional CSS string or CSS file path or CSS file url for customizing html report
|
348
|
+
#
|
349
|
+
# @return [String] additional_css additional CSS string or CSS file path or CSS file url for customizing html report
|
350
|
+
#
|
351
|
+
def self.additional_css
|
352
|
+
options[:additional_css]
|
353
|
+
end
|
354
|
+
|
355
|
+
##
|
356
|
+
# Set Report Builder additional JS string or JS file path or JS file url for customizing html report
|
357
|
+
#
|
358
|
+
# @param [String] additional_js additional JS string or JS file path or JS file url for customizing html report
|
359
|
+
#
|
360
|
+
# Example:
|
361
|
+
#
|
362
|
+
# ReportBuilder.json_report_path = 'js/script.js'
|
363
|
+
#
|
364
|
+
def self.additional_js=(additional_js)
|
365
|
+
options
|
366
|
+
@options[:additional_js=] = additional_js if additional_js.is_a? String
|
367
|
+
end
|
368
|
+
|
369
|
+
##
|
370
|
+
# Returns Report Builder additional JS string or JS file path or JS file url for customizing html report
|
371
|
+
#
|
372
|
+
# @return [String] additional_js additional JS string or JS file path or JS file url for customizing html report
|
373
|
+
#
|
374
|
+
def self.additional_js
|
375
|
+
options[:additional_js]
|
376
|
+
end
|
377
|
+
|
378
|
+
##
|
379
|
+
# Set Report Builder report color, Ex: indigo, cyan, purple, grey, lime etc.
|
380
|
+
#
|
381
|
+
# @param [String] color report color, Ex: indigo, cyan, purple, grey, lime etc.
|
382
|
+
#
|
383
|
+
# Example:
|
384
|
+
#
|
385
|
+
# ReportBuilder.color = 'purple'
|
386
|
+
#
|
387
|
+
def self.color=(color)
|
388
|
+
options
|
389
|
+
@options[:color] = color if color.is_a? String
|
390
|
+
end
|
391
|
+
|
392
|
+
##
|
393
|
+
# Returns Report Builder report color, Ex: indigo, cyan, purple, grey, lime etc.
|
394
|
+
#
|
395
|
+
# @return [String] color report color, Ex: indigo, cyan, purple, grey, lime etc.
|
396
|
+
#
|
397
|
+
def self.color
|
398
|
+
options[:color]
|
399
|
+
end
|
400
|
+
|
401
|
+
##
|
402
|
+
# Set Report Builder Options
|
403
|
+
#
|
404
|
+
# @param [String] option
|
405
|
+
# @param [String] value
|
406
|
+
#
|
407
|
+
# Example:
|
408
|
+
#
|
409
|
+
# ReportBuilder.set('title', 'My Features')
|
410
|
+
#
|
411
|
+
def self.set_option(option, value)
|
412
|
+
options
|
413
|
+
@options[option.to_sym] = value
|
414
|
+
end
|
415
|
+
|
416
|
+
##
|
417
|
+
# Set Report Builder Options
|
418
|
+
#
|
419
|
+
# @param [String] option
|
420
|
+
# @param [String] value
|
421
|
+
#
|
422
|
+
# Example:
|
423
|
+
#
|
424
|
+
# ReportBuilder.set('title', 'My Features')
|
425
|
+
#
|
426
|
+
def self.set(option, value)
|
427
|
+
set_option(option, value)
|
428
|
+
end
|
429
|
+
end
|
data/template/error.erb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
<li class="error">
|
2
|
+
<div class="collapsible-header red lighten-2 white-text waves-effect waves-light">
|
3
|
+
<i class="material-icons">bug_report</i><%= error %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="collapsible-body <%= options[:color] %> lighten-4">
|
7
|
+
<div class="collection failedScenarioList">
|
8
|
+
<% features.each_with_index do |feature, f| %>
|
9
|
+
<% feature['elements'].each_with_index do |scenario, s| %>
|
10
|
+
<% if scenario['error'] %>
|
11
|
+
<% if scenario['error'] == error %>
|
12
|
+
<a class="collection-item failedScenario <%= options[:color] %> lighten-5 red-text modal-trigger waves-effect waves-light" href="#<%= "#{gid}f#{f}s#{s}" %>">
|
13
|
+
<i class="material-icons">highlight_off</i> <%= scenario['name'] %>
|
14
|
+
</a>
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</li>
|
data/template/errors.erb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
<li class="feature <%= feature['status'] %>">
|
2
|
+
<div class="collapsible-header <%= options[:color] %> lighten-1 waves-effect waves-light">
|
3
|
+
<i class="material-icons">featured_play_list</i>
|
4
|
+
<b><%= feature['keyword'] %></b> <%= feature['name'] %> (<%= duration(feature['duration']) %>)
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="collapsible-body <%= options[:color] %> lighten-4">
|
8
|
+
<div class="collection scenarioList <%= options[:color] %>">
|
9
|
+
<% feature['elements'].each_with_index do |scenario, s| %>
|
10
|
+
<a class="collection-item scenario modal-trigger waves-effect waves-light white-text <%= scenario['status'] %>" href="#<%= "#{fid}s#{s}" %>">
|
11
|
+
<b><%= scenario['keyword'] %></b> <%= scenario['name'] %> (<%= duration(scenario['duration']) %>)
|
12
|
+
</a>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</li>
|
data/template/footer.erb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
<footer class="page-footer <%= options[:color] %> lighten-4">
|
2
|
+
<div class="footer-copyright <%= options[:color] %> lighten-1">
|
3
|
+
<div class="container">
|
4
|
+
Happy Reporting!
|
5
|
+
<a class="white-text text-lighten-4 right" href="https://reportbuilder.rajatthareja.com">Generated by Report Builder</a>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
</footer>
|
9
|
+
|
10
|
+
<script type="text/javascript" src="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.9/js/report.builder.min.js"></script>
|
11
|
+
|
12
|
+
<% if options[:voice_commands] %>
|
13
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/annyang/2.6.0/annyang.min.js"></script>
|
14
|
+
<script>
|
15
|
+
var commands = {
|
16
|
+
'show :tab': function(tab) {
|
17
|
+
if (tab === "overview") {
|
18
|
+
$("a[data-tooltip='Results Overview']").click();
|
19
|
+
} else if (tab === "features" || tab === "feature") {
|
20
|
+
$("a[data-tooltip='Scenarios by Features']").click();
|
21
|
+
} else if (tab === "summary") {
|
22
|
+
$("a[data-tooltip='Scenarios Summary Table']").click();
|
23
|
+
} else if (tab === "errors" || tab === "error" || tab === "failed" || tab === "bugs") {
|
24
|
+
$("a[data-tooltip='Failed Scenarios']").click();
|
25
|
+
}
|
26
|
+
},
|
27
|
+
'search *search': function (search) {
|
28
|
+
$("a[data-tooltip='Scenarios Summary Table']").click();
|
29
|
+
$("input[type='search']").val(search);
|
30
|
+
$('table#summaryTable').DataTable().search(search).draw();
|
31
|
+
}
|
32
|
+
};
|
33
|
+
annyang.addCommands(commands);
|
34
|
+
annyang.start();
|
35
|
+
</script>
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
<% if options[:additional_js] %>
|
39
|
+
<% if options[:additional_js] =~ /^http(|s):\/\/.*\.js$/ %>
|
40
|
+
<script src="<%= options[:additional_js] %>"></script>
|
41
|
+
<% else %>
|
42
|
+
<script type="text/javascript">
|
43
|
+
<%= options[:additional_js]%>
|
44
|
+
</script>
|
45
|
+
<% end %>
|
46
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<ul class="groupErrorList collapsible popout" data-collapsible="expandable">
|
2
|
+
<% groups.each_with_index do |group, g| %>
|
3
|
+
|
4
|
+
<% gid = "g#{g}" %>
|
5
|
+
<% features = group['features'] %>
|
6
|
+
<li class="groupError">
|
7
|
+
|
8
|
+
<div class="collapsible-header red lighten-2 white-text waves-effect waves-light">
|
9
|
+
<i class="material-icons">group_work</i>
|
10
|
+
<b><%= group['name'] %></b>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="collapsible-body <%= options[:color] %> lighten-4">
|
14
|
+
<%= get('errors').result(binding) %>
|
15
|
+
</div>
|
16
|
+
</li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<ul class="groupList collapsible popout" data-collapsible="expandable">
|
2
|
+
<% groups.each_with_index do |group, g| %>
|
3
|
+
|
4
|
+
<% gid = "g#{g}" %>
|
5
|
+
<% features = group['features'] %>
|
6
|
+
<li class="group">
|
7
|
+
|
8
|
+
<div class="collapsible-header <%= options[:color] %> lighten-1 waves-effect waves-light">
|
9
|
+
<i class="material-icons">group_work</i>
|
10
|
+
<b><%= group['name'] %></b> (<%= duration(total_time(features)) %>)
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="collapsible-body <%= options[:color] %> lighten-4">
|
14
|
+
<%= get('features').result(binding) %>
|
15
|
+
</div>
|
16
|
+
</li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col m4 s12">
|
3
|
+
<canvas id="featuresDoughnut" width="400" height="400"></canvas>
|
4
|
+
<table id="metaDataFeatures" class="bordered">
|
5
|
+
<tbody></tbody>
|
6
|
+
</table>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="col m4 s12">
|
10
|
+
<canvas id="scenariosDoughnut" width="400" height="400"></canvas>
|
11
|
+
<table id="metaDataScenarios" class="bordered">
|
12
|
+
<tbody></tbody>
|
13
|
+
</table>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="col m4 s12">
|
17
|
+
<table id="metaData" class="bordered">
|
18
|
+
<tbody>
|
19
|
+
<tr><th>Total Time</th><td><%= duration(total_time(groups.map{|g| g['features']}.flatten)) %></td></tr>
|
20
|
+
<% options[:additional_info].each do |key, value| %>
|
21
|
+
<tr>
|
22
|
+
<th><%= key %></th>
|
23
|
+
<td><%= value %></td>
|
24
|
+
</tr>
|
25
|
+
<% end %>
|
26
|
+
</tbody>
|
27
|
+
</table>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="col s12">
|
31
|
+
<canvas id="groupBarChart"></canvas>
|
32
|
+
</div>
|
33
|
+
</div>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<%= get('head').result(binding) %>
|
4
|
+
<body>
|
5
|
+
<%= get('header').result(binding) %>
|
6
|
+
|
7
|
+
<% errors = [] %>
|
8
|
+
|
9
|
+
<% groups.each_with_index do |group, g| %>
|
10
|
+
<% gid = "g#{g}" %>
|
11
|
+
<% features = group['features'] %>
|
12
|
+
<%= get('scenarios').result(binding) %>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<main class="<%= options[:color] %> lighten-5">
|
16
|
+
<div class="row">
|
17
|
+
<div id="overview" class="col s12 <%= options[:color] %> lighten-5">
|
18
|
+
<%= get('group_overview').result(binding) %>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div id="features" class="col s12 <%= options[:color] %> lighten-5 white-text">
|
22
|
+
<%= get('group_features').result(binding) %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div id="summary" class="col s12 <%= options[:color] %> lighten-5">
|
26
|
+
<%= get('group_summary').result(binding) %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div id="errors" class="col s12 <%= options[:color] %> lighten-5">
|
30
|
+
<%= get('group_errors').result(binding) %>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</main>
|
34
|
+
|
35
|
+
<script type="text/javascript" src="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.4/js/group.report.builder.min.js"></script>
|
36
|
+
|
37
|
+
<%= get('footer').result(binding) %>
|
38
|
+
</body>
|
39
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<table id="summaryTable" class="bordered <%= options[:color] %> lighten-1 white-text" width="100%">
|
2
|
+
<thead>
|
3
|
+
<tr>
|
4
|
+
<th class="hide-on-small-only">Group</th>
|
5
|
+
<th class="hide-on-small-only">Feature</th>
|
6
|
+
<th>Scenario</th>
|
7
|
+
<th class="hide">Tags</th>
|
8
|
+
<th>Status</th>
|
9
|
+
<th class="hide-on-small-only">Error</th>
|
10
|
+
</tr>
|
11
|
+
</thead>
|
12
|
+
<tbody>
|
13
|
+
<% groups.each_with_index do |group, g| %>
|
14
|
+
<% group['features'].each_with_index do |feature, f| %>
|
15
|
+
<% feature['elements'].each_with_index do |scenario, s| %>
|
16
|
+
<% sid = "g#{g}f#{f}s#{s}" %>
|
17
|
+
<tr class="<%= scenario['status'] %>">
|
18
|
+
<td class="hide-on-small-only"><%= group['name'] %></td>
|
19
|
+
<%= get('summary_row').result(binding) %>
|
20
|
+
</tr>
|
21
|
+
<% end %>
|
22
|
+
<% end %>
|
23
|
+
<% end %>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
data/template/head.erb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
<head>
|
2
|
+
<meta charset="utf-8">
|
3
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
4
|
+
|
5
|
+
<title><%= options[:report_title] %></title>
|
6
|
+
|
7
|
+
<link rel="icon" href="https://reportbuilder.rajatthareja.com/rb.ico">
|
8
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
9
|
+
<link href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet">
|
10
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css" media="screen,projection"/>
|
11
|
+
<link href="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.9/css/report.builder.min.css" rel="stylesheet">
|
12
|
+
|
13
|
+
<% if options[:additional_css] %>
|
14
|
+
<% if options[:additional_css] =~ /^http(|s):\/\/.*\.css$/ %>
|
15
|
+
<link rel="stylesheet" href="<%= options[:additional_css] %>" media="all"/>
|
16
|
+
<% else %>
|
17
|
+
<style type="text/css">
|
18
|
+
<%= options[:additional_css]%>
|
19
|
+
</style>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
</head>
|