insurance 0.1

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.
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'insurance'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ require 'insurance'
8
+ end
9
+ require 'optparse'
10
+
11
+ options = {}
12
+ opts = OptionParser.new do |opts|
13
+ opts.banner = <<-EOF
14
+ Insurance Rails Runner #{Insurance::VERSION}, #{Insurance::RELEASE_DATE}
15
+ Usage: railscov [options]
16
+ EOF
17
+
18
+ opts.separator ''
19
+ opts.on('-A', '--apply-to DIRECTORY',
20
+ 'Create a Rake task for running the ',
21
+ 'Insurance analyzer.',
22
+ 'Currently only works with Rails apps.'
23
+ ) { |value| options[:apply_to] = value }
24
+
25
+ opts.separator ''
26
+ opts.on_tail('-h', '--help', 'Show this message') do
27
+ puts opts
28
+ exit
29
+ end
30
+ opts.on_tail('--version', 'Show version') do
31
+ puts "Insurance #{Insurance::VERSION}, #{Insurance::RELEASE_DATE}"
32
+ end
33
+ end
34
+ opts.parse! ARGV
35
+
36
+ if options[:apply_to]
37
+ require 'insurance/generators/rails/loader'
38
+ InsuranceLoader::Generators::RailsLoader.load! options
39
+ exit
40
+ end
41
+
42
+ unless File.exist?('config/environment.rb')
43
+ puts 'Please run railscov from your RAILS_ROOT'
44
+ exit
45
+ end
46
+
47
+
48
+ # We modify Test::Unit::TestCase so that tracing is only turned on
49
+ # when executing a test. This avoids tracing framework loading
50
+ # and speeds things up by a great deal.
51
+
52
+ require 'test/unit'
53
+ module Test
54
+ module Unit
55
+ include Assertions
56
+ class TestCase
57
+ def run(result)
58
+ yield(STARTED, name)
59
+ @_result = result
60
+ begin
61
+ setup
62
+ Insurance.set_trace_func Insurance::RailsAnalyzer.method(:line_trace_func).to_proc
63
+ __send__(@method_name)
64
+ rescue AssertionFailedError => e
65
+ add_failure(e.message, e.backtrace)
66
+ rescue StandardError, ScriptError
67
+ add_error($!)
68
+ ensure
69
+ Insurance.set_trace_func nil
70
+ begin
71
+ teardown
72
+ rescue AssertionFailedError => e
73
+ add_failure(e.message, e.backtrace)
74
+ rescue StandardError, ScriptError
75
+ add_error($!)
76
+ end
77
+ end
78
+ result.add_run
79
+ yield(FINISHED, name)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ Insurance::RailsAnalyzer.run(Dir['test/unit/*.rb'] + Dir['test/functional/*.rb'])
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile 'insurance_tracer'
@@ -0,0 +1,99 @@
1
+ #include <ruby.h>
2
+ #include <node.h>
3
+ #include <env.h>
4
+
5
+ static int tracing = 0;
6
+ static int am_tracing = 0;
7
+
8
+ static char *
9
+ get_event_name(rb_event_t event)
10
+ {
11
+ switch (event) {
12
+ case RUBY_EVENT_LINE:
13
+ return "line";
14
+ case RUBY_EVENT_CLASS:
15
+ return "class";
16
+ case RUBY_EVENT_END:
17
+ return "end";
18
+ case RUBY_EVENT_CALL:
19
+ return "call";
20
+ case RUBY_EVENT_RETURN:
21
+ return "return";
22
+ case RUBY_EVENT_C_CALL:
23
+ return "c-call";
24
+ case RUBY_EVENT_C_RETURN:
25
+ return "c-return";
26
+ case RUBY_EVENT_RAISE:
27
+ return "raise";
28
+ default:
29
+ return "unknown";
30
+ }
31
+ }
32
+
33
+ static VALUE cov_tracer = 0;
34
+
35
+ static void
36
+ insurance_trace_func(event, node, self, id, klass)
37
+ rb_event_t event;
38
+ NODE *node;
39
+ VALUE self;
40
+ ID id;
41
+ VALUE klass;
42
+ {
43
+ int state, raised;
44
+ NODE *node_save;
45
+ VALUE srcfile;
46
+ struct FRAME *prev;
47
+ static int counting = 0;
48
+
49
+ if (tracing) return;
50
+ if (id == ID_ALLOCATOR) return;
51
+ tracing = 1;
52
+ if (node) {
53
+ ruby_current_node = node;
54
+ ruby_frame->node = node;
55
+ ruby_sourcefile = node->nd_file;
56
+ ruby_sourceline = nd_line(node);
57
+ }
58
+
59
+ srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)");
60
+ rb_funcall(cov_tracer, rb_intern("call"), 3, rb_str_new2(get_event_name(event)), srcfile, INT2FIX(ruby_sourceline));
61
+ tracing = 0;
62
+ }
63
+
64
+ static VALUE
65
+ is_tracing()
66
+ {
67
+ if (am_tracing == 0) {
68
+ return Qfalse;
69
+ }
70
+ return Qtrue;
71
+ }
72
+
73
+ static VALUE
74
+ set_insurance_trace_func(obj, trace)
75
+ VALUE obj, trace;
76
+ {
77
+ if (NIL_P(trace)) {
78
+ cov_tracer = 0;
79
+ am_tracing = 0;
80
+ rb_remove_event_hook(insurance_trace_func);
81
+ return Qnil;
82
+ }
83
+
84
+ cov_tracer = trace;
85
+ am_tracing = 1;
86
+ rb_add_event_hook(insurance_trace_func, RUBY_EVENT_LINE);
87
+ return trace;
88
+ }
89
+
90
+
91
+ void
92
+ Init_insurance_tracer()
93
+ {
94
+ VALUE mProf;
95
+
96
+ mProf = rb_define_module("Insurance");
97
+ rb_define_module_function(mProf, "set_trace_func", set_insurance_trace_func, 1);
98
+ rb_define_module_function(mProf, "is_tracing?", is_tracing, 0);
99
+ }
@@ -0,0 +1,9 @@
1
+ require 'insurance_tracer.so'
2
+ require 'insurance/analyzer'
3
+ require 'insurance/source_file'
4
+ require 'insurance/formatter'
5
+
6
+ module Insurance
7
+ VERSION = '0.1'
8
+ RELEASE_DATE = '28 Oct 2005'
9
+ end
@@ -0,0 +1,82 @@
1
+ require 'yaml'
2
+ module Insurance
3
+ FILELIST = {}
4
+
5
+ END {
6
+ Insurance.set_trace_func nil
7
+
8
+ Dir.mkdir('insurance') unless File.exist?('insurance')
9
+
10
+ Insurance::Formatter.run(Insurance::FILELIST)
11
+ }
12
+
13
+ class Analyzer
14
+ def self.line_trace_func(event, file, line)
15
+ # case event
16
+ # when 'c-call', 'c-return'
17
+ # return
18
+ # end
19
+
20
+ if (full_path = self.filter(file))
21
+ FILELIST[full_path] ||= SourceFile.new(full_path)
22
+ FILELIST[full_path] << line
23
+ end
24
+ end
25
+
26
+ def self.filter(file)
27
+ file
28
+ end
29
+
30
+ def self.run(files)
31
+ Insurance.set_trace_func self.method(:line_trace_func).to_proc
32
+ files.each { |f| load f }
33
+ end
34
+ end
35
+
36
+ class RailsAnalyzer < Analyzer
37
+ @@dir_regexp = Regexp.new("^#{Dir.pwd}/(?:lib|app/(?:models|controllers))/")
38
+ @@_path_cache = {}
39
+
40
+ def self.filter(file)
41
+ begin
42
+ full_path = @@_path_cache[file] || (@@_path_cache[file] = File.expand_path(file))
43
+ if @@dir_regexp =~ full_path
44
+ pwd = Dir.pwd
45
+ return full_path[(full_path.index(pwd)+pwd.length+1)..-1]
46
+ else
47
+ return false
48
+ end
49
+ rescue
50
+ return false
51
+ end
52
+ end
53
+
54
+ def self.run(files)
55
+ # The rails analyzer does not need to set the trace func, because that is
56
+ # done in the perversion of Test::Unit::TestCase.
57
+
58
+ # Since we flip tracing on only right before a test is executed, to avoid
59
+ # tracing the entire framework at all times (very slow), we need to pre-load
60
+ # all of the application's models and controllers so that we can trace things
61
+ # at the class level. This is just easier to do than to try and figure out
62
+ # what should really be marked as hit in the output stage.
63
+
64
+ pipe = IO.popen('-', 'w+')
65
+ if pipe
66
+ Insurance::FILELIST.merge!(YAML::load(pipe.read))
67
+ files.each { |f| load f }
68
+ else
69
+ at_exit {
70
+ Insurance.set_trace_func nil
71
+ puts Insurance::FILELIST.to_yaml
72
+ exit!
73
+ }
74
+
75
+ require 'config/environment'
76
+ Insurance.set_trace_func self.method(:line_trace_func).to_proc
77
+ require 'application'
78
+ (Dir['app/models/*.rb'] + Dir['app/controllers/*.rb']).each { |f| load f }
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,42 @@
1
+ require 'erb'
2
+ require 'syntax'
3
+ require 'syntax/convertors/html'
4
+
5
+ module Insurance
6
+ class Formatter
7
+ include ERB::Util
8
+
9
+ def self.run(filelist)
10
+ files = filelist.keys.sort
11
+
12
+ project_name = File.basename Dir.pwd
13
+
14
+ File.open("insurance/index.html", 'w') do |f|
15
+ f.write ERB.new(File.read("#{File.dirname(__FILE__)}/templates/index.rhtml")).result(binding)
16
+ puts "Wrote insurance/index.html"
17
+ end
18
+
19
+ filelist.each do |file, sf|
20
+ sf.post_analyze!
21
+
22
+ file_under_test = sf.name
23
+ percentage = sf.coverage_percent
24
+
25
+ File.open("insurance/#{sf.name.gsub('/', '-')}.html", 'w') do |f|
26
+ contents = File.open(sf.name, 'r').readlines
27
+ body = "<pre class=\"ruby\">\n"
28
+ contents.each_with_index do |line, num|
29
+ unless sf.lines.include?(num + 1)
30
+ body << "#{'%3s' % (num + 1).to_s} <span class=\"unhit\">#{Syntax::Convertors::HTML.for_syntax('ruby').convert(line.chomp, false)}</span>\n"
31
+ else
32
+ body << "#{'%3s' % (num + 1).to_s} #{Syntax::Convertors::HTML.for_syntax('ruby').convert(line, false)}"
33
+ end
34
+ end
35
+ body << "</pre>"
36
+ f.write ERB.new(File.read("#{File.dirname(__FILE__)}/templates/code-page.rhtml")).result(binding)
37
+ puts "Wrote insurance/#{sf.name.gsub('/', '-')}.html"
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ class InsuranceGenerator < Rails::Generator::NamedBase
2
+ def initialize(runtime_args, runtime_options={})
3
+ super
4
+ end
5
+
6
+ def manifest
7
+ record do |m|
8
+ m.directory 'lib/tasks'
9
+ m.template 'insurance.rake', File.join('lib', 'tasks', 'insurance.rake')
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ desc 'Run Insurnace coverage analysis'
2
+ task :insurance => [ :prepare_test_database ] do
3
+ puts
4
+ puts 'You may want to get a beverage while this runs. It could take a while!'
5
+ puts
6
+ system 'railscov'
7
+ end
@@ -0,0 +1,17 @@
1
+ module InsuranceLoader
2
+ module Generators
3
+ class RailsLoader
4
+ def self.load!(options)
5
+ require "#{options[:apply_to]}/config/environment"
6
+ require "rails_generator"
7
+ require "rails_generator/scripts/generate"
8
+
9
+ Rails::Generator::Base.sources << Rails::Generator::PathSource.new(
10
+ :insurance, File.dirname(__FILE__))
11
+
12
+ args = ['insurance', 'insurance', 'insurance']
13
+ Rails::Generator::Scripts::Generate.new.run(args)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ module Insurance
2
+ class SourceFile
3
+ attr_reader :name
4
+ attr_reader :lines
5
+ attr_reader :coverage_percent
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ @lines = []
10
+ @coverage_percent = 0
11
+ end
12
+
13
+ def <<(line)
14
+ @lines << line unless @lines.include?(line)
15
+ end
16
+
17
+ # This marks crufty crap that isn't important, like 'end', and whitespace.
18
+ def post_analyze!
19
+ contents = File.open(self.name, 'r').readlines
20
+ contents.each_with_index do |line, num|
21
+ sline = line.strip
22
+ lines << num + 1 if sline.empty?
23
+ lines << num + 1 if sline =~ /^#/
24
+ lines << num + 1 if sline =~ /^\s*(?:end|\})\s*(?:#.*)?$/
25
+ lines << num + 1 if sline =~ /^(public|private|protected)/
26
+ lines << num + 1 if sline =~ /^(?:begin\s*(?:#.*)?|ensure\s*(?:#.*)?|else\s*(?:#.*)?)$/
27
+ lines << num + 1 if sline =~ /^(?:rescue)/
28
+ lines << num + 1 if sline =~ /^case\s*(?:#.*)?$/
29
+ lines << num + 1 if sline =~ /^(\)|\]|\})(?:#.*)?$/
30
+ end
31
+
32
+ @coverage_percent = (@lines.size.to_f / contents.size.to_f) * 100.0
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,73 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
+ <title><%= file_under_test %></title>
7
+ <style type="text/css" media="screen">
8
+ /* <![CDATA[ */
9
+ body {
10
+ font-size: small;
11
+ }
12
+
13
+ th { text-align: left; }
14
+
15
+ .ruby .normal {}
16
+ .ruby .comment { color: #bfbfbf; }
17
+ .ruby .keyword { color: #FF5600; font-weight: bold; }
18
+ .ruby .method { color: #21439C; }
19
+ .ruby .class { color: #21439C; }
20
+ .ruby .module { color: #21439C; }
21
+ .ruby .punct { color: #21439C; font-weight: bold; }
22
+ .ruby .symbol { color: #21439C; }
23
+ .ruby .string { color: #00A33F; }
24
+ .ruby .char { color: #00A33F; }
25
+ .ruby .ident { color: #21439C; }
26
+ .ruby .constant { color: #A535AE; }
27
+ .ruby .regex { color: #990000; }
28
+ .ruby .number { }
29
+ .ruby .attribute { }
30
+ .ruby .global { }
31
+ .ruby .expr { }
32
+
33
+ .unhit { background: #FFC6C6; }
34
+
35
+ .right { text-align: right; }
36
+
37
+ #code-tree {
38
+ float: left;
39
+ width: 30%;
40
+ }
41
+
42
+ #graph, #code {
43
+ margin-left: 30%;
44
+ }
45
+
46
+ #graph {
47
+ padding-left: 35px;
48
+ }
49
+
50
+ /* ]]> */
51
+ </style>
52
+
53
+ </head>
54
+ <body>
55
+ <div id="header">
56
+ <h1>Insurance - <%= project_name %></h1>
57
+ </div>
58
+ <div id="code-tree">
59
+ <table>
60
+ <% files.each do |f| %>
61
+ <tr>
62
+ <td><a href="<%= "#{f.gsub('/', '-')}.html" %>"><%= f %></a></td>
63
+ <td></td>
64
+ </tr>
65
+ <% end %>
66
+ </table>
67
+ </div>
68
+ <div id="code">
69
+ <h2><%= file_under_test %></h2>
70
+ <%= body %>
71
+ </div>
72
+ </body>
73
+ </html>
@@ -0,0 +1,72 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
+ <title>Insurance - <%= project_name %></title>
7
+ <style type="text/css" media="screen">
8
+ /* <![CDATA[ */
9
+ body {
10
+ font-size: small;
11
+ }
12
+
13
+ th { text-align: left; }
14
+
15
+ .ruby .normal {}
16
+ .ruby .comment { color: #bfbfbf; }
17
+ .ruby .keyword { color: #FF5600; font-weight: bold; }
18
+ .ruby .method { color: #21439C; }
19
+ .ruby .class { color: #21439C; }
20
+ .ruby .module { color: #21439C; }
21
+ .ruby .punct { color: #21439C; font-weight: bold; }
22
+ .ruby .symbol { color: #21439C; }
23
+ .ruby .string { color: #00A33F; }
24
+ .ruby .char { color: #00A33F; }
25
+ .ruby .ident { color: #21439C; }
26
+ .ruby .constant { color: #A535AE; }
27
+ .ruby .regex { color: #990000; }
28
+ .ruby .number { }
29
+ .ruby .attribute { }
30
+ .ruby .global { }
31
+ .ruby .expr { }
32
+
33
+ .unhit { background: #FFC6C6; }
34
+
35
+ .right { text-align: right; }
36
+
37
+ #code-tree {
38
+ float: left;
39
+ width: 30%;
40
+ }
41
+
42
+ #graph, #code {
43
+ margin-left: 30%;
44
+ }
45
+
46
+ #graph {
47
+ padding-left: 35px;
48
+ }
49
+
50
+ /* ]]> */
51
+ </style>
52
+
53
+ </head>
54
+ <body>
55
+ <div id="header">
56
+ <h1>Insurance - <%= project_name %></h1>
57
+ </div>
58
+ <div id="code-tree">
59
+ <table>
60
+ <% files.each do |f| %>
61
+ <tr>
62
+ <td><a href="<%= "#{f.gsub('/', '-')}.html" %>"><%= f %></a></td>
63
+ <td></td>
64
+ </tr>
65
+ <% end %>
66
+ </table>
67
+ </div>
68
+ <div id="code">
69
+ The next release will have much more information here. I promise!
70
+ </div>
71
+ </body>
72
+ </html>
@@ -0,0 +1,140 @@
1
+ # Taken from Ruby 1.8.3's test_settracefunc.rb
2
+ require 'test/unit'
3
+ require 'insurance'
4
+
5
+ class TestSetTraceFunc < Test::Unit::TestCase
6
+ def foo; end;
7
+
8
+ def bar
9
+ events = []
10
+ Insurance.set_trace_func(Proc.new { |event, file, lineno|
11
+ events << [event, lineno]
12
+ })
13
+ return events
14
+ end
15
+
16
+ def test_event
17
+ events = []
18
+ Insurance.set_trace_func(Proc.new { |event, file, lineno|
19
+ events << [event, lineno]
20
+ })
21
+ a = 1
22
+ foo
23
+ a
24
+ b = 1 + 2
25
+ if b == 3
26
+ case b
27
+ when 2
28
+ c = "b == 2"
29
+ when 3
30
+ c = "b == 3"
31
+ end
32
+ end
33
+ begin
34
+ raise "error"
35
+ rescue
36
+ end
37
+ eval("class Foo; end")
38
+ Insurance.set_trace_func nil
39
+
40
+ assert_equal(["line", 21],
41
+ events.shift) # a = 1
42
+ assert_equal(["line", 22],
43
+ events.shift) # foo
44
+ assert_equal(["call", 6],
45
+ events.shift) # foo
46
+ assert_equal(["return", 6],
47
+ events.shift) # foo
48
+ assert_equal(["line", 23],
49
+ events.shift) # a
50
+ assert_equal(["line", 24],
51
+ events.shift) # b = 1 + 2
52
+ assert_equal(["c-call", 24],
53
+ events.shift) # 1 + 2
54
+ assert_equal(["c-return", 24],
55
+ events.shift) # 1 + 2
56
+ assert_equal(["line", 25],
57
+ events.shift) # if b == 3
58
+ assert_equal(["line", 25],
59
+ events.shift) # if b == 3
60
+ assert_equal(["c-call", 25],
61
+ events.shift) # b == 3
62
+ assert_equal(["c-return", 25],
63
+ events.shift) # b == 3
64
+ assert_equal(["line", 26],
65
+ events.shift) # case b
66
+ assert_equal(["line", 27],
67
+ events.shift) # when 2
68
+ assert_equal(["c-call", 27],
69
+ events.shift) # when 2
70
+ assert_equal(["c-call", 27],
71
+ events.shift) # when 2
72
+ assert_equal(["c-return", 27],
73
+ events.shift) # when 2
74
+ assert_equal(["c-return", 27],
75
+ events.shift) # when 2
76
+ assert_equal(["line", 29],
77
+ events.shift) # when 3
78
+ assert_equal(["c-call", 29],
79
+ events.shift) # when 3
80
+ assert_equal(["c-return", 29],
81
+ events.shift) # when 3
82
+ assert_equal(["line", 30],
83
+ events.shift) # c = "b == 3"
84
+ assert_equal(["line", 33],
85
+ events.shift) # begin
86
+ assert_equal(["line", 34],
87
+ events.shift) # raise "error"
88
+ assert_equal(["c-call", 34],
89
+ events.shift) # raise "error"
90
+ assert_equal(["c-call", 34],
91
+ events.shift) # raise "error"
92
+ assert_equal(["c-call", 34],
93
+ events.shift) # raise "error"
94
+ assert_equal(["c-return", 34],
95
+ events.shift) # raise "error"
96
+ assert_equal(["c-return", 34],
97
+ events.shift) # raise "error"
98
+ assert_equal(["c-call", 34],
99
+ events.shift) # raise "error"
100
+ assert_equal(["c-return", 34],
101
+ events.shift) # raise "error"
102
+ assert_equal(["c-call", 34],
103
+ events.shift) # raise "error"
104
+ assert_equal(["c-return", 34],
105
+ events.shift) # raise "error"
106
+ assert_equal(["raise", 34],
107
+ events.shift) # raise "error"
108
+ assert_equal(["c-return", 34],
109
+ events.shift) # raise "error"
110
+ assert_equal(["line", 37],
111
+ events.shift) # eval(<<EOF)
112
+ assert_equal(["c-call", 37],
113
+ events.shift) # eval(<<EOF)
114
+ assert_equal(["line", 1],
115
+ events.shift) # class Foo
116
+ assert_equal(["c-call", 1],
117
+ events.shift) # class Foo
118
+ assert_equal(["c-return", 1],
119
+ events.shift) # class Foo
120
+ assert_equal(["class", 1],
121
+ events.shift) # class Foo
122
+ assert_equal(["end", 1],
123
+ events.shift) # class Foo
124
+ assert_equal(["c-return", 37],
125
+ events.shift) # eval(<<EOF)
126
+ assert_equal(["line", 38],
127
+ events.shift) # set_trace_func nil
128
+ assert_equal(["c-call", 38],
129
+ events.shift) # set_trace_func nil
130
+ assert_equal([], events)
131
+
132
+ events = bar
133
+ Insurance.set_trace_func(nil)
134
+ assert_equal(["line", 13], events.shift)
135
+ assert_equal(["return", 9], events.shift)
136
+ assert_equal(["line", 133], events.shift)
137
+ assert_equal(["c-call", 133], events.shift)
138
+ assert_equal([], events)
139
+ end
140
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.6
3
+ specification_version: 1
4
+ name: insurance
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2005-10-28
8
+ summary: Code coverage analysis package.
9
+ require_paths:
10
+ - lib
11
+ email: scott@elitists.net
12
+ homepage: http://lunchboxsoftware.com/insurance
13
+ rubyforge_project: insurance
14
+ description: Insurance is a code coverage analysis utility.
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ -
22
+ - ">"
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.0
25
+ version:
26
+ platform: ruby
27
+ authors:
28
+ - Scott Barron
29
+ files:
30
+ - extconf.rb
31
+ - insurance_tracer.c
32
+ - bin/railscov
33
+ - lib/insurance
34
+ - lib/insurance.rb
35
+ - lib/insurance/analyzer.rb
36
+ - lib/insurance/formatter.rb
37
+ - lib/insurance/generators
38
+ - lib/insurance/source_file.rb
39
+ - lib/insurance/templates
40
+ - lib/insurance/generators/rails
41
+ - lib/insurance/generators/rails/insurance
42
+ - lib/insurance/generators/rails/loader.rb
43
+ - lib/insurance/generators/rails/insurance/insurance_generator.rb
44
+ - lib/insurance/generators/rails/insurance/templates
45
+ - lib/insurance/generators/rails/insurance/templates/insurance.rake
46
+ - lib/insurance/templates/code-page.rhtml
47
+ - lib/insurance/templates/index.rhtml
48
+ - test/test_settracefunc.rb
49
+ test_files: []
50
+ rdoc_options: []
51
+ extra_rdoc_files: []
52
+ executables:
53
+ - railscov
54
+ extensions:
55
+ - extconf.rb
56
+ requirements: []
57
+ dependencies:
58
+ - !ruby/object:Gem::Dependency
59
+ name: syntax
60
+ version_requirement:
61
+ version_requirements: !ruby/object:Gem::Version::Requirement
62
+ requirements:
63
+ -
64
+ - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.0.0
67
+ version: