indirect-metric_fu 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,20 @@
1
1
  namespace :metrics do
2
- task :prepare do
3
- RAILS_ENV = 'test'
4
- end
5
-
6
- desc "Useful for continuous integration"
7
- task :all_with_migrate => [:prepare, "db:migrate", :all]
8
-
9
2
  if MetricFu::RAILS
10
- desc "Generate coverage, cyclomatic complexity, flog, stats, and churn reports"
11
- task :all => [:coverage, :saikuro, :flog, :churn, :stats]
3
+
4
+ desc "Generate coverage, cyclomatic complexity, flog, stats, duplication and churn reports"
5
+ task :all => [:coverage, :stats, :saikuro, :churn, :flog, :flay]
6
+
7
+ task :set_testing_env do
8
+ RAILS_ENV = 'test'
9
+ end
10
+
11
+ desc "Generate metrics after migrating (for continuous integration)"
12
+ task :all_with_migrate => [:set_testing_env, "db:migrate", :all]
13
+
12
14
  else
13
- desc "Generate coverage, cyclomatic complexity, flog, and churn reports"
14
- task :all => [:coverage, :saikuro, :flog, :churn]
15
+
16
+ desc "Generate coverage, cyclomatic complexity, flog, duplication and churn reports"
17
+ task :all => [:coverage, :saikuro, :churn, :flog, :flay]
18
+
15
19
  end
16
20
  end
@@ -14,10 +14,10 @@ namespace :metrics do
14
14
  :filter_cyclo => "0",
15
15
  :warn_cyclo => "5",
16
16
  :error_cyclo => "7"}
17
-
17
+
18
18
  options.merge!(MetricFu::SAIKURO_OPTIONS) if defined?(MetricFu::SAIKURO_OPTIONS)
