report_builder_fix 0.3 → 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.
@@ -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
@@ -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>&nbsp;<%= scenario['name'] %>
14
+ </a>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
19
+ </div>
20
+ </div>
21
+ </li>
@@ -0,0 +1,5 @@
1
+ <ul class="errorList collapsible popout" data-collapsible="expandable">
2
+ <% errors.uniq.each do |error| %>
3
+ <%= get('error').result(binding) %>
4
+ <% end %>
5
+ </ul>
@@ -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>&nbsp;<%= feature['name'] %>&nbsp;(<%= 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'] %>&nbsp;(<%= duration(scenario['duration']) %>)
12
+ </a>
13
+ <% end %>
14
+ </div>
15
+ </div>
16
+ </li>
@@ -0,0 +1,6 @@
1
+ <ul class="featureList collapsible popout" data-collapsible="expandable">
2
+ <% features.each_with_index do |feature, f| %>
3
+ <% fid = "#{gid}f#{f}" %>
4
+ <%= get('feature').result(binding) %>
5
+ <% end %>
6
+ </ul>
@@ -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>&nbsp;(<%= 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>