continuous4r 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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"><a name="Overview"></a><h3>Overview</h3>
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
- project.gems.each('gem') do |gem|
35
- i = i + 1
36
- gem_raw_details = `gem query -d|grep #{gem['name']}`
37
- gem_details = gem_raw_details.split(/$/)
38
- gem_comment = gem_details[1] if gem_details.length > 1
39
- gem_comment ||= ''
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
- <% end %>
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>
@@ -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
@@ -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>&#160;&#160;<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'><%= page.scanned_methods.length %></td>
21
- <td class='score'><%= sprintf("%0.2f", page.average_score) %></td>
22
- <td class='score'><%= sprintf("%0.2f", page.highest_score) %></td>
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><%= pages.inject(0){|sum, page| sum + page.scanned_methods.length } %></strong></td>
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>
@@ -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
- <p><strong><%= sm.name %> (<%= sm.score %>)</strong></p>
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>
@@ -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>&nbsp;Doc for <%= project['name'] %><%= display_version %></div>
41
+ <div class="xleft">Last published: <%= generation_date.strftime("%Y-%m-%d") %> <span class="separator">|</span>&nbsp;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
- <% tasks.each do |task| %>
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>
@@ -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
- <% tasks.each do |task| %>
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