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.
@@ -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