continuous4r 0.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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +83 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/lib/capistrano_formatter.rb +19 -0
- data/lib/continuous4r/version.rb +9 -0
- data/lib/continuous4r.rb +490 -0
- data/lib/flog_formatter.rb +48 -0
- data/lib/heckle_formatter.rb +27 -0
- data/lib/httperf_formatter.rb +160 -0
- data/lib/site/body-capistrano.rhtml +8 -0
- data/lib/site/body-changelog.rhtml +8 -0
- data/lib/site/body-continuous4r-reports.rhtml +83 -0
- data/lib/site/body-dcov.rhtml +27 -0
- data/lib/site/body-dependencies.rhtml +52 -0
- data/lib/site/body-flog.rhtml +15 -0
- data/lib/site/body-heckle.rhtml +16 -0
- data/lib/site/body-httperf.rhtml +8 -0
- data/lib/site/body-index.rhtml +71 -0
- data/lib/site/body-issue-tracking.rhtml +38 -0
- data/lib/site/body-kwala.rhtml +35 -0
- data/lib/site/body-railroad.rhtml +29 -0
- data/lib/site/body-rcov.rhtml +23 -0
- data/lib/site/body-rdoc.rhtml +12 -0
- data/lib/site/body-scm-usage.rhtml +37 -0
- data/lib/site/body-stats.rhtml +8 -0
- data/lib/site/body-team-list.rhtml +73 -0
- data/lib/site/body-tests.rhtml +8 -0
- data/lib/site/body-zentest.rhtml +8 -0
- data/lib/site/header.rhtml +41 -0
- data/lib/site/images/continuous4r-logo.png +0 -0
- data/lib/site/images/external.png +0 -0
- data/lib/site/images/icon_error_sml.gif +0 -0
- data/lib/site/images/icon_success_sml.gif +0 -0
- data/lib/site/images/newwindow.png +0 -0
- data/lib/site/menu-capistrano.rhtml +23 -0
- data/lib/site/menu-changelog.rhtml +23 -0
- data/lib/site/menu-continuous4r-reports.rhtml +31 -0
- data/lib/site/menu-dcov.rhtml +23 -0
- data/lib/site/menu-dependencies.rhtml +19 -0
- data/lib/site/menu-flog.rhtml +23 -0
- data/lib/site/menu-heckle.rhtml +23 -0
- data/lib/site/menu-httperf.rhtml +23 -0
- data/lib/site/menu-index.rhtml +19 -0
- data/lib/site/menu-issue-tracking.rhtml +19 -0
- data/lib/site/menu-kwala.rhtml +23 -0
- data/lib/site/menu-railroad.rhtml +23 -0
- data/lib/site/menu-rcov.rhtml +23 -0
- data/lib/site/menu-rdoc.rhtml +23 -0
- data/lib/site/menu-scm-usage.rhtml +19 -0
- data/lib/site/menu-stats.rhtml +23 -0
- data/lib/site/menu-team-list.rhtml +19 -0
- data/lib/site/menu-tests.rhtml +23 -0
- data/lib/site/menu-zentest.rhtml +23 -0
- data/lib/site/style/commons-maven.css +113 -0
- data/lib/site/style/maven-base.css +151 -0
- data/lib/site/style/maven-theme.css +100 -0
- data/lib/site/style/project.css +1 -0
- data/lib/stats_formatter.rb +51 -0
- data/lib/subversion_extractor.rb +64 -0
- data/lib/tests_formatter.rb +65 -0
- data/lib/zen_test_formatter.rb +48 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/destroy.cmd +1 -0
- data/script/generate +14 -0
- data/script/generate.cmd +1 -0
- data/script/txt2html +74 -0
- data/script/txt2html.cmd +1 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_continuous4r.rb +11 -0
- data/test/test_helper.rb +2 -0
- data/website/index.html +411 -0
- data/website/index.txt +298 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +141 -0
@@ -0,0 +1,113 @@
|
|
1
|
+
body {
|
2
|
+
color: #000;
|
3
|
+
background-color: #fff;
|
4
|
+
font-size: 13px;
|
5
|
+
}
|
6
|
+
|
7
|
+
p {
|
8
|
+
margin-left: 4px;
|
9
|
+
margin-top: 8px;
|
10
|
+
margin-bottom: 4px;
|
11
|
+
}
|
12
|
+
ul, ol {
|
13
|
+
margin-top: 4px;
|
14
|
+
margin-bottom: 4px;
|
15
|
+
}
|
16
|
+
|
17
|
+
h2 {
|
18
|
+
color: #fff;
|
19
|
+
border: none;
|
20
|
+
margin-top: 8px;
|
21
|
+
margin-bottom: 4px;
|
22
|
+
padding: 4px 4px 4px 6px;
|
23
|
+
background-color: #036;
|
24
|
+
font-weight: 900;
|
25
|
+
font-size: 13px;
|
26
|
+
background-image: url(../images/nw_maj_rond.gif);
|
27
|
+
background-repeat: no-repeat;
|
28
|
+
}
|
29
|
+
|
30
|
+
h3 {
|
31
|
+
color: #fff;
|
32
|
+
background-color: #888;
|
33
|
+
margin-top: 12px;
|
34
|
+
margin-bottom: 4px;
|
35
|
+
padding: 4px 4px 4px 6px;
|
36
|
+
border: none;
|
37
|
+
font-weight: 900;
|
38
|
+
font-size: 13px;
|
39
|
+
background-image: url(../images/nw_maj_rond.gif);
|
40
|
+
background-repeat: no-repeat;
|
41
|
+
}
|
42
|
+
|
43
|
+
div#bodyColumn {
|
44
|
+
margin-top: 0px;
|
45
|
+
margin-left: 158px;
|
46
|
+
}
|
47
|
+
|
48
|
+
div#bodyColumn a {
|
49
|
+
text-decoration: underline;
|
50
|
+
}
|
51
|
+
div#bodyColumn a:link {
|
52
|
+
color: #00f;
|
53
|
+
}
|
54
|
+
div#bodyColumn a:visited {
|
55
|
+
color: #00f;
|
56
|
+
}
|
57
|
+
a:active, a:hover {
|
58
|
+
color: #f30 !important;
|
59
|
+
}
|
60
|
+
|
61
|
+
div.source {
|
62
|
+
background-color: #eee;
|
63
|
+
color: #000;
|
64
|
+
margin-right: 0px;
|
65
|
+
margin-left: 4px;
|
66
|
+
margin-top: 1em;
|
67
|
+
}
|
68
|
+
|
69
|
+
div#leftColumn {
|
70
|
+
color: #000;
|
71
|
+
background-color: #eee;
|
72
|
+
margin-left: 0px;
|
73
|
+
margin-top: 0px;
|
74
|
+
border-right: 1px solid #aaa;
|
75
|
+
border-bottom: 1px solid #aaa;
|
76
|
+
border-top: none;
|
77
|
+
border-left: none;
|
78
|
+
width: 150px;
|
79
|
+
|
80
|
+
background-image:url(http://www.apache.org/ads/ApacheCon/2008-europe-125x125.png);
|
81
|
+
background-repeat: no-repeat;
|
82
|
+
background-position: 50% 1%;
|
83
|
+
}
|
84
|
+
div#navcolumn {
|
85
|
+
margin-top: 129px;
|
86
|
+
|
87
|
+
color: #000;
|
88
|
+
border: none;
|
89
|
+
padding: 6px 4px 0 8px;
|
90
|
+
}
|
91
|
+
|
92
|
+
#navcolumn li {
|
93
|
+
padding-left: 8px;
|
94
|
+
}
|
95
|
+
|
96
|
+
#navcolumn h5 {
|
97
|
+
padding-top: 3px;
|
98
|
+
}
|
99
|
+
|
100
|
+
#banner, #banner td {
|
101
|
+
background-color: #fff;
|
102
|
+
color: #000;
|
103
|
+
}
|
104
|
+
|
105
|
+
#banner td {
|
106
|
+
height: 100%;
|
107
|
+
vertical-align: middle;
|
108
|
+
}
|
109
|
+
|
110
|
+
#menuCommons a.externalLink, #menuCommons a.externalLink:link, #menuCommons a.externalLink:visited, #menuCommons a.externalLink:active, #menuCommons a.externalLink:hover {
|
111
|
+
background-image: none;
|
112
|
+
padding-right: 0px;
|
113
|
+
}
|
@@ -0,0 +1,151 @@
|
|
1
|
+
body {
|
2
|
+
margin: 0px;
|
3
|
+
padding: 0px 0px 10px 0px;
|
4
|
+
}
|
5
|
+
img {
|
6
|
+
border:none;
|
7
|
+
}
|
8
|
+
table {
|
9
|
+
padding:0px;
|
10
|
+
width: 100%;
|
11
|
+
margin-left: -2px;
|
12
|
+
margin-right: -2px;
|
13
|
+
}
|
14
|
+
acronym {
|
15
|
+
cursor: help;
|
16
|
+
border-bottom: 1px dotted #feb;
|
17
|
+
}
|
18
|
+
table.bodyTable th, table.bodyTable td {
|
19
|
+
padding: 2px 4px 2px 4px;
|
20
|
+
vertical-align: top;
|
21
|
+
}
|
22
|
+
div.clear{
|
23
|
+
clear:both;
|
24
|
+
visibility: hidden;
|
25
|
+
}
|
26
|
+
div.clear hr{
|
27
|
+
display: none;
|
28
|
+
}
|
29
|
+
#projectLogo {
|
30
|
+
font-size: xx-large;
|
31
|
+
font-weight: bold;
|
32
|
+
}
|
33
|
+
#organizationLogo img, #projectLogo img, #projectLogo span{
|
34
|
+
margin: 8px;
|
35
|
+
}
|
36
|
+
#projectLogo span{
|
37
|
+
border: 1px solid;
|
38
|
+
padding: 4px 10px 4px 10px;
|
39
|
+
background-color: #eee;
|
40
|
+
cursor: pointer;
|
41
|
+
}
|
42
|
+
.xleft, #organizationLogo img{
|
43
|
+
float:left;
|
44
|
+
}
|
45
|
+
.xright, #projectLogo img, #projectLogo span{
|
46
|
+
float:right;
|
47
|
+
text-shadow: #7CFC00;
|
48
|
+
}
|
49
|
+
#banner {
|
50
|
+
border-bottom: 1px solid #fff;
|
51
|
+
}
|
52
|
+
#banner img {
|
53
|
+
border: none;
|
54
|
+
}
|
55
|
+
#footer, #breadcrumbs {
|
56
|
+
padding: 3px 10px 3px 10px;
|
57
|
+
}
|
58
|
+
#leftColumn {
|
59
|
+
width: 18%;
|
60
|
+
float:left;
|
61
|
+
}
|
62
|
+
#bodyColumn {
|
63
|
+
margin-left: 20%;
|
64
|
+
}
|
65
|
+
#legend {
|
66
|
+
padding: 8px 0 8px 0;
|
67
|
+
}
|
68
|
+
#navcolumn {
|
69
|
+
padding: 8px 4px 0 8px;
|
70
|
+
}
|
71
|
+
#navcolumn h5, #navcolumn ul {
|
72
|
+
margin: 0;
|
73
|
+
padding: 0;
|
74
|
+
font-size: small;
|
75
|
+
}
|
76
|
+
#navcolumn li {
|
77
|
+
list-style-type: none;
|
78
|
+
background-image: none;
|
79
|
+
background-repeat: no-repeat;
|
80
|
+
background-position: 0 0.4em;
|
81
|
+
padding-left: 16px;
|
82
|
+
list-style-position: ouside;
|
83
|
+
line-height: 1.2em;
|
84
|
+
font-size: smaller;
|
85
|
+
}
|
86
|
+
#navcolumn li.expanded {
|
87
|
+
background-image: url(../images/expanded.gif);
|
88
|
+
}
|
89
|
+
#navcolumn li.collapsed {
|
90
|
+
background-image: url(../images/collapsed.gif);
|
91
|
+
}
|
92
|
+
#poweredBy {
|
93
|
+
text-align: center;
|
94
|
+
}
|
95
|
+
#navcolumn img {
|
96
|
+
margin-top: 10px;
|
97
|
+
margin-bottom: 3px;
|
98
|
+
}
|
99
|
+
#poweredBy img {
|
100
|
+
display:block;
|
101
|
+
margin: 20px 0 20px 17px;
|
102
|
+
border: 1px solid black;
|
103
|
+
width: 90px;
|
104
|
+
height: 30px;
|
105
|
+
}
|
106
|
+
#searchbar img {
|
107
|
+
margin: 0px;
|
108
|
+
display: block;
|
109
|
+
}
|
110
|
+
#searchbar #q, #searchbar #btnG {
|
111
|
+
border: 1px solid #999;
|
112
|
+
margin-bottom:10px;
|
113
|
+
}
|
114
|
+
#searchbar form {
|
115
|
+
margin: 0px;
|
116
|
+
}
|
117
|
+
#lastPublished {
|
118
|
+
font-size: x-small;
|
119
|
+
}
|
120
|
+
.navSection {
|
121
|
+
margin-bottom: 2px;
|
122
|
+
padding: 8px;
|
123
|
+
}
|
124
|
+
.navSectionHead {
|
125
|
+
font-weight: bold;
|
126
|
+
font-size: x-small;
|
127
|
+
}
|
128
|
+
.section {
|
129
|
+
padding: 4px;
|
130
|
+
}
|
131
|
+
#footer {
|
132
|
+
font-size: x-small;
|
133
|
+
}
|
134
|
+
#breadcrumbs {
|
135
|
+
font-size: x-small;
|
136
|
+
margin: 0pt;
|
137
|
+
}
|
138
|
+
.source {
|
139
|
+
padding: 12px;
|
140
|
+
margin: 1em 7px 1em 7px;
|
141
|
+
}
|
142
|
+
.source pre {
|
143
|
+
margin: 0px;
|
144
|
+
padding: 0px;
|
145
|
+
}
|
146
|
+
.error {
|
147
|
+
background-color: #f00;
|
148
|
+
}
|
149
|
+
.ok {
|
150
|
+
background-color: #00f000;
|
151
|
+
}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
body, td, select, input, li{
|
2
|
+
font-family: Verdana, Helvetica, Arial, sans-serif;
|
3
|
+
font-size: 13px;
|
4
|
+
}
|
5
|
+
code{
|
6
|
+
font-size: 13px;
|
7
|
+
font-family: Courier New, Verdana, Helvetica, Arial, sans-serif;
|
8
|
+
}
|
9
|
+
a {
|
10
|
+
text-decoration: none;
|
11
|
+
}
|
12
|
+
a:link {
|
13
|
+
color:#36a;
|
14
|
+
}
|
15
|
+
a:visited {
|
16
|
+
color:#47a;
|
17
|
+
}
|
18
|
+
a:active, a:hover {
|
19
|
+
color:#69c;
|
20
|
+
}
|
21
|
+
#legend li.externalLink {
|
22
|
+
background: url(../images/external.png) left top no-repeat;
|
23
|
+
padding-left: 18px;
|
24
|
+
}
|
25
|
+
a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
|
26
|
+
background: url(../images/external.png) right center no-repeat;
|
27
|
+
padding-right: 18px;
|
28
|
+
}
|
29
|
+
#legend li.newWindow {
|
30
|
+
background: url(../images/newwindow.png) left top no-repeat;
|
31
|
+
padding-left: 18px;
|
32
|
+
}
|
33
|
+
a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
|
34
|
+
background: url(../images/newwindow.png) right center no-repeat;
|
35
|
+
padding-right: 18px;
|
36
|
+
}
|
37
|
+
h2 {
|
38
|
+
padding: 4px 4px 4px 6px;
|
39
|
+
border: 1px solid #999;
|
40
|
+
color: #900;
|
41
|
+
background-color: #ddd;
|
42
|
+
font-weight:900;
|
43
|
+
font-size: x-large;
|
44
|
+
}
|
45
|
+
h3 {
|
46
|
+
padding: 4px 4px 4px 6px;
|
47
|
+
border: 1px solid #aaa;
|
48
|
+
color: #900;
|
49
|
+
background-color: #eee;
|
50
|
+
font-weight: normal;
|
51
|
+
font-size: large;
|
52
|
+
}
|
53
|
+
p {
|
54
|
+
line-height: 1.3em;
|
55
|
+
font-size: small;
|
56
|
+
}
|
57
|
+
#breadcrumbs {
|
58
|
+
border-top: 1px solid #aaa;
|
59
|
+
border-bottom: 1px solid #aaa;
|
60
|
+
background-color: #ccc;
|
61
|
+
}
|
62
|
+
#leftColumn {
|
63
|
+
margin: 10px 0 0 5px;
|
64
|
+
border: 1px solid #999;
|
65
|
+
background-color: #eee;
|
66
|
+
}
|
67
|
+
#navcolumn h5 {
|
68
|
+
font-size: smaller;
|
69
|
+
border-bottom: 1px solid #aaaaaa;
|
70
|
+
padding-top: 2px;
|
71
|
+
}
|
72
|
+
|
73
|
+
table.bodyTable th {
|
74
|
+
color: white;
|
75
|
+
background-color: #bbb;
|
76
|
+
text-align: left;
|
77
|
+
font-weight: bold;
|
78
|
+
}
|
79
|
+
|
80
|
+
table.bodyTable th, table.bodyTable td {
|
81
|
+
font-size: 1em;
|
82
|
+
}
|
83
|
+
|
84
|
+
table.bodyTable tr.a {
|
85
|
+
background-color: #ddd;
|
86
|
+
}
|
87
|
+
|
88
|
+
table.bodyTable tr.b {
|
89
|
+
background-color: #eee;
|
90
|
+
}
|
91
|
+
|
92
|
+
.source {
|
93
|
+
border: 1px solid #999;
|
94
|
+
font-family: Courier New, Verdana, Helvetica, Arial, sans-serif;
|
95
|
+
}
|
96
|
+
|
97
|
+
dt.question {
|
98
|
+
color: #900;
|
99
|
+
background-color: #eee;
|
100
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
@import url("../style/commons-maven.css");
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# =========================================================
|
2
|
+
# Classe de formatage des resultats renvoyes par rake stats
|
3
|
+
# Author: Vincent Dubois
|
4
|
+
# =========================================================
|
5
|
+
class StatsFormatter
|
6
|
+
attr_accessor :result
|
7
|
+
|
8
|
+
# Constructeur
|
9
|
+
def initialize result
|
10
|
+
self.result = result
|
11
|
+
end
|
12
|
+
|
13
|
+
# Methode qui permet de fabriquer le flux HTML a partir des flux console
|
14
|
+
def to_html
|
15
|
+
html = "<table class='bodyTable'><thead><th>Name</th><th>Lines</th><th>LOC</th><th>Classes</th><th>Methods</th><th>M/C</th><th>LOC/M</th></thead><tbody>"
|
16
|
+
i = 0
|
17
|
+
results = self.result.split(/$/)
|
18
|
+
bottom = 4
|
19
|
+
while !results[bottom].nil? and results[bottom][0..1] != "\n+" do
|
20
|
+
bottom = bottom + 1
|
21
|
+
end
|
22
|
+
lines = results[4..bottom-1]
|
23
|
+
lines.each do |line|
|
24
|
+
elements = line.split(/\|/)
|
25
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'>"
|
26
|
+
html = html + "<td><strong>#{elements[1]}</strong></td>"
|
27
|
+
html = html + "<td style='text-align: right;'>#{elements[2]}</td>"
|
28
|
+
html = html + "<td style='text-align: right;'>#{elements[3]}</td>"
|
29
|
+
html = html + "<td style='text-align: right;'>#{elements[4]}</td>"
|
30
|
+
html = html + "<td style='text-align: right;'>#{elements[5]}</td>"
|
31
|
+
html = html + "<td style='text-align: right;'>#{elements[6]}</td>"
|
32
|
+
html = html + "<td style='text-align: right;'>#{elements[7]}</td>"
|
33
|
+
html = html + "</tr>"
|
34
|
+
i = i + 1
|
35
|
+
end
|
36
|
+
total = results[bottom + 1]
|
37
|
+
elements = total.split(/\|/)
|
38
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'>"
|
39
|
+
html = html + "<td><strong>#{elements[1]}</strong></td>"
|
40
|
+
[2,3,4,5,6,7].each do |j|
|
41
|
+
html = html + "<td style='text-align: right;'><strong>#{elements[j]}</strong></td>"
|
42
|
+
end
|
43
|
+
html = html + "</tr>"
|
44
|
+
html = html + "</tbody></table>"
|
45
|
+
extra = results[bottom + 3]
|
46
|
+
elements = extra.split(/:| /)
|
47
|
+
html = html + "<p><strong>#{elements[0]} : </strong>#{elements[1]}      "
|
48
|
+
html = html + "<strong>#{elements[2]} : </strong>#{elements[3]}      "
|
49
|
+
html = html + "<strong>#{elements[4]} : </strong>#{elements[5]}:#{elements[6]}</p><br/>"
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'iconv'
|
2
|
+
# ====================================================
|
3
|
+
# Classe d'extraction des informations de Subversion
|
4
|
+
# Author: Vincent Dubois
|
5
|
+
# ====================================================
|
6
|
+
module SubversionExtractor
|
7
|
+
|
8
|
+
# Methode qui permet de fabriquer le flux HTML a partir des informations
|
9
|
+
# presentes dans le referentiel
|
10
|
+
def self.extract_changelog scm_current_version, scm, file_name
|
11
|
+
post_command= ""
|
12
|
+
begin
|
13
|
+
post_command = post_command + " --username " + scm.user.text
|
14
|
+
post_command = post_command + " --password " + scm.password.text
|
15
|
+
rescue
|
16
|
+
post_command = ""
|
17
|
+
end
|
18
|
+
get_head_log = `svn log -r 'HEAD'#{post_command}`
|
19
|
+
get_head_log_lines = get_head_log.split(/$/)
|
20
|
+
revision = get_head_log_lines[1].split(/ \| /)[0]
|
21
|
+
revision = revision[2..(revision.length-1)]
|
22
|
+
puts " Computing changelog for #{scm.url.text}, from revision #{scm_current_version} to revision #{revision}..."
|
23
|
+
i = 0
|
24
|
+
html = "<table class='bodyTable'><thead><th>Revision</th><th>Date</th><th>Author</th><th>File(s)</th><th>Comment</th></thead><tbody>"
|
25
|
+
(scm_current_version.to_i..revision.to_i).to_a.reverse_each do |rev|
|
26
|
+
puts " Changelog for revision #{rev}..."
|
27
|
+
rev_files = Array.new
|
28
|
+
if rev == 1 or (!scm['min_revision'].nil? and rev == scm['min_revision'].to_i)
|
29
|
+
rev_result = `svn diff -r #{rev}#{post_command}|grep ^Index:`
|
30
|
+
else
|
31
|
+
rev_result = `svn diff -r #{rev-1}:#{rev} --summarize#{post_command}`
|
32
|
+
end
|
33
|
+
rev_result_lines = rev_result.split(/$/)
|
34
|
+
rev_result_lines.each do |line|
|
35
|
+
rev_files.push line[7..(line.length-1)]
|
36
|
+
end
|
37
|
+
rev_files.pop
|
38
|
+
rev_log_result = `svn log -r #{rev}`
|
39
|
+
rev_log_result_lines = rev_log_result.split(/$/)
|
40
|
+
rev_line = rev_log_result_lines[1].split(/ \| /)
|
41
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'><td><strong>#{rev_line[0][2..(rev_line[0].length-1)]}</strong></td>"
|
42
|
+
html = html + "<td>#{rev_line[2][0..18]}</td><td>#{rev_line[1]}</td><td>"
|
43
|
+
rev_files.each do |rev_file|
|
44
|
+
html = html + rev_file + "<br/>"
|
45
|
+
end
|
46
|
+
html = html + "</td><td>"
|
47
|
+
(3..(rev_log_result_lines.length-3)).to_a.each do |line|
|
48
|
+
begin
|
49
|
+
html = html + Iconv.conv('ISO-8859-1', 'UTF-8', rev_log_result_lines[line]) + "<br/>"
|
50
|
+
rescue
|
51
|
+
html = html + rev_log_result_lines[line] + "<br/>"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
html = html + "</td></tr>"
|
55
|
+
i = i + 1
|
56
|
+
end
|
57
|
+
html = html + "</tbody></table>"
|
58
|
+
changelog_file = File.open(file_name,"w")
|
59
|
+
changelog_file.write(html)
|
60
|
+
changelog_file.close
|
61
|
+
return revision
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'XmlElements'
|
3
|
+
# =====================================================
|
4
|
+
# Classe de formatage des resultats renvoyes par les
|
5
|
+
# differents tests unitaires
|
6
|
+
# Author: Vincent Dubois
|
7
|
+
# =====================================================
|
8
|
+
class TestsFormatter
|
9
|
+
attr_accessor :params
|
10
|
+
|
11
|
+
# Constructeur
|
12
|
+
def initialize params
|
13
|
+
self.params = params
|
14
|
+
end
|
15
|
+
|
16
|
+
# Methode qui permet de fabriquer le flux HTML a partir des flux console
|
17
|
+
# de tests unitaires
|
18
|
+
def to_html
|
19
|
+
html = "<table class='bodyTable'><thead><th>Testing element</th><th>Pass</th><th>Result</th></thead><tbody>"
|
20
|
+
i = 0
|
21
|
+
self.params.each('runner') do |runner|
|
22
|
+
puts " Running #{runner['type']} tests..."
|
23
|
+
pass = true
|
24
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'><td><strong>#{runner['type']}</strong></td>"
|
25
|
+
case runner['type']
|
26
|
+
when "units"
|
27
|
+
pass = system("rake test:units > test_units.log")
|
28
|
+
if !pass
|
29
|
+
puts " #{File.read("test_units.log")}"
|
30
|
+
raise " BUILD FAILED."
|
31
|
+
end
|
32
|
+
html = html + "<td style='text-align: center;'><img src='images/icon_#{pass ? 'success' : 'error'}_sml.gif'/></td>"
|
33
|
+
html = html + "<td><pre>#{File.read("test_units.log")}</pre></td></tr>"
|
34
|
+
when "functionals"
|
35
|
+
pass = system("rake test:functionals > test_functionals.log")
|
36
|
+
if !pass
|
37
|
+
puts " #{File.read("test_functionals.log")}"
|
38
|
+
raise " BUILD FAILED."
|
39
|
+
end
|
40
|
+
html = html + "<td style='text-align: center;'><img src='images/icon_#{pass ? 'success' : 'error'}_sml.gif'/></td>"
|
41
|
+
html = html + "<td><pre>#{File.read("test_functionals.log")}</pre></td></tr>"
|
42
|
+
when "integration"
|
43
|
+
pass = system("rake test:integration > test_integration.log")
|
44
|
+
if !pass
|
45
|
+
puts " #{File.read("test_integration.log")}"
|
46
|
+
raise " BUILD FAILED."
|
47
|
+
end
|
48
|
+
html = html + "<td style='text-align: center;'><img src='images/icon_#{pass ? 'success' : 'error'}_sml.gif'/></td>"
|
49
|
+
html = html + "<td><pre>#{File.read("test_integration.log")}</pre></td></tr>"
|
50
|
+
when "rspec"
|
51
|
+
pass = system("rake spec > test_rspec.log")
|
52
|
+
if !pass
|
53
|
+
puts " #{File.read("test_rspec.log")}"
|
54
|
+
raise " BUILD FAILED."
|
55
|
+
end
|
56
|
+
html = html + "<td style='text-align: center;'><img src='images/icon_#{pass ? 'success' : 'error'}_sml.gif'/></td>"
|
57
|
+
html = html + "<td><pre>#{File.read("test_rspec.log").gsub(/\[32m|\[0m|\[31m/,"")}</pre></td></tr>"
|
58
|
+
else
|
59
|
+
raise " Don't know how to run '#{runner['type']}' test.\n BUILD FAILED."
|
60
|
+
end
|
61
|
+
i = i + 1
|
62
|
+
end
|
63
|
+
html = html + "</tbody></table>"
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'XmlElements'
|
3
|
+
# =====================================================
|
4
|
+
# Classe de formatage des resultats renvoyes par les
|
5
|
+
# differents resultats de ZenTest
|
6
|
+
# Author: Vincent Dubois
|
7
|
+
# =====================================================
|
8
|
+
class ZenTestFormatter
|
9
|
+
attr_accessor :params
|
10
|
+
|
11
|
+
# Constructeur
|
12
|
+
def initialize params
|
13
|
+
self.params = params
|
14
|
+
end
|
15
|
+
|
16
|
+
# Methode qui permet de fabriquer le flux HTML a partir des flux console
|
17
|
+
# de ZenTest
|
18
|
+
def to_html
|
19
|
+
html = "<table class='bodyTable'><thead><th>Element</th><th>Pass</th><th>Errors</th><th>Generated class</th></thead><tbody>"
|
20
|
+
i = 0
|
21
|
+
self.params.each('runner') do |runner|
|
22
|
+
puts " Running ZenTest on #{runner['class']} against #{runner['test']}..."
|
23
|
+
html = html + "<tr class='#{ i % 2 == 0 ? 'a' : 'b'}'><td><strong>#{runner['class']}</strong> against <strong>#{runner['test']}</strong></td>"
|
24
|
+
system("zentest -r #{runner['class']} #{runner['test']} > continuous4r_build/zentest.log")
|
25
|
+
file_content = File.read("continuous4r_build/zentest.log")
|
26
|
+
file_lines = file_content.split(/$/)
|
27
|
+
start_line = 0
|
28
|
+
while file_lines[start_line].index("Code Generated by ZenTest").nil?
|
29
|
+
start_line = start_line + 1
|
30
|
+
end
|
31
|
+
end_line = start_line
|
32
|
+
while file_lines[end_line].index("Number of errors detected").nil?
|
33
|
+
end_line = end_line + 1
|
34
|
+
end
|
35
|
+
number_of_errors = file_lines[end_line][29..(file_lines[end_line].length - 1)]
|
36
|
+
end_line = end_line - 1
|
37
|
+
html = html + "<td style='text-align: center;'><img src='images/icon_#{(number_of_errors.to_i == 0) ? 'success' : 'error'}_sml.gif'/></td>"
|
38
|
+
html = html + "<td style='text-align: center;'>#{number_of_errors}</td>"
|
39
|
+
html = html + "<td style='width: 75%;'><pre style='font-family: Courier New;'>"
|
40
|
+
(start_line..end_line).to_a.each do |index|
|
41
|
+
html = html + file_lines[index]
|
42
|
+
end
|
43
|
+
html = html + "</pre></td></tr>"
|
44
|
+
i = i + 1
|
45
|
+
end
|
46
|
+
html = html + "</tbody></table>"
|
47
|
+
end
|
48
|
+
end
|
data/log/debug.log
ADDED
File without changes
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/destroy.cmd
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
@ruby script/destroy %*
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/generate.cmd
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
@ruby script/generate %*
|