continuous4r 0.0.1 → 0.0.2

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.
Files changed (95) hide show
  1. data/History.txt +1 -1
  2. data/Manifest.txt +34 -34
  3. data/PostInstall.txt +3 -0
  4. data/README.rdoc +58 -0
  5. data/Rakefile +28 -3
  6. data/lib/changelog_builder.rb +51 -0
  7. data/lib/continuous4r.rb +63 -426
  8. data/lib/dcov_builder.rb +144 -0
  9. data/lib/flay_builder.rb +38 -0
  10. data/lib/flog_builder.rb +120 -0
  11. data/lib/git_extractor.rb +48 -0
  12. data/lib/rcov_builder.rb +23 -0
  13. data/lib/rdoc_builder.rb +33 -0
  14. data/lib/reek_builder.rb +38 -0
  15. data/lib/roodi_builder.rb +41 -0
  16. data/lib/saikuro_builder.rb +20 -0
  17. data/lib/site/body-changelog.rhtml +1 -1
  18. data/lib/site/body-continuous4r-reports.rhtml +40 -47
  19. data/lib/site/body-dcov.rhtml +1 -21
  20. data/lib/site/body-flay.rhtml +16 -0
  21. data/lib/site/body-flog.rhtml +2 -10
  22. data/lib/site/body-rcov.rhtml +2 -3
  23. data/lib/site/body-rdoc.rhtml +1 -1
  24. data/lib/site/body-reek.rhtml +16 -0
  25. data/lib/site/body-roodi.rhtml +16 -0
  26. data/lib/site/body-saikuro.rhtml +32 -0
  27. data/lib/site/body-scm-usage.rhtml +13 -12
  28. data/lib/site/body-stats.rhtml +1 -1
  29. data/lib/site/body-tests.rhtml +1 -1
  30. data/lib/site/body-xdoclet.rhtml +29 -0
  31. data/lib/site/body-zentest.rhtml +1 -1
  32. data/lib/site/flog.html.erb +33 -0
  33. data/lib/site/flog_page.html.erb +74 -0
  34. data/lib/site/header.rhtml +36 -20
  35. data/lib/site/images/added.png +0 -0
  36. data/lib/site/images/deleted.png +0 -0
  37. data/lib/site/images/modified.png +0 -0
  38. data/lib/site/menu-continuous4r-reports.rhtml +4 -14
  39. data/lib/site/{menu-dcov.rhtml → menu-task.rhtml} +3 -5
  40. data/lib/site/style/maven-base.css +3 -0
  41. data/lib/site/syntax_highlighting.css +30 -0
  42. data/lib/stats_builder.rb +18 -0
  43. data/lib/subversion_extractor.rb +29 -19
  44. data/lib/tasks/continuous4r-project.xml +26 -0
  45. data/lib/tasks/continuous4r.rake +23 -0
  46. data/lib/tasks/continuous4r.rb +6 -0
  47. data/lib/tests_builder.rb +21 -0
  48. data/lib/tests_formatter.rb +13 -46
  49. data/lib/utils.rb +47 -0
  50. data/lib/xdoclet_builder.rb +48 -0
  51. data/lib/zen_test_formatter.rb +58 -28
  52. data/lib/zentest_builder.rb +19 -0
  53. data/script/console +10 -0
  54. data/script/console.cmd +1 -0
  55. data/script/destroy +1 -1
  56. data/script/generate +1 -1
  57. data/test/test_continuous4r.rb +1 -1
  58. data/test/test_helper.rb +1 -0
  59. data/website/index.html +141 -363
  60. data/website/index.txt +169 -228
  61. data/website/template.rhtml +2 -2
  62. metadata +66 -46
  63. data/License.txt +0 -20
  64. data/README.txt +0 -1
  65. data/config/hoe.rb +0 -71
  66. data/config/requirements.rb +0 -17
  67. data/lib/capistrano_formatter.rb +0 -19
  68. data/lib/continuous4r/version.rb +0 -9
  69. data/lib/flog_formatter.rb +0 -48
  70. data/lib/heckle_formatter.rb +0 -27
  71. data/lib/httperf_formatter.rb +0 -160
  72. data/lib/site/body-capistrano.rhtml +0 -8
  73. data/lib/site/body-heckle.rhtml +0 -16
  74. data/lib/site/body-httperf.rhtml +0 -8
  75. data/lib/site/body-kwala.rhtml +0 -35
  76. data/lib/site/body-railroad.rhtml +0 -29
  77. data/lib/site/menu-capistrano.rhtml +0 -23
  78. data/lib/site/menu-changelog.rhtml +0 -23
  79. data/lib/site/menu-flog.rhtml +0 -23
  80. data/lib/site/menu-heckle.rhtml +0 -23
  81. data/lib/site/menu-httperf.rhtml +0 -23
  82. data/lib/site/menu-kwala.rhtml +0 -23
  83. data/lib/site/menu-railroad.rhtml +0 -23
  84. data/lib/site/menu-rcov.rhtml +0 -23
  85. data/lib/site/menu-rdoc.rhtml +0 -23
  86. data/lib/site/menu-stats.rhtml +0 -23
  87. data/lib/site/menu-tests.rhtml +0 -23
  88. data/lib/site/menu-zentest.rhtml +0 -23
  89. data/log/debug.log +0 -0
  90. data/script/txt2html +0 -74
  91. data/script/txt2html.cmd +0 -1
  92. data/setup.rb +0 -1585
  93. data/tasks/deployment.rake +0 -34
  94. data/tasks/environment.rake +0 -7
  95. data/tasks/website.rake +0 -17
