report_builder 1.3 → 1.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/CHANGELOG.md +13 -1
- data/README.md +59 -30
- data/lib/report_builder.rb +18 -3
- data/lib/report_builder/builder.rb +54 -19
- data/report_builder.gemspec +4 -4
- data/template/error.erb +21 -0
- data/template/errors.erb +5 -0
- data/template/feature.erb +18 -0
- data/template/features.erb +6 -0
- data/template/footer.erb +20 -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 +28 -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 +28 -0
- data/template/summary.erb +21 -0
- data/template/summary_row.erb +25 -0
- metadata +24 -10
- data/.gitignore +0 -6
- data/.travis.yml +0 -15
- data/Gemfile +0 -4
- data/Rakefile +0 -14
- data/lib/report_builder.rake +0 -6
- data/template/html_report.erb +0 -356
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35b353893ae02902dd4b6c8d07a7f38d66ab57c6
|
4
|
+
data.tar.gz: fab6f1b0dad20645c4e8f7f68d43761da94521c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4403905db936a5cd577738d24cfd7553f4fa9ab458226d4f0d56d5f4bf8bcbacf31ea14f0a962360a23f68e670c8df9ca548fa6aea124bca4d62fcbba212708c
|
7
|
+
data.tar.gz: 4bb0c1e121f3935bced443fb09903a6a2f6f61893e80497c02424ece1224569af13facb623e371c1f7bc1fdc5a1b654f39aa7fc784e541de9df3acf081b1ca55
|
data/CHANGELOG.md
CHANGED
@@ -3,7 +3,19 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
|
6
|
-
## [Unreleased](https://github.com/rajatthareja/ReportBuilder/compare/v1.
|
6
|
+
## [Unreleased](https://github.com/rajatthareja/ReportBuilder/compare/v1.4...master)
|
7
|
+
|
8
|
+
## [1.4](https://github.com/rajatthareja/ReportBuilder/compare/v1.3...v1.4) - 2017-10-29
|
9
|
+
### Fixed
|
10
|
+
- Config options Fixed
|
11
|
+
- Document Fixed
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- Grouped Features Report
|
15
|
+
- Method to set single option
|
16
|
+
|
17
|
+
### Removed
|
18
|
+
- Sample Rake Task
|
7
19
|
|
8
20
|
## [1.3](https://github.com/rajatthareja/ReportBuilder/compare/v1.2...v1.3) - 2017-10-22
|
9
21
|
### Changed
|
data/README.md
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
# ReportBuilder
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/report_builder)
|
4
|
-
[](https://travis-ci.org/rajatthareja/ReportBuilder)
|
4
|
+
[](https://travis-ci.org/rajatthareja/ReportBuilder)
|
5
|
+
[](https://ci.appveyor.com/project/rajatthareja/reportbuilder)
|
5
6
|
[](https://gitter.im/rajatthareja/ReportBuilder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
6
7
|
|
7
|
-
Ruby gem to merge Cucumber JSON reports and build mobile
|
8
|
+
Ruby gem to merge Cucumber JSON reports and build mobile-friendly HTML Test Report, JSON report and retry file.
|
8
9
|
|
9
|
-
|
10
|
+
## Sample Reports
|
11
|
+
|
12
|
+
**[Features Report](http://reportbuilder.rajatthareja.com/sample/report.html)**
|
13
|
+
|
14
|
+
**[Grouped Features Report](http://reportbuilder.rajatthareja.com/sample/group_report.html)**
|
10
15
|
|
11
16
|
## Installation
|
12
17
|
|
@@ -27,18 +32,19 @@ gem install report_builder
|
|
27
32
|
|
28
33
|
### Config Options:
|
29
34
|
|
30
|
-
| Option
|
31
|
-
|
32
|
-
| json_path
|
33
|
-
| report_path
|
34
|
-
| json_report_path
|
35
|
-
| html_report_path
|
36
|
-
| retry_report_path
|
37
|
-
| report_types
|
38
|
-
| report_title
|
39
|
-
| include_images
|
40
|
-
| additional_info
|
41
|
-
| additional_css
|
35
|
+
| Option | Type | Default | Values |
|
36
|
+
|----------------------|-------------------------|---------------------|------------------------------------------------------------------------------------------|
|
37
|
+
| json_path/input_path | [String]/[Array]/[Hash] | (current directory) | input json files path / array of json files or path / hash of json files or path |
|
38
|
+
| report_path | [String] | 'test_report' | reports output file path with file name without extension |
|
39
|
+
| json_report_path | [String] | (report_path) | json report output file path with file name without extension |
|
40
|
+
| html_report_path | [String] | (report_path) | html report output file path with file name without extension |
|
41
|
+
| retry_report_path | [String] | (report_path) | retry report output file path with file name without extension |
|
42
|
+
| report_types | [Array] | [:html] | :json, :html, :retry (output file types) |
|
43
|
+
| report_title | [String] | 'Test Results' | report and html title |
|
44
|
+
| include_images | [Boolean] | true | true / false (If false, the size of HTML report is reduced by excluding embedded images) |
|
45
|
+
| additional_info | [Hash] | {} | additional info for report summary |
|
46
|
+
| additional_css | [String] | nil | additional CSS string or CSS file path or CSS file url for customizing html report |
|
47
|
+
| additional_js | [String] | nil | additional JS string or JS file path or JS file url for customizing html report |
|
42
48
|
|
43
49
|
### Code Examples:
|
44
50
|
|
@@ -72,22 +78,39 @@ gem install report_builder
|
|
72
78
|
|
73
79
|
```
|
74
80
|
|
81
|
+
### Grouped Features Report Example:
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
|
85
|
+
ReportBuilder.configure do |config|
|
86
|
+
config.json_path = config.json_path = {
|
87
|
+
'Group A' => ['path/of/json/files/dir1', 'path/of/json/files/dir2'],
|
88
|
+
'Group B' => ['path/of/json/file1', 'path/of/json/file2'],
|
89
|
+
'Group C' => 'path/of/json/files/dir'}
|
90
|
+
end
|
91
|
+
|
92
|
+
ReportBuilder.build_report
|
93
|
+
|
94
|
+
```
|
95
|
+
|
96
|
+
|
75
97
|
### CLI Options:
|
76
98
|
|
77
|
-
| Option | Values
|
78
|
-
|
79
|
-
| -s, --source | x,y,z
|
80
|
-
| -o, --out | [PATH]NAME
|
81
|
-
| --json_out | [PATH]NAME
|
82
|
-
| --html_out | [PATH]NAME
|
83
|
-
| --retry_out | [PATH]NAME
|
84
|
-
| -f, --format | x,y,z
|
85
|
-
| --[no-]images |
|
86
|
-
| -T, --title | TITLE
|
87
|
-
| -I, --info | a:x,b:y,c:z
|
88
|
-
| --css |
|
89
|
-
|
|
90
|
-
| -
|
99
|
+
| Option | Values | Explanation |
|
100
|
+
|---------------------|--------------|------------------------------------------------------------------------------------|
|
101
|
+
| -s, --source | x,y,z | List of input json path or files |
|
102
|
+
| -o, --out | [PATH]NAME | Reports path with name without extension |
|
103
|
+
| --json_out | [PATH]NAME | JSON report path with name without extension |
|
104
|
+
| --html_out | [PATH]NAME | HTML report path with name without extension |
|
105
|
+
| --retry_out | [PATH]NAME | Retry report path with name without extension |
|
106
|
+
| -f, --format | x,y,z | List of report format - html,json,retry |
|
107
|
+
| --[no-]images | | Reduce HTML report size by excluding embedded images |
|
108
|
+
| -T, --title | TITLE | Report title |
|
109
|
+
| -I, --info | a:x,b:y,c:z | List of additional info about test - key:value |
|
110
|
+
| --css | CSS/PATH/URL | Additional CSS string or CSS file path or CSS file url for customizing html report |
|
111
|
+
| --js | JS/PATH/URL | Additional JS string or JS file path or JS file url for customizing html report |
|
112
|
+
| -h, --help | | Show available command line switches |
|
113
|
+
| -v, --version | | Show gem version |
|
91
114
|
|
92
115
|
### CLI Example:
|
93
116
|
|
@@ -106,7 +129,13 @@ Add in Rakefile
|
|
106
129
|
```ruby
|
107
130
|
|
108
131
|
require 'report_builder'
|
109
|
-
|
132
|
+
|
133
|
+
desc 'Sample rake task to build report'
|
134
|
+
task :report_builder, [:json_path, :report_path] do |t, args|
|
135
|
+
args.with_defaults(:json_path => nil, :report_path => 'test_report')
|
136
|
+
options = {:json_path => args.json_path, :report_path => args.report_path}
|
137
|
+
ReportBuilder.build_report options
|
138
|
+
end
|
110
139
|
|
111
140
|
```
|
112
141
|
|
data/lib/report_builder.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require_relative 'report_builder/builder'
|
2
2
|
|
3
|
-
|
3
|
+
##
|
4
|
+
# ReportBuilder Main module
|
5
|
+
#
|
4
6
|
module ReportBuilder
|
5
|
-
|
6
7
|
##
|
7
8
|
# Configure ReportBuilder
|
8
9
|
#
|
@@ -23,6 +24,21 @@ module ReportBuilder
|
|
23
24
|
builder.options = defaults.marshal_dump
|
24
25
|
end
|
25
26
|
|
27
|
+
##
|
28
|
+
# Set single option
|
29
|
+
#
|
30
|
+
# @param [String] option
|
31
|
+
# @param [Object] value
|
32
|
+
#
|
33
|
+
# Example:
|
34
|
+
#
|
35
|
+
# ReportBuilder.set_option('include_images', false)
|
36
|
+
#
|
37
|
+
def self.set_option(option, value)
|
38
|
+
builder.options ||= builder.default_options.marshal_dump
|
39
|
+
builder.options[option] = value
|
40
|
+
end
|
41
|
+
|
26
42
|
##
|
27
43
|
# Build Report
|
28
44
|
#
|
@@ -48,5 +64,4 @@ module ReportBuilder
|
|
48
64
|
def self.builder
|
49
65
|
@builder ||= Builder.new
|
50
66
|
end
|
51
|
-
|
52
67
|
end
|
@@ -2,31 +2,34 @@ require 'json'
|
|
2
2
|
require 'erb'
|
3
3
|
require 'pathname'
|
4
4
|
require 'base64'
|
5
|
+
require 'ostruct'
|
5
6
|
|
6
7
|
require 'report_builder/core-ext/hash'
|
7
8
|
|
8
9
|
module ReportBuilder
|
10
|
+
##
|
11
|
+
# ReportBuilder Main class
|
12
|
+
#
|
9
13
|
class Builder
|
10
14
|
|
11
15
|
attr_accessor :options
|
12
16
|
|
17
|
+
##
|
18
|
+
# ReportBuilder Main method
|
19
|
+
#
|
13
20
|
def build_report(opts = nil)
|
14
21
|
options = self.options || default_options.marshal_dump
|
15
22
|
options.merge! opts if opts.is_a? Hash
|
16
23
|
|
17
|
-
|
18
|
-
|
24
|
+
fail 'Error:: Invalid report_types. Use: [:json, :html]' unless options[:report_types].is_a? Array
|
19
25
|
options[:report_types].map!(&:to_s).map!(&:upcase)
|
20
26
|
|
21
|
-
options[:
|
22
|
-
|
23
|
-
raise "Error:: No file(s) found at #{options[:json_path]}" if files.empty?
|
24
|
-
|
25
|
-
features = get_features(files) rescue raise('Error:: Invalid Input File(s). Please provide valid cucumber JSON output file(s)')
|
27
|
+
options[:input_path] ||= options[:json_path] || Dir.pwd
|
28
|
+
groups = get_groups options[:input_path]
|
26
29
|
|
27
30
|
json_report_path = options[:json_report_path] || options[:report_path]
|
28
31
|
File.open(json_report_path + '.json', 'w') do |file|
|
29
|
-
file.write JSON.pretty_generate features
|
32
|
+
file.write JSON.pretty_generate(groups.size > 1 ? groups : groups.first['features'])
|
30
33
|
end if options[:report_types].include? 'JSON'
|
31
34
|
|
32
35
|
if options[:additional_css] and Pathname.new(options[:additional_css]).file?
|
@@ -39,33 +42,65 @@ module ReportBuilder
|
|
39
42
|
|
40
43
|
html_report_path = options[:html_report_path] || options[:report_path]
|
41
44
|
File.open(html_report_path + '.html', 'w') do |file|
|
42
|
-
file.write
|
45
|
+
file.write get(groups.size > 1 ? 'group_report' : 'report').result(binding).gsub(' ', '').gsub("\n\n", '')
|
43
46
|
end if options[:report_types].include? 'HTML'
|
44
47
|
|
45
48
|
retry_report_path = options[:retry_report_path] || options[:report_path]
|
46
49
|
File.open(retry_report_path + '.retry', 'w') do |file|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
+
groups.each do |group|
|
51
|
+
group['features'].each do |feature|
|
52
|
+
if feature['status'] == 'broken'
|
53
|
+
feature['elements'].each {|scenario| file.puts "#{feature['uri']}:#{scenario['line']}" if scenario['status'] == 'failed'}
|
54
|
+
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
end if options[:report_types].include? 'RETRY'
|
53
58
|
[json_report_path, html_report_path, retry_report_path]
|
54
59
|
end
|
55
60
|
|
61
|
+
##
|
62
|
+
# ReportBuilder default configuration
|
63
|
+
#
|
56
64
|
def default_options
|
57
|
-
OpenStruct.new(
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
OpenStruct.new(json_path: nil,
|
66
|
+
input_path: nil,
|
67
|
+
report_types: [:html],
|
68
|
+
report_title: 'Test Results',
|
69
|
+
include_images: true,
|
70
|
+
additional_info: {},
|
71
|
+
report_path: 'test_report',
|
72
|
+
json_report_path: nil,
|
73
|
+
html_report_path: nil,
|
74
|
+
retry_report_path: nil,
|
75
|
+
additional_css: nil,
|
76
|
+
additional_js: nil
|
64
77
|
)
|
65
78
|
end
|
66
79
|
|
67
80
|
private
|
68
81
|
|
82
|
+
def get(template)
|
83
|
+
@erb ||= {}
|
84
|
+
@erb[template] ||= ERB.new(File.read(File.dirname(__FILE__) + '/../../template/' + template + '.erb'), nil, nil, '_' + template)
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_groups(input_path)
|
88
|
+
groups = []
|
89
|
+
if input_path.is_a? Hash
|
90
|
+
input_path.each do |group_name, group_path|
|
91
|
+
files = get_files group_path
|
92
|
+
puts "Error:: No file(s) found at #{group_path}" if files.empty?
|
93
|
+
groups << {'name' => group_name, 'features' => get_features(files)} rescue next
|
94
|
+
end
|
95
|
+
fail 'Error:: Invalid Input File(s). Please provide valid cucumber JSON output file(s)' if groups.empty?
|
96
|
+
else
|
97
|
+
files = get_files input_path
|
98
|
+
fail "Error:: No file(s) found at #{input_path}" if files.empty?
|
99
|
+
groups << {'features' => get_features(files)} rescue fail('Error:: Invalid Input File(s). Please provide valid cucumber JSON output file(s)')
|
100
|
+
end
|
101
|
+
groups
|
102
|
+
end
|
103
|
+
|
69
104
|
def get_files(path)
|
70
105
|
if path.is_a?(String) and Pathname.new(path).exist?
|
71
106
|
if Pathname.new(path).directory?
|
data/report_builder.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'report_builder'
|
3
|
-
s.version = '1.
|
3
|
+
s.version = '1.4'
|
4
4
|
s.bindir = 'bin'
|
5
5
|
s.summary = 'ReportBuilder'
|
6
|
-
s.description = 'Ruby gem to merge Cucumber JSON reports and build mobile
|
6
|
+
s.description = 'Ruby gem to merge Cucumber JSON reports and build mobile-friendly HTML Test Report, JSON report and retry file.'
|
7
7
|
s.post_install_message = 'Happy reporting!'
|
8
8
|
s.authors = ['Rajat Thareja']
|
9
9
|
s.email = 'rajat.thareja.1990@gmail.com'
|
10
|
-
s.homepage = '
|
10
|
+
s.homepage = 'http://reportbuilder.rajatthareja.com'
|
11
11
|
s.license = 'MIT'
|
12
12
|
s.required_ruby_version = '>= 1.9.1'
|
13
13
|
s.requirements << 'Cucumber >= 2.1.0 test results in JSON format'
|
14
14
|
|
15
|
-
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(
|
15
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(sample/|css/|js/|pkg/|testing/|coverage/|CNAME|.gitignore|appveyor.yml|.travis.yml|_config.yml|Gemfile|Rakefile|rb.ico)}) }
|
16
16
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
s.test_files = s.files.grep(%r{^(testing)/})
|
18
18
|
|
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 brown lighten-4">
|
7
|
+
<ul 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
|
+
<li class="collection-item failedScenario brown lighten-5 red-text">
|
13
|
+
<i class="material-icons">highlight_off</i> <a class="modal-trigger red-text" href="#<%= "#{gid}f#{f}s#{s}" %>"><%= scenario['name'] %></a>
|
14
|
+
</li>
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
</ul>
|
20
|
+
</div>
|
21
|
+
</li>
|
data/template/errors.erb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<li class="feature <%= feature['status'] %>">
|
2
|
+
<div class="collapsible-header brown 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 brown lighten-4">
|
8
|
+
<ul class="collection scenarioList">
|
9
|
+
<% feature['elements'].each_with_index do |scenario, s| %>
|
10
|
+
<li class="collection-item scenario <%= scenario['status'] %>">
|
11
|
+
<a class="waves-effect waves-light modal-trigger white-text" href="#<%= "#{fid}s#{s}" %>">
|
12
|
+
<b><%= scenario['keyword'] %></b> <%= scenario['name'] %> (<%= duration(scenario['duration']) %>)
|
13
|
+
</a>
|
14
|
+
</li>
|
15
|
+
<% end %>
|
16
|
+
</ul>
|
17
|
+
</div>
|
18
|
+
</li>
|
data/template/footer.erb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<footer class="page-footer brown lighten-4">
|
2
|
+
<div class="footer-copyright brown lighten-1">
|
3
|
+
<div class="container">
|
4
|
+
Happy Reporting!
|
5
|
+
<a class="white-text text-lighten-4 right" href="http://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.4/js/report.builder.min.js"></script>
|
11
|
+
|
12
|
+
<% if options[:additional_js] %>
|
13
|
+
<% if options[:additional_js] =~ /^http(|s):\/\/.*\.js$/ %>
|
14
|
+
<script src="<%= options[:additional_js] %>"></script>
|
15
|
+
<% else %>
|
16
|
+
<script type="text/javascript">
|
17
|
+
<%= options[:additional_js]%>
|
18
|
+
</script>
|
19
|
+
<% end %>
|
20
|
+
<% 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 brown 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 brown 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 brown lighten-4">
|
14
|
+
<%= get('features').result(binding) %>
|
15
|
+
</div>
|
16
|
+
</li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|