relevance-rcov 0.8.2.1 → 0.8.3.0
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/Rakefile +5 -13
- data/bin/rcov +3 -5
- data/ext/rcovrt/extconf.rb +19 -21
- data/lib/rcov/formatters/base_formatter.rb +292 -0
- data/lib/rcov/formatters/full_text_report.rb +55 -0
- data/lib/rcov/formatters/html_coverage.rb +258 -0
- data/lib/rcov/formatters/text_coverage_diff.rb +199 -0
- data/lib/rcov/formatters/text_report.rb +36 -0
- data/lib/rcov/formatters/text_summary.rb +15 -0
- data/lib/rcov/formatters.rb +14 -0
- data/lib/rcov/report.rb +0 -63
- data/lib/rcov/templates/detail.html.erb +102 -0
- data/lib/rcov/templates/index.html.erb +100 -0
- data/lib/rcov/templates/screen.css +144 -0
- data/lib/rcov/version.rb +4 -3
- data/lib/rcov.rb +21 -1
- data/test/assets/sample_05.rb +0 -4
- data/test/code_coverage_analyzer_test.rb +1 -5
- data/test/file_statistics_test.rb +3 -3
- metadata +15 -7
- data/lib/rcov/rexml_extensions.rb +0 -44
- data/lib/rcov/xx.rb +0 -754
@@ -0,0 +1,199 @@
|
|
1
|
+
module Rcov
|
2
|
+
|
3
|
+
class TextCoverageDiff < BaseFormatter # :nodoc:
|
4
|
+
FORMAT_VERSION = [0, 1, 0]
|
5
|
+
DEFAULT_OPTS = { :textmode => :coverage_diff, :coverage_diff_mode => :record,
|
6
|
+
:coverage_diff_file => "coverage.info", :diff_cmd => "diff", :comments_run_by_default => true }
|
7
|
+
HUNK_HEADER = /@@ -\d+,\d+ \+(\d+),(\d+) @@/
|
8
|
+
|
9
|
+
def SERIALIZER
|
10
|
+
# mfp> this was going to be YAML but I caught it failing at basic
|
11
|
+
# round-tripping, turning "\n" into "" and corrupting the data, so
|
12
|
+
# it must be Marshal for now
|
13
|
+
Marshal
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(opts = {})
|
17
|
+
options = DEFAULT_OPTS.clone.update(opts)
|
18
|
+
@textmode = options[:textmode]
|
19
|
+
@color = options[:color]
|
20
|
+
@mode = options[:coverage_diff_mode]
|
21
|
+
@state_file = options[:coverage_diff_file]
|
22
|
+
@diff_cmd = options[:diff_cmd]
|
23
|
+
@gcc_output = options[:gcc_output]
|
24
|
+
super(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute
|
28
|
+
case @mode
|
29
|
+
when :record
|
30
|
+
record_state
|
31
|
+
when :compare
|
32
|
+
compare_state
|
33
|
+
else
|
34
|
+
raise "Unknown TextCoverageDiff mode: #{mode.inspect}."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def record_state
|
39
|
+
state = {}
|
40
|
+
each_file_pair_sorted do |filename, fileinfo|
|
41
|
+
state[filename] = {:lines => SCRIPT_LINES__[filename], :coverage => fileinfo.coverage.to_a,:counts => fileinfo.counts}
|
42
|
+
end
|
43
|
+
File.open(@state_file, "w") do |f|
|
44
|
+
self.SERIALIZER.dump([FORMAT_VERSION, state], f)
|
45
|
+
end
|
46
|
+
rescue
|
47
|
+
$stderr.puts <<-EOF
|
48
|
+
Couldn't save coverage data to #{@state_file}.
|
49
|
+
EOF
|
50
|
+
end # '
|
51
|
+
|
52
|
+
require 'tempfile'
|
53
|
+
def compare_state
|
54
|
+
return unless verify_diff_available
|
55
|
+
begin
|
56
|
+
format, prev_state = File.open(@state_file){|f| self.SERIALIZER.load(f) }
|
57
|
+
rescue
|
58
|
+
$stderr.puts <<-EOF
|
59
|
+
Couldn't load coverage data from #{@state_file}.
|
60
|
+
EOF
|
61
|
+
return # '
|
62
|
+
end
|
63
|
+
if !(Array === format) or
|
64
|
+
FORMAT_VERSION[0] != format[0] || FORMAT_VERSION[1] < format[1]
|
65
|
+
$stderr.puts <<-EOF
|
66
|
+
Couldn't load coverage data from #{@state_file}.
|
67
|
+
The file is saved in the format #{format.inspect[0..20]}.
|
68
|
+
This rcov executable understands #{FORMAT_VERSION.inspect}.
|
69
|
+
EOF
|
70
|
+
return # '
|
71
|
+
end
|
72
|
+
each_file_pair_sorted do |filename, fileinfo|
|
73
|
+
old_data = Tempfile.new("#{mangle_filename(filename)}-old")
|
74
|
+
new_data = Tempfile.new("#{mangle_filename(filename)}-new")
|
75
|
+
if prev_state.has_key? filename
|
76
|
+
old_code, old_cov = prev_state[filename].values_at(:lines, :coverage)
|
77
|
+
old_code.each_with_index do |line, i|
|
78
|
+
prefix = old_cov[i] ? " " : "!! "
|
79
|
+
old_data.write "#{prefix}#{line}"
|
80
|
+
end
|
81
|
+
else
|
82
|
+
old_data.write ""
|
83
|
+
end
|
84
|
+
old_data.close
|
85
|
+
SCRIPT_LINES__[filename].each_with_index do |line, i|
|
86
|
+
prefix = fileinfo.coverage[i] ? " " : "!! "
|
87
|
+
new_data.write "#{prefix}#{line}"
|
88
|
+
end
|
89
|
+
new_data.close
|
90
|
+
|
91
|
+
diff = `#{@diff_cmd} -u "#{old_data.path}" "#{new_data.path}"`
|
92
|
+
new_uncovered_hunks = process_unified_diff(filename, diff)
|
93
|
+
old_data.close!
|
94
|
+
new_data.close!
|
95
|
+
display_hunks(filename, new_uncovered_hunks)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def display_hunks(filename, hunks)
|
100
|
+
return if hunks.empty?
|
101
|
+
puts
|
102
|
+
puts "=" * 80
|
103
|
+
puts "!!!!! Uncovered code introduced in #{filename}"
|
104
|
+
|
105
|
+
hunks.each do |offset, lines|
|
106
|
+
if @gcc_output
|
107
|
+
lines.each_with_index do |line,i|
|
108
|
+
lineno = offset + i
|
109
|
+
flag = (/^!! / !~ line) ? "-" : ":"
|
110
|
+
prefix = "#{filename}#{flag}#{lineno}#{flag}"
|
111
|
+
puts "#{prefix}#{line[3..-1]}"
|
112
|
+
end
|
113
|
+
elsif @color
|
114
|
+
puts "### #{filename}:#{offset}"
|
115
|
+
lines.each do |line|
|
116
|
+
prefix = (/^!! / !~ line) ? "\e[32;40m" : "\e[31;40m"
|
117
|
+
puts "#{prefix}#{line[3..-1].chomp}\e[37;40m"
|
118
|
+
end
|
119
|
+
else
|
120
|
+
puts "### #{filename}:#{offset}"
|
121
|
+
puts lines
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def verify_diff_available
|
127
|
+
old_stderr = STDERR.dup
|
128
|
+
old_stdout = STDOUT.dup
|
129
|
+
# TODO: should use /dev/null or NUL(?), but I don't want to add the
|
130
|
+
# win32 check right now
|
131
|
+
new_stderr = Tempfile.new("rcov_check_diff")
|
132
|
+
STDERR.reopen new_stderr.path
|
133
|
+
STDOUT.reopen new_stderr.path
|
134
|
+
|
135
|
+
retval = system "#{@diff_cmd} --version"
|
136
|
+
unless retval
|
137
|
+
old_stderr.puts <<EOF
|
138
|
+
|
139
|
+
The '#{@diff_cmd}' executable seems not to be available.
|
140
|
+
You can specify which diff executable should be used with --diff-cmd.
|
141
|
+
If your system doesn't have one, you might want to use Diff::LCS's:
|
142
|
+
gem install diff-lcs
|
143
|
+
and use --diff-cmd=ldiff.
|
144
|
+
EOF
|
145
|
+
return false
|
146
|
+
end
|
147
|
+
true
|
148
|
+
ensure
|
149
|
+
STDOUT.reopen old_stdout
|
150
|
+
STDERR.reopen old_stderr
|
151
|
+
new_stderr.close!
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
def process_unified_diff(filename, diff)
|
156
|
+
current_hunk = []
|
157
|
+
current_hunk_start = 0
|
158
|
+
keep_current_hunk = false
|
159
|
+
state = :init
|
160
|
+
interesting_hunks = []
|
161
|
+
diff.each_with_index do |line, i|
|
162
|
+
#puts "#{state} %5d #{line}" % i
|
163
|
+
case state
|
164
|
+
when :init
|
165
|
+
if md = HUNK_HEADER.match(line)
|
166
|
+
current_hunk = []
|
167
|
+
current_hunk_start = md[1].to_i
|
168
|
+
state = :body
|
169
|
+
end
|
170
|
+
when :body
|
171
|
+
case line
|
172
|
+
when HUNK_HEADER
|
173
|
+
new_start = $1.to_i
|
174
|
+
if keep_current_hunk
|
175
|
+
interesting_hunks << [current_hunk_start, current_hunk]
|
176
|
+
end
|
177
|
+
current_hunk_start = new_start
|
178
|
+
current_hunk = []
|
179
|
+
keep_current_hunk = false
|
180
|
+
when /^-/
|
181
|
+
# ignore
|
182
|
+
when /^\+!! /
|
183
|
+
keep_current_hunk = true
|
184
|
+
current_hunk << line[1..-1]
|
185
|
+
else
|
186
|
+
current_hunk << line[1..-1]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
if keep_current_hunk
|
191
|
+
interesting_hunks << [current_hunk_start, current_hunk]
|
192
|
+
end
|
193
|
+
|
194
|
+
interesting_hunks
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Rcov
|
2
|
+
|
3
|
+
class TextReport < TextSummary # :nodoc:
|
4
|
+
|
5
|
+
def execute
|
6
|
+
print_lines
|
7
|
+
print_header
|
8
|
+
print_lines
|
9
|
+
|
10
|
+
each_file_pair_sorted do |fname, finfo|
|
11
|
+
name = fname.size < 52 ? fname : "..." + fname[-48..-1]
|
12
|
+
print_info(name, finfo.num_lines, finfo.num_code_lines,
|
13
|
+
finfo.code_coverage)
|
14
|
+
end
|
15
|
+
|
16
|
+
print_lines
|
17
|
+
print_info("Total", num_lines, num_code_lines, code_coverage)
|
18
|
+
print_lines
|
19
|
+
puts summary
|
20
|
+
end
|
21
|
+
|
22
|
+
def print_info(name, lines, loc, coverage)
|
23
|
+
puts "|%-51s | %5d | %5d | %5.1f%% |" % [name, lines, loc, 100 * coverage]
|
24
|
+
end
|
25
|
+
|
26
|
+
def print_lines
|
27
|
+
puts "+----------------------------------------------------+-------+-------+--------+"
|
28
|
+
end
|
29
|
+
|
30
|
+
def print_header
|
31
|
+
puts "| File | Lines | LOC | COV |"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rcov/formatters/base_formatter'
|
2
|
+
require 'rcov/formatters/text_summary'
|
3
|
+
require 'rcov/formatters/text_report'
|
4
|
+
require 'rcov/formatters/text_coverage_diff'
|
5
|
+
require 'rcov/formatters/full_text_report'
|
6
|
+
require 'rcov/formatters/html_coverage'
|
7
|
+
|
8
|
+
module Rcov
|
9
|
+
|
10
|
+
module Formatters
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/rcov/report.rb
CHANGED
@@ -3,69 +3,6 @@
|
|
3
3
|
|
4
4
|
require 'pathname'
|
5
5
|
|
6
|
-
|
7
6
|
module Rcov
|
8
|
-
|
9
|
-
# Try to fix bugs in the REXML shipped with Ruby 1.8.6
|
10
|
-
# They affect Mac OSX 10.5.1 users and motivates endless bug reports.
|
11
|
-
begin
|
12
|
-
require 'rexml/formatters/transitive'
|
13
|
-
require 'rexml/formatter/pretty'
|
14
|
-
rescue LoadError
|
15
|
-
end
|
16
|
-
|
17
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'rexml_extensions' ))
|
18
|
-
|
19
|
-
if (RUBY_VERSION == "1.8.6" || RUBY_VERSION == "1.8.7") && defined? REXML::Formatters::Transitive
|
20
|
-
class REXML::Document
|
21
|
-
remove_method :write rescue nil
|
22
|
-
def write( output=$stdout, indent=-1, trans=false, ie_hack=false )
|
23
|
-
if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output)
|
24
|
-
output = Output.new( output, xml_decl.encoding )
|
25
|
-
end
|
26
|
-
formatter = if indent > -1
|
27
|
-
#if trans
|
28
|
-
REXML::Formatters::Transitive.new( indent )
|
29
|
-
#else
|
30
|
-
# REXML::Formatters::Pretty.new( indent, ie_hack )
|
31
|
-
#end
|
32
|
-
else
|
33
|
-
REXML::Formatters::Default.new( ie_hack )
|
34
|
-
end
|
35
|
-
formatter.write( self, output )
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class REXML::Formatters::Transitive
|
40
|
-
remove_method :write_element rescue nil
|
41
|
-
def write_element( node, output )
|
42
|
-
output << "<#{node.expanded_name}"
|
43
|
-
|
44
|
-
node.attributes.each_attribute do |attr|
|
45
|
-
output << " "
|
46
|
-
attr.write( output )
|
47
|
-
end unless node.attributes.empty?
|
48
|
-
|
49
|
-
if node.children.empty?
|
50
|
-
output << "/>"
|
51
|
-
else
|
52
|
-
output << ">"
|
53
|
-
# If compact and all children are text, and if the formatted output
|
54
|
-
# is less than the specified width, then try to print everything on
|
55
|
-
# one line
|
56
|
-
skip = false
|
57
|
-
@level += @indentation
|
58
|
-
node.children.each { |child|
|
59
|
-
write( child, output )
|
60
|
-
}
|
61
|
-
@level -= @indentation
|
62
|
-
output << "</#{node.expanded_name}>"
|
63
|
-
end
|
64
|
-
output << "\n"
|
65
|
-
output << ' '*@level
|
66
|
-
end
|
67
|
-
end
|
68
7
|
|
69
8
|
end
|
70
|
-
|
71
|
-
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
|
3
|
+
<head>
|
4
|
+
<title><%= title %></title>
|
5
|
+
<link href="screen.css" media="screen" rel="stylesheet" type="text/css" />
|
6
|
+
<script type='text/javascript'>
|
7
|
+
// <![CDATA[
|
8
|
+
function toggleCode( id ) {
|
9
|
+
if ( document.getElementById )
|
10
|
+
elem = document.getElementById( id );
|
11
|
+
else if ( document.all )
|
12
|
+
elem = eval( "document.all." + id );
|
13
|
+
else
|
14
|
+
return false;
|
15
|
+
|
16
|
+
elemStyle = elem.style;
|
17
|
+
|
18
|
+
if ( elemStyle.display != "block" ) {
|
19
|
+
elemStyle.display = "block"
|
20
|
+
} else {
|
21
|
+
elemStyle.display = "none"
|
22
|
+
}
|
23
|
+
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
|
27
|
+
// Make cross-references hidden by default
|
28
|
+
document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" )
|
29
|
+
// ]]>
|
30
|
+
</script>
|
31
|
+
</head>
|
32
|
+
<body>
|
33
|
+
<h3><%= title %></h3>
|
34
|
+
<p>Generated on <%= generated_on %> with <a href="<%= rcov::UPSTREAM_URL %>">rcov <%= rcov::VERSION %></a></p>
|
35
|
+
<% if output_threshold != 101 %>
|
36
|
+
<!-- Note: 101 is the default threshold if you don't enter one -->
|
37
|
+
<p>Threshold: <%= output_threshold %>%</p>
|
38
|
+
<% end %>
|
39
|
+
<hr />
|
40
|
+
<pre>
|
41
|
+
<span class='marked'>Code reported as executed by Ruby looks like this...</span><span class='marked1'>and this: this line is also marked as covered.</span><span class='inferred'>Lines considered as run by rcov, but not reported by Ruby, look like this,</span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics).</span><span class='uncovered'>Finally, here's a line marked as not executed.</span>
|
42
|
+
</pre>
|
43
|
+
<table class='report'>
|
44
|
+
<thead>
|
45
|
+
<tr>
|
46
|
+
<td class='heading'>Name</td>
|
47
|
+
<td class='heading'>Total lines</td>
|
48
|
+
<td class='heading'>Lines of code</td>
|
49
|
+
<td class='heading'>Total coverage</td>
|
50
|
+
<td class='heading'>Code coverage</td>
|
51
|
+
</tr>
|
52
|
+
</thead>
|
53
|
+
<tbody>
|
54
|
+
<!-- alternate light/dark here -->
|
55
|
+
<tr class='light'>
|
56
|
+
<td><%= file.name %></td>
|
57
|
+
<td class='lines_total'><tt><%= file.num_lines %></tt></td>
|
58
|
+
<td class='lines_code'><tt><%= file.num_code_lines %></tt></td>
|
59
|
+
<td>
|
60
|
+
<table cellspacing='0' cellpadding='0' align='right'>
|
61
|
+
<tr>
|
62
|
+
<td><tt class='coverage_total'><%= "%3.2f" % file.total_coverage_for_report %>%</tt> </td>
|
63
|
+
<td>
|
64
|
+
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
65
|
+
<tr>
|
66
|
+
<td class='covered' width='<%= file.total_coverage_for_report.round %>'></td>
|
67
|
+
<td class='uncovered' width='<%= 100 - file.total_coverage_for_report.round %>'></td>
|
68
|
+
</tr>
|
69
|
+
</table>
|
70
|
+
</td>
|
71
|
+
</tr>
|
72
|
+
</table>
|
73
|
+
</td>
|
74
|
+
<td>
|
75
|
+
<table cellspacing='0' cellpadding='0' align='right'>
|
76
|
+
<tr>
|
77
|
+
<td><tt class='coverage_code'><%= "%3.2f" % file.code_coverage_for_report %>%</tt> </td>
|
78
|
+
<td>
|
79
|
+
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
80
|
+
<tr>
|
81
|
+
<td class='covered' width='<%= file.code_coverage_for_report.round %>'/>
|
82
|
+
<td class='uncovered' width='<%= 100 - file.code_coverage_for_report.round %>'/>
|
83
|
+
</tr>
|
84
|
+
</table>
|
85
|
+
</td>
|
86
|
+
</tr>
|
87
|
+
</table>
|
88
|
+
</td>
|
89
|
+
</tr>
|
90
|
+
<% file.num_lines.times do |i| %>
|
91
|
+
<% line = file.lines[i].chomp %>
|
92
|
+
<% count = file.counts[i] %>
|
93
|
+
<tr class="<%= line_css(i) %>">
|
94
|
+
<td colspan="5"><pre><a name="line<%= i.next %>"></a><%= i.next %> <%= line %></pre></td>
|
95
|
+
</tr>
|
96
|
+
<% end %>
|
97
|
+
</tbody>
|
98
|
+
</table>
|
99
|
+
<hr/>
|
100
|
+
<p>Generated on <%= generated_on %> with <a href="<%= rcov::UPSTREAM_URL %>">rcov <%= rcov::VERSION %></a></p>
|
101
|
+
</body>
|
102
|
+
</html>
|
@@ -0,0 +1,100 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
|
3
|
+
<head>
|
4
|
+
<title><%= title %></title>
|
5
|
+
<link href="screen.css" media="screen" rel="stylesheet" type="text/css" />
|
6
|
+
<script type='text/javascript'>
|
7
|
+
// <![CDATA[
|
8
|
+
function toggleCode( id ) {
|
9
|
+
if ( document.getElementById )
|
10
|
+
elem = document.getElementById( id );
|
11
|
+
else if ( document.all )
|
12
|
+
elem = eval( "document.all." + id );
|
13
|
+
else
|
14
|
+
return false;
|
15
|
+
|
16
|
+
elemStyle = elem.style;
|
17
|
+
|
18
|
+
if ( elemStyle.display != "block" ) {
|
19
|
+
elemStyle.display = "block"
|
20
|
+
} else {
|
21
|
+
elemStyle.display = "none"
|
22
|
+
}
|
23
|
+
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
|
27
|
+
// Make cross-references hidden by default
|
28
|
+
document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" )
|
29
|
+
// ]]>
|
30
|
+
</script>
|
31
|
+
</head>
|
32
|
+
<body>
|
33
|
+
<h3><%= title %></h3>
|
34
|
+
<p>Generated on <%= generated_on %> with <a href="<%= rcov::UPSTREAM_URL %>">rcov <%= rcov::VERSION %></a></p>
|
35
|
+
<% if output_threshold != 101 %>
|
36
|
+
<!-- Note: 101 is the default threshold if you don't enter one -->
|
37
|
+
<p>Threshold: <%= output_threshold %>%</p>
|
38
|
+
<% end %>
|
39
|
+
<hr />
|
40
|
+
<table class='report'>
|
41
|
+
<thead>
|
42
|
+
<tr>
|
43
|
+
<td class='heading'>Name</td>
|
44
|
+
<td class='heading'>Total lines</td>
|
45
|
+
<td class='heading'>Lines of code</td>
|
46
|
+
<td class='heading'>Total coverage</td>
|
47
|
+
<td class='heading'>Code coverage</td>
|
48
|
+
</tr>
|
49
|
+
</thead>
|
50
|
+
<tbody>
|
51
|
+
<% files.each do |f| %>
|
52
|
+
<!-- alternate light/dark here -->
|
53
|
+
<tr class='light'>
|
54
|
+
<td>
|
55
|
+
<% if f.name == 'TOTAL' %>
|
56
|
+
<%= f.name %>
|
57
|
+
<% else %>
|
58
|
+
<a href="<%= relative_filename(f.name) %>"><%= f.name %></a>
|
59
|
+
<% end %>
|
60
|
+
</td>
|
61
|
+
<td class='lines_total'><tt><%= f.num_lines %></tt></td>
|
62
|
+
<td class='lines_code'><tt><%= f.num_code_lines %></tt></td>
|
63
|
+
<td>
|
64
|
+
<table cellspacing='0' cellpadding='0' align='right'>
|
65
|
+
<tr>
|
66
|
+
<td><tt class='coverage_total'><%= "%3.2f" % f.total_coverage_for_report %>%</tt> </td>
|
67
|
+
<td>
|
68
|
+
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
69
|
+
<tr>
|
70
|
+
<td class='covered' width='<%= f.total_coverage_for_report.round %>'></td>
|
71
|
+
<td class='uncovered' width='<%= 100 - f.total_coverage_for_report.round %>'></td>
|
72
|
+
</tr>
|
73
|
+
</table>
|
74
|
+
</td>
|
75
|
+
</tr>
|
76
|
+
</table>
|
77
|
+
</td>
|
78
|
+
<td>
|
79
|
+
<table cellspacing='0' cellpadding='0' align='right'>
|
80
|
+
<tr>
|
81
|
+
<td><tt class='coverage_code'><%= "%3.2f" % f.code_coverage_for_report %>%</tt> </td>
|
82
|
+
<td>
|
83
|
+
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
84
|
+
<tr>
|
85
|
+
<td class='covered' width='<%= f.code_coverage_for_report.round %>'/>
|
86
|
+
<td class='uncovered' width='<%= 100 - f.code_coverage_for_report.round %>'/>
|
87
|
+
</tr>
|
88
|
+
</table>
|
89
|
+
</td>
|
90
|
+
</tr>
|
91
|
+
</table>
|
92
|
+
</td>
|
93
|
+
</tr>
|
94
|
+
<% end %>
|
95
|
+
</tbody>
|
96
|
+
</table>
|
97
|
+
<hr/>
|
98
|
+
<p>Generated on <%= generated_on %> with <a href="<%= rcov::UPSTREAM_URL %>">rcov <%= rcov::VERSION %></a></p>
|
99
|
+
</body>
|
100
|
+
</html>
|
@@ -0,0 +1,144 @@
|
|
1
|
+
body { background-color: rgb(240, 240, 245); }
|
2
|
+
|
3
|
+
span.cross-ref-title {
|
4
|
+
font-size: 140%;
|
5
|
+
}
|
6
|
+
span.cross-ref a {
|
7
|
+
text-decoration: none;
|
8
|
+
}
|
9
|
+
span.cross-ref {
|
10
|
+
background-color:#f3f7fa;
|
11
|
+
border: 1px dashed #333;
|
12
|
+
margin: 1em;
|
13
|
+
padding: 0.5em;
|
14
|
+
overflow: hidden;
|
15
|
+
}
|
16
|
+
a.crossref-toggle {
|
17
|
+
text-decoration: none;
|
18
|
+
}
|
19
|
+
pre, code {
|
20
|
+
-x-system-font:none;
|
21
|
+
font-family:Monaco,"Courier New",monospace;
|
22
|
+
font-size:65%;
|
23
|
+
font-size-adjust:none;
|
24
|
+
font-stretch:normal;
|
25
|
+
font-style:normal;
|
26
|
+
font-variant:normal;
|
27
|
+
font-weight:normal;
|
28
|
+
}
|
29
|
+
|
30
|
+
tr.marked td, span.marked {
|
31
|
+
background-color: rgb(185, 210, 200);
|
32
|
+
}
|
33
|
+
span.marked1 {
|
34
|
+
background-color: rgb(190, 215, 205);
|
35
|
+
display: block;
|
36
|
+
}
|
37
|
+
tr.inferred td, span.inferred {
|
38
|
+
background-color: rgb(255, 255, 240);
|
39
|
+
}
|
40
|
+
span.inferred1 {
|
41
|
+
background-color: rgb(255, 255, 240);
|
42
|
+
display: block;
|
43
|
+
}
|
44
|
+
tr.uncovered td, span.uncovered {
|
45
|
+
background-color: rgb(225, 110, 110);
|
46
|
+
}
|
47
|
+
span.uncovered1 {
|
48
|
+
background-color: rgb(235, 120, 120);
|
49
|
+
display: block;
|
50
|
+
}
|
51
|
+
span.overview {
|
52
|
+
border-bottom: 8px solid black;
|
53
|
+
}
|
54
|
+
div.overview {
|
55
|
+
border-bottom: 8px solid black;
|
56
|
+
}
|
57
|
+
body {
|
58
|
+
font-family: verdana, arial, helvetica;
|
59
|
+
}
|
60
|
+
|
61
|
+
div.footer {
|
62
|
+
font-size: 68%;
|
63
|
+
margin-top: 1.5em;
|
64
|
+
}
|
65
|
+
|
66
|
+
h1, h2, h3, h4, h5, h6 {
|
67
|
+
margin-bottom: 0.5em;
|
68
|
+
}
|
69
|
+
|
70
|
+
h5 {
|
71
|
+
margin-top: 0.5em;
|
72
|
+
}
|
73
|
+
|
74
|
+
.hidden {
|
75
|
+
display: none;
|
76
|
+
}
|
77
|
+
|
78
|
+
div.separator {
|
79
|
+
height: 10px;
|
80
|
+
}
|
81
|
+
/* Commented out for better readability, esp. on IE */
|
82
|
+
/*
|
83
|
+
table tr td, table tr th {
|
84
|
+
font-size: 68%;
|
85
|
+
}
|
86
|
+
|
87
|
+
td.value table tr td {
|
88
|
+
font-size: 11px;
|
89
|
+
}
|
90
|
+
*/
|
91
|
+
|
92
|
+
table.percent_graph {
|
93
|
+
height: 12px;
|
94
|
+
border: #808080 1px solid;
|
95
|
+
empty-cells: show;
|
96
|
+
}
|
97
|
+
|
98
|
+
table.percent_graph td.covered {
|
99
|
+
height: 10px;
|
100
|
+
background: #00f000;
|
101
|
+
}
|
102
|
+
|
103
|
+
table.percent_graph td.uncovered {
|
104
|
+
height: 10px;
|
105
|
+
background: #e00000;
|
106
|
+
}
|
107
|
+
|
108
|
+
table.percent_graph td.NA {
|
109
|
+
height: 10px;
|
110
|
+
background: #eaeaea;
|
111
|
+
}
|
112
|
+
|
113
|
+
table.report {
|
114
|
+
border-collapse: collapse;
|
115
|
+
width: 100%;
|
116
|
+
}
|
117
|
+
|
118
|
+
table.report td.heading {
|
119
|
+
background: #dcecff;
|
120
|
+
border: #d0d0d0 1px solid;
|
121
|
+
font-weight: bold;
|
122
|
+
text-align: center;
|
123
|
+
}
|
124
|
+
|
125
|
+
table.report td.heading:hover {
|
126
|
+
background: #c0ffc0;
|
127
|
+
}
|
128
|
+
|
129
|
+
table.report td.text {
|
130
|
+
border: #d0d0d0 1px solid;
|
131
|
+
}
|
132
|
+
|
133
|
+
table.report td.value,
|
134
|
+
table.report td.lines_total,
|
135
|
+
table.report td.lines_code {
|
136
|
+
text-align: right;
|
137
|
+
border: #d0d0d0 1px solid;
|
138
|
+
}
|
139
|
+
table.report tr.light {
|
140
|
+
background-color: rgb(240, 240, 245);
|
141
|
+
}
|
142
|
+
table.report tr.dark {
|
143
|
+
background-color: rgb(230, 230, 235);
|
144
|
+
}
|
data/lib/rcov/version.rb
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
# See LEGAL and LICENSE for licensing information.
|
4
4
|
|
5
5
|
module Rcov
|
6
|
-
VERSION = "0.8.
|
7
|
-
RELEASE_DATE = "2009-
|
6
|
+
VERSION = "0.8.3.0"
|
7
|
+
RELEASE_DATE = "2009-05-08"
|
8
8
|
RCOVRT_ABI = [2,0,0]
|
9
|
-
UPSTREAM_URL = "http://github.com/
|
9
|
+
UPSTREAM_URL = "http://github.com/relevance/rcov"
|
10
|
+
ROOF_POSITION = 'raised'
|
10
11
|
|
11
12
|
end
|