@@ -0,0 +1,41 @@
1
+ # ==========================================================================
2
+ # Construction de la tache roodi (problemes de conception dans le code)
3
+ # author: Vincent Dubois
4
+ # date: 08 fevrier 2009
5
+ # ==========================================================================
6
+ class RoodiBuilder
7
+ include Utils
8
+
9
+ # Implementation de la construction de la tache
10
+ def build(project_name, auto_install, proxy_option)
11
+ # On verifie la presence de roodi
12
+ Utils.verify_gem_presence("roodi", auto_install, proxy_option)
13
+ # On lance la generation
14
+ puts " Building roodi report..."
15
+ files = Array.new
16
+ files << Dir.glob("app/**/*.rb")
17
+ files << Dir.glob("lib/**/*.rb")
18
+ files << Dir.glob("test/**/*.rb")
19
+ files.flatten!
20
+ roodi_command = "roodi"
21
+ files.each do |file|
22
+ roodi_command += " '#{file}'"
23
+ end
24
+ roodi_result = Utils.run_command(roodi_command)
25
+ matches = roodi_result.chomp.split("\n").map{|m| m.split(" - ") }
26
+ FileUtils.mkdir("#{Continuous4r::WORK_DIR}/roodi")
27
+ roodi_file = File.open("#{Continuous4r::WORK_DIR}/roodi/index.html","w")
28
+ matches.each_with_index do |match, count|
29
+ roodi_file.write("<tr class='#{count % 2 == 0 ? "a" : "b"}'>")
30
+ if match.first and match.first.index("Found ").nil?
31
+ roodi_file.write("<td><a href='xdoclet/#{match.first.split(':').first.gsub(/\//,'_')}.html' target='_blank'>#{match.first.split(':').first}</a></td>")
32
+ elsif match.first and !match.first.index("Found ").nil?
33
+ roodi_file.write("<td><b>#{match.first}</b></td>")
34
+ else
35
+ roodi_file.write("<td>&#160;</td>")
36
+ end
37
+ roodi_file.write("<td>#{match[1]}</td></tr>")
38
+ end
39
+ roodi_file.close
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ # ==========================================================================
2
+ # Construction de la tache saikuro (complexité cyclomatique du code)
3
+ # author: Vincent Dubois
4
+ # date: 08 fevrier 2009
5
+ # ==========================================================================
6
+ class SaikuroBuilder
7
+ include Utils
8
+
9
+ # Implementation de la construction de la tache
10
+ def build(project_name, auto_install, proxy_option)
11
+ # On verifie la presence de saikuro
12
+ Utils.verify_gem_presence("Saikuro", auto_install, proxy_option)
13
+ # On lance la generation
14
+ puts " Building saikuro report..."
15
+ puts Utils.run_command("saikuro -c -i app -i lib -i test -y 0 -w 5 -e 7 -o #{Continuous4r::WORK_DIR}/saikuro")
16
+ if !File.exist?("#{Continuous4r::WORK_DIR}/saikuro/index_cyclo.html")
17
+ raise " Execution of saikuro with the metric_fu gem failed.\n BUILD FAILED."
18
+ end
19
+ end
20
+ end
@@ -2,7 +2,7 @@
2
2
  <div class="contentBox">
