p8-metric_fu 0.8.0.16

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,30 @@
1
+ <html>
2
+ <head>
3
+ <title>Reek Results</title>
4
+ <style>
5
+ <%= inline_css("default.css") %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Reek Results</h1>
11
+ <p><a href="http://reek.rubyforge.org/">Reek</a> detects common code smells in ruby code.</p>
12
+ <table>
13
+ <tr>
14
+ <th>File Path</th>
15
+ <th>Code Smell</th>
16
+ </tr>
17
+ <% @matches.each_with_index do |match, count| %>
18
+ <tr class='<%= cycle("light", "dark", count) %>'>
19
+ <td><%= match.first %></td>
20
+ <td>
21
+ <% match[1..-1].each do |line| %>
22
+ <%= line %><br>
23
+ <% end %>
24
+ </td>
25
+ </tr>
26
+ <% end %>
27
+ </table>
28
+ <p>Generated on <%= Time.now.localtime %></p>
29
+ </body>
30
+ </html>
@@ -0,0 +1,26 @@
1
+ <html>
2
+ <head>
3
+ <title>Roodi Results</title>
4
+ <style>
5
+ <%= inline_css("default.css") %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Roodi Results</h1>
11
+ <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>
12
+ <table>
13
+ <tr>
14
+ <th>File Path</th>
15
+ <th>Warning</th>
16
+ </tr>
17
+ <% @matches.each_with_index do |match, count| %>
18
+ <tr class='<%= cycle("light", "dark", count) %>'>
19
+ <td><%= link_to_filename(match.first.split(':').first) if match.first %></td>
20
+ <td><%= match[1] %></td>
21
+ </tr>
22
+ <% end %>
23
+ </table>
24
+ <p>Generated on <%= Time.now.localtime %></p>
25
+ </body>
26
+ </html>
data/spec/base_spec.rb ADDED
@@ -0,0 +1,57 @@
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
7
+ @generator.should_receive(:open).with("tmp/metric_fu/generator/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
13
+ @generator.should_receive(:open).with("tmp/metric_fu/generator/metric_fu/custom.html", "w")
14
+ @generator.save_html("<html>", 'metric_fu/custom.html')
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_html" do
28
+ it "should create a new Generator and call generate_report on it" do
29
+ @generator = MetricFu::Base::Generator.new
30
+ @generator.should_receive(:open).with("tmp/metric_fu/generator/index.html", "w")
31
+ @generator.should_receive(:generate_html).and_return('<html>')
32
+ @generator.generate_report
33
+ end
34
+ end
35
+
36
+ describe "cycle" do
37
+ it "should create a new Generator and call generate_report on it" do
38
+ @generator = MetricFu::Base::Generator.new
39
+ @generator.cycle("light", "dark", 0).should == 'light'
40
+ @generator.cycle("light", "dark", 1).should == 'dark'
41
+ end
42
+ end
43
+
44
+ describe "template_name" do
45
+ it "should return the class name in lowercase" do
46
+ @generator = MetricFu::Base::Generator.new
47
+ @generator.template_name.should == 'generator'
48
+ end
49
+ end
50
+
51
+ describe "metric_dir" do
52
+ it "should return tmp/metric_fu/{the class name in lowercase}" do
53
+ MetricFu::Base::Generator.metric_dir.should == 'tmp/metric_fu/generator'
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,117 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MetricFu::Churn do
4
+ describe "generate_report" do
5
+ after do
6
+ load File.dirname(__FILE__) + '/../lib/metric_fu/churn.rb' #need to reload file to wipe out mock of private static
7
+ end
8
+
9
+ it "should strip out files that have less than the min count" do
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(: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
22
+ end
23
+
24
+ end
25
+
26
+ describe "template_name" do
27
+ it "should return the class name in lowercase" do
28
+ churn = Churn.new
29
+ churn.template_name.should == 'churn'
30
+ end
31
+ end
32
+
33
+ describe "parse_log_for_changes" do
34
+ it "should count the changes with git" do
35
+ logs = ["home_page/index.html", "README", "History.txt", "README", "History.txt", "README"]
36
+ git_mock = mock('git')
37
+ git_mock.should_receive(:get_logs).and_return(logs)
38
+ Churn::Git.should_receive(:new).and_return(git_mock)
39
+ File.should_receive(:exist?).with(".git").and_return(true)
40
+ changes = Churn.new.send(:parse_log_for_changes)
41
+ changes["home_page/index.html"].should == 1
42
+ changes["History.txt"].should == 2
43
+ changes["README"].should == 3
44
+ end
45
+
46
+ it "should count the changes with svn" do
47
+ logs = ["home_page/index.html", "README", "History.txt", "README", "History.txt", "README"]
48
+ svn_mock = mock('svn')
49
+ svn_mock.should_receive(:get_logs).and_return(logs)
50
+ Churn::Svn.should_receive(:new).and_return(svn_mock)
51
+ File.should_receive(:exist?).with(".git").and_return(false)
52
+ File.should_receive(:exist?).with(".svn").and_return(true)
53
+ changes = Churn.new.send(:parse_log_for_changes)
54
+ changes["home_page/index.html"].should == 1
55
+ changes["History.txt"].should == 2
56
+ changes["README"].should == 3
57
+ end
58
+ end
59
+ end
60
+
61
+ describe MetricFu::Churn::Svn do
62
+
63
+ describe "get_logs" do
64
+ it "should use the start date if supplied" do
65
+ @churn = Churn::Svn.new
66
+ @churn.should_receive(:`).with('svn log --verbose').and_return("")
67
+ @churn.get_logs
68
+ end
69
+ it "should use the start date if supplied" do
70
+ Time.should_receive(:now).and_return(Date.new(2001, 1, 2))
71
+ @churn = Churn::Svn.new(lambda{Date.new(2000, 1, 1)})
72
+ @churn.should_receive(:require_rails_env)
73
+ @churn.should_receive(:`).with("svn log --revision {2000-01-01}:{2001-01-02} --verbose").and_return("")
74
+ @churn.get_logs
75
+ end
76
+ end
77
+
78
+ describe "clean_up_svn_line" do
79
+ it "should return nil for non matches" do
80
+ Churn::Svn.new.send(:clean_up_svn_line, "Adding Google analytics").should be_nil
81
+ Churn::Svn.new.send(:clean_up_svn_line, "A bunch of new files").should be_nil
82
+ end
83
+
84
+ it "should strip out all but the full path" do
85
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
86
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
87
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
88
+ Churn::Svn.new.send(:clean_up_svn_line, " A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
89
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
90
+ Churn::Svn.new.send(:clean_up_svn_line, "A /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
91
+
92
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
93
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
94
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb ").should == "/trunk/lib/server.rb"
95
+ Churn::Svn.new.send(:clean_up_svn_line, " M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
96
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
97
+ Churn::Svn.new.send(:clean_up_svn_line, "M /trunk/lib/server.rb").should == "/trunk/lib/server.rb"
98
+ end
99
+ end
100
+ end
101
+
102
+ describe MetricFu::Churn::Git do
103
+
104
+ describe "get_logs" do
105
+ it "should use the start date if supplied" do
106
+ @churn = Churn::Git.new
107
+ @churn.should_receive(:`).with('git log --name-only --pretty=format:').and_return("")
108
+ @churn.get_logs
109
+ end
110
+ it "should use the start date if supplied" do
111
+ @churn = Churn::Git.new(lambda{Date.new(2000, 1, 1)})
112
+ @churn.should_receive(:require_rails_env)
113
+ @churn.should_receive(:`).with("git log --after=2000-01-01 --name-only --pretty=format:").and_return("")
114
+ @churn.get_logs
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,110 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MetricFu::Configuration do
4
+ before do
5
+ MetricFu.configuration.reset
6
+ end
7
+ after do
8
+ ENV['CC_BUILD_ARTIFACTS'] = nil
9
+ end
10
+ describe "open_in_browser" do
11
+ it "should return false if running in cruise" do
12
+ unless ENV['CC_BUILD_ARTIFACTS']
13
+ MetricFu.open_in_browser?.should == !!PLATFORM['darwin']
14
+ ENV['CC_BUILD_ARTIFACTS'] = ''
15
+ MetricFu.open_in_browser?.should == false
16
+ end
17
+ end
18
+ end
19
+
20
+ describe "metrics" do
21
+ it "should be configurable" do
22
+ MetricFu.metrics.should == [:coverage, :churn, :flog, :flay, :reek, :roodi, :saikuro]
23
+ MetricFu::Configuration.run do |config|
24
+ config.metrics = [:coverage, :flog]
25
+ end
26
+ MetricFu.metrics.should == [:coverage, :flog]
27
+ end
28
+ end
29
+
30
+ describe "churn" do
31
+ it "should be configurable" do
32
+ now = Time.now
33
+ MetricFu.churn.should == {}
34
+ MetricFu::Configuration.run do |config|
35
+ config.churn[:start_date] = now
36
+ end
37
+ MetricFu.churn.should == {:start_date => now }
38
+ end
39
+ end
40
+
41
+ describe "coverage" do
42
+ it "should be configurable" do
43
+ MetricFu.coverage[:test_files].should == ['test/**/*_test.rb', 'spec/**/*_spec.rb']
44
+ MetricFu::Configuration.run do |config|
45
+ config.coverage[:test_files] = ['test/**/test_*.rb']
46
+ end
47
+ MetricFu.coverage[:test_files].should == ['test/**/test_*.rb']
48
+ end
49
+ end
50
+
51
+ describe "flay" do
52
+ it "should be configurable" do
53
+ now = Time.now
54
+ MetricFu.flay.should == { :dirs_to_flay => ['lib'] }
55
+ MetricFu::Configuration.run do |config|
56
+ config.flay[:dirs_to_flay] = ['cms/app', 'cms/lib']
57
+ end
58
+ MetricFu.flay.should == { :dirs_to_flay => ['cms/app', 'cms/lib'] }
59
+ end
60
+ end
61
+
62
+ describe "flog" do
63
+ it "should be configurable" do
64
+ MetricFu.flog.should == { :dirs_to_flog => ['lib'] }
65
+ MetricFu::Configuration.run do |config|
66
+ config.flog[:dirs_to_flog] = ['cms/app', 'cms/lib']
67
+ end
68
+ MetricFu.flog.should == { :dirs_to_flog => ['cms/app', 'cms/lib'] }
69
+ end
70
+ end
71
+
72
+ describe "saikuro" do
73
+ it "should be configurable" do
74
+ MetricFu.saikuro.should == {}
75
+ MetricFu::Configuration.run do |config|
76
+ config.saikuro = { "--warn_cyclo" => "3", "--error_cyclo" => "4" }
77
+ end
78
+ MetricFu.saikuro.should == { "--warn_cyclo" => "3", "--error_cyclo" => "4" }
79
+ end
80
+
81
+ it "should only accept a Hash" do
82
+ MetricFu.saikuro.should == {}
83
+ lambda {
84
+ MetricFu::Configuration.run do |config|
85
+ config.saikuro = ''
86
+ end
87
+ }.should raise_error
88
+ end
89
+ end
90
+
91
+ describe "reek" do
92
+ it "should be configurable" do
93
+ MetricFu.reek.should == { :dirs_to_reek => ['lib'] }
94
+ MetricFu::Configuration.run do |config|
95
+ config.reek[:dirs_to_reek] = ['cms/app', 'cms/lib']
96
+ end
97
+ MetricFu.reek.should == { :dirs_to_reek => ['cms/app', 'cms/lib'] }
98
+ end
99
+ end
100
+
101
+ describe "roodi" do
102
+ it "should be configurable" do
103
+ MetricFu.roodi.should == { :dirs_to_roodi => ['lib'] }
104
+ MetricFu::Configuration.run do |config|
105
+ config.roodi[:dirs_to_roodi] = ['cms/app', 'cms/lib']
106
+ end
107
+ MetricFu.roodi.should == { :dirs_to_roodi => ['cms/app', 'cms/lib'] }
108
+ end
109
+ end
110
+ end
data/spec/flay_spec.rb ADDED
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MetricFu::Flay do
4
+
5
+ describe "generate_html" do
6
+ it "should create a new Generator and call generate_report on it" do
7
+ @generator = MetricFu::Flay.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
+
13
+ describe "template_name" do
14
+ it "should return the class name in lowercase" do
15
+ flay = MetricFu::Flay.new('base_dir')
16
+ flay.template_name.should == 'flay'
17
+ end
18
+ end
19
+ end
data/spec/flog_spec.rb ADDED
@@ -0,0 +1,147 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+ include MetricFu::Flog
3
+
4
+ describe "Flog::Base" do
5
+ before do
6
+ @alpha_only_method = <<-AOM
7
+ Total flog = 13.6283678106927
8
+
9
+ ErrorMailer#errormail: (12.5)
10
+ 12.0: assignment
11
+ 1.2: []
12
+ 1.2: now
13
+ 1.2: content_type
14
+ AOM
15
+
16
+ @method_that_has_digits = <<-MTHD
17
+ Total flog = 7.08378429936994
18
+
19
+ NoImmunizationReason#to_c32: (7.1)
20
+ 3.0: code
21
+ 2.3: branch
22
+ 1.4: templateId
23
+ 1.2: act
24
+ 1.1: entryRelationship
25
+ MTHD
26
+
27
+ @bang_method = <<-BM
28
+ Total flog = 7.08378429936994
29
+
30
+ NoImmunizationReason#to_c32!: (7.1)
31
+ 3.0: code
32
+ 2.3: branch
33
+ 1.4: templateId
34
+ 1.2: act
35
+ 1.1: entryRelationship
36
+ BM
37
+
38
+ @invalid_method = <<-IM
39
+ Total flog = 7.08378429936994
40
+
41
+ 3.0: code
42
+ 2.3: branch
43
+ 1.4: templateId
44
+ 1.2: act
45
+ 1.1: entryRelationship
46
+ IM
47
+
48
+ end
49
+
50
+ it "should be able to parse an alpha only method" do
51
+ page = Base.parse(@alpha_only_method)
52
+ page.should_not be_nil
53
+ page.score.should == 13.6283678106927
54
+ page.scanned_methods.size.should == 1
55
+ sm = page.scanned_methods.first
56
+ sm.name.should == 'ErrorMailer#errormail'
57
+ sm.score.should == 12.5
58
+ end
59
+
60
+ it "should be able to parse method that has digits" do
61
+ page = Base.parse(@method_that_has_digits)
62
+ page.should_not be_nil
63
+ page.score.should == 7.08378429936994
64
+ page.scanned_methods.size.should == 1
65
+ sm = page.scanned_methods.first
66
+ sm.name.should == 'NoImmunizationReason#to_c32'
67
+ sm.score.should == 7.1
68
+ end
69
+
70
+ it "should be able to parse bang method" do
71
+ page = Base.parse(@bang_method)
72
+ page.should_not be_nil
73
+ page.score.should == 7.08378429936994
74
+ page.scanned_methods.size.should == 1
75
+ sm = page.scanned_methods.first
76
+ sm.name.should == 'NoImmunizationReason#to_c32!'
77
+ sm.score.should == 7.1
78
+ end
79
+
80
+ it "should return nil when parsing invalid method" do
81
+ page = Base.parse(@invalid_method)
82
+ page.should be_nil
83
+ end
84
+ end
85
+
86
+ IM = <<-IM
87
+ Total flog = 7.08378429936994
88
+
89
+ 3.0: code
90
+ 2.3: branch
91
+ 1.4: templateId
92
+ 1.2: act
93
+ 1.1: entryRelationship
94
+ IM
95
+ describe MetricFu::Flog do
96
+
97
+ describe "generate_report" do
98
+ it "should generate reports" do
99
+ generator = Flog::Generator.new('other_dir')
100
+ generator.should_receive(:flog_results).and_return(['A', 'B'])
101
+ generator.should_receive(:save_html).at_least(3).times.and_return('')
102
+ generator.should_receive(:open).any_number_of_times.and_return(['Total Flog = 1273.9 (9.3 +/- 259.2 flog / method)', 'TokenCounter#list_tokens_per_line: (15.2)', '9.0: assignment'].join("\n"))
103
+ generator.generate_report
104
+ end
105
+
106
+ it "should be able to handle InvalidFlogs" do
107
+ generator = Flog::Generator.new('other_dir')
108
+ generator.should_receive(:flog_results).and_return(['A', 'B'])
109
+ generator.should_receive(:inline_css).any_number_of_times.and_return('')
110
+ generator.should_receive(:save_html).once
111
+ generator.should_receive(:open).any_number_of_times.and_return(IM)
112
+ generator.generate_report
113
+ end
114
+ end
115
+
116
+ describe "template_name" do
117
+ it "should return the class name in lowercase" do
118
+ flog = Flog::Generator.new('base_dir')
119
+ flog.template_name.should == 'flog'
120
+ end
121
+ end
122
+ end
123
+
124
+ describe MetricFu::Flog::Page do
125
+
126
+ describe "average_score" do
127
+ it "should calculate the average score" do
128
+ page = Page.new(10)
129
+ page.should_receive(:scanned_methods).any_number_of_times.and_return([ScannedMethod.new(:test, 10), ScannedMethod.new(:test, 20)])
130
+ page.average_score.should == 15
131
+ end
132
+
133
+ it "should be able to handle divide by zero" do
134
+ page = Page.new(10)
135
+ page.should_receive(:scanned_methods).any_number_of_times.and_return([])
136
+ page.average_score.should == 0
137
+ end
138
+ end
139
+
140
+ describe "highest_score" do
141
+ it "should calculate the average score" do
142
+ page = Page.new(10)
143
+ page.should_receive(:scanned_methods).any_number_of_times.and_return([ScannedMethod.new(:test, 10), ScannedMethod.new(:test, 20)])
144
+ page.highest_score.should == 20
145
+ end
146
+ end
147
+ end