r19cov 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +18 -0
- data/ChangeLog +3 -0
- data/README.rdoc +15 -0
- data/Rakefile +73 -0
- data/bin/r19cov +8 -0
- data/lib/r19cov.rb +39 -0
- data/lib/r19cov/analyzer.rb +88 -0
- data/lib/r19cov/cli.rb +9 -0
- data/lib/r19cov/coverage.rb +41 -0
- data/lib/r19cov/coverage/summary.rb +42 -0
- data/lib/r19cov/option_parser.rb +42 -0
- data/lib/r19cov/options.rb +24 -0
- data/lib/r19cov/rake/spec_task.rb +66 -0
- data/lib/r19cov/report/html.rb +49 -0
- data/lib/r19cov/report/html/detail_page.rb +24 -0
- data/lib/r19cov/report/html/index_page.rb +24 -0
- data/lib/r19cov/report/html/page.rb +93 -0
- data/lib/r19cov/report/html/templates/detail.html.erb +75 -0
- data/lib/r19cov/report/html/templates/index.html.erb +99 -0
- data/lib/r19cov/report/html/templates/r19cov.css +225 -0
- data/lib/r19cov/report_factory.rb +11 -0
- data/lib/r19cov/version.rb +5 -0
- data/spec/r19cov/analyzer_spec.rb +40 -0
- data/spec/r19cov/option_parser_spec.rb +78 -0
- data/spec/r19cov/report/html/page_spec.rb +28 -0
- data/spec/r19cov/report_factory_spec.rb +13 -0
- data/spec/r19cov/version_spec.rb +9 -0
- data/spec/r19cov_spec.rb +36 -0
- data/spec/sample/bar.rb +5 -0
- data/spec/sample/baz.rb +5 -0
- data/spec/sample/exit_script.rb +8 -0
- data/spec/sample/foo.rb +5 -0
- data/spec/sample/sample_script.rb +16 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- metadata +98 -0
data/COPYING
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2009 orepuri
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/ChangeLog
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
= R19Cov: Coverage Tool for Ruby 1.9
|
2
|
+
|
3
|
+
R19Cov is a simple coverage tool for Ruby 1.9.
|
4
|
+
|
5
|
+
* R19Cov supports only C0 Coverage.
|
6
|
+
* R19Cov works only with Ruby 1.9 because uses coverage library embedded in Ruby 1.9.
|
7
|
+
|
8
|
+
= Install
|
9
|
+
|
10
|
+
gem sources -a http://gemcutter.org/
|
11
|
+
gem install r19cov
|
12
|
+
|
13
|
+
= Usage
|
14
|
+
|
15
|
+
r19cov <ruby script>
|
data/Rakefile
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Rake file for R19Cov. -*-ruby-*-
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require File.join(File.dirname(__FILE__), 'lib', 'r19cov')
|
6
|
+
|
7
|
+
spec = Gem::Specification.new do |s|
|
8
|
+
s.name = 'r19cov'
|
9
|
+
s.version = R19Cov::VERSION
|
10
|
+
s.description = 'Coverage Tool for Ruby 1.9'
|
11
|
+
s.date = Date.today
|
12
|
+
s.authors = ['orepuri']
|
13
|
+
s.email = 'orepuri@gmail.com'
|
14
|
+
s.homepage = 'http://github.com/orepuri'
|
15
|
+
s.require_paths = ['lib']
|
16
|
+
s.rubygems_version = Gem::VERSION
|
17
|
+
s.summary = <<-SUMMARY
|
18
|
+
R19Cov is a Coverage Tool for Ruby 1.9. It uses `coverage` library embeded in Ruby 1.9.
|
19
|
+
R19Cov analyzes source code coverage and report in HTML format.
|
20
|
+
SUMMARY
|
21
|
+
s.rubyforge_project = 'r19cov'
|
22
|
+
s.files = %w(COPYING ChangeLog README.rdoc Rakefile) + Dir["{lib,bin,spec}/**/*"]
|
23
|
+
s.bindir = 'bin'
|
24
|
+
s.executables << 'r19cov'
|
25
|
+
s.required_ruby_version = ">= 1.9"
|
26
|
+
|
27
|
+
s.add_development_dependency 'rspec', '1.2.9'
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
task :package
|
32
|
+
Rake::GemPackageTask.new(spec) do |p|
|
33
|
+
p.gem_spec = spec
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
require 'spec/rake/spectask'
|
38
|
+
|
39
|
+
spec_opts = lambda do
|
40
|
+
lib_dir = File.join(File.dirname(__FILE__), 'lib')
|
41
|
+
ENV['RUBYLIB'] ? (ENV['RUBYLIB'] += ":#{lib_dir}") : (ENV['RUBYLIB'] = lib_dir)
|
42
|
+
File.read('spec/spec.opts').split("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Run specs'
|
46
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
47
|
+
t.spec_files = Dir['spec/**/*_spec.rb']
|
48
|
+
t.spec_opts = spec_opts.call
|
49
|
+
end
|
50
|
+
|
51
|
+
namespace :spec do
|
52
|
+
desc 'Run specs with r19cov'
|
53
|
+
R19Cov::Rake::SpecTask.new do |t|
|
54
|
+
t.spec_files = Dir['spec/**/*_spec.rb']
|
55
|
+
t.spec_opts = spec_opts.call
|
56
|
+
t.spec_script = "spec"
|
57
|
+
t.rcov_opts = ['-x ruby-1.9.1,gems,spec']
|
58
|
+
t.rcov_dir = 'coverage'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
rescue LoadError => e
|
62
|
+
STDERR.puts e
|
63
|
+
STDERR.puts "gem install rspec if needs to run specs"
|
64
|
+
end
|
65
|
+
|
66
|
+
desc 'clean unneccessary files'
|
67
|
+
task :clean do
|
68
|
+
(Dir['**/*~'] + Dir['**/*#']).each do |file|
|
69
|
+
cmd = "rm #{file}"
|
70
|
+
puts cmd
|
71
|
+
system cmd
|
72
|
+
end
|
73
|
+
end
|
data/bin/r19cov
ADDED
data/lib/r19cov.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
if RUBY_VERSION !~ /1\.9/
|
4
|
+
STDERR.puts 'R19Cov runs only Ruby 1.9'
|
5
|
+
exit(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
$:.unshift File.dirname(__FILE__)
|
9
|
+
|
10
|
+
require 'coverage'
|
11
|
+
|
12
|
+
::Coverage.start
|
13
|
+
|
14
|
+
module R19Cov
|
15
|
+
autoload :VERSION, 'r19cov/version'
|
16
|
+
autoload :Analyzer, 'r19cov/analyzer'
|
17
|
+
autoload :Coverage, 'r19cov/coverage'
|
18
|
+
autoload :OptionParser, 'r19cov/option_parser'
|
19
|
+
autoload :Options, 'r19cov/options'
|
20
|
+
autoload :ReportFactory, 'r19cov/report_factory'
|
21
|
+
autoload :CLI, 'r19cov/cli'
|
22
|
+
|
23
|
+
class Coverage
|
24
|
+
autoload :Summary, 'r19cov/coverage/summary'
|
25
|
+
end
|
26
|
+
|
27
|
+
module Report
|
28
|
+
autoload :HTML, 'r19cov/report/html'
|
29
|
+
class HTML
|
30
|
+
autoload :Page, 'r19cov/report/html/page'
|
31
|
+
autoload :DetailPage, 'r19cov/report/html/detail_page'
|
32
|
+
autoload :IndexPage, 'r19cov/report/html/index_page'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Rake
|
37
|
+
autoload :SpecTask, 'r19cov/rake/spec_task'
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module R19Cov
|
4
|
+
class Analyzer
|
5
|
+
def initialize(args)
|
6
|
+
parser = R19Cov::OptionParser.new
|
7
|
+
@options = parser.parse(args)
|
8
|
+
@report = R19Cov::ReportFactory.create(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :options, :coverages
|
12
|
+
|
13
|
+
def analyze
|
14
|
+
@coverages = []
|
15
|
+
@@loaded_files ||= []
|
16
|
+
target_files = []
|
17
|
+
|
18
|
+
targets.each do |target|
|
19
|
+
target = Pathname.new(target).cleanpath.to_s
|
20
|
+
if File.directory?(target)
|
21
|
+
Dir["#{target}/**/*.rb"].each do |file|
|
22
|
+
target_files << file if File.file?(file) && !target_files.include?(file)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
target_files << target unless target_files.include?(target)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
target_files.each do |target_file|
|
29
|
+
if to_be_loaded?(target_file)
|
30
|
+
begin
|
31
|
+
load target_file
|
32
|
+
rescue Exception
|
33
|
+
# rescue exception in library and do nothing
|
34
|
+
end
|
35
|
+
@@loaded_files << target_file
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
add_result
|
40
|
+
@@result.each do |file, cov|
|
41
|
+
next if to_be_excluded?(file)
|
42
|
+
cov = @@result[File.expand_path(file)]
|
43
|
+
if cov
|
44
|
+
coverage = R19Cov::Coverage.new(file, cov)
|
45
|
+
@coverages << coverage
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_result
|
51
|
+
@@result ||= {}
|
52
|
+
::Coverage.result.each do |file, coverage|
|
53
|
+
coverage.each_with_index do |c, idx|
|
54
|
+
@@result[file] ||= []
|
55
|
+
if @@result[file][idx].nil?
|
56
|
+
@@result[file][idx] = c
|
57
|
+
else
|
58
|
+
@@result[file][idx] += c
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
::Coverage.start
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_be_loaded?(file)
|
66
|
+
!@@loaded_files.include?(file) && File.exist?(file)
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_be_excluded?(file)
|
70
|
+
options.exclude.each do |e|
|
71
|
+
return true if file =~ /#{e}/
|
72
|
+
end
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
|
76
|
+
def output_dir
|
77
|
+
options.output_dir
|
78
|
+
end
|
79
|
+
|
80
|
+
def output
|
81
|
+
@report.output(coverages)
|
82
|
+
end
|
83
|
+
|
84
|
+
def targets
|
85
|
+
options.targets
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/r19cov/cli.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module R19Cov
|
4
|
+
class Coverage
|
5
|
+
def initialize(source_file, result)
|
6
|
+
@filename = source_file
|
7
|
+
@result = result
|
8
|
+
load_source_file(source_file)
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :filename, :lines, :result
|
12
|
+
|
13
|
+
def load_source_file(source_file)
|
14
|
+
@lines = File.read(source_file).split("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def total_lines
|
18
|
+
lines.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def lines_of_code
|
22
|
+
result.select{ |c| !c.nil? }.size
|
23
|
+
end
|
24
|
+
|
25
|
+
def total_coverage
|
26
|
+
total_lines > 0 ? (total_lines.to_f - uncovered.to_f) / total_lines.to_f : 0.0
|
27
|
+
end
|
28
|
+
|
29
|
+
def code_coverage
|
30
|
+
lines_of_code > 0 ? covered.to_f / lines_of_code.to_f : 0.0
|
31
|
+
end
|
32
|
+
|
33
|
+
def uncovered
|
34
|
+
result.select{ |c| c == 0 }.size
|
35
|
+
end
|
36
|
+
|
37
|
+
def covered
|
38
|
+
result.select{ |c| !c.nil? && c > 0 }.size
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module R19Cov
|
4
|
+
class Coverage
|
5
|
+
class Summary
|
6
|
+
def initialize(coverages)
|
7
|
+
@coverages = coverages
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :coverages, :code_coverage
|
11
|
+
|
12
|
+
def filename
|
13
|
+
'index'
|
14
|
+
end
|
15
|
+
|
16
|
+
def total_lines
|
17
|
+
coverages.inject(0){ |t, c| t += c.total_lines }
|
18
|
+
end
|
19
|
+
|
20
|
+
def lines_of_code
|
21
|
+
coverages.inject(0){ |t, c| t += c.lines_of_code }
|
22
|
+
end
|
23
|
+
|
24
|
+
def total_coverage
|
25
|
+
total_lines > 0 ? (total_lines.to_f - uncovered.to_f) / total_lines.to_f : 0.0
|
26
|
+
end
|
27
|
+
|
28
|
+
def code_coverage
|
29
|
+
lines_of_code > 0 ? covered.to_f / lines_of_code.to_f : 0.0
|
30
|
+
end
|
31
|
+
|
32
|
+
def covered
|
33
|
+
coverages.inject(0){ |t, c| t += c.covered }
|
34
|
+
end
|
35
|
+
|
36
|
+
def uncovered
|
37
|
+
coverages.inject(0){ |t, c| t += c.uncovered }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
module R19Cov
|
6
|
+
class OptionParser
|
7
|
+
def initialize(out = STDOUT, err = STDERR)
|
8
|
+
@out = out
|
9
|
+
@err = err
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :options
|
13
|
+
|
14
|
+
def parse(args)
|
15
|
+
@options = Options.new
|
16
|
+
if (idx = args.index('--'))
|
17
|
+
extra_args = args[idx + 1 .. -1]
|
18
|
+
args = args[0, idx].dup
|
19
|
+
else
|
20
|
+
extra_args = []
|
21
|
+
args = args.dup
|
22
|
+
end
|
23
|
+
@options.raw_options = args.dup
|
24
|
+
args = ['--help'] if args.empty?
|
25
|
+
::OptionParser.new { |opt|
|
26
|
+
opt.banner = "Usage: r19cov [options] (FILE|DIRECTORY)+ [-- --extra-options]"
|
27
|
+
opt.on('-h', '--help', 'Show help messages') { @out.puts opt }
|
28
|
+
opt.on('-o', '--output [OUTPUT_DIR]', 'Specifies output directory of coverage report') {
|
29
|
+
|v| @options.output_dir = v
|
30
|
+
}
|
31
|
+
opt.on('-x', '--exclude [PATTERNS]', 'Don\'t generate info for files matching a pattern',
|
32
|
+
'(comma-separated regexp list)') { |v| @options.exclude = v.split(/,/) }
|
33
|
+
opt.on('-v', '--version', 'Show version') { @out.puts "r19cov #{R19Cov::VERSION}" }
|
34
|
+
opt.parse!(args)
|
35
|
+
}
|
36
|
+
@options.targets = args
|
37
|
+
@options.raw_options -= @options.targets
|
38
|
+
ARGV.replace extra_args
|
39
|
+
@options
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module R19Cov
|
6
|
+
class Options
|
7
|
+
def initialize
|
8
|
+
@exclude = []
|
9
|
+
@output_dir = default_output_dir
|
10
|
+
@report = default_report
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_accessor :targets, :raw_options, :exclude, :output_dir, :report
|
14
|
+
|
15
|
+
private
|
16
|
+
def default_output_dir
|
17
|
+
Pathname.new(File.join(Dir.pwd, 'coverage')).cleanpath.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_report
|
21
|
+
:html
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# Define a task library for running spec with R19Cov
|
4
|
+
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
|
7
|
+
module R19Cov
|
8
|
+
module Rake
|
9
|
+
|
10
|
+
# A Rake task that runs coverage.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# R19Cov::Rake::Task.new do |t|
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# This will create a task that can be run with:
|
18
|
+
#
|
19
|
+
# rake r19cov
|
20
|
+
#
|
21
|
+
class SpecTask < ::Spec::Rake::SpecTask
|
22
|
+
def initialize(name = :r19cov)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
attr_accessor :spec_script
|
26
|
+
|
27
|
+
def define # :nodoc:
|
28
|
+
rcov = true
|
29
|
+
lib_path = libs.join(File::PATH_SEPARATOR)
|
30
|
+
task name do
|
31
|
+
RakeFileUtils.verbose(verbose) do
|
32
|
+
unless spec_file_list.empty?
|
33
|
+
# ruby [ruby_opts] -Ilib -S r19cov [r19cov_opts] bin/spec -- examples [spec_opts]
|
34
|
+
cmd_parts = [ruby_cmd || RUBY]
|
35
|
+
cmd_parts += ruby_opts
|
36
|
+
cmd_parts << %[-I"#{lib_path}"]
|
37
|
+
cmd_parts << "-S r19cov"
|
38
|
+
cmd_parts << "-w" if warning
|
39
|
+
cmd_parts << rcov_option_list if rcov
|
40
|
+
cmd_parts << %[-o "#{rcov_dir}"] if rcov
|
41
|
+
cmd_parts << %["#{spec_script}"]
|
42
|
+
cmd_parts << "--"
|
43
|
+
cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] }
|
44
|
+
cmd_parts << spec_option_list
|
45
|
+
if out
|
46
|
+
cmd_parts << %[> "#{out}"]
|
47
|
+
STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
|
48
|
+
end
|
49
|
+
cmd = cmd_parts.join(" ")
|
50
|
+
puts cmd if verbose
|
51
|
+
unless system(cmd)
|
52
|
+
STDERR.puts failure_message if failure_message
|
53
|
+
raise("Command #{cmd} failed") if fail_on_error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def rcov_option_list # :nodoc:
|
62
|
+
ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|