report_builder_fix 0.2 → 0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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>
|