3
3
  <div class="section"><a name="changelog"></a>
4
4
  <h2>Changelog Report</h2>
5
- <%= File.read("changelog.html") %>
5
+ <%= File.read("#{Continuous4r::WORK_DIR}/changelog-body.html") %>
6
6
  </div>
7
7
  </div>
8
8
  </div>
@@ -1,7 +1,5 @@
1
1
  <%
2
- require 'rubygems'
3
- require 'XmlElements'
4
- project = XmlElements.fromString(File.read("continuous4r-project.xml"))
2
+ tasks = Continuous4r::TASKS
5
3
  %>
6
4
  <div id="bodyColumn">
7
5
  <div class="contentBox">
@@ -25,57 +23,52 @@
25
23
  </tr>
26
24
  <%
27
25
  i = 0
28
- begin
29
- project.tasks.each('task') do |task|
26
+ tasks.each do |task|
30
27
  %>
31
28
  <tr class="<% if i % 2 == 0 %>a<% else %>b<% end %>">
32
29
  <td>
33
- <a href="<%= task['name'] %>.html">
34
- <%= task['name'] %>
30
+ <a href="<%= task %>.html">
31
+ <%= task %>
35
32
  </a>
36
33
  </td>
37
- <td><%
38
- begin
39
- puts task.description.text
40
- rescue
41
- case task['name']
42
- when "changelog"
43
- puts "Displays changes in the SCM repository."
44
- when "stats"
45
- puts "Provides statistics for your Rails code."
46
- when "dcov"
47
- puts "Provides statistics on the coverage of your documentation (rdoc)."
48
- when "rcov"
49
- puts "Provides general and detailed statistics on the coverage of your unit tests."
50
- when "rdoc"
51
- puts "Report for the generation of the apidoc for #{project['name']}"
52
- when "heckle"
53
- puts "Provides results for the attempts of breaking your tests with heckle."
54
- when "flog"
55
- puts "Provides statistics on the complexity of your class methods with flog."
56
- when "zentest"
57
- puts "Provides generated code for units tests which are missing in your project."
58
- when "capistrano"
59
- puts "Report for deployments of your application with Capistrano."
60
- when "httperf"
61
- puts "Provides data on the stressing of your application with httperf."
62
- when "kwala"
63
- puts "Provides various reports on quality and metrics for your Ruby code."
64
- when "railroad"
65
- puts "Provides graphs for you controllers and/or models."
66
- when "tests"
67
- puts "Report on the execution of you unit tests."
68
- end
69
- end %></td>
34
+ <td><%=
35
+ case task
36
+ when "changelog"
37
+ "Displays changes in the SCM repository."
38
+ when "stats"
39
+ "Provides statistics for your Rails code."
40
+ when "dcov"
41
+ "Provides statistics on the coverage of your documentation (rdoc)."
42
+ when "rcov"
43
+ "Provides general and detailed statistics on the coverage of your unit tests."
44
+ when "rdoc"
45
+ "Report for the generation of the apidoc for #{project['name']}"
46
+ when "heckle"
47
+ "Provides results for the attempts of breaking your tests with heckle."
48
+ when "flog"
49
+ "Flog measures code complexity."
50
+ when "zentest"
51
+ "Provides generated code for units tests which are missing in your project."
52
+ when "kwala"
53
+ "Provides various reports on quality and metrics for your Ruby code."
54
+ when "tests"
55
+ "Report on the execution of you unit tests."
56
+ when "flay"
57
+ "Flay analyzes ruby code for structural similarities."
58
+ when "xdoclet"
59
+ "Displays your Ruby files in HTML format."
60
+ when "reek"
61
+ "Reek detects common code smells in ruby code."
62
+ when "roodi"
63
+ "Roodi parses your Ruby code and warns you about design issues you have based on the checks that is has configured."
64
+ when "saikuro"
65
+ "Saikuro is a Ruby cyclomatic complexity analyzer."
66
+ end
67
+ %></td>
70
68
  </tr>
