continuous4r 0.0.2 → 0.0.3
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 +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
|