nxgreport 0.7.0 → 0.11.1

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,196 @@
1
+ require 'nxgreport/nxgcss.rb'
2
+ require 'nxgreport/nxgjs.rb'
3
+
4
+ module NxgHTML
5
+
6
+ include NxgCss
7
+ include NxgJavascript
8
+
9
+ def html(data_provider)
10
+ @data_provider = data_provider
11
+ "<html lang=\"en\">
12
+ #{head()}
13
+ #{body()}
14
+ #{js(@data_provider)}
15
+ </html>"
16
+ end
17
+
18
+ def head()
19
+ "<head>
20
+ <meta charset=\"UTF-8\" />
21
+ <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />
22
+ <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js\"></script>
23
+ <script> #{js_detect_system_dark_mode()}</script>
24
+ <title>Home | #{@data_provider[:title]}</title>
25
+ #{google_fonts_link()}
26
+ #{icons_link()}
27
+ #{css(@data_provider)}
28
+ </head>"
29
+ end
30
+
31
+ def google_fonts_link()
32
+ "<link
33
+ href=\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,600;0,700;0,800;1,300;1,400;1,600;1,700;1,800&display=swap\"
34
+ rel=\"stylesheet\"
35
+ />"
36
+ end
37
+
38
+ def icons_link()
39
+ "<link
40
+ href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"
41
+ rel=\"stylesheet\"
42
+ />"
43
+ end
44
+
45
+ def body()
46
+ "<body id=\"app\" onload=\"onRefresh()\">
47
+ <div id=\"sidebar\" onclick=\"closeDetails(event)\">
48
+ <div id=\"sidebar-div\">
49
+ <div id=\"sidebar-title-wrap\">
50
+ <h1 id=\"sidebar-title\">Title</h1>
51
+ <i class=\"material-icons\" id=\"sidebar-status\">check_circle</i>
52
+ </div>
53
+ <div id=\"sidebar-catergories\">
54
+ </div>
55
+ </div>
56
+ </div>
57
+ <div id=\"sidebar-overlay\" onclick=\"closeDetails(event)\">
58
+ <div id=\"sidebar-overlay-grid\"></div>
59
+ </div>
60
+ <div id=\"body-wrap\">
61
+ #{header()}
62
+ #{config()}
63
+ #{features()}
64
+ #{footer()}
65
+ </div>
66
+ </body>"
67
+ end
68
+
69
+ def header()
70
+ "<div id=\"header\">
71
+ <h1 id=\"app-title\">#{@data_provider[:title]}</h1>
72
+ <div id=\"theme-wrap\">
73
+ <button id=\"theme-switch\" onclick=\"switchTheme()\">
74
+ <i class=\"material-icons\" id=\"theme-icon\">wb_sunny</i>
75
+ </button>
76
+ </div>
77
+ </div>"
78
+ end
79
+
80
+ def features()
81
+ "<div class=\"features-grid\"></div>"
82
+ end
83
+
84
+ def footer()
85
+ "<div id=\"footer\">
86
+ <p>
87
+ Developed by
88
+ <span>
89
+ <a
90
+ href=\"https://www.linkedin.com/in/balabharathijayaraman\"
91
+ rel=\"noopener\"
92
+ target=\"_blank\"
93
+ >Balabharathi Jayaraman</a
94
+ >
95
+ </span>
96
+ </p>
97
+ </div>"
98
+ end
99
+
100
+ def config()
101
+ return if @data_provider.length == 0
102
+
103
+ return "<div class=\"params-container\">
104
+ #{release_name()}
105
+ #{execution_date()}
106
+ #{device()}
107
+ #{os()}
108
+ #{app_version()}
109
+ #{environment()}
110
+ #{passed_tests()}
111
+ #{failed_tests()}
112
+ #{percentage_pass()}
113
+ #{execution_time()}
114
+ #{filter()}
115
+ </div>"
116
+ end
117
+
118
+ def execution_time()
119
+ return if !@data_provider.key?(:environment)
120
+
121
+ return config_item("Total execution time", @data_provider[:execution_time],'access_time')
122
+ end
123
+
124
+ def filter()
125
+ "<div class=\"param-wrap\" onclick=\"setFilter()\" id=\"filter\" title=\"Filter tests\">
126
+ <i class=\"pi material-icons\">filter_list</i>
127
+ <h5 id=\"pt\">Failed</h5>
128
+ </div>"
129
+ end
130
+
131
+ def passed_tests()
132
+ "<div class=\"param-wrap\" title=\"Passed tests\">
133
+ <i class=\"pi green-font material-icons\">check_circle</i>
134
+ <h5 id=\"pt\">#{@data_provider[:pass] == 0 ? "None" : @data_provider[:pass]}</h5>
135
+ </div>"
136
+ end
137
+
138
+ def failed_tests()
139
+ "<div class=\"param-wrap\" title=\"Failed tests\" #{@data_provider[:fail] > 0 ? "onclick=\"filterAllFailed()\" style=\"cursor: pointer\"" : ""}>
140
+ <i class=\"pi red-font material-icons\">cancel</i>
141
+ <h5 id=\"pt\">#{@data_provider[:fail] == 0 ? "None" : @data_provider[:fail]}</h5>
142
+ </div>"
143
+ end
144
+
145
+ def percentage_pass()
146
+ pass_percentage = ((@data_provider[:pass]/@data_provider[:total].to_f) * 100).round(2)
147
+
148
+ return "<div class=\"param-wrap\" title=\"Pass percentage\">
149
+ <i class=\"pi #{pass_percentage.to_i == 100 ? "green-font" : ""} material-icons\">equalizer</i>
150
+ <h5 id=\"pt\">#{pass_percentage.to_i == 100 ? pass_percentage.to_i : pass_percentage}%</h5>
151
+ </div>"
152
+ end
153
+
154
+ def environment()
155
+ return if !@data_provider.key?(:environment)
156
+
157
+ return config_item("Test environment", @data_provider[:environment], "layers")
158
+ end
159
+
160
+ def app_version()
161
+ return if !@data_provider.key?(:app_version)
162
+
163
+ return config_item("App version tested", @data_provider[:app_version], "info")
164
+ end
165
+
166
+ def release_name()
167
+ return if !@data_provider.key?(:release_name)
168
+
169
+ return config_item("Release", @data_provider[:release_name], "bookmark")
170
+ end
171
+
172
+ def os()
173
+ return if !@data_provider.key?(:os)
174
+
175
+ return config_item("Os tested", @data_provider[:os], "settings")
176
+ end
177
+
178
+ def device()
179
+ return if !@data_provider.key?(:device)
180
+
181
+ return config_item("Device tested", @data_provider[:device], "devices")
182
+ end
183
+
184
+ def execution_date()
185
+ @data_provider[:execution_date] = Time.now().strftime("%b %d, %Y") if !@data_provider.key?(:execution_date)
186
+
187
+ return config_item("Execution date", @data_provider[:execution_date], "event")
188
+ end
189
+
190
+ def config_item(toot_tip, name, icon)
191
+ "<div class=\"param-wrap\" title=\"#{toot_tip}\">
192
+ <i class=\"pi material-icons\">#{icon}</i>
193
+ <h5 id=\"pt\">#{name}</h5>
194
+ </div>"
195
+ end
196
+ end
@@ -0,0 +1,233 @@
1
+
2
+ module NxgJavascript
3
+
4
+ def js_detect_system_dark_mode()
5
+ "if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
6
+ $(document.documentElement).attr(\"theme\", \"dark\");
7
+ }"
8
+ end
9
+
10
+ def js(data_provider)
11
+
12
+ js_array = data_provider[:features].to_s.gsub("=>", ":")
13
+
14
+ return "<script>
15
+ const allFeatures = #{js_array};
16
+ const STATUS = { pass: \"check_circle\", fail: \"cancel\", };
17
+ var displayFailuresOnly = false;
18
+ var dataSource = [];
19
+ var catergories = [];
20
+
21
+ function onRefresh() {
22
+ dataSource = allFeatures;
23
+ setFilter();
24
+ currentTheme = $(document.documentElement).attr(\"theme\");
25
+ $(\"#theme-icon\").text(currentTheme === \"dark\" ? \"brightness_2\" : \"wb_sunny\");
26
+ }
27
+
28
+ function updateView() {
29
+ $(\".banner\").removeClass(\"banner\").addClass(\"features-grid\");
30
+ $(\".features-grid\").empty();
31
+
32
+ if (dataSource.length === 0) {
33
+ console.log(\"inside\");
34
+ $(\".features-grid\")
35
+ .removeClass(\"features-grid\")
36
+ .addClass(\"banner\")
37
+ .append(
38
+ `<i class=\"banner-text green-font material-icons\">done_all</i><h1>No Failures</>`
39
+ );
40
+ return;
41
+ }
42
+
43
+ dataSource.forEach((feature, index) => {
44
+ $(\".features-grid\").append(
45
+ `<div class=\"module dark ${
46
+ feature.fail > 0 ? \"red-bg\" : \"\"
47
+ }\" onclick=\"showDetails(${index})\"><div class=\"funcname\"><h4>${
48
+ feature.name
49
+ }</h4></div><div class=\"total\"><h6>Total</h6><h4>${
50
+ feature.total
51
+ }</h4></div><div class=\"pass green-font\"><h6>Passed</h6><h4>${
52
+ feature.pass
53
+ }</h4></div><div class=\"fail red-font\"><h6>Failed</h6><h4>${
54
+ feature.fail
55
+ }</h4></div></div>`
56
+ );
57
+ });
58
+ }
59
+
60
+ function setFilter() {
61
+ if (displayFailuresOnly) {
62
+ $(\"#filter h5\").text(\"Failed\");
63
+ dataSource = allFeatures.filter((feature) => {
64
+ return feature.fail > 0;
65
+ });
66
+ } else {
67
+ $(\"#filter h5\").text(\"All\");
68
+ dataSource = allFeatures;
69
+ }
70
+ updateView();
71
+ displayFailuresOnly = !displayFailuresOnly;
72
+ }
73
+
74
+ function filterAllFailed() {
75
+ allFailedTests = [];
76
+ catergories = [];
77
+
78
+ failedFeatures = allFeatures.filter((feature) => {
79
+ return feature.fail > 0;
80
+ });
81
+
82
+ for (index = 0; index < failedFeatures.length; index++) {
83
+ failedFeatures[index].tests.filter((test) => {
84
+ if (!test.testPass) {
85
+ allFailedTests.push(test);
86
+ }
87
+ });
88
+ }
89
+
90
+ $(\"#body-wrap\").css(\"overflow\", \"hidden\");
91
+ $(\"#sidebar-overlay\").css(\"overflow\", \"auto\");
92
+ $(\"#sidebar-overlay\").css(\"visibility\", \"visible\");
93
+ $(\"#sidebar-overlay\").css(\"margin-left\", \"40%\");
94
+ $(\"#sidebar\").css(\"width\", \"40%\");
95
+ $(\"#sidebar-title\").css(\"visibility\", \"visible\");
96
+ $(\"#sidebar-status\").css(\"visibility\", \"visible\");
97
+ $(\"#sidebar-title\").css(\"opacity\", \"1\");
98
+ $(\"#sidebar-status\").css(\"opacity\", \"1\");
99
+ $(\"#sidebar-catergories\").css(\"visibility\", \"visible\");
100
+ $(\"#sidebar-catergories\").css(\"opacity\", \"1\");
101
+ /* Update Test Information */
102
+
103
+ $(\"#sidebar-title\").text(\"Failed Tests\");
104
+ $(\"#sidebar-status\").text(STATUS.fail);
105
+ $(\"#sidebar-overlay-grid\").empty();
106
+ allFailedTests.forEach((test) => {
107
+ $(\"#sidebar-overlay-grid\").append(
108
+ `<div id=\"sidebar-overlay-test-info\" onclick=\"()=>{}\"><i class=\"${
109
+ test.testPass ? \"green-font\" : \"red-font\"
110
+ } material-icons\" style=\"font-size: 1em\">${
111
+ STATUS.fail
112
+ }</i>&nbsp;&nbsp;<h4 id=\"test-title\">${test.name}</h4><div><h4 id=\"test-execution-time\">${test.time} secs</h4></div>${
113
+ test.comments !== \"\"
114
+ ? `<p id=\"error-message\">${test.comments}</p>`
115
+ : \"\"
116
+ }</div>`
117
+ );
118
+ categorize(test);
119
+ });
120
+ displayCategories();
121
+ }
122
+
123
+ function displayCategories() {
124
+ $(\"#sidebar-catergories\").empty();
125
+ if(catergories.length === 1) { return; }
126
+ catergories.forEach((cat) => {$(\"#sidebar-catergories\").append(`<div><h6>#${cat.name}</h6></div>`);});
127
+ }
128
+
129
+ function switchTheme() {
130
+ currentTheme = $(document.documentElement).attr(\"theme\");
131
+ $(document.documentElement).attr(\"theme\", currentTheme === \"dark\" ? \"light\" : \"dark\");
132
+ $(\"#theme-icon\").text(currentTheme === \"dark\" ? \"wb_sunny\" : \"brightness_2\");
133
+ }
134
+
135
+ function closeDetails(e) {
136
+ if (e.target.id === \"sidebar\" || e.target.id === \"sidebar-overlay\") {
137
+ $(\"#sidebar-catergories\").css(\"visibility\", \"hidden\");
138
+ $(\"#sidebar-catergories\").css(\"opacity\", \"0\");
139
+ $(\"#sidebar-title\").css(\"visibility\", \"hidden\");
140
+ $(\"#sidebar-status\").css(\"visibility\", \"hidden\");
141
+ $(\"#sidebar-title\").css(\"opacity\", \"0\");
142
+ $(\"#sidebar-status\").css(\"opacity\", \"0\");
143
+ $(\"#sidebar-overlay\").css(\"margin-left\", \"0\");
144
+ $(\"#sidebar-overlay\").css(\"visibility\", \"hidden\");
145
+ $(\"#sidebar\").css(\"width\", \"0\");
146
+ $(\"#body-wrap\").css(\"overflow\", \"auto\");
147
+ $(\"#sidebar-overlay\").css(\"overflow\", \"hidden\");
148
+ }
149
+ }
150
+
151
+ window
152
+ .matchMedia(\"(prefers-color-scheme: dark)\")
153
+ .addEventListener(\"change\", (e) => {
154
+ darkTheme = e.matches;
155
+ $(document.documentElement).attr(\"theme\", darkTheme ? \"dark\" : \"light\");
156
+ $(\"#theme-icon\").text(darkTheme ? \"brightness_2\" : \"wb_sunny\");
157
+ });
158
+
159
+ function showDetails(featureID) {
160
+ feature = dataSource[featureID];
161
+ catergories = [];
162
+
163
+ $(\"#body-wrap\").css(\"overflow\", \"hidden\");
164
+ $(\"#sidebar-overlay\").css(\"overflow\", \"auto\");
165
+ $(\"#sidebar-overlay\").css(\"visibility\", \"visible\");
166
+ $(\"#sidebar-overlay\").css(\"margin-left\", \"40%\");
167
+ $(\"#sidebar\").css(\"width\", \"40%\");
168
+ $(\"#sidebar-title\").css(\"visibility\", \"visible\");
169
+ $(\"#sidebar-status\").css(\"visibility\", \"visible\");
170
+ $(\"#sidebar-title\").css(\"opacity\", \"1\");
171
+ $(\"#sidebar-status\").css(\"opacity\", \"1\");
172
+ $(\"#sidebar-catergories\").css(\"visibility\", \"visible\");
173
+ $(\"#sidebar-catergories\").css(\"opacity\", \"1\");
174
+ /* Update Test Information */
175
+
176
+ $(\"#sidebar-title\").text(feature.name);
177
+ $(\"#sidebar-overlay-grid\").empty();
178
+ feature.tests.forEach((test) => {
179
+ $(\"#sidebar-overlay-grid\").append(
180
+ `<div id=\"sidebar-overlay-test-info\" onclick=\"()=>{}\"><i class=\"${
181
+ test.testPass ? \"green-font\" : \"red-font\"
182
+ } material-icons\" style=\"font-size: 1em\">${
183
+ test.testPass ? STATUS.pass : STATUS.fail
184
+ }</i>&nbsp;&nbsp;<h4 id=\"test-title\">${test.name}</h4><div><h4 id=\"test-execution-time\">${test.time} secs</h4></div>${
185
+ test.comments !== \"\"
186
+ ? `<p id=\"error-message\">${test.comments}</p>`
187
+ : \"\"
188
+ }</div>`
189
+ );
190
+ categorize(test);
191
+ });
192
+ displayCategories();
193
+
194
+ for (index = 0; index < feature.tests.length; index++) {
195
+ if (!feature.tests[index].testPass) {
196
+ $(\"#sidebar-status\").text(STATUS.fail);
197
+ return;
198
+ }
199
+ }
200
+ $(\"#sidebar-status\").text(STATUS.pass);
201
+ }
202
+
203
+ function categorize(test) {
204
+ if (test.tag === \"\") {
205
+ return;
206
+ }
207
+ if (!catergoryAdded(test.tag)) {
208
+ catergories.push({ name: test.tag.toLowerCase(), tests: [test] });
209
+ } else {
210
+ catergories[catergoryIndex(test.tag)].tests.push(test);
211
+ }
212
+ }
213
+
214
+ function catergoryAdded(category) {
215
+ for (var i = 0; i < catergories.length; i++) {
216
+ if (catergories[i].name === category.toLowerCase()) {
217
+ return true;
218
+ }
219
+ }
220
+ return false;
221
+ }
222
+
223
+ function catergoryIndex(category) {
224
+ for (var i = 0; i < catergories.length; i++) {
225
+ if (catergories[i].name === category.toLowerCase()) {
226
+ return i;
227
+ }
228
+ }
229
+ return 0;
230
+ }
231
+ </script>"
232
+ end
233
+ end
@@ -0,0 +1,3 @@
1
+ module Nxgreport
2
+ VERSION = "0.11.1"
3
+ end
metadata CHANGED
@@ -1,32 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nxgreport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Balabharathi Jayaraman
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-06 00:00:00.000000000 Z
12
- dependencies: []
13
- description: "A simple light weighted gem to generate a beautiful emailable test report.
14
- \n\nIt displays a single view where tests (total, pass, fail) are grouped by functionality.
15
- The result is a single static HTML file with an option to switch between dark &
16
- light modes."
17
- email: balabharathi.jayaraman@gmail.com
11
+ date: 2021-08-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Generate a beautiful static test report.
42
+ email:
43
+ - balabharathi.jayaraman@gmail.com
18
44
  executables: []
19
45
  extensions: []
20
46
  extra_rdoc_files: []
21
47
  files:
22
48
  - lib/nxgreport.rb
49
+ - lib/nxgreport/nxgcore.rb
50
+ - lib/nxgreport/nxgcss.rb
51
+ - lib/nxgreport/nxghtml.rb
52
+ - lib/nxgreport/nxgjs.rb
53
+ - lib/nxgreport/version.rb
23
54
  homepage: https://rubygemspec.org/gems/nxgreport
24
55
  licenses:
25
56
  - MIT
26
57
  metadata:
27
58
  homepage_uri: https://rubygemspec.org/gems/nxgreport
28
- source_code_uri: https://github.com/balabharathijayaraman/nxgreport
29
- changelog_uri: https://github.com/balabharathijayaraman/nxgreport/blob/master/CHANGELOG.md
59
+ source_code_uri: https://github.com/iambalabharathi/nxgreport-ruby
60
+ changelog_uri: https://github.com/iambalabharathi/nxgreport-ruby/blob/master/CHANGELOG.md
30
61
  post_install_message:
31
62
  rdoc_options: []
32
63
  require_paths:
@@ -42,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
73
  - !ruby/object:Gem::Version
43
74
  version: '0'
44
75
  requirements: []
45
- rubygems_version: 3.0.3
76
+ rubygems_version: 3.1.4
46
77
  signing_key:
47
78
  specification_version: 4
48
79
  summary: Next Gen Report