sbformat 1.0.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.
- checksums.yaml +7 -0
- data/lib/html_generator.rb +76 -0
- data/lib/index.erb +160 -0
- data/lib/refs/main.min.css +1 -0
- data/lib/refs/main.min.js +1 -0
- data/lib/sbformat.rb +237 -0
- metadata +82 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c4d57ae8aa653d941b06b6c1b79ee8e26cdc222c
|
4
|
+
data.tar.gz: 4473ba167e61400b3b7e0afa8ecdeec94fa53c7b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c51d4524b3bf6a3cc687b17cf5ad9c36483fc2ef0bb4002421d18b75c7e9518d9705a9765c4f346ed3cc20803c8e30b5ce392e8909a9bc95e504f191081cbebe
|
7
|
+
data.tar.gz: b1a41361e9cbbb44de6e5ee092bd7ad19b47cdcaf6f1ca41001bc801d4c2d76b5c543ce3b60e42ab340ede07c7a98f0e6ece2ff18a5d180d437ca9e021cf5cf3
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'erb'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class HtmlGenerator
|
6
|
+
def initialize data, externalDetails
|
7
|
+
@baseData = JSON.parse(data)
|
8
|
+
external = JSON.parse(externalDetails)
|
9
|
+
@externalDetails = external['userDetails']
|
10
|
+
end
|
11
|
+
|
12
|
+
def createHtml
|
13
|
+
summary = @baseData['summary']
|
14
|
+
currentTime = Time.now.strftime("%A, %b %d %Y %r %z")
|
15
|
+
suits = @baseData['suits']
|
16
|
+
groupNames = @baseData['groupNames']
|
17
|
+
|
18
|
+
footer = @externalDetails['footerMessage']
|
19
|
+
outPath = @externalDetails['outPath']
|
20
|
+
documentation = @externalDetails['documentation']
|
21
|
+
|
22
|
+
path = 'reports'
|
23
|
+
|
24
|
+
if(outPath != '')
|
25
|
+
path = outPath
|
26
|
+
end
|
27
|
+
|
28
|
+
Dir.mkdir(path) unless File.exists?(path)
|
29
|
+
Dir.mkdir(path + '/refs') unless File.exists?(path + '/refs')
|
30
|
+
|
31
|
+
cssFile = File.expand_path(File.dirname(__FILE__)) + "/refs/main.min.css"
|
32
|
+
jsFile = File.expand_path(File.dirname(__FILE__)) + "/refs/main.min.js"
|
33
|
+
|
34
|
+
File.open path + "/refs/main.min.css", "w" do |c|
|
35
|
+
c << IO.read(cssFile)
|
36
|
+
end
|
37
|
+
|
38
|
+
File.open path + "/refs/main.min.js", "w" do |c|
|
39
|
+
c << IO.read(jsFile)
|
40
|
+
end
|
41
|
+
|
42
|
+
templateFile = File.expand_path(File.dirname(__FILE__)) + "/index.erb"
|
43
|
+
File.open path + "/index.html", "w" do |f|
|
44
|
+
f << ERB.new(IO.read(templateFile), nil, '>', 'output').result(binding)
|
45
|
+
end
|
46
|
+
|
47
|
+
File.open path + "/summary.json", "w" do |f|
|
48
|
+
f.write summary.to_json
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "\n"
|
52
|
+
puts "---------------------------------------------------------"
|
53
|
+
puts "Total Suits : #{summary['groupCount']}"
|
54
|
+
puts "Total Tests : #{summary['testCount']}"
|
55
|
+
puts "Total Passed : #{summary['passCount']}"
|
56
|
+
puts "Total Failed : #{summary['failureCount']}"
|
57
|
+
puts "Total Pending : #{summary['pendingCount']}"
|
58
|
+
puts "Total Time Taken : #{summary['duration']}"
|
59
|
+
puts "---------------------------------------------------------"
|
60
|
+
|
61
|
+
if(documentation)
|
62
|
+
puts "=====================Exceptions=========================="
|
63
|
+
cnt = 0
|
64
|
+
@baseData['failed'].each do |failedTest|
|
65
|
+
exMessage = failedTest['exception']['message'].gsub("\n","")
|
66
|
+
exType = failedTest['exception']['type']
|
67
|
+
puts "\n#{cnt + 1}. #{failedTest['fullName']}"
|
68
|
+
puts "Exception : #{exType}"
|
69
|
+
puts "Message : #{exMessage}"
|
70
|
+
cnt = cnt + 1
|
71
|
+
puts "\n"
|
72
|
+
end
|
73
|
+
puts "========================================================="
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/index.erb
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Shreyas</title>
|
4
|
+
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
5
|
+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400" rel="stylesheet">
|
6
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
7
|
+
<link href="./refs/main.min.css" rel="stylesheet">
|
8
|
+
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
|
9
|
+
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
10
|
+
<script src="./refs/main.min.js"></script>
|
11
|
+
<script>
|
12
|
+
$(document).ready(function(){
|
13
|
+
initialise('<%= groupNames %>');
|
14
|
+
});
|
15
|
+
</script>
|
16
|
+
</head>
|
17
|
+
<body>
|
18
|
+
<div id="holder">
|
19
|
+
<nav id="menuHeader" class="navbar navbar-default">
|
20
|
+
<div>
|
21
|
+
<div class="navbar-header">
|
22
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
|
23
|
+
<span class="sr-only">Toggle navigation</span>
|
24
|
+
<span class="icon-bar"></span>
|
25
|
+
<span class="icon-bar"></span>
|
26
|
+
<span class="icon-bar"></span>
|
27
|
+
</button>
|
28
|
+
<a class="navbar-brand" href="#" onClick="openNav()"><i class="material-icons md-18 slideSide">dehaze</i></a>
|
29
|
+
<p class="navbar-text" ><%= summary['projectName'] %></p>
|
30
|
+
</div>
|
31
|
+
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1" >
|
32
|
+
<ul class="nav navbar-nav navbar-right">
|
33
|
+
<li><p class="navbar-text"><i class="material-icons md-18" >timer</i> <%= summary['duration'] %></p></li>
|
34
|
+
<li><p class="navbar-text"><i class="material-icons md-18" style="color: lightgreen">folder</i> <%= summary['groupCount'] %></p></li>
|
35
|
+
<li><p class="navbar-text"><i class="material-icons md-18" style="color: dodgerblue">library_books</i> <%= summary['testCount'] %></p></li>
|
36
|
+
<li><p class="navbar-text"><i class="material-icons md-18" style="color: #4CAF50">done</i> <%= summary['passCount'] %></p></li>
|
37
|
+
<li><p class="navbar-text"><i class="material-icons md-18" style="color: red">clear</i> <%= summary['failureCount'] %></p></li>
|
38
|
+
<li><p class="navbar-text"><i class="material-icons md-18" style="color: orange">pan_tool</i> <%=summary['pendingCount'] %></p></li>
|
39
|
+
</ul>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</nav>
|
43
|
+
<div id="mainBody" class="container-fluid">
|
44
|
+
<a href="#" class="goTop" onClick="navigateToTop()" style="display: none;"><i class="material-icons">publish</i></a>
|
45
|
+
<div id="main">
|
46
|
+
<% suits.each do |suit| %>
|
47
|
+
<div id="Main_<%= suit['group']%>" class="suitContainer">
|
48
|
+
|
49
|
+
<div class="container">
|
50
|
+
<div class="suitTitle"><%= suit['group']%></div>
|
51
|
+
<div class="suitDetails">
|
52
|
+
<div>
|
53
|
+
<ul class="list-inline">
|
54
|
+
<li><i class="material-icons md-18" style="color: dodgerblue">library_books</i> <%= suit['testCount']%></li>
|
55
|
+
<li><i class="material-icons md-18" style="color: #4CAF50">done</i> <%= suit['passedCount']%> </li>
|
56
|
+
<li><i class="material-icons md-18" style="color: red">clear</i> <%= suit['failedCount']%></li>
|
57
|
+
<li><i class="material-icons md-18" style="color: orange">warning</i> <%= suit['pendingCount']%></li>
|
58
|
+
<li><i class="material-icons md-18" style="color: #333">timer</i> <%= suit['totalTimeForSuit']%></li>
|
59
|
+
<li><i class="material-icons md-18" style="color: #666">location_on</i> <%= suit['location']%></li>
|
60
|
+
</ul>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
<div class="col-sm-12 testContainer" >
|
64
|
+
<% suit['grpTests'].each do |test|%>
|
65
|
+
<div class=" row testDetail">
|
66
|
+
<div id="Boundary_<%= test['status']%>_<%= test['id']%>" class="col-sm-12 testBoundary anchorDiv" onClick="showErrorDetails(<%= test['id']%>, '<%= test['status']%>')">
|
67
|
+
<%if test['status'] == 'passed' %>
|
68
|
+
<div class="col-sm-10"><i class="material-icons md-24" style="color: #4CAF50">check_circle</i> <%= test['fullName']%></div>
|
69
|
+
<% elsif test['status'] == 'failed' %>
|
70
|
+
<div class="col-sm-10"><i class="material-icons md-24" style="color: red">error</i> <%= test['fullName']%></div>
|
71
|
+
<% elsif test['status'] == 'pending' %>
|
72
|
+
<div class="col-sm-10"><i class="material-icons md-24" style="color: orange">warning</i> <%= test['fullName']%></div>
|
73
|
+
<%end %>
|
74
|
+
<div class="col-sm-2 alignRight"><%= RSpec::Core::Formatters::Helpers.format_duration(test['runtime'].round(3))%> <i class="material-icons md-24" style="color: silver;">timer</i></div>
|
75
|
+
<%if test['status'] == 'failed'|| test['status'] == 'pending' %>
|
76
|
+
<div class="col-sm-12 exceptionDiv ">
|
77
|
+
<%if test['status'] == 'failed'%>
|
78
|
+
<div class="col-sm-12"><%= test['exception']['type'].split('::')[2]%>: <%= test['exception']['message']%></div>
|
79
|
+
<%end %>
|
80
|
+
</div>
|
81
|
+
<div>
|
82
|
+
<div id="Exception_<%= test['id']%>" class="col-sm-12 exceptionDiv">
|
83
|
+
<div class="well errorInfo">
|
84
|
+
<div><i class="material-icons">keyboard_arrow_right</i> Location : <%= suit['location']%></div>
|
85
|
+
<div><i class="material-icons">keyboard_arrow_right</i> Line No : <%= test['lineNo']%></div>
|
86
|
+
<%if test['status'] == 'failed'%><div><i class="material-icons">keyboard_arrow_right</i> Type : <%= test['exception']['type'].split('::')[2]%></div><%end %>
|
87
|
+
<%if test['status'] == 'failed'%>
|
88
|
+
<div><i class="material-icons">keyboard_arrow_right</i> Message : <%= test['exception']['message']%></div>
|
89
|
+
<% elsif test['status'] == 'pending' %>
|
90
|
+
<div><i class="material-icons">keyboard_arrow_right</i> Message : <%= test['pendingMessage']%></div>
|
91
|
+
<%end %>
|
92
|
+
</div>
|
93
|
+
<%if test['status'] == 'failed'%>
|
94
|
+
<div class="well">
|
95
|
+
<div><%= test['exception']['backtrace'] %></div>
|
96
|
+
</div>
|
97
|
+
<%end %>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
<%end %>
|
101
|
+
</div>
|
102
|
+
</div>
|
103
|
+
<%end %>
|
104
|
+
</div>
|
105
|
+
</div>
|
106
|
+
</div>
|
107
|
+
<%end %>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
<div class="footer">
|
111
|
+
<div class="mainFooter"><%= footer%></div>
|
112
|
+
<div class="fixedFooter">© Page generated by SbFormat</div> </div>
|
113
|
+
|
114
|
+
<!-- Side Menu Starts -->
|
115
|
+
<div id="slideMenu" class="sidenav">
|
116
|
+
<div>
|
117
|
+
<div class="col-sm-12 bottomBorder">
|
118
|
+
<div class="col-sm-9 sideNavHeading"><%= summary['projectName']%></div>
|
119
|
+
<div class="col-sm-3 anchorDiv" style="text-align: right;" onclick="closeNav()"><i class="material-icons md-24" style="color: red">clear</i></div>
|
120
|
+
<br/>
|
121
|
+
<div class="col-sm-12 sideNavSubHeading"><%= currentTime%></div>
|
122
|
+
</div> <!-- Main Heading Side Menu End -->
|
123
|
+
<div class="col-sm-12 bottomBorder"> <!-- Bottom Border Nav Settings starts -->
|
124
|
+
<div class="col-sm-12 navSettings">
|
125
|
+
<div class="col-sm-8 navSettingsText"><i class="material-icons md-18" style="color: #4CAF50">done</i> Show passed</div>
|
126
|
+
<div class="col-sm-4 navSettingsText anchorDiv" style="text-align: right;" onclick="toggleCheck('P')"><i id="chkPass" class="material-icons md-24" style="color: gray"></i></div>
|
127
|
+
</div>
|
128
|
+
<div class="col-sm-12 navSettings">
|
129
|
+
<div class="col-sm-8 navSettingsText"><i class="material-icons md-18" style="color: red">clear</i> Show failed</div>
|
130
|
+
<div class="col-sm-4 navSettingsText anchorDiv" style="text-align: right;" onclick="toggleCheck('F')"><i id="chkFail" class="material-icons md-24" style="color: gray"></i></div>
|
131
|
+
</div>
|
132
|
+
<div class="col-sm-12 navSettings">
|
133
|
+
<div class="col-sm-8 navSettingsText"><i class="material-icons md-18" style="color: orange">pan_tool</i> Show pending</div>
|
134
|
+
<div class="col-sm-4 navSettingsText anchorDiv" style="text-align: right;" onclick="toggleCheck('W')"><i id="chkPending" class="material-icons md-24" style="color: gray"></i></div>
|
135
|
+
</div>
|
136
|
+
</div> <!-- Bottom Border Nav Settings End -->
|
137
|
+
<div class="col-sm-12 bottomBorder"> <!-- Bottom Border Suits Names starts -->
|
138
|
+
<div>
|
139
|
+
<% suits.each do |suit| %>
|
140
|
+
<a href="#" class="col-sm-12 navSuits">
|
141
|
+
|
142
|
+
<%if suit['status'] == 'P' %>
|
143
|
+
<div class="col-sm-1 "><i class="material-icons md-18" style="color: #4CAF50">done_all</i></div>
|
144
|
+
<% elsif suit['status'] == 'F' %>
|
145
|
+
<div class="col-sm-1 "><i class="material-icons md-18" style="color: red">error</i></div>
|
146
|
+
<% elsif suit['status'] == 'W' || suit['status'] == 'FW' %>
|
147
|
+
<div class="col-sm-1 "><i class="material-icons md-18" style="color: orange">warning</i></div>
|
148
|
+
<%end %>
|
149
|
+
<div class="col-sm-10" onClick="navigateToSuit('<%= suit['group']%>')"><%= suit['group']%></div>
|
150
|
+
|
151
|
+
</a>
|
152
|
+
<%end %>
|
153
|
+
</div>
|
154
|
+
</div> <!-- Bottom Border Suits Names Ends -->
|
155
|
+
</div>
|
156
|
+
</div>
|
157
|
+
<!-- Side Menu Ends -->
|
158
|
+
</div>
|
159
|
+
</body>
|
160
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
#mainBody,body{background:#F2F2F2}.sidenav,.testDetail{border-right:1px solid #f5f5f5}body{font-family:'Open Sans',sans-serif;height:100%}#holder{min-height:100%;position:relative}#mainBody{padding-bottom:100px}.navbar-default .navbar-collapse,.navbar-header{background-color:#45555D}.container-fluid{background-color:#fff}.navbar-default .navbar-brand,.navbar-default .navbar-text,.slideSide,.slideSide:active,.slideSide:focus,.slideSide:hover{color:#fff}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga';vertical-align:middle}.material-icons.md-14{font-size:14px}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}#menuHeader:after{width:0;border-bottom:4px solid silver;-webkit-animation:transit 3s forwards;-webkit-animation-direction:right;animation:transit 2s forwards;animation-direction:right}@-webkit-keyframes transit{0%{width:0}100%{width:100%}}@keyframes transit{0%{width:0}100%{width:100%}}.footer{text-align:center;bottom:0;padding:10px;left:0;position:absolute;right:0}.fixedFooter{opacity:.3;font-size:12px;color:#111}.mainFooter{font-size:15px;color:#111}.suitDetails{padding-top:8px;color:#111;font-size:12px;text-align:left}.testContainer{box-shadow:10px 10px 5px #888}.suitTitle{font-weight:700;font-size:20px}.testDetail{border-left:1px solid #f5f5f5;border-bottom:1px solid #f5f5f5;background:#fff}.testDetail:first-child{border-top:1px solid #f5f5f5}.testBoundary{border-left:5px solid #fff;padding:15px 0}.testBoundary:hover{border-left:5px solid silver}.errorBoundary,.errorBoundary:hover{border-left:5px solid red}.warningBoundary,.warningBoundary:hover{border-left:5px solid orange}.alignRight{text-align:right}.alignLeft{text-align:left}.suitContainer{margin-top:40px}.exceptionDiv{padding-top:10px;padding-left:27px;color:red;font-size:13px}.well{margin-bottom:1px;background-color:gray;color:#fafad2;font-size:13px;font-family:consolas;border-radius:0}.goTop,.goTop:hover{color:#fff;text-decoration:none}.errorInfo div{border-bottom:1px solid #8C8C8C;padding:4px 0}.errorInfo div:last-child{border-bottom:none}.goTop{position:fixed;bottom:50px;right:.5em;background-color:rgba(0,0,0,.25);font-size:12px;padding:10px;display:none;margin:0}.goTop:hover{background-color:rgba(0,0,0,.6)}.sidenav{height:100%;width:0;position:fixed;z-index:1;top:0;left:0;background-color:#fff;overflow-x:hidden;padding-top:25px;transition:.5s}.bottomBorder{border-bottom:1px solid #f5f5f5;margin-bottom:10px;padding-bottom:10px}.sideNavHeading{overflow:hidden;font-size:20px}.sideNavSubHeading{color:silver;font-size:12px;text-align:left;font-weight:lighter}.navSettingsText,.navSuits{color:#a9a9a9;font-size:13px;padding:8px 0}.anchorDiv{cursor:pointer;cursor:hand}.navSettings{background:#f5f5f5}.navSettings:nth-child(even){background-color:#fff}.navSuits{display:block;transition:.3s;text-decoration:none}.navSuits:hover{color:red}@media screen and (max-height:450px){.sidenav{padding-top:15px}.sidenav a{font-size:18px}}
|
@@ -0,0 +1 @@
|
|
1
|
+
function initialise(a){$("#chkPass").text("radio_button_checked"),$("#chkFail").text("radio_button_checked"),$("#chkPending").text("radio_button_checked");var b=JSON.parse(a);for(console.log("suits: ",b),console.log("suits: ",b.length),i=0;i<b.length;i++){var c="#"+b[i]+"Accordion";console.log("acc: ",c),$(c).text("arrow_drop_down")}var d=$('[id^="Exception_"]').get();for(i=0;i<d.length;i++){var e="#"+d[i].id;$(e).hide()}$("html, body").animate({scrollTop:0},300),showToTopButton()}function showToTopButton(){$(window).scroll(function(){$(this).scrollTop()>200?$(".goTop").fadeIn(500):$(".goTop").fadeOut(500)})}function navigateToTop(){$(".goTop").click(function(a){$("html, body").animate({scrollTop:0},slow),a.preventDefault()})}function openNav(){$("#slideMenu").width(350)}function closeNav(){$("#slideMenu").width(0)}function toggleCheck(a){if(unCheckText="radio_button_unchecked",checkText="radio_button_checked","P"===a){var b=$('[id^="Boundary_passed_"]').get();if($("#chkPass").text()===checkText)for($("#chkPass").text(unCheckText),i=0;i<b.length;i++){var c="#"+b[i].id;$(c).hide("slow")}else for($("#chkPass").text(checkText),i=0;i<b.length;i++){var c="#"+b[i].id;$(c).show("slow")}}if("F"===a){var d=$('[id^="Boundary_failed_"]').get();if($("#chkFail").text()===checkText)for($("#chkFail").text(unCheckText),i=0;i<d.length;i++){var c="#"+d[i].id;$(c).hide("slow")}else for($("#chkFail").text(checkText),i=0;i<d.length;i++){var c="#"+d[i].id;$(c).show("slow")}}if("W"===a){var e=$('[id^="Boundary_pending_"]').get();if($("#chkPending").text()===checkText)for($("#chkPending").text(unCheckText),i=0;i<e.length;i++){var c="#"+e[i].id;$(c).hide("slow")}else for($("#chkPending").text(checkText),i=0;i<e.length;i++){var c="#"+e[i].id;$(c).show("slow")}}}function navigateToSuit(a){var b="#Main_"+a,c=0;c=110==$(b).offset().top?60:$(b).offset().top,$("html,body").animate({scrollTop:c},"slow"),closeNav()}function toggleAccordion(a){downArrow="arrow_drop_down",upArrow="arrow_drop_up";var b="#"+a+"Accordion";$(b).text()==downArrow?$(b).text(upArrow):$(b).text(downArrow)}function showErrorDetails(a,b){var c="#Exception_"+a,d="#Boundary_"+a;"failed"==b&&($(d).toggleClass("errorBoundary"),$(c).toggle()),"pending"==b&&($(d).toggleClass("warningBoundary"),$(c).toggle())}
|
data/lib/sbformat.rb
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'html_generator'
|
3
|
+
|
4
|
+
class SbFormat
|
5
|
+
attr_accessor :summary
|
6
|
+
RSpec::Core::Formatters.register self, :dump_summary, :close, :example_passed, :example_failed, :example_pending, :dump_pending, :dump_failures
|
7
|
+
|
8
|
+
def initialize output
|
9
|
+
@output = output
|
10
|
+
@testsb = []
|
11
|
+
@passed = []
|
12
|
+
@failed = []
|
13
|
+
@pending = []
|
14
|
+
@jsonOutput = {}
|
15
|
+
@projectName = 'SB'
|
16
|
+
@footerMessage = ''
|
17
|
+
@outPath = ''
|
18
|
+
@documentation = false
|
19
|
+
@count = 0
|
20
|
+
|
21
|
+
if File.exist?('.sbfrc')
|
22
|
+
begin
|
23
|
+
x = JSON.parse(IO.read('.sbfrc'))
|
24
|
+
if(x.has_key? 'project')
|
25
|
+
@projectName = x['project']
|
26
|
+
end
|
27
|
+
|
28
|
+
if(x.has_key? 'footer')
|
29
|
+
@footerMessage = x['footer']
|
30
|
+
end
|
31
|
+
|
32
|
+
if(x.has_key? 'outPath')
|
33
|
+
@outPath = x['outPath']
|
34
|
+
end
|
35
|
+
|
36
|
+
if(x.has_key? 'document')
|
37
|
+
@documentation = x['document'].eql?('true') ? true : false
|
38
|
+
end
|
39
|
+
rescue
|
40
|
+
puts 'rescue block'
|
41
|
+
end
|
42
|
+
else
|
43
|
+
puts false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def example_passed notification # ExampleNotification
|
48
|
+
test = {
|
49
|
+
group: notification.example.example_group,
|
50
|
+
name: notification.example.description,
|
51
|
+
fullName: notification.example.full_description,
|
52
|
+
status: notification.example.execution_result.status.to_s,
|
53
|
+
location: notification.example.location.split(":")[0],
|
54
|
+
lineNo: notification.example.location.split(":")[1],
|
55
|
+
runtime: notification.example.execution_result.run_time,
|
56
|
+
pendingMessage: notification.example.execution_result.pending_message,
|
57
|
+
id: @count + 1
|
58
|
+
}
|
59
|
+
@count = @count + 1
|
60
|
+
@testsb.push(test)
|
61
|
+
@passed.push(test)
|
62
|
+
print "."
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def example_failed notification # FailedExampleNotification
|
67
|
+
test = {
|
68
|
+
group: notification.example.example_group,
|
69
|
+
name: notification.example.description,
|
70
|
+
fullName: notification.example.full_description,
|
71
|
+
status: notification.example.execution_result.status.to_s,
|
72
|
+
location: notification.example.location.split(":")[0],
|
73
|
+
lineNo: notification.example.location.split(":")[1],
|
74
|
+
runtime: notification.example.execution_result.run_time,
|
75
|
+
id: @count + 1,
|
76
|
+
exception: {
|
77
|
+
type: notification.example.exception.class,
|
78
|
+
message: notification.example.execution_result.exception.message,
|
79
|
+
backtrace: notification.example.exception.backtrace
|
80
|
+
},
|
81
|
+
pendingMessage: notification.example.execution_result.pending_message
|
82
|
+
}
|
83
|
+
@count = @count + 1
|
84
|
+
@testsb.push(test)
|
85
|
+
@failed.push(test)
|
86
|
+
print "F"
|
87
|
+
end
|
88
|
+
|
89
|
+
def example_pending notification # ExampleNotification
|
90
|
+
test = {
|
91
|
+
group: notification.example.example_group,
|
92
|
+
name: notification.example.description,
|
93
|
+
fullName: notification.example.full_description,
|
94
|
+
status: notification.example.execution_result.status.to_s,
|
95
|
+
location: notification.example.location.split(":")[0],
|
96
|
+
lineNo: notification.example.location.split(":")[1],
|
97
|
+
runtime: notification.example.execution_result.run_time,
|
98
|
+
pendingMessage: notification.example.execution_result.pending_message,
|
99
|
+
id: @count + 1
|
100
|
+
}
|
101
|
+
@count = @count + 1
|
102
|
+
@testsb.push(test)
|
103
|
+
@pending.push(test)
|
104
|
+
print "*"
|
105
|
+
end
|
106
|
+
|
107
|
+
def dump_summary notification # SummaryNotification
|
108
|
+
groupArray = @testsb.map{ |a|
|
109
|
+
{
|
110
|
+
group: a[:group].to_s.split('::')[2],
|
111
|
+
status: a[:status],
|
112
|
+
location: a[:location],
|
113
|
+
runtime: a[:runtime],
|
114
|
+
id: a[:id]
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
groupNames = groupArray.map{|a| a[:group]}.uniq
|
120
|
+
suits = groupNames.map do |g|
|
121
|
+
status = 'P'
|
122
|
+
passCount = 0;
|
123
|
+
failCount = 0;
|
124
|
+
pendCount = 0;
|
125
|
+
count = 0
|
126
|
+
totalTime = 0
|
127
|
+
location = ''
|
128
|
+
id = 0
|
129
|
+
|
130
|
+
groupArray.each do |c|
|
131
|
+
if c[:group] == g
|
132
|
+
count = count + 1
|
133
|
+
location = c[:location]
|
134
|
+
totalTime = totalTime + c[:runtime]
|
135
|
+
id = c[:id]
|
136
|
+
|
137
|
+
if c[:status] == 'pending'
|
138
|
+
pendCount = pendCount + 1
|
139
|
+
|
140
|
+
if status == 'P'
|
141
|
+
status = 'W'
|
142
|
+
elsif status == 'F'
|
143
|
+
status = 'FW'
|
144
|
+
end
|
145
|
+
elsif c[:status] == 'failed'
|
146
|
+
failCount = failCount + 1
|
147
|
+
|
148
|
+
if status == 'P'
|
149
|
+
status = 'F'
|
150
|
+
elsif status == 'W'
|
151
|
+
status = 'FW'
|
152
|
+
end
|
153
|
+
else
|
154
|
+
passCount = passCount + 1
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
groupTests = @testsb.select{|y| y[:group].to_s.split('::')[2] == g}
|
160
|
+
|
161
|
+
{
|
162
|
+
group: g,
|
163
|
+
status: status,
|
164
|
+
location: location,
|
165
|
+
testCount: count,
|
166
|
+
passedCount: passCount,
|
167
|
+
failedCount: failCount,
|
168
|
+
pendingCount: pendCount,
|
169
|
+
totalTimeForSuit: RSpec::Core::Formatters::Helpers.format_duration(totalTime.round(3)),
|
170
|
+
grpTests: groupTests,
|
171
|
+
id: id
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
summary = {
|
176
|
+
duration: RSpec::Core::Formatters::Helpers.format_duration(notification.duration.round(3)),
|
177
|
+
groupCount: suits.length,
|
178
|
+
testCount: notification.example_count,
|
179
|
+
pendingCount: notification.pending_count,
|
180
|
+
failureCount: notification.failure_count,
|
181
|
+
passCount: notification.example_count - ( notification.pending_count + notification.failure_count),
|
182
|
+
projectName: @projectName
|
183
|
+
}
|
184
|
+
# @output << "\n\nFinished in #{RSpec::Core::Formatters::Helpers.format_duration(notification.duration)}.\n"
|
185
|
+
jo = @jsonOutput
|
186
|
+
jo[:summary] = summary
|
187
|
+
jo[:allTests] = @testsb
|
188
|
+
jo[:pending] = @pending
|
189
|
+
jo[:failed] = @failed
|
190
|
+
jo[:passed] = @passed
|
191
|
+
jo[:suits] = suits
|
192
|
+
jo[:groupNames] = groupNames
|
193
|
+
|
194
|
+
externalDetails = {}
|
195
|
+
externalDetails[:userDetails] = {
|
196
|
+
projectName: @projectName,
|
197
|
+
footerMessage: @footerMessage,
|
198
|
+
outPath: @outPath,
|
199
|
+
documentation: @documentation
|
200
|
+
}
|
201
|
+
generator = HtmlGenerator.new(jo.to_json, externalDetails.to_json)
|
202
|
+
generator.createHtml
|
203
|
+
|
204
|
+
# @output << "Wrote the file in formattor/report.json"
|
205
|
+
end
|
206
|
+
|
207
|
+
def dump_failures notification # ExamplesNotification
|
208
|
+
# @output << "\nFAILING\n\t"
|
209
|
+
# # For every failed example...
|
210
|
+
# @output << notification.failed_examples.map do |example|
|
211
|
+
# # Extract the full description of the example
|
212
|
+
|
213
|
+
# full_description = example.full_description
|
214
|
+
# # Extract the example location in the file
|
215
|
+
# location = example.location
|
216
|
+
# #- #{example.execution_result.exception.message}
|
217
|
+
|
218
|
+
# "#{example.description} - #{full_description} - #{example.execution_result.status} - #{location} - #{example.example_group} - #{example.exception.class}"
|
219
|
+
# end.join("\n\n\t")
|
220
|
+
end
|
221
|
+
|
222
|
+
def dump_pending notification # ExamplesNotification
|
223
|
+
# @output << "\n\nPENDING:\n\t"
|
224
|
+
|
225
|
+
# @output << notification.pending_examples.map {|example| example.full_description + " - " + example.location + " - #{example.execution_result.pending_message}"}.join("\n\t")
|
226
|
+
end
|
227
|
+
|
228
|
+
def close notification # NullNotification
|
229
|
+
# ARGV.each do|a|
|
230
|
+
# puts "Argument: #{a}"
|
231
|
+
# end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sbformat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shreyas Bande
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-01-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.4'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.4'
|
47
|
+
description: Formats the rspec results beautifully in html
|
48
|
+
email: shreyas.bande@abc
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- lib/html_generator.rb
|
54
|
+
- lib/index.erb
|
55
|
+
- lib/refs/main.min.css
|
56
|
+
- lib/refs/main.min.js
|
57
|
+
- lib/sbformat.rb
|
58
|
+
homepage: https://rubygems.org/gems/example
|
59
|
+
licenses:
|
60
|
+
- SB
|
61
|
+
metadata: {}
|
62
|
+
post_install_message: Thanks for installing!
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.6.10
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: SB Formatter
|
82
|
+
test_files: []
|