71
- <% i = i + 1
69
+ <% i = i + 1
72
70
  end
73
- rescue Exception => e
74
- unless e.to_s == "no childs named 'task' found!"
75
- raise e
76
- end
77
- puts "<tr class='a'><td colspan='2'>No reports</td></tr>"
78
- end %>
71
+ %>
79
72
  </table>
80
73
  </div>
81
74
  </div>
@@ -1,27 +1,7 @@
1
- <%
2
- require 'rubygems'
3
- require 'hpricot'
4
- require 'XmlElements'
5
- project = XmlElements.fromString(File.read("continuous4r-project.xml"))
6
- %>
7
1
  <div id="bodyColumn">
8
2
  <div class="contentBox">
9
3
  <div class="section"><a name="dcov"></a>
10
- <%
11
- # chargement/modification du rapport dcov
12
- path = ""
13
- project.tasks.each('task') do |task|
14
- if task['name'] == "dcov"
15
- path = task.params.report['path']
16
- end
17
- end
18
- doc = Hpricot(File.read(path))
19
- doc.at("h1").swap("<h2>Dcov Results</h2>")
20
- doc.search('//font') do |font|
21
- font.swap("<span style='color: red;'>" + font.inner_html + "</span>")
22
- end
23
- %>
24
- <%= (doc/"body").inner_html %>
4
+ <%= File.read("#{Continuous4r::WORK_DIR}/dcov/coverage.html") %>
25
5
  </div>
26
6
  </div>
27
7
  </div>
@@ -0,0 +1,16 @@
1
+ <div id="bodyColumn">
2
+ <div class="contentBox">
3
+ <div class="section"><a name="flay"></a>
4
+ <h2>Flay Results</h2>
5
+ <p><a href='http://ruby.sadi.st/Flay.html'>Flay</a> analyzes ruby code for structural similarities.</p>
6
+ <table class="bodyTable">
7
+ <tr>
8
+ <th>Files</th>
9
+ <th>Matches</th>
10
+ </tr>
11
+ <%= File.read("#{Continuous4r::WORK_DIR}/flay/index.html") %>
12
+ </table>
13
+ <p>Generated on <%= Time.now.localtime %></p>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -1,15 +1,7 @@
1
- <%
2
- require 'rubygems'
3
- require 'XmlElements'
4
- require "#{File.dirname(__FILE__)}/../flog_formatter.rb"
5
- %>
6
1
  <div id="bodyColumn">
7
2
  <div class="contentBox">
8
- <div class="section"><a name="rcov"></a>
9
- <h2>Flog Results</h2>
10
- <p>Flog shows you the most torturous code you wrote. The more painful the code, the higher the score.</p>
11
- <p>Flog essentially scores an ABC metric: Assignments, Branches, Calls, with particular attention placed on calls.</p>
12
- <%= FlogFormatter.new(File.read("flog.log")).to_html %>
3
+ <div class="section"><a name="flog"></a>
4
+ <%= File.read("#{Continuous4r::WORK_DIR}/flog/index.html") %>
13
5
  </div>
14
6
  </div>
15
7
  </div>
@@ -1,17 +1,16 @@
1
1
  <%
2
2
  require 'rubygems'
3
3
  require 'hpricot'
4
- require 'XmlElements'
5
4
  %>
6
5
  <div id="bodyColumn">
7
6
  <div class="contentBox">
8
7
  <div class="section"><a name="rcov"></a>
9
8
  <%
10
9
  # chargement/modification du rapport rcov
11
- doc = Hpricot(File.read("continuous4r_build/rcov/index.html"))
10
+ doc = Hpricot(File.read("#{Continuous4r::WORK_DIR}/rcov/coverage/index.html"))
12
11
  doc.search('//a') do |link|
13
12
  if link.inner_text.index('rcov').nil?
14
- link.swap("<a target='_blank' href='rcov/#{link.attributes['href']}'>#{link.inner_text}</a>")
13
+ link.swap("<a target='_blank' href='rcov/coverage/#{link.attributes['href']}'>#{link.inner_text}</a>")
15
14
  end
16
15
  end
17
16
  %>
@@ -4,7 +4,7 @@
4
4
  <h2>Rdoc Report</h2>
5
5
  <p style="padding-left: 20px;"><a target="_blank" class="newWindow" href="rdoc/app/index.html">View generated apidoc</a></p>
6
6
  <div>
7
- <pre class="source"><%= File.read("rdoc.log") %>
7
+ <pre class="source"><%= File.read("#{Continuous4r::WORK_DIR}/rdoc/rdoc.log") %>
8
8
  </pre>
9
9
  </div>
10
10
  </div>
@@ -0,0 +1,16 @@
1
+ <div id="bodyColumn">
2
+ <div class="contentBox">
3
+ <div class="section"><a name="reek"></a>
4
+ <h2>Reek Results</h2>
5
+ <p><a href="http://reek.rubyforge.org/">Reek</a> detects common code smells in ruby code.</p>
6
+ <table class="bodyTable">
7
+ <tr>
8
+ <th>File Path</th>
9
+ <th>Code Smell</th>
10
+ </tr>
11
+ <%= File.read("#{Continuous4r::WORK_DIR}/reek/index.html") %>
12
+ </table>
13
+ <p>Generated on <%= Time.now.localtime %></p>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1,16 @@
1
+ <div id="bodyColumn">
2
+ <div class="contentBox">
3
+ <div class="section"><a name="roodi"></a>
4
+ <h2>Roodi Results</h2>
5
+ <p><a href="http://roodi.rubyforge.org/">Roodi</a> parses your Ruby code and warns you about design issues you have based on the checks that is has configured.</p>
6
+ <table class="bodyTable">
7
+ <tr>
8
+ <th>File Path</th>
9
+ <th>Warning</th>
10
+ </tr>
11
+ <%= File.read("#{Continuous4r::WORK_DIR}/roodi/index.html") %>
12
+ </table>
13
+ <p>Generated on <%= Time.now.localtime %></p>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1,32 @@
1
+ <%
2
+ require 'rubygems'
3
+ require 'hpricot'
4
+ %>
5
+ <div id="bodyColumn">
6
+ <div class="contentBox">
7
+ <div class="section"><a name="saikuro"></a>
8
+ <%
9
+ # chargement/modification du rapport roodi
10
+ doc = Hpricot(File.read("#{Continuous4r::WORK_DIR}/saikuro/index_cyclo.html"))
11
+ doc.search("h2") do |h2|
12
+ h2.swap("<h3>#{h2.inner_text}</h3>")
13
+ end
14
+ description = "Saikuro is a Ruby cyclomatic complexity analyzer. When given Ruby source code Saikuro will generate a report listing the cyclomatic complexity of each method found. In addition, Saikuro counts the number of lines per method and can generate a listing of the number of tokens on each line of code."
15
+ doc.at("h1").swap("<h2>Index for cyclomatic complexity</h2>\n<p>#{description}</p>")
16
+ doc.search('//a') do |link|
17
+ link.swap("<a target='_blank' href='saikuro/#{link.attributes['href']}'>#{link.inner_text}</a>") if link.attributes['href'].index("http://").nil?
18
+ end
19
+ doc.search('table') do |table|
20
+ table.swap("<table class='bodyTable'>#{table.html}</table>")
21
+ end
22
+ doc.search(".light") do |tr|
23
+ tr.swap("<tr class='a'>#{tr.inner_html}</tr>")
24
+ end
25
+ doc.search(".dark") do |tr|
26
+ tr.swap("<tr class='b'>#{tr.inner_html}</tr>")
27
+ end
28
+ %>
29
+ <%= (doc/"body").html %>
30
+ </div>
31
+ </div>
32
+ </div>
@@ -9,28 +9,29 @@
9
9
  <div class="section"><a name="Source_repository"></a>
10
10
  <h2>Source repository</h2>
11
11
  <%
12
- scms = {'cvs' => ['CVS', 'http://www.nongnu.org/cvs/'], 'svn' => ['subversion', 'http://subversion.tigris.org']}
13
- if !scms.has_key? project.scm.repository_type.text
12
+ scms = {'git' => ['Git', 'http://git-scm.com'], 'svn' => ['Subversion', 'http://subversion.tigris.org']}
13
+ if File.exist?(".git")
14
+ scm_name = "git"
15
+ scm_url = File.read(".git/config").split(/$/).select {|l| l =~ /url = /}[0].split(/url = /)[1]
16
+ end
17
+ if File.exist?(".svn")
18
+ scm_name = "svn"
19
+ svn_info = Utils.run_command("svn info")
20
+ scm_url = svn_info.split(/$/)[1].split(/^URL/)[1].strip.split(/: /)[1]
21
+ end
22
+ if !scms.has_key?(scm_name)
14
23
  %>
15
24
  <p>
16
25
  <%= project['name'] %> is hosted on an unknown repository type.
17
26
  </p>
18
27
  <% else %>
19
28
  <p>
20
- <%= project['name'] %> is hosted on a <a href="<%= scms[project.scm.repository_type.text][1] %>" target="_blank" class="externalLink" title="External Link"><%= scms[project.scm.repository_type.text][0] %></a> repository.
29
+ <%= project['name'] %> is hosted on a <a href="<%= scms[scm_name][1] %>" target="_blank" class="externalLink" title="External Link"><%= scms[scm_name][0] %></a> repository.
21
30
  </p>
22
31
  <% end %>
23
32
  <p>
24
33
  The project URL is:<br></br>
25
- <code><%= project.scm.url.text %></code>
26
- </p>
27
- <p>
28
- The best way to view the repository is via the
29
- <a href="<%= project.scm.view.text %>" class="externalLink" target="_blank" title="External Link"><%= scms[project.scm.repository_type.text][0] %> viewer</a>.
30
- </p>
31
- <p>
32
- The alternative is to use the
33
- <a href="<%= project.scm.url.text %>" class="externalLink" target="_blank" title="External Link">native <%= scms[project.scm.repository_type.text][0] %></a> display.
34
+ <code><%= scm_url %></code>
34
35
  </p>
35
36
  </div>
36
37
  </div>
@@ -2,7 +2,7 @@
2
2
  <div class="contentBox">
3
3
  <div class="section"><a name="heckle"></a>
4
4
  <h2>Rails Statistics Report</h2>
5
- <%= File.read("stats.html") %>
5
+ <%= File.read("#{Continuous4r::WORK_DIR}/stats_body.html") %>
6
6
  </div>
7
7
  </div>
8
8
  </div>
@@ -2,7 +2,7 @@
2
2
  <div class="contentBox">
3
3
  <div class="section"><a name="tests"></a>
4
4
  <h2>Units Tests Results</h2>
5
- <%= File.read("tests.html") %>
5
+ <%= File.read("#{Continuous4r::WORK_DIR}/tests-run.html") %>
6
6
  </div>
7
7
  </div>
8
8
  </div>
@@ -0,0 +1,29 @@
1
+ <div id="bodyColumn">
2
+ <div class="contentBox">
3
+ <div class="section"><a name="xdoc"></a>
4
+ <h2>XDoclet Report</h2>
5
+ <table class="bodyTable">
6
+ <thead>
7
+ <tr class="b">
8
+ <th>Source file</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <%
13
+ files = Array.new
14
+ files << Dir.glob("#{RAILS_ROOT}/app/**/*.rb")
15
+ files << Dir.glob("#{RAILS_ROOT}/lib/**/*.rb")
16
+ files.flatten!
17
+ files.each_with_index do |file,index|
18
+ %>
19
+ <tr class="<%= index % 2 == 0 ? 'a' : 'b' %>">
20
+ <td><a href="xdoclet/<%= "#{file.gsub(Regexp.new("#{RAILS_ROOT}/"),'').gsub(/\//,'_')}" %>.html" target="_blank"><%= file.gsub(Regexp.new("#{RAILS_ROOT}/"),'') %></a></td>
21
+ </tr>
22
+ <%
23
+ end
24
+ %>
25
+ </tbody>
26
+ </table>
27
+ </div>
28
+ </div>
29
+ </div>
@@ -2,7 +2,7 @@
2
2
  <div class="contentBox">
3
3
  <div class="section"><a name="zentest"></a>
4
4
  <h2>ZenTest Report</h2>
5
- <%= File.read("zentest.html") %>
5
+ <%= File.read("#{Continuous4r::WORK_DIR}/zentest-body.html") %>
6
6
  </div>
7
7
  </div>
8
8
  </div>