continuous4r 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -3
- data/Manifest.txt +4 -0
- data/lib/changelog_builder.rb +10 -4
- data/lib/continuous4r.rb +165 -127
- data/lib/dcov_builder.rb +22 -1
- data/lib/flay_builder.rb +53 -7
- data/lib/flog_builder.rb +24 -0
- data/lib/rcov_builder.rb +33 -11
- data/lib/reek_builder.rb +50 -6
- data/lib/saikuro_builder.rb +28 -0
- data/lib/site/body-continuous4r-reports.rhtml +57 -1
- data/lib/site/body-dependencies.rhtml +16 -7
- data/lib/site/body-flay.rhtml +1 -1
- data/lib/site/build.xml.erb +48 -0
- data/lib/site/charts/AC_RunActiveContent.js +292 -0
- data/lib/site/charts/charts.swf +0 -0
- data/lib/site/charts/charts_library/pono.swf +0 -0
- data/lib/site/flog.html.erb +8 -4
- data/lib/site/flog_page.html.erb +20 -1
- data/lib/site/header.rhtml +1 -13
- data/lib/site/menu-continuous4r-reports.rhtml +6 -1
- data/lib/site/menu-task.rhtml +6 -1
- data/lib/tests_builder.rb +10 -0
- data/lib/utils.rb +69 -1
- data/lib/zen_test_formatter.rb +1 -1
- data/lib/zentest_builder.rb +10 -0
- data/website/index.txt +37 -28
- metadata +6 -2
data/lib/saikuro_builder.rb
CHANGED
@@ -16,5 +16,33 @@ class SaikuroBuilder
|
|
16
16
|
if !File.exist?("#{Continuous4r::WORK_DIR}/saikuro/index_cyclo.html")
|
17
17
|
raise " Execution of saikuro with the metric_fu gem failed.\n BUILD FAILED."
|
18
18
|
end
|
19
|
+
require 'hpricot'
|
20
|
+
doc = Hpricot(File.read("#{Continuous4r::WORK_DIR}/saikuro/index_cyclo.html"))
|
21
|
+
classes_with_errors = Array.new
|
22
|
+
classes_with_warnings = Array.new
|
23
|
+
doc.search("//tr") do |tr|
|
24
|
+
tds = tr.search("td")
|
25
|
+
if tds.length > 0 and tds[2]['class'] == "error" and !(classes_with_errors.include?(tds[0].inner_text))
|
26
|
+
classes_with_errors << tds[0].inner_text
|
27
|
+
elsif tds.length > 0 and tds[2]['class'] == "warning" and !(classes_with_warnings.include?(tds[0].inner_text))
|
28
|
+
classes_with_warnings << tds[0].inner_text
|
29
|
+
end
|
30
|
+
end
|
31
|
+
files = Array.new
|
32
|
+
files << Dir.glob("app/**/*.rb")
|
33
|
+
files << Dir.glob("lib/**/*.rb")
|
34
|
+
files << Dir.glob("test/**/*.rb")
|
35
|
+
files.flatten!
|
36
|
+
@percent = 100.0 - (((classes_with_errors.length + (classes_with_warnings.length * 0.5)) * 100.0) / files.length.to_f)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Methode qui permet d'extraire le pourcentage de qualité extrait d'un builder
|
40
|
+
def quality_percentage
|
41
|
+
@percent
|
42
|
+
end
|
43
|
+
|
44
|
+
# Nom de l'indicateur de qualité
|
45
|
+
def quality_indicator_name
|
46
|
+
"cyclomatic complexity"
|
19
47
|
end
|
20
48
|
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
<%
|
2
2
|
tasks = Continuous4r::TASKS
|
3
3
|
%>
|
4
|
+
<script src="charts/AC_RunActiveContent.js" language="javascript"></script>
|
5
|
+
<script language="JavaScript" type="text/javascript">
|
6
|
+
<!--
|
7
|
+
var requiredMajorVersion = 9;
|
8
|
+
var requiredMinorVersion = 0;
|
9
|
+
var requiredRevision = 45;
|
10
|
+
-->
|
11
|
+
</script>
|
4
12
|
<div id="bodyColumn">
|
5
13
|
<div class="contentBox">
|
6
14
|
<div class="section">
|
@@ -11,7 +19,52 @@
|
|
11
19
|
. Each report is briefly described below.
|
12
20
|
</p>
|
13
21
|
|
14
|
-
<div class="subsection"
|
22
|
+
<div class="subsection">
|
23
|
+
<a name="BuildQuality"></a><h3>Project quality indicators</h3>
|
24
|
+
<script language="JavaScript" type="text/javascript">
|
25
|
+
<!--
|
26
|
+
if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
|
27
|
+
alert("This page requires AC_RunActiveContent.js.");
|
28
|
+
} else {
|
29
|
+
var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
|
30
|
+
if(hasRightVersion) { // if we've detected an acceptable version
|
31
|
+
// embed the flash movie
|
32
|
+
AC_FL_RunContent(
|
33
|
+
'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,45,0',
|
34
|
+
'width', '640',
|
35
|
+
'height', '450',
|
36
|
+
'bgcolor', '#ffffff',
|
37
|
+
'movie', 'charts',
|
38
|
+
'src', 'charts/charts',
|
39
|
+
'FlashVars', 'library_path=charts/charts_library&xml_source=build.xml',
|
40
|
+
'wmode', 'opaque',
|
41
|
+
'scale', 'noScale',
|
42
|
+
'id', 'charts',
|
43
|
+
'name', 'charts',
|
44
|
+
'menu', 'true',
|
45
|
+
'allowFullScreen', 'true',
|
46
|
+
'allowScriptAccess','sameDomain',
|
47
|
+
'quality', 'high',
|
48
|
+
'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
|
49
|
+
'align', 'middle',
|
50
|
+
'play', 'true',
|
51
|
+
'devicefont', 'false',
|
52
|
+
'salign', 'TL'
|
53
|
+
); //end AC code
|
54
|
+
} else { // flash is too old or we can't detect the plugin
|
55
|
+
var alternateContent = 'This content requires the Adobe Flash Player. '
|
56
|
+
+ '<u><a href=http://www.macromedia.com/go/getflash/>Get Flash</a></u>.';
|
57
|
+
document.write(alternateContent); // insert non-flash content
|
58
|
+
}
|
59
|
+
}
|
60
|
+
// -->
|
61
|
+
</script>
|
62
|
+
<noscript>
|
63
|
+
<P>This content requires JavaScript.</P>
|
64
|
+
</noscript>
|
65
|
+
|
66
|
+
|
67
|
+
<a name="Overview"></a><h3>Overview</h3>
|
15
68
|
<table class="bodyTable">
|
16
69
|
<tr class="b">
|
17
70
|
<th>
|
@@ -24,6 +77,9 @@
|
|
24
77
|
<%
|
25
78
|
i = 0
|
26
79
|
tasks.each do |task|
|
80
|
+
task_class = Object.const_get("#{task.capitalize}Builder")
|
81
|
+
task_builder = task_class.new
|
82
|
+
next if task_builder.respond_to?(:prerequisite_met?) and !task_builder.prerequisite_met?
|
27
83
|
%>
|
28
84
|
<tr class="<% if i % 2 == 0 %>a<% else %>b<% end %>">
|
29
85
|
<td>
|
@@ -31,12 +31,13 @@
|
|
31
31
|
</thead>
|
32
32
|
<tbody>
|
33
33
|
<% i = 0
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
begin
|
35
|
+
project.gems.each('gem') do |gem|
|
36
|
+
i = i + 1
|
37
|
+
gem_raw_details = Utils.run_command("gem query -d").select{ |l| l =~ Regexp.new(gem['name'])}
|
38
|
+
gem_details = gem_raw_details.split(/$/)
|
39
|
+
gem_comment = gem_details[1] if gem_details.length > 1
|
40
|
+
gem_comment ||= ''
|
40
41
|
%>
|
41
42
|
<tr class="<% if i % 2 == 0 %>a<% else %>b<% end %>">
|
42
43
|
<td><%= gem['name'] %></td>
|
@@ -44,7 +45,15 @@
|
|
44
45
|
<td><%= gem['version'] %></td>
|
45
46
|
<td><%= gem_comment %></td>
|
46
47
|
</tr>
|
47
|
-
<%
|
48
|
+
<% end
|
49
|
+
rescue
|
50
|
+
%>
|
51
|
+
<tr class="a">
|
52
|
+
<td colspan="4">No gems declared for this project.</td>
|
53
|
+
</tr>
|
54
|
+
<%
|
55
|
+
end
|
56
|
+
%>
|
48
57
|
</tbody>
|
49
58
|
</table>
|
50
59
|
</div>
|
data/lib/site/body-flay.rhtml
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="contentBox">
|
3
3
|
<div class="section"><a name="flay"></a>
|
4
4
|
<h2>Flay Results</h2>
|
5
|
-
<p><a href='http://ruby.sadi.st/Flay.html'>Flay</a> analyzes ruby code for structural similarities.</p>
|
5
|
+
<p><a href='http://ruby.sadi.st/Flay.html' target="_blank">Flay</a> analyzes ruby code for structural similarities.</p>
|
6
6
|
<table class="bodyTable">
|
7
7
|
<tr>
|
8
8
|
<th>Files</th>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<chart>
|
2
|
+
<axis_category shadow='shadow2' size='13' color='4e627c' alpha='75' orientation='horizontal' />
|
3
|
+
<axis_ticks value_ticks='' category_ticks='' />
|
4
|
+
<axis_value alpha='0' min='0' max='100' />
|
5
|
+
|
6
|
+
<chart_border bottom_thickness='0' left_thickness='0' />
|
7
|
+
<chart_data>
|
8
|
+
<row>
|
9
|
+
<null/>
|
10
|
+
<% Continuous4r::METRICS_HASH.each_key do |key| %>
|
11
|
+
<string><%= key %></string>
|
12
|
+
<% end %>
|
13
|
+
</row>
|
14
|
+
<row>
|
15
|
+
<string><%= Continuous4r.build_name %></string>
|
16
|
+
<% Continuous4r::METRICS_HASH.each_value do |value| %>
|
17
|
+
<number tooltip='<%= "%0.2f" % value %>'><%= "%0.2f" % value %></number>
|
18
|
+
<% end %>
|
19
|
+
</row>
|
20
|
+
</chart_data>
|
21
|
+
<chart_grid_h alpha='20' color='000000' thickness='1' type='dashed' />
|
22
|
+
<chart_grid_v alpha='20' color='000000' thickness='1' type='solid' />
|
23
|
+
|
24
|
+
<!--chart_pref line_thickness='2' point_size='6' fill_shape='true' grid='circular' point_shape='circle'/-->
|
25
|
+
<chart_pref line_thickness='2' point_size='4' type='line' grid='circular' />
|
26
|
+
|
27
|
+
<chart_rect x='100' y='60' width='500' height='325' positive_color='FFFFFF' positive_alpha='25' />
|
28
|
+
<chart_transition type='slide_right' delay='0.5' duration='0.5' order='series' />
|
29
|
+
<chart_type>polar</chart_type>
|
30
|
+
|
31
|
+
<draw>
|
32
|
+
<text layer='background' shadow='shadow1' transition='slide_right' delay='0' duration='3' color='000000' width='600' alpha='8' size='95' x='0' y='-20'>Build quality</text>
|
33
|
+
</draw>
|
34
|
+
<filter>
|
35
|
+
<shadow id='shadow1' distance='2' angle='45' color='0' alpha='100' blurX='10' blurY='10' />
|
36
|
+
<shadow id='shadow2' distance='1' angle='45' color='0' alpha='50' blurX='3' blurY='3' />
|
37
|
+
</filter>
|
38
|
+
|
39
|
+
<legend shadow='shadow2' x='20' y='350' width='20' height='40' margin='5' fill_alpha='30' layout='vertical' bullet='line' size='12' color='ffffff' alpha='90' />
|
40
|
+
|
41
|
+
<series_color>
|
42
|
+
<color>ff4400</color>
|
43
|
+
<!--color>88ff00</color-->
|
44
|
+
</series_color>
|
45
|
+
|
46
|
+
<tooltip color='FFFFFF' alpha='75' size='11' background_color='8888ff' background_alpha='90' shadow='low' />
|
47
|
+
|
48
|
+
</chart>
|
@@ -0,0 +1,292 @@
|
|
1
|
+
//v1.7
|
2
|
+
// Flash Player Version Detection
|
3
|
+
// Detect Client Browser type
|
4
|
+
// Copyright 2005-2007 Adobe Systems Incorporated. All rights reserved.
|
5
|
+
var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
|
6
|
+
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
|
7
|
+
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
|
8
|
+
|
9
|
+
function ControlVersion()
|
10
|
+
{
|
11
|
+
var version;
|
12
|
+
var axo;
|
13
|
+
var e;
|
14
|
+
|
15
|
+
// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
|
16
|
+
|
17
|
+
try {
|
18
|
+
// version will be set for 7.X or greater players
|
19
|
+
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
|
20
|
+
version = axo.GetVariable("$version");
|
21
|
+
} catch (e) {
|
22
|
+
}
|
23
|
+
|
24
|
+
if (!version)
|
25
|
+
{
|
26
|
+
try {
|
27
|
+
// version will be set for 6.X players only
|
28
|
+
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
|
29
|
+
|
30
|
+
// installed player is some revision of 6.0
|
31
|
+
// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
|
32
|
+
// so we have to be careful.
|
33
|
+
|
34
|
+
// default to the first public version
|
35
|
+
version = "WIN 6,0,21,0";
|
36
|
+
|
37
|
+
// throws if AllowScripAccess does not exist (introduced in 6.0r47)
|
38
|
+
axo.AllowScriptAccess = "always";
|
39
|
+
|
40
|
+
// safe to call for 6.0r47 or greater
|
41
|
+
version = axo.GetVariable("$version");
|
42
|
+
|
43
|
+
} catch (e) {
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
if (!version)
|
48
|
+
{
|
49
|
+
try {
|
50
|
+
// version will be set for 4.X or 5.X player
|
51
|
+
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
|
52
|
+
version = axo.GetVariable("$version");
|
53
|
+
} catch (e) {
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
if (!version)
|
58
|
+
{
|
59
|
+
try {
|
60
|
+
// version will be set for 3.X player
|
61
|
+
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
|
62
|
+
version = "WIN 3,0,18,0";
|
63
|
+
} catch (e) {
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
if (!version)
|
68
|
+
{
|
69
|
+
try {
|
70
|
+
// version will be set for 2.X player
|
71
|
+
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
|
72
|
+
version = "WIN 2,0,0,11";
|
73
|
+
} catch (e) {
|
74
|
+
version = -1;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
return version;
|
79
|
+
}
|
80
|
+
|
81
|
+
// JavaScript helper required to detect Flash Player PlugIn version information
|
82
|
+
function GetSwfVer(){
|
83
|
+
// NS/Opera version >= 3 check for Flash plugin in plugin array
|
84
|
+
var flashVer = -1;
|
85
|
+
|
86
|
+
if (navigator.plugins != null && navigator.plugins.length > 0) {
|
87
|
+
if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
|
88
|
+
var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
|
89
|
+
var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
|
90
|
+
var descArray = flashDescription.split(" ");
|
91
|
+
var tempArrayMajor = descArray[2].split(".");
|
92
|
+
var versionMajor = tempArrayMajor[0];
|
93
|
+
var versionMinor = tempArrayMajor[1];
|
94
|
+
var versionRevision = descArray[3];
|
95
|
+
if (versionRevision == "") {
|
96
|
+
versionRevision = descArray[4];
|
97
|
+
}
|
98
|
+
if (versionRevision[0] == "d") {
|
99
|
+
versionRevision = versionRevision.substring(1);
|
100
|
+
} else if (versionRevision[0] == "r") {
|
101
|
+
versionRevision = versionRevision.substring(1);
|
102
|
+
if (versionRevision.indexOf("d") > 0) {
|
103
|
+
versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
|
104
|
+
}
|
105
|
+
}
|
106
|
+
var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
// MSN/WebTV 2.6 supports Flash 4
|
110
|
+
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
|
111
|
+
// WebTV 2.5 supports Flash 3
|
112
|
+
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
|
113
|
+
// older WebTV supports Flash 2
|
114
|
+
else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
|
115
|
+
else if ( isIE && isWin && !isOpera ) {
|
116
|
+
flashVer = ControlVersion();
|
117
|
+
}
|
118
|
+
return flashVer;
|
119
|
+
}
|
120
|
+
|
121
|
+
// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
|
122
|
+
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
|
123
|
+
{
|
124
|
+
versionStr = GetSwfVer();
|
125
|
+
if (versionStr == -1 ) {
|
126
|
+
return false;
|
127
|
+
} else if (versionStr != 0) {
|
128
|
+
if(isIE && isWin && !isOpera) {
|
129
|
+
// Given "WIN 2,0,0,11"
|
130
|
+
tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"]
|
131
|
+
tempString = tempArray[1]; // "2,0,0,11"
|
132
|
+
versionArray = tempString.split(","); // ['2', '0', '0', '11']
|
133
|
+
} else {
|
134
|
+
versionArray = versionStr.split(".");
|
135
|
+
}
|
136
|
+
var versionMajor = versionArray[0];
|
137
|
+
var versionMinor = versionArray[1];
|
138
|
+
var versionRevision = versionArray[2];
|
139
|
+
|
140
|
+
// is the major.revision >= requested major.revision AND the minor version >= requested minor
|
141
|
+
if (versionMajor > parseFloat(reqMajorVer)) {
|
142
|
+
return true;
|
143
|
+
} else if (versionMajor == parseFloat(reqMajorVer)) {
|
144
|
+
if (versionMinor > parseFloat(reqMinorVer))
|
145
|
+
return true;
|
146
|
+
else if (versionMinor == parseFloat(reqMinorVer)) {
|
147
|
+
if (versionRevision >= parseFloat(reqRevision))
|
148
|
+
return true;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
return false;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
function AC_AddExtension(src, ext)
|
156
|
+
{
|
157
|
+
if (src.indexOf('?') != -1)
|
158
|
+
return src.replace(/\?/, ext+'?');
|
159
|
+
else
|
160
|
+
return src + ext;
|
161
|
+
}
|
162
|
+
|
163
|
+
function AC_Generateobj(objAttrs, params, embedAttrs)
|
164
|
+
{
|
165
|
+
var str = '';
|
166
|
+
if (isIE && isWin && !isOpera)
|
167
|
+
{
|
168
|
+
str += '<object ';
|
169
|
+
for (var i in objAttrs)
|
170
|
+
{
|
171
|
+
str += i + '="' + objAttrs[i] + '" ';
|
172
|
+
}
|
173
|
+
str += '>';
|
174
|
+
for (var i in params)
|
175
|
+
{
|
176
|
+
str += '<param name="' + i + '" value="' + params[i] + '" /> ';
|
177
|
+
}
|
178
|
+
str += '</object>';
|
179
|
+
}
|
180
|
+
else
|
181
|
+
{
|
182
|
+
str += '<embed ';
|
183
|
+
for (var i in embedAttrs)
|
184
|
+
{
|
185
|
+
str += i + '="' + embedAttrs[i] + '" ';
|
186
|
+
}
|
187
|
+
str += '> </embed>';
|
188
|
+
}
|
189
|
+
|
190
|
+
document.write(str);
|
191
|
+
}
|
192
|
+
|
193
|
+
function AC_FL_RunContent(){
|
194
|
+
var ret =
|
195
|
+
AC_GetArgs
|
196
|
+
( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
|
197
|
+
, "application/x-shockwave-flash"
|
198
|
+
);
|
199
|
+
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
|
200
|
+
}
|
201
|
+
|
202
|
+
function AC_SW_RunContent(){
|
203
|
+
var ret =
|
204
|
+
AC_GetArgs
|
205
|
+
( arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
|
206
|
+
, null
|
207
|
+
);
|
208
|
+
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
|
209
|
+
}
|
210
|
+
|
211
|
+
function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
|
212
|
+
var ret = new Object();
|
213
|
+
ret.embedAttrs = new Object();
|
214
|
+
ret.params = new Object();
|
215
|
+
ret.objAttrs = new Object();
|
216
|
+
for (var i=0; i < args.length; i=i+2){
|
217
|
+
var currArg = args[i].toLowerCase();
|
218
|
+
|
219
|
+
switch (currArg){
|
220
|
+
case "classid":
|
221
|
+
break;
|
222
|
+
case "pluginspage":
|
223
|
+
ret.embedAttrs[args[i]] = args[i+1];
|
224
|
+
break;
|
225
|
+
case "src":
|
226
|
+
case "movie":
|
227
|
+
args[i+1] = AC_AddExtension(args[i+1], ext);
|
228
|
+
ret.embedAttrs["src"] = args[i+1];
|
229
|
+
ret.params[srcParamName] = args[i+1];
|
230
|
+
break;
|
231
|
+
case "onafterupdate":
|
232
|
+
case "onbeforeupdate":
|
233
|
+
case "onblur":
|
234
|
+
case "oncellchange":
|
235
|
+
case "onclick":
|
236
|
+
case "ondblclick":
|
237
|
+
case "ondrag":
|
238
|
+
case "ondragend":
|
239
|
+
case "ondragenter":
|
240
|
+
case "ondragleave":
|
241
|
+
case "ondragover":
|
242
|
+
case "ondrop":
|
243
|
+
case "onfinish":
|
244
|
+
case "onfocus":
|
245
|
+
case "onhelp":
|
246
|
+
case "onmousedown":
|
247
|
+
case "onmouseup":
|
248
|
+
case "onmouseover":
|
249
|
+
case "onmousemove":
|
250
|
+
case "onmouseout":
|
251
|
+
case "onkeypress":
|
252
|
+
case "onkeydown":
|
253
|
+
case "onkeyup":
|
254
|
+
case "onload":
|
255
|
+
case "onlosecapture":
|
256
|
+
case "onpropertychange":
|
257
|
+
case "onreadystatechange":
|
258
|
+
case "onrowsdelete":
|
259
|
+
case "onrowenter":
|
260
|
+
case "onrowexit":
|
261
|
+
case "onrowsinserted":
|
262
|
+
case "onstart":
|
263
|
+
case "onscroll":
|
264
|
+
case "onbeforeeditfocus":
|
265
|
+
case "onactivate":
|
266
|
+
case "onbeforedeactivate":
|
267
|
+
case "ondeactivate":
|
268
|
+
case "type":
|
269
|
+
case "codebase":
|
270
|
+
case "id":
|
271
|
+
ret.objAttrs[args[i]] = args[i+1];
|
272
|
+
break;
|
273
|
+
case "width":
|
274
|
+
case "height":
|
275
|
+
case "align":
|
276
|
+
case "vspace":
|
277
|
+
case "hspace":
|
278
|
+
case "class":
|
279
|
+
case "title":
|
280
|
+
case "accesskey":
|
281
|
+
case "name":
|
282
|
+
case "tabindex":
|
283
|
+
ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
|
284
|
+
break;
|
285
|
+
default:
|
286
|
+
ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
|
287
|
+
}
|
288
|
+
}
|
289
|
+
ret.objAttrs["classid"] = classid;
|
290
|
+
if (mimeType) ret.embedAttrs["type"] = mimeType;
|
291
|
+
return ret;
|
292
|
+
}
|
Binary file
|
Binary file
|
data/lib/site/flog.html.erb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
<h2>Flog Results</h2>
|
2
2
|
<p><a href='http://ruby.sadi.st/Flog.html'>Flog</a> measures code complexity.</p>
|
3
|
+
<%
|
4
|
+
project_score = pages.inject(0){|sum, page| sum + page.score } / (pages.inject(0){|sum, page| sum + page.scanned_methods.length})
|
5
|
+
%>
|
6
|
+
<h3 <%= Utils.flog_score_to_css_style(project_score) %>>Project average score : <%= sprintf("%0.2f", project_score) %></h3>
|
3
7
|
<table class='bodyTable'>
|
4
8
|
<tr>
|
5
9
|
<th>File</th>
|
@@ -17,15 +21,15 @@
|
|
17
21
|
<tr class='<%= cycle("a", "b", count) %>'>
|
18
22
|
<td><a href='flog/<%= page.path %>' target="_blank"><%= page.filename.sub('.txt', '.rb').gsub(Regexp.new("#{Continuous4r::WORK_DIR}/flog/"),'') %></a>  <i>(<a class="externalLink" href="xdoclet/<%= page.filename.sub('.txt', '.rb.html').gsub(Regexp.new("#{Continuous4r::WORK_DIR}/flog/"),'').gsub(/\//,'_') %>" target="_blank">view source</a>)</i></td>
|
19
23
|
<td class='score'><%= sprintf("%0.2f", page.score) %></td>
|
20
|
-
<td class='score'><%=
|
21
|
-
<td class='score'
|
22
|
-
<td class='score'
|
24
|
+
<td class='score'><%= page.scanned_methods.length %></td>
|
25
|
+
<td class='score' <%= Utils.flog_caracteristics(page.average_score) %>><%= sprintf("%0.2f", page.average_score) %></td>
|
26
|
+
<td class='score' <%= Utils.flog_caracteristics(page.highest_score) %>><%= sprintf("%0.2f", page.highest_score) %></td>
|
23
27
|
</tr>
|
24
28
|
<% end %>
|
25
29
|
<tr>
|
26
30
|
<td><strong>Totals</strong></td>
|
27
31
|
<td class='score'><strong><%= sprintf("%0.2f", pages.inject(0){|sum, page| sum + page.score }) %></strong></td>
|
28
|
-
<td class='score'><strong><%=
|
32
|
+
<td class='score'><strong><%= pages.inject(0){|sum, page| sum + page.scanned_methods.length } %></strong></td>
|
29
33
|
<td class='score'></td>
|
30
34
|
<td class='score'></td>
|
31
35
|
</tr>
|
data/lib/site/flog_page.html.erb
CHANGED
@@ -49,9 +49,28 @@
|
|
49
49
|
</style>
|
50
50
|
</head>
|
51
51
|
<body>
|
52
|
+
<%
|
53
|
+
def flog_caracteristics(flog_score)
|
54
|
+
if flog_score >= 0 and flog_score < 11
|
55
|
+
"title='Awesome'"
|
56
|
+
elsif flog_score >= 11 and flog_score < 21
|
57
|
+
"title='Good enough'"
|
58
|
+
elsif flog_score >= 21 and flog_score < 41
|
59
|
+
"style='background-color: #FFFF99; color: black;' title='Might need refactoring'"
|
60
|
+
elsif flog_score >= 41 and flog_score < 61
|
61
|
+
"style='background-color: yellow; color: black;' title='Possible to justify'"
|
62
|
+
elsif flog_score >= 61 and flog_score < 100
|
63
|
+
"style='background-color: orange; color: black;' title='Danger'"
|
64
|
+
elsif flog_score >= 100 and flog_score < 200
|
65
|
+
"style='background-color: red; color: black;' title='Whoop, whoop, whoop'"
|
66
|
+
elsif flog_score > 200
|
67
|
+
"style='background-color: black; color: white;' title='Someone please think of the children'"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
%>
|
52
71
|
<p>Score: <%= score %></p>
|
53
72
|
<% scanned_methods.each do |sm| %>
|
54
|
-
<
|
73
|
+
<table><tr><td <%= flog_caracteristics(sm.score) %>><strong><%= sm.name %> (<%= sm.score %>)</strong></td></tr></table>
|
55
74
|
<table>
|
56
75
|
<tr>
|
57
76
|
<th>Score</th>
|
data/lib/site/header.rhtml
CHANGED
@@ -38,19 +38,7 @@
|
|
38
38
|
<div class="clear"><hr></div>
|
39
39
|
</div>
|
40
40
|
<div id="breadcrumbs">
|
41
|
-
|
42
|
-
if File.exist?(".git")
|
43
|
-
display_version = ", commit #{Utils.run_command("git log").split(/$/).select{ |l| l =~ /^commit / }.collect { |l| l[8..(l.length-1)] }[0]}"
|
44
|
-
end
|
45
|
-
if File.exist?(".svn")
|
46
|
-
get_head_log = Utils.run_command("svn log -r HEAD")
|
47
|
-
get_head_log_lines = get_head_log.split(/$/)
|
48
|
-
revision = get_head_log_lines[1].split(/ \| /)[0]
|
49
|
-
revision = revision[2..(revision.length-1)]
|
50
|
-
display_version = ", revision #{revision}"
|
51
|
-
end
|
52
|
-
%>
|
53
|
-
<div class="xleft">Last published: <%= generation_date.strftime("%Y-%m-%d") %> <span class="separator">|</span> Doc for <%= project['name'] %><%= display_version %></div>
|
41
|
+
<div class="xleft">Last published: <%= generation_date.strftime("%Y-%m-%d") %> <span class="separator">|</span> Doc for <%= project['name'] %>, <%= Continuous4r.build_name %></div>
|
54
42
|
<div class="xright">
|
55
43
|
</div>
|
56
44
|
<div class="clear"><hr></div>
|
@@ -9,7 +9,12 @@
|
|
9
9
|
<li class="collapsed"><a href="index.html">Project Info</a></li>
|
10
10
|
<li class="expanded"><strong><a href="continuous4r-reports.html">Project Reports</a></strong>
|
11
11
|
<ul>
|
12
|
-
<%
|
12
|
+
<%
|
13
|
+
tasks.each do |task|
|
14
|
+
task_class = Object.const_get("#{task.capitalize}Builder")
|
15
|
+
task_builder = task_class.new
|
16
|
+
next if task_builder.respond_to?(:prerequisite_met?) and !task_builder.prerequisite_met?
|
17
|
+
%>
|
13
18
|
<li class="none"><a href="<%= task %>.html"><%= task %></a></li>
|
14
19
|
<% end %>
|
15
20
|
</ul>
|
data/lib/site/menu-task.rhtml
CHANGED
@@ -9,7 +9,12 @@
|
|
9
9
|
<li class="collapsed"><a href="index.html">Project Info</a></li>
|
10
10
|
<li class="expanded"><a href="continuous4r-reports.html">Project Reports</a>
|
11
11
|
<ul>
|
12
|
-
<%
|
12
|
+
<%
|
13
|
+
tasks.each do |task|
|
14
|
+
task_class = Object.const_get("#{task.capitalize}Builder")
|
15
|
+
task_builder = task_class.new
|
16
|
+
next if task_builder.respond_to?(:prerequisite_met?) and !task_builder.prerequisite_met?
|
17
|
+
%>
|
13
18
|
<li class="none"><% if task == current_task %><strong><% end %><a href="<%= task %>.html"><%= task %></a><% if task == current_task %></strong><% end %></li>
|
14
19
|
<% end %>
|
15
20
|
</ul>
|
data/lib/tests_builder.rb
CHANGED
@@ -6,6 +6,16 @@
|
|
6
6
|
class TestsBuilder
|
7
7
|
include Utils
|
8
8
|
|
9
|
+
# Prérequis à la tâche
|
10
|
+
def prerequisite_met?
|
11
|
+
Dir.glob("test/**/*.rb").length > 0
|
12
|
+
end
|
13
|
+
|
14
|
+
# Dans le cas de l'erreur de prérequis
|
15
|
+
def prerequisite_unmet_message
|
16
|
+
" No tests found. The 'tests' task will be empty."
|
17
|
+
end
|
18
|
+
|
9
19
|
# Implementation de la construction de la tache
|
10
20
|
def build(project_name, auto_install, proxy_option)
|
11
21
|
# On lance la generation
|