19
- options_string = options.inject(""){ |o, h| o + "--#{h.join(' ')} " }
20
-
19
+ options_string = options.inject(""){ |o, h| o + "--#{h.join(' ')} " }
20
+
21
21
  sh %{ruby "#{SAIKURO}" #{options_string}} do |ok, response|
22
22
  unless ok
23
23
  puts "Saikuro failed with exit status: #{response.exitstatus}"
@@ -26,10 +26,10 @@ namespace :metrics do
26
26
  end
27
27
 
28
28
  if File.exist? "#{SAIKURO_DIR}/index_cyclo.html"
29
- mv "#{SAIKURO_DIR}/index_cyclo.html",
29
+ mv "#{SAIKURO_DIR}/index_cyclo.html",
30
30
  "#{SAIKURO_DIR}/index.html"
31
31
  end
32
-
32
+
33
33
  system("open #{SAIKURO_DIR}/index.html") if PLATFORM['darwin']
34
34
  end
35
35
  end
data/lib/tasks/stats.rake CHANGED
@@ -1,8 +1,8 @@
1
1
  namespace :metrics do
2
-
2
+
3
3
  STATS_DIR = File.join(MetricFu::BASE_DIRECTORY, 'stats')
4
4
  STATS_FILE = File.join(STATS_DIR, 'index.html')
5
-
5
+
6
6
  desc "A stats report"
7
7
  task :stats do
8
8
  mkdir_p(STATS_DIR) unless File.directory?(STATS_DIR)
@@ -0,0 +1,38 @@
1
+ body {
2
+ margin: 20px;
3
+ padding: 0;
4
+ font-size: 12px;
5
+ font-family: bitstream vera sans, verdana, arial, sans serif;
6
+ background-color: #efefef;
7
+ }
8
+
9
+ table {
10
+ border-collapse: collapse;
11
+ /*border-spacing: 0;*/
12
+ border: 1px solid #666;
13
+ background-color: #fff;
14
+ margin-bottom: 20px;
15
+ }
16
+
17
+ table, th, th+th, td, td+td {
18
+ border: 1px solid #ccc;
19
+ }
20
+
21
+ table th {
22
+ font-size: 12px;
23
+ color: #fc0;
24
+ padding: 4px 0;
25
+ background-color: #336;
26
+ }
27
+
28
+ th, td {
29
+ padding: 4px 10px;
30
+ }
31
+
32
+ td {
33
+ font-size: 13px;
34
+ }
35
+
36
+ .warning {
37
+ background-color: yellow;
38
+ }
@@ -0,0 +1,19 @@
1
+ <html>
2
+ <head>
3
+ <title>Source Control Churn Results</title>
4
+ <style>
5
+ <%= open(File.join(MetricFu::TEMPLATE_DIR, "#{template_name}.css")) { |f| f.read } %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Source Control Churn Results</h1>
11
+ <table width="100%" border="1">
12
+ <tr><th>File Path</th><th>Times Changed</th></tr>
13
+ <% @changes.to_a.sort {|x,y| y[1] <=> x[1]}.each do |change| %>
14
+ <tr><td><%= change[0] %></td><td class='warning'><%= change[1] %></td></tr>
15
+ <% end %>
16
+
17
+ </table>
18
+ </body>
19
+ </html>
@@ -0,0 +1,38 @@
1
+ body {
2
+ margin: 20px;
3
+ padding: 0;
4
+ font-size: 12px;
5
+ font-family: bitstream vera sans, verdana, arial, sans serif;
6
+ background-color: #efefef;
7
+ }
8
+
9
+ table {
10
+ border-collapse: collapse;
11
+ /*border-spacing: 0;*/
12
+ border: 1px solid #666;
13
+ background-color: #fff;
14
+ margin-bottom: 10px;
15
+ }
16
+
17
+ table, th, th+th, td, td+td {
18
+ border: 1px solid #ccc;
19
+ }
20
+
21
+ table th {
22
+ font-size: 14px;
23
+ color: #fc0;
24
+ background-color: #336;
25
+ text-align: left;
26
+ }
27
+
28
+ th, td {
29
+ padding: 4px 10px;
30
+ }
31
+
32
+ td {
33
+ font-size: 13px;
34
+ }
35
+
36
+ .warning {
37
+ background-color: yellow;
38
+ }
@@ -0,0 +1,23 @@
1
+ <html>
2
+ <head>
3
+ <title>Flay Results</title>
4
+ <style>
5
+ <%= open(File.join(MetricFu::TEMPLATE_DIR, "#{template_name}.css")) { |f| f.read } %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Flay Results</h1>
11
+
12
+ <% @matches.each do |match| %>
13
+ <table width="80%" border="1">
14
+ <tr><th><%= match.first %></th></tr>
15
+ <tr><td>
16
+ <% match[1..-1].each do |filename| %>
17
+ <%= link_to_filename(*filename.split(":")) %><br>
18
+ <% end %>
19
+ </td></tr>
20
+ <% end %>
21
+ </table>
22
+ </body>
23
+ </html>
@@ -0,0 +1,39 @@
1
+ body {
2
+ background-color: rgb(240, 240, 245);
3
+ font-family: verdana, arial, helvetica;
4
+ }
5
+
6
+ table {
7
+ border-collapse: collapse;
8
+ }
9
+
10
+ table.report {
11
+ width: 100%;
12
+ }
13
+
14
+ table th {
15
+ text-align: center;
16
+ }
17
+
18
+ table td.score {
19
+ text-align: right;
20
+ }
21
+
22
+ table th {
23
+ background: #dcecff;
24
+ border: #d0d0d0 1px solid;
25
+ font-weight: bold;
26
+ }
27
+
28
+ table td {
29
+ border: #d0d0d0 1px solid;
30
+ }
31
+
32
+ table tr.light {
33
+ background-color: rgb(240, 240, 245);
34
+ }
35
+
36
+ table tr.dark {
37
+ background-color: rgb(230, 230, 235);
38
+ }
39
+
@@ -0,0 +1,26 @@
1
+ <html>
2
+ <head>
3
+ <title>Flog Reporter</title>
4
+ <style>
5
+ <%= open(File.join(MetricFu::TEMPLATE_DIR, "#{template_name}.css")) { |f| f.read } %>
6
+ </style>
7
+ </head>
8
+ <body>
9
+ <h1>Flogged files</h1>
10
+ <p>Generated on <%= Time.now.localtime %> with <a href='http://ruby.sadi.st/Flog.html'>flog</a></p>
11
+ <table class='report'>
12
+ <tr><th>File</th><th>Total score</th><th>Methods</th><th>Average score</th><th>Highest score</th></tr>
13
+ <% count = 0 %>
14
+ <% flog_hashes.sort {|x,y| y[:page].highest_score <=> x[:page].highest_score }.each do |flog_hash| %>
15
+ <tr class='<%= Base.cycle("light", "dark", count) %>'>
16
+ <td><a href='<%= flog_hash[:path]%>'><%= flog_hash[:path].sub('.html', '.rb') %></a></td>
17
+ <td class='score'><%= sprintf(SCORE_FORMAT, flog_hash[:page].score) %></td>
18
+ <td class='score'><%= flog_hash[:page].scanned_methods.length %></td>
19
+ <td class='score'><%= sprintf(SCORE_FORMAT, flog_hash[:page].average_score) %></td>
20
+ <td class='score'><%= sprintf(SCORE_FORMAT, flog_hash[:page].highest_score) %></td>
21
+ </tr>
22
+ <% count += 1 %>
23
+ <% end %>
24
+ </table>
25
+ </body>
26
+ </html>
@@ -0,0 +1,13 @@
1
+ <html>
2
+ <head>
3
+ <style>
4
+ <%= open(File.join(MetricFu::TEMPLATE_DIR, "flog.css")) { |f| f.read } %>
5
+ </style>
6
+ </head>
7
+ <body>
8
+ <p>Score: <%= score %></p>
9
+ <% scanned_methods.each do |sm| %>
10
+ <%= sm.to_html %>
11
+ <% end %>
12
+ </body>
13
+ </html>
data/spec/base_spec.rb ADDED
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MetricFu::Base::Generator do
4
+ describe "save_html" do
5
+ it "should save to a index.html in the base_dir" do
6
+ @generator = MetricFu::Base::Generator.new('base_dir')
7
+ @generator.should_receive(:open).with("base_dir/index.html", "w")
8
+ @generator.save_html("<html>")
9
+ end
10
+
11
+ it "should save to a custom.html to the base_dir if 'custom' is passed as name" do
12
+ @generator = MetricFu::Base::Generator.new('base_dir')
13
+ @generator.should_receive(:open).with("base_dir/metric_fu/custom.html", "w")
14
+ @generator.save_html("<html>", 'metric_fu/custom')
15
+ end
16
+ end
17
+
18
+ describe "generate_report class method" do
19
+ it "should create a new Generator and call generate_report on it" do
20
+ @generator = mock('generator')
21
+ @generator.should_receive(:generate_report)
22
+ MetricFu::Base::Generator.should_receive(:new).and_return(@generator)
23
+ MetricFu::Base::Generator.generate_report('base_dir')
24
+ end
25
+ end
26
+
27
+ describe "generate_report" do
28
+ it "should create a new Generator and call generate_report on it" do
29
+ @generator = MetricFu::Base::Generator.new('other_dir')
30
+ @generator.should_receive(:open).with("other_dir/index.html", "w")
31
+ @generator.should_receive(:generate_html).and_return('<html>')
32
+ @generator.generate_report
33
+ end
34
+ end
35
+ end
data/spec/churn_spec.rb CHANGED
@@ -1,63 +1,110 @@
1
- require 'spec'
2
- require File.dirname(__FILE__) + '/../lib/metric_fu/churn'
3
- include MetricFu
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
4
2
 
5
3
  describe MetricFu::Churn do
6
4
  describe "generate_report" do
7
5
  after do
8
6
  load File.dirname(__FILE__) + '/../lib/metric_fu/churn.rb' #need to reload file to wipe out mock of private static
9
7
  end
10
-
8
+
11
9
  it "should strip out files that have less than the min count" do
12
- Churn.should_receive(:churn_options).and_return(["", 5, :git])
13
- Churn.should_receive(:parse_log_for_changes).with(:git, "").and_return({"reject" => 4, "accept" => 5})
14
- Churn.should_receive(:write_churn_file).with({"accept" => 5}, "output_dir")
15
- Churn.generate_report("output_dir", {})
10
+ logs = ["accept", "accept", "accept", "reject", "reject"]
11
+ git_mock = mock('git')
12
+ git_mock.should_receive(:get_logs).and_return(logs)
13
+ Churn::Git.should_receive(:new).and_return(git_mock)
14
+ churn = Churn.new('base_dir', :scm => :git, :minimum_churn_count => 3)
15
+ churn.analyze
16
+ churn.instance_variable_get(:@changes).should == {"accept"=>3}
17
+ end
18
+
19
+ it "should have a default min count of 5" do
20
+ churn = Churn.new('base_dir')
21
+ churn.instance_variable_get(:@minimum_churn_count).should == 5
16
22
  end
23
+
17
24
  end
18
-
25
+
19
26
  describe "parse_log_for_changes" do
20
27
  it "should count the changes with git" do
21
28
  logs = ["home_page/index.html", "README", "History.txt", "README", "History.txt", "README"]
22
- Churn.should_receive(:get_logs).with(:git, "").and_return(logs)
23
- changes = Churn.send(:parse_log_for_changes, :git, "")
24
-
29
+ git_mock = mock('git')
30
+ git_mock.should_receive(:get_logs).and_return(logs)
31
+ Churn::Git.should_receive(:new).and_return(git_mock)
32
+ File.should_receive(:exist?).with(".git").and_return(true)
33
+ changes = Churn.new('base_dir').send(:parse_log_for_changes)
25
34
  changes["home_page/index.html"].should == 1
26
35
  changes["History.txt"].should == 2
27
36
  changes["README"].should == 3
28
37
  end
29
-
38
+
30
39
  it "should count the changes with svn" do
31
40
  logs = ["home_page/index.html", "README", "History.txt", "README", "History.txt", "README"]
32
- Churn.should_receive(:get_logs).with(:svn, "").and_return(logs)
33
- changes = Churn.send(:parse_log_for_changes, :svn, "")
34
-
41
+ svn_mock = mock('svn')
42
+ svn_mock.should_receive(:get_logs).and_return(logs)
43
+ Churn::Svn.should_receive(:new).and_return(svn_mock)
44
+ File.should_receive(:exist?).with(".git").and_return(false)
45
+ File.should_receive(:exist?).with(".svn").and_return(true)
46
+ changes = Churn.new('base_dir').send(:parse_log_for_changes)
35
47
  changes["home_page/index.html"].should == 1
36
48
  changes["History.txt"].should == 2
37
49
  changes["README"].should == 3
38
- end
50
+ end
39
51
  end
40
-
52
+ end
53
+
54
+ describe MetricFu::Churn::Svn do
55
+
56
+ describe "get_logs" do
57
+ it "should use the start date if supplied" do
58
+ @churn = Churn::Svn.new
59
+ @churn.should_receive(:`).with('svn log --verbose').and_return("")
60
+ @churn.get_logs
61
+ end
62
+ it "should use the start date if supplied" do
63
+ Time.should_receive(:now).and_return(Date.new(2001, 1, 2))
64
+ @churn = Churn::Svn.new(lambda{Date.new(2000, 1, 1)})
65
+ @churn.should_receive(:require_rails_env)
66
+ @churn.should_receive(:`).with("svn log --revision {2000-01-01}:{2001-01-02} --verbose").and_return("")
67
+ @churn.get_logs
68
+ end
69
+ end
70
+
41
71
  describe "clean_up_svn_line" do
42
72
  it "should return nil for non matches" do
43
- Churn.send(:clean_up_svn_line, "Adding Google analytics").should be_nil
44
- Churn.send(:clean_up_svn_line, "A bunch of new files").should be_nil
73
+ Churn::Svn.new.send(:clean_up_svn_line, "Adding Google analytics").should be_nil
74
+ Churn::Svn.new.send(:clean_up_svn_line, "A bunch of new files").should be_nil
45
75
  end
46
-
76
+
47
77
  it "should strip out all but the full path" do
48
- Churn.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
49
- Churn.send(:clean_up_svn_line, "A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
50
- Churn.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
51
- Churn.send(:clean_up_svn_line, " A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
52
- Churn.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
53
- Churn.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
54
-
55
- Churn.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
56
- Churn.send(:clean_up_svn_line, "M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
57
- Churn.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
58
- Churn.send(:clean_up_svn_line, " M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
59
- Churn.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
60
- Churn.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
78
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
79
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
80
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
81
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
82
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
83
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
84
+
85
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
86
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
87
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
88
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
89
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
90
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
61
91
  end
62
92
  end
63
93
  end
94
+
95
+ describe MetricFu::Churn::Git do
96
+
97
+ describe "get_logs" do
98
+ it "should use the start date if supplied" do
99
+ @churn = Churn::Git.new
100
+ @churn.should_receive(:`).with('git log --name-only --pretty=format:').and_return("")
101
+ @churn.get_logs
102
+ end
103
+ it "should use the start date if supplied" do
104
+ @churn = Churn::Git.new(lambda{Date.new(2000, 1, 1)})
105
+ @churn.should_receive(:require_rails_env)
106
+ @churn.should_receive(:`).with("git log --after=2000-01-01 --name-only --pretty=format:").and_return("")
107
+ @churn.get_logs
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MetricFu::FlayReporter do
4
+
5
+ describe "generate_html" do
6
+ it "should create a new Generator and call generate_report on it" do
7
+ @generator = MetricFu::FlayReporter.new('other_dir')
8
+ @generator.should_receive(:`).and_return("Matches found in :call (mass = 55)\n\tlib/metric_fu/flog_reporter.rb:2\n\tlib/metric_fu/flog_reporter.rb:3")
9
+ @generator.generate_html
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  require 'spec'
2
- require File.dirname(__FILE__) + '/../../lib/metric_fu'
2
+ require File.dirname(__FILE__) + '/../../lib/metric_fu/flog_reporter'
3
3
  include MetricFu::FlogReporter
4
4
 
5
5
  describe "FlogReporter::Base" do
@@ -36,27 +36,27 @@ MTHD
36
36
  1.1: entryRelationship
37
37
  BM
38
38
  end
39
-
39
+
40
40
  it "should be able to parse an alpha only method" do
41
41
  page = Base.parse(@alpha_only_method)
42
42
  page.should_not be_nil
43
43
  page.score.should == 13.6283678106927
44
- page.scanned_methods.size.should == 1
44
+ page.scanned_methods.size.should == 1
45
45
  sm = page.scanned_methods.first
46
46
  sm.name.should == 'ErrorMailer#errormail'
47
- sm.score.should == 12.5
47
+ sm.score.should == 12.5
48
48
  end
49
-
49
+
50
50
  it "should be able to parse method that has digits" do
51
51
  page = Base.parse(@method_that_has_digits)
52
52
  page.should_not be_nil
53
53
  page.score.should == 7.08378429936994
54
- page.scanned_methods.size.should == 1
54
+ page.scanned_methods.size.should == 1
55
55
  sm = page.scanned_methods.first
56
56
  sm.name.should == 'NoImmunizationReason#to_c32'
57
57
  sm.score.should == 7.1
58
58
  end
59
-
59
+
60
60
  it "should be able to parse bang method" do
61
61
  page = Base.parse(@bang_method)
62
62
  page.should_not be_nil
@@ -9,11 +9,11 @@ describe MetricFu::MD5Tracker do
9
9
  @file1 = File.new(File.join(@tmp_dir, 'file1.txt'), 'w')
10
10
  @file2 = File.new(File.join(@tmp_dir, 'file2.txt'), 'w')
11
11
  end
12
-
12
+
13
13
  after do
14
14
  FileUtils.rm_rf(@tmp_dir, :verbose => false)
15
15
  end
16
-
16
+
17
17
  it "identical files should match" do
18
18
  @file1.puts("Hello World")
19
19
  @file1.close
@@ -25,7 +25,7 @@ describe MetricFu::MD5Tracker do
25
25
 
26
26
  file2_md5.should == file1_md5
27
27
  end
28
-
28
+
29
29
  it "different files should not match" do
30
30
  @file1.puts("Hello World")
31
31
  @file1.close
@@ -37,20 +37,20 @@ describe MetricFu::MD5Tracker do
37
37
 
38
38
  file2_md5.should_not == file1_md5
39
39
  end
40
-
40
+
41
41
  it "file_changed? should detect a change" do
42
42
  @file2.close
43
-
43
+
44
44
  @file1.puts("Hello World")
45
45
  @file1.close
46
46
  file1_md5 = MD5Tracker.track(@file1.path, @tmp_dir)
47
-
47
+
48
48
  @file1 = File.new(File.join(@tmp_dir, 'file1.txt'), 'w')
49
49
  @file1.puts("Goodbye World")
50
50
  @file1.close
51
51
  MD5Tracker.file_changed?(@file1.path, @tmp_dir).should be_true
52
52
  end
53
-
53
+
54
54
  it "should detect a new file" do
55
55
  @file2.close
56
56
  MD5Tracker.file_changed?(@file1.path, @tmp_dir).should be_true
@@ -0,0 +1,7 @@
1
+ require 'spec'
2
+ require 'date'
3
+
4
+ require File.dirname(__FILE__) + '/../lib/metric_fu/base'
5
+ require File.dirname(__FILE__) + '/../lib/metric_fu/flay_reporter'
6
+ require File.dirname(__FILE__) + '/../lib/metric_fu/churn'
7
+ include MetricFu
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indirect-metric_fu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Scruggs
@@ -41,7 +41,16 @@ dependencies:
41
41
  - !ruby/object:Gem::Version
42
42
  version: 0.0.0
43
43
  version:
44
- description: Code metrics from Flog, RCov, Saikuro, Churn, and Rails' stats task
44
+ - !ruby/object:Gem::Dependency
45
+ name: diff-lcs
46
+ version_requirement:
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">"
50
+ - !ruby/object:Gem::Version
51
+ version: 0.0.0
52
+ version:
53
+ description: Code metrics from Flog, Flay, RCov, Saikuro, Churn, and Rails' stats task
45
54
  email: jake.scruggs@gmail.com
46
55
  executables: []
47
56
 
@@ -56,8 +65,9 @@ files:
56
65
  - TODO
57
66
  - MIT-LICENSE
58
67
  - Rakefile
68
+ - lib/metric_fu/base.rb
59
69
  - lib/metric_fu/churn.rb
60
- - lib/metric_fu/flay.rb
70
+ - lib/metric_fu/flay_reporter.rb
61
71
  - lib/metric_fu/flog_reporter/base.rb
62
72
  - lib/metric_fu/flog_reporter/generator.rb
63
73
  - lib/metric_fu/flog_reporter/operator.rb
@@ -70,10 +80,18 @@ files:
70
80
  - lib/tasks/metric_fu.rb
71
81
  - lib/tasks/churn.rake
72
82
  - lib/tasks/coverage.rake
83
+ - lib/tasks/flay.rake
73
84
  - lib/tasks/flog.rake
74
85
  - lib/tasks/metric_fu.rake
75
86
  - lib/tasks/saikuro.rake
76
87
  - lib/tasks/stats.rake
88
+ - lib/templates/churn.css
89
+ - lib/templates/churn.html.erb
90
+ - lib/templates/flay.css
91
+ - lib/templates/flay.html.erb
92
+ - lib/templates/flog.css
93
+ - lib/templates/flog.html.erb
94
+ - lib/templates/flog_page.html.erb
77
95
  has_rdoc: true
78
96
  homepage: http://metric-fu.rubyforge.org/
79
97
  post_install_message:
@@ -102,6 +120,9 @@ signing_key:
102
120
  specification_version: 2
103
121
  summary: A fistful of code metrics
104
122
  test_files:
123
+ - spec/base_spec.rb
105
124
  - spec/churn_spec.rb
125
+ - spec/flay_reporter_spec.rb
106
126
  - spec/flog_reporter/base_spec.rb
107
127
  - spec/md5_tracker_spec.rb
128
+ - spec/spec_helper.rb