cdd-metric_fu 1.3.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.
- data/.document +7 -0
- data/.gitignore +24 -0
- data/HISTORY +182 -0
- data/MIT-LICENSE +22 -0
- data/Manifest.txt +25 -0
- data/README.rdoc +20 -0
- data/Rakefile +59 -0
- data/TODO +9 -0
- data/VERSION +1 -0
- data/cdd-metric_fu.gemspec +200 -0
- data/home_page/back_all.jpg +0 -0
- data/home_page/churn.gif +0 -0
- data/home_page/flay.gif +0 -0
- data/home_page/flog.gif +0 -0
- data/home_page/footer.gif +0 -0
- data/home_page/header.jpg +0 -0
- data/home_page/img09.gif +0 -0
- data/home_page/index.html +277 -0
- data/home_page/rcov.gif +0 -0
- data/home_page/reek.gif +0 -0
- data/home_page/roodi.gif +0 -0
- data/home_page/saikuro.gif +0 -0
- data/home_page/stats.gif +0 -0
- data/home_page/styles.css +245 -0
- data/home_page/title.gif +0 -0
- data/home_page/title_back.gif +0 -0
- data/lib/base/base_template.rb +145 -0
- data/lib/base/configuration.rb +188 -0
- data/lib/base/generator.rb +167 -0
- data/lib/base/graph.rb +47 -0
- data/lib/base/md5_tracker.rb +52 -0
- data/lib/base/report.rb +100 -0
- data/lib/generators/churn.rb +34 -0
- data/lib/generators/flay.rb +35 -0
- data/lib/generators/flog.rb +172 -0
- data/lib/generators/rcov.rb +82 -0
- data/lib/generators/reek.rb +64 -0
- data/lib/generators/roodi.rb +33 -0
- data/lib/generators/saikuro.rb +221 -0
- data/lib/generators/stats.rb +59 -0
- data/lib/graphs/engines/bluff.rb +101 -0
- data/lib/graphs/engines/gchart.rb +120 -0
- data/lib/graphs/flay_grapher.rb +19 -0
- data/lib/graphs/flog_grapher.rb +39 -0
- data/lib/graphs/grapher.rb +18 -0
- data/lib/graphs/rails_best_practices_grapher.rb +24 -0
- data/lib/graphs/rcov_grapher.rb +19 -0
- data/lib/graphs/reek_grapher.rb +31 -0
- data/lib/graphs/roodi_grapher.rb +19 -0
- data/lib/graphs/stats_grapher.rb +22 -0
- data/lib/metric_fu.rb +32 -0
- data/lib/metric_fu/railtie.rb +10 -0
- data/lib/tasks/metric_fu.rake +22 -0
- data/lib/templates/awesome/awesome_template.rb +37 -0
- data/lib/templates/awesome/churn.html.erb +58 -0
- data/lib/templates/awesome/css/buttons.css +82 -0
- data/lib/templates/awesome/css/default.css +91 -0
- data/lib/templates/awesome/css/integrity.css +335 -0
- data/lib/templates/awesome/css/reset.css +7 -0
- data/lib/templates/awesome/flay.html.erb +34 -0
- data/lib/templates/awesome/flog.html.erb +53 -0
- data/lib/templates/awesome/index.html.erb +31 -0
- data/lib/templates/awesome/layout.html.erb +30 -0
- data/lib/templates/awesome/rcov.html.erb +42 -0
- data/lib/templates/awesome/reek.html.erb +40 -0
- data/lib/templates/awesome/roodi.html.erb +27 -0
- data/lib/templates/awesome/saikuro.html.erb +71 -0
- data/lib/templates/awesome/stats.html.erb +51 -0
- data/lib/templates/javascripts/bluff-min.js +1 -0
- data/lib/templates/javascripts/excanvas.js +35 -0
- data/lib/templates/javascripts/js-class.js +1 -0
- data/lib/templates/standard/churn.html.erb +31 -0
- data/lib/templates/standard/default.css +64 -0
- data/lib/templates/standard/flay.html.erb +34 -0
- data/lib/templates/standard/flog.html.erb +53 -0
- data/lib/templates/standard/index.html.erb +38 -0
- data/lib/templates/standard/rcov.html.erb +43 -0
- data/lib/templates/standard/reek.html.erb +42 -0
- data/lib/templates/standard/roodi.html.erb +29 -0
- data/lib/templates/standard/saikuro.html.erb +84 -0
- data/lib/templates/standard/standard_template.rb +26 -0
- data/lib/templates/standard/stats.html.erb +55 -0
- data/spec/base/base_template_spec.rb +161 -0
- data/spec/base/configuration_spec.rb +274 -0
- data/spec/base/generator_spec.rb +244 -0
- data/spec/base/graph_spec.rb +32 -0
- data/spec/base/md5_tracker_spec.rb +57 -0
- data/spec/base/report_spec.rb +139 -0
- data/spec/generators/churn_spec.rb +43 -0
- data/spec/generators/flay_spec.rb +110 -0
- data/spec/generators/flog_spec.rb +262 -0
- data/spec/generators/rcov_spec.rb +159 -0
- data/spec/generators/reek_spec.rb +125 -0
- data/spec/generators/saikuro_spec.rb +58 -0
- data/spec/generators/stats_spec.rb +74 -0
- data/spec/graphs/engines/bluff_spec.rb +17 -0
- data/spec/graphs/engines/gchart_spec.rb +109 -0
- data/spec/graphs/flay_grapher_spec.rb +37 -0
- data/spec/graphs/flog_grapher_spec.rb +45 -0
- data/spec/graphs/grapher_spec.rb +29 -0
- data/spec/graphs/rcov_grapher_spec.rb +37 -0
- data/spec/graphs/reek_grapher_spec.rb +47 -0
- data/spec/graphs/roodi_grapher_spec.rb +37 -0
- data/spec/graphs/stats_grapher_spec.rb +44 -0
- data/spec/resources/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
- data/spec/resources/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
- data/spec/resources/saikuro/index_cyclo.html +155 -0
- data/spec/resources/saikuro_sfiles/thing.rb_cyclo.html +11 -0
- data/spec/resources/yml/20090630.yml +7913 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +7 -0
- metadata +285 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe MetricFu do
|
|
4
|
+
|
|
5
|
+
describe "responding to #graph" do
|
|
6
|
+
it "should return an instance of Graph" do
|
|
7
|
+
MetricFu.graph.should be_a(Graph)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe MetricFu::Graph do
|
|
13
|
+
|
|
14
|
+
before(:each) do
|
|
15
|
+
@graph = MetricFu::Graph.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "responding to #add with gchart enabled" do
|
|
19
|
+
it 'should instantiate a grapher and push it to clazz' do
|
|
20
|
+
@graph.clazz.should_receive(:push).with(an_instance_of(RcovGchartGrapher))
|
|
21
|
+
@graph.add("rcov", 'gchart')
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "#date_for(report)" do
|
|
26
|
+
it "should return the right month/day date for the given report file name" do
|
|
27
|
+
@graph.send(:date_for, "tmp/metric_fu/_data/20100502.yml").should == "5/2"
|
|
28
|
+
@graph.send(:date_for, "tmp/metric_fu/_data/20081101.yml").should == "11/1"
|
|
29
|
+
@graph.send(:date_for, "tmp/metric_fu/_data/20081231.yml").should == "12/31"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe MetricFu::MD5Tracker do
|
|
4
|
+
before do
|
|
5
|
+
@tmp_dir = File.join(File.dirname(__FILE__), 'tmp')
|
|
6
|
+
FileUtils.mkdir_p(@tmp_dir, :verbose => false) unless File.directory?(@tmp_dir)
|
|
7
|
+
@file1 = File.new(File.join(@tmp_dir, 'file1.txt'), 'w')
|
|
8
|
+
@file2 = File.new(File.join(@tmp_dir, 'file2.txt'), 'w')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
after do
|
|
12
|
+
FileUtils.rm_rf(@tmp_dir, :verbose => false)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "identical files should match" do
|
|
16
|
+
@file1.puts("Hello World")
|
|
17
|
+
@file1.close
|
|
18
|
+
file1_md5 = MD5Tracker.track(@file1.path, @tmp_dir)
|
|
19
|
+
|
|
20
|
+
@file2.puts("Hello World")
|
|
21
|
+
@file2.close
|
|
22
|
+
file2_md5 = MD5Tracker.track(@file2.path, @tmp_dir)
|
|
23
|
+
|
|
24
|
+
file2_md5.should == file1_md5
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "different files should not match" do
|
|
28
|
+
@file1.puts("Hello World")
|
|
29
|
+
@file1.close
|
|
30
|
+
file1_md5 = MD5Tracker.track(@file1.path, @tmp_dir)
|
|
31
|
+
|
|
32
|
+
@file2.puts("Goodbye World")
|
|
33
|
+
@file2.close
|
|
34
|
+
file2_md5 = MD5Tracker.track(@file2.path, @tmp_dir)
|
|
35
|
+
|
|
36
|
+
file2_md5.should_not == file1_md5
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "file_changed? should detect a change" do
|
|
40
|
+
@file2.close
|
|
41
|
+
|
|
42
|
+
@file1.puts("Hello World")
|
|
43
|
+
@file1.close
|
|
44
|
+
file1_md5 = MD5Tracker.track(@file1.path, @tmp_dir)
|
|
45
|
+
|
|
46
|
+
@file1 = File.new(File.join(@tmp_dir, 'file1.txt'), 'w')
|
|
47
|
+
@file1.puts("Goodbye World")
|
|
48
|
+
@file1.close
|
|
49
|
+
MD5Tracker.file_changed?(@file1.path, @tmp_dir).should be_true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should detect a new file" do
|
|
53
|
+
@file2.close
|
|
54
|
+
MD5Tracker.file_changed?(@file1.path, @tmp_dir).should be_true
|
|
55
|
+
File.exist?(MD5Tracker.md5_file(@file1.path, @tmp_dir)).should be_true
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe MetricFu do
|
|
4
|
+
|
|
5
|
+
describe "#report" do
|
|
6
|
+
it 'should return an instance of Report' do
|
|
7
|
+
MetricFu.report.instance_of?(Report).should be(true)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe MetricFu::Report do
|
|
13
|
+
|
|
14
|
+
before(:each) do
|
|
15
|
+
@report = MetricFu::Report.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "#to_yaml" do
|
|
19
|
+
it 'should call #report_hash' do
|
|
20
|
+
report_hash = mock('report_hash')
|
|
21
|
+
report_hash.should_receive(:to_yaml)
|
|
22
|
+
@report.should_receive(:report_hash).and_return(report_hash)
|
|
23
|
+
@report.to_yaml
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "#report_hash" do
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#save_templatized_report" do
|
|
31
|
+
it 'should create a new template class assign a report_hash '\
|
|
32
|
+
'to the template class, and ask it to write itself out' do
|
|
33
|
+
template_class = mock('template_class')
|
|
34
|
+
template_class.should_receive(:new).and_return(template_class)
|
|
35
|
+
MetricFu.should_receive(:template_class).and_return(template_class)
|
|
36
|
+
template_class.should_receive(:report=)
|
|
37
|
+
template_class.should_receive(:write)
|
|
38
|
+
@report.save_templatized_report
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "#add" do
|
|
43
|
+
it 'should add a passed hash to the report_hash instance variable' do
|
|
44
|
+
report_type = mock('report_type')
|
|
45
|
+
report_type.should_receive(:to_s).and_return('type')
|
|
46
|
+
report_type.should_receive(:generate_report).and_return({:a => 'b'})
|
|
47
|
+
MetricFu.should_receive(:const_get).
|
|
48
|
+
with('Type').and_return(report_type)
|
|
49
|
+
report_hash = mock('report_hash')
|
|
50
|
+
report_hash.should_receive(:merge!).with({:a => 'b'})
|
|
51
|
+
@report.should_receive(:report_hash).and_return(report_hash)
|
|
52
|
+
@report.add(report_type)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "#save_output" do
|
|
57
|
+
it 'should write the passed content to dir/index.html' do
|
|
58
|
+
f = mock('file')
|
|
59
|
+
content = 'content'
|
|
60
|
+
@report.should_receive(:open).with('dir/file', 'w').and_yield(f)
|
|
61
|
+
f.should_receive(:puts).with(content)
|
|
62
|
+
@report.save_output(content, 'dir', 'file')
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe '#open_in_browser? ' do
|
|
67
|
+
|
|
68
|
+
before(:each) do
|
|
69
|
+
@config = mock('configuration')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
describe 'when the platform is os x ' do
|
|
73
|
+
|
|
74
|
+
before(:each) do
|
|
75
|
+
@config.should_receive(:platform).and_return('darwin')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe 'and we are in cruise control ' do
|
|
79
|
+
|
|
80
|
+
before(:each) do
|
|
81
|
+
@config.should_receive(:is_cruise_control_rb?).and_return(true)
|
|
82
|
+
MetricFu.stub!(:configuration).and_return(@config)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'should return false' do
|
|
86
|
+
@report.open_in_browser?.should be_false
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
describe 'and we are not in cruise control' do
|
|
91
|
+
|
|
92
|
+
before(:each) do
|
|
93
|
+
@config.should_receive(:is_cruise_control_rb?).and_return(false)
|
|
94
|
+
MetricFu.stub!(:configuration).and_return(@config)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'should return true' do
|
|
98
|
+
@report.open_in_browser?.should be_true
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe 'when the platform is not os x ' do
|
|
104
|
+
before(:each) do
|
|
105
|
+
@config.should_receive(:platform).and_return('other')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe 'and we are in cruise control' do
|
|
109
|
+
before(:each) do
|
|
110
|
+
MetricFu.stub!(:configuration).and_return(@config)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should return false' do
|
|
114
|
+
@report.open_in_browser?.should be_false
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe 'and we are not in cruise control' do
|
|
119
|
+
before(:each) do
|
|
120
|
+
MetricFu.stub!(:configuration).and_return(@config)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it 'should return false' do
|
|
124
|
+
@report.open_in_browser?.should be_false
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
describe '#show_in_browser' do
|
|
132
|
+
it 'should call open with the passed directory' do
|
|
133
|
+
@report.should_receive(:open_in_browser?).and_return(true)
|
|
134
|
+
@report.should_receive(:system).with("open my_dir/index.html")
|
|
135
|
+
@report.show_in_browser('my_dir')
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe Churn do
|
|
4
|
+
|
|
5
|
+
describe "analyze method" do
|
|
6
|
+
before :each do
|
|
7
|
+
MetricFu::Configuration.run {}
|
|
8
|
+
File.stub!(:directory?).and_return(true)
|
|
9
|
+
MetricFu::Churn.should_receive(:verify_dependencies!).and_return(true)
|
|
10
|
+
@changes = {"lib/generators/flog.rb"=>2, "lib/metric_fu.rb"=>3}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should be empty on error" do
|
|
14
|
+
churn = MetricFu::Churn.new
|
|
15
|
+
churn.instance_variable_set(:@output, "fatal: Not a git repository")
|
|
16
|
+
result = churn.analyze
|
|
17
|
+
result.should == [:churn => {}]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should return yaml results" do
|
|
21
|
+
churn = MetricFu::Churn.new
|
|
22
|
+
churn.instance_variable_set(:@output, "--- \n:churn: \n :changed_files: \n - spec/graphs/flog_grapher_spec.rb\n - spec/base/graph_spec.rb\n - lib/templates/awesome/layout.html.erb\n - lib/graphs/rcov_grapher.rb\n - lib/base/base_template.rb\n - spec/graphs/grapher_spec.rb\n - lib/templates/awesome/flog.html.erb\n - lib/templates/awesome/flay.html.erb\n - lib/graphs/roodi_grapher.rb\n - lib/graphs/reek_grapher.rb\n - HISTORY\n - spec/graphs/roodi_grapher_spec.rb\n - lib/generators/rcov.rb\n - spec/graphs/engines/gchart_spec.rb\n - spec/graphs/rcov_grapher_spec.rb\n - lib/templates/javascripts/excanvas.js\n - lib/templates/javascripts/bluff-min.js\n - spec/graphs/reek_grapher_spec.rb\n")
|
|
23
|
+
result = churn.analyze
|
|
24
|
+
result.should == {:churn=>{:changed_files=>["spec/graphs/flog_grapher_spec.rb", "spec/base/graph_spec.rb", "lib/templates/awesome/layout.html.erb", "lib/graphs/rcov_grapher.rb", "lib/base/base_template.rb", "spec/graphs/grapher_spec.rb", "lib/templates/awesome/flog.html.erb", "lib/templates/awesome/flay.html.erb", "lib/graphs/roodi_grapher.rb", "lib/graphs/reek_grapher.rb", "HISTORY", "spec/graphs/roodi_grapher_spec.rb", "lib/generators/rcov.rb", "spec/graphs/engines/gchart_spec.rb", "spec/graphs/rcov_grapher_spec.rb", "lib/templates/javascripts/excanvas.js", "lib/templates/javascripts/bluff-min.js", "spec/graphs/reek_grapher_spec.rb"]}}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "to_h method" do
|
|
30
|
+
before :each do
|
|
31
|
+
MetricFu::Configuration.run {}
|
|
32
|
+
File.stub!(:directory?).and_return(true)
|
|
33
|
+
MetricFu::Churn.should_receive(:verify_dependencies!).and_return(true)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should put the changes into a hash" do
|
|
37
|
+
churn = MetricFu::Churn.new
|
|
38
|
+
churn.instance_variable_set(:@churn, {:churn => 'results'})
|
|
39
|
+
churn.to_h[:churn].should == "results"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe Flay do
|
|
4
|
+
before :each do
|
|
5
|
+
MetricFu::Flay.stub!(:verify_dependencies!).and_return(true)
|
|
6
|
+
end
|
|
7
|
+
describe "emit method" do
|
|
8
|
+
it "should look at the dirs" do
|
|
9
|
+
MetricFu::Configuration.run {|config| config.flay = { :dirs_to_flay => ['app', 'lib'] } }
|
|
10
|
+
File.stub!(:directory?).and_return(true)
|
|
11
|
+
@flay = MetricFu::Flay.new('base_dir')
|
|
12
|
+
|
|
13
|
+
Dir.should_receive(:[]).with(File.join("app", "**/*.rb")).and_return("path/to/app")
|
|
14
|
+
Dir.should_receive(:[]).with(File.join("lib", "**/*.rb")).and_return("path/to/lib")
|
|
15
|
+
@flay.should_receive(:`).with("flay path/to/app path/to/lib")
|
|
16
|
+
output = @flay.emit
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should limit flay scores by the minimum_score" do
|
|
20
|
+
MetricFu::Configuration.run {|config| config.flay = { :dirs_to_flay => [], :minimum_score => 99 } }
|
|
21
|
+
File.stub!(:directory?).and_return(true)
|
|
22
|
+
@flay = MetricFu::Flay.new('base_dir')
|
|
23
|
+
|
|
24
|
+
@flay.should_receive(:`).with("flay --mass 99 ")
|
|
25
|
+
output = @flay.emit
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "analyze method" do
|
|
30
|
+
before :each do
|
|
31
|
+
lines = <<-HERE
|
|
32
|
+
Total score (lower is better) = 246
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
1) IDENTICAL code found in :or (mass*2 = 68)
|
|
36
|
+
app/controllers/link_targets_controller.rb:57
|
|
37
|
+
app/controllers/primary_sites_controller.rb:138
|
|
38
|
+
|
|
39
|
+
2) Similar code found in :if (mass = 64)
|
|
40
|
+
app/controllers/primary_sites_controller.rb:75
|
|
41
|
+
app/controllers/primary_sites_controller.rb:76
|
|
42
|
+
app/controllers/primary_sites_controller.rb:88
|
|
43
|
+
app/controllers/primary_sites_controller.rb:89
|
|
44
|
+
HERE
|
|
45
|
+
MetricFu::Configuration.run {}
|
|
46
|
+
File.stub!(:directory?).and_return(true)
|
|
47
|
+
@flay = MetricFu::Flay.new('base_dir')
|
|
48
|
+
@flay.instance_variable_set(:@output, lines)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should analyze and return matches" do
|
|
52
|
+
@flay.analyze.should == [ ["Total score (lower is better) = 246"],
|
|
53
|
+
["\n1) IDENTICAL code found in :or (mass*2 = 68)",
|
|
54
|
+
"app/controllers/link_targets_controller.rb:57",
|
|
55
|
+
"app/controllers/primary_sites_controller.rb:138"],
|
|
56
|
+
["2) Similar code found in :if (mass = 64)",
|
|
57
|
+
"app/controllers/primary_sites_controller.rb:75",
|
|
58
|
+
"app/controllers/primary_sites_controller.rb:76",
|
|
59
|
+
"app/controllers/primary_sites_controller.rb:88",
|
|
60
|
+
"app/controllers/primary_sites_controller.rb:89"] ]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "to_h method" do
|
|
65
|
+
|
|
66
|
+
before :each do
|
|
67
|
+
lines = [ ["Total score (lower is better) = 284"],
|
|
68
|
+
["\n1) IDENTICAL code found in :or (mass*2 = 68)",
|
|
69
|
+
"app/controllers/link_targets_controller.rb:57",
|
|
70
|
+
"app/controllers/primary_sites_controller.rb:138"],
|
|
71
|
+
["2) Similar code found in :if (mass = 64)",
|
|
72
|
+
"app/controllers/primary_sites_controller.rb:75",
|
|
73
|
+
"app/controllers/primary_sites_controller.rb:76",
|
|
74
|
+
"app/controllers/primary_sites_controller.rb:88",
|
|
75
|
+
"app/controllers/primary_sites_controller.rb:89"],
|
|
76
|
+
["3) Similar code found in :defn (mass = 40)",
|
|
77
|
+
"app/controllers/link_targets_controller.rb:40",
|
|
78
|
+
"app/controllers/primary_sites_controller.rb:98"],
|
|
79
|
+
["4) Similar code found in :defn (mass = 38)",
|
|
80
|
+
"app/controllers/link_targets_controller.rb:13",
|
|
81
|
+
"app/controllers/primary_sites_controller.rb:50"],
|
|
82
|
+
["5) Similar code found in :defn (mass = 38)",
|
|
83
|
+
"app/models/primary_site.rb:104",
|
|
84
|
+
"app/models/primary_site.rb:109"],
|
|
85
|
+
["6) Similar code found in :call (mass = 36)",
|
|
86
|
+
"app/controllers/bookmarklet_integration_controller.rb:6",
|
|
87
|
+
"app/controllers/bookmarklet_integration_controller.rb:17"]]
|
|
88
|
+
|
|
89
|
+
MetricFu::Configuration.run {}
|
|
90
|
+
File.stub!(:directory?).and_return(true)
|
|
91
|
+
flay = MetricFu::Flay.new('base_dir')
|
|
92
|
+
flay.instance_variable_set(:@matches, lines)
|
|
93
|
+
@results = flay.to_h
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should find the total_score" do
|
|
97
|
+
@results[:flay][:total_score].should == '284'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "should have 6 matches" do
|
|
101
|
+
@results[:flay][:matches].size.should == 6
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "should capture info for match" do
|
|
105
|
+
@results[:flay][:matches].first[:reason].should =~ /IDENTICAL/
|
|
106
|
+
@results[:flay][:matches].first[:matches].first[:name].should =~ /link_targets_controller/
|
|
107
|
+
@results[:flay][:matches].first[:matches].first[:line].should == "57"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
describe Flog do
|
|
3
|
+
before :each do
|
|
4
|
+
@text = <<-HERE
|
|
5
|
+
157.9: flog total
|
|
6
|
+
11.3: flog/method average
|
|
7
|
+
|
|
8
|
+
34.8: UsersController#create
|
|
9
|
+
9.2: branch
|
|
10
|
+
6.8: current_user
|
|
11
|
+
5.2: assignment
|
|
12
|
+
3.4: role
|
|
13
|
+
3.0: render
|
|
14
|
+
3.0: ==
|
|
15
|
+
2.8: flash
|
|
16
|
+
1.6: after_create_page
|
|
17
|
+
1.6: params
|
|
18
|
+
1.5: activate!
|
|
19
|
+
1.5: errors
|
|
20
|
+
1.4: login
|
|
21
|
+
1.4: redirect_to
|
|
22
|
+
1.4: []
|
|
23
|
+
1.3: empty?
|
|
24
|
+
1.3: save
|
|
25
|
+
1.2: new
|
|
26
|
+
24.2: UsersController#authorize_user
|
|
27
|
+
4.8: branch
|
|
28
|
+
4.7: current_user
|
|
29
|
+
3.6: params
|
|
30
|
+
3.2: []
|
|
31
|
+
2.6: ==
|
|
32
|
+
1.5: role
|
|
33
|
+
1.5: to_i
|
|
34
|
+
1.5: id
|
|
35
|
+
1.4: new_session_path
|
|
36
|
+
1.3: include?
|
|
37
|
+
1.2: assignment
|
|
38
|
+
1.2: flash
|
|
39
|
+
1.2: redirect_to
|
|
40
|
+
16.4: UsersController#thank_you
|
|
41
|
+
4.0: assignment
|
|
42
|
+
3.3: params
|
|
43
|
+
2.9: []
|
|
44
|
+
2.7: redirect_to
|
|
45
|
+
2.4: branch
|
|
46
|
+
1.5: new_session_path
|
|
47
|
+
1.4: flash
|
|
48
|
+
1.4: activate!
|
|
49
|
+
1.3: can_activate?
|
|
50
|
+
1.2: find_by_id
|
|
51
|
+
14.2: UsersController#update
|
|
52
|
+
3.2: params
|
|
53
|
+
2.8: []
|
|
54
|
+
2.6: assignment
|
|
55
|
+
1.4: login
|
|
56
|
+
1.4: flash
|
|
57
|
+
1.4: redirect_to
|
|
58
|
+
1.3: render
|
|
59
|
+
1.2: branch
|
|
60
|
+
1.2: update_attributes
|
|
61
|
+
1.2: find_by_id
|
|
62
|
+
12.5: UsersController#sanitize_params
|
|
63
|
+
3.9: assignment
|
|
64
|
+
3.6: branch
|
|
65
|
+
3.0: current_user
|
|
66
|
+
1.6: params
|
|
67
|
+
1.5: role
|
|
68
|
+
1.4: []
|
|
69
|
+
1.3: include?
|
|
70
|
+
1.3: ==
|
|
71
|
+
1.2: reject!
|
|
72
|
+
10.6: UsersController#users_have_changed
|
|
73
|
+
3.9: assignment
|
|
74
|
+
2.6: branch
|
|
75
|
+
1.6: params
|
|
76
|
+
1.5: refresh_from_external
|
|
77
|
+
1.4: find_by_id
|
|
78
|
+
1.4: []
|
|
79
|
+
1.2: split
|
|
80
|
+
1.2: each
|
|
81
|
+
1.2: head
|
|
82
|
+
10.0: UsersController#after_create_page
|
|
83
|
+
3.0: current_user
|
|
84
|
+
2.6: id
|
|
85
|
+
2.4: branch
|
|
86
|
+
1.5: role
|
|
87
|
+
1.3: login
|
|
88
|
+
1.3: ==
|
|
89
|
+
8.4: UsersController#add_primary_site
|
|
90
|
+
2.4: assignment
|
|
91
|
+
1.6: params
|
|
92
|
+
1.4: []
|
|
93
|
+
1.4: new
|
|
94
|
+
1.2: find_by_id
|
|
95
|
+
1.2: all
|
|
96
|
+
1.2: render
|
|
97
|
+
7.7: UsersController#none
|
|
98
|
+
3.3: before_filter
|
|
99
|
+
1.1: private
|
|
100
|
+
1.1: caches_page
|
|
101
|
+
1.1: after_filter
|
|
102
|
+
1.1: skip_before_filter
|
|
103
|
+
7.2: UsersController#destroy
|
|
104
|
+
1.8: params
|
|
105
|
+
1.6: []
|
|
106
|
+
1.4: find_by_id
|
|
107
|
+
1.2: destroy
|
|
108
|
+
1.2: redirect_to
|
|
109
|
+
5.9: UsersController#edit
|
|
110
|
+
2.4: assignment
|
|
111
|
+
1.6: params
|
|
112
|
+
1.4: []
|
|
113
|
+
1.2: all
|
|
114
|
+
1.2: find_by_id
|
|
115
|
+
2.7: UsersController#signup
|
|
116
|
+
1.2: render
|
|
117
|
+
1.2: assignment
|
|
118
|
+
1.2: new
|
|
119
|
+
1.7: UsersController#new
|
|
120
|
+
1.2: assignment
|
|
121
|
+
1.2: new
|
|
122
|
+
1.7: UsersController#index
|
|
123
|
+
1.2: assignment
|
|
124
|
+
1.2: all
|
|
125
|
+
HERE
|
|
126
|
+
MetricFu::Flog.stub!(:verify_dependencies!).and_return(true)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
describe "parse method" do
|
|
130
|
+
before :each do
|
|
131
|
+
MetricFu::Configuration.run {}
|
|
132
|
+
File.stub!(:directory?).and_return(true)
|
|
133
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
134
|
+
@flog_page = flog.parse(@text)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it "should find the total score" do
|
|
138
|
+
@flog_page.score.should == 157.9
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should find the average score" do
|
|
142
|
+
@flog_page.average_score.should == 11.3
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should find the scanned method score" do
|
|
146
|
+
@flog_page.scanned_methods.first.score.should == 34.8
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "should find the scanned method name" do
|
|
150
|
+
@flog_page.scanned_methods.first.name.should == "UsersController#create"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "should find the scanned method opperators names" do
|
|
154
|
+
@flog_page.scanned_methods.first.operators.first.operator.should == "branch"
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "should find the scanned method opperators scores" do
|
|
158
|
+
@flog_page.scanned_methods.first.operators.first.score.should == 9.2
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "should find the name of the method even if namespaced" do
|
|
162
|
+
text = <<-HERE
|
|
163
|
+
157.9: flog total
|
|
164
|
+
11.3: flog/method average
|
|
165
|
+
|
|
166
|
+
34.8: SomeNamespace::UsersController#create
|
|
167
|
+
HERE
|
|
168
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
169
|
+
flog_page = flog.parse(text)
|
|
170
|
+
flog_page.scanned_methods.first.name.should == "SomeNamespace::UsersController#create"
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should find the line number for the method" do
|
|
174
|
+
text = <<-HERE
|
|
175
|
+
157.9: flog total
|
|
176
|
+
11.3: flog/method average
|
|
177
|
+
|
|
178
|
+
34.8: SomeNamespace::UsersController#create lib/blah/file.rb:37
|
|
179
|
+
HERE
|
|
180
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
181
|
+
flog_page = flog.parse(text)
|
|
182
|
+
flog_page.scanned_methods.first.line.should == "37"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it "should not add a line number, when none is found" do
|
|
186
|
+
text = <<-HERE
|
|
187
|
+
157.9: flog total
|
|
188
|
+
11.3: flog/method average
|
|
189
|
+
|
|
190
|
+
34.8: UsersController#none lib/blah/file.rb
|
|
191
|
+
HERE
|
|
192
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
193
|
+
flog_page = flog.parse(text)
|
|
194
|
+
flog_page.scanned_methods.first.line.should == nil
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "should parse empty flog files" do
|
|
198
|
+
text = ""
|
|
199
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
200
|
+
flog_page = flog.parse(text)
|
|
201
|
+
flog_page.should be_nil
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe "to_h function with results" do
|
|
206
|
+
before :each do
|
|
207
|
+
MetricFu::Configuration.run {}
|
|
208
|
+
File.stub!(:directory?).and_return(true)
|
|
209
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
210
|
+
flog.should_receive(:open).and_return(@text)
|
|
211
|
+
flog.stub!(:is_file_current?).and_return(true)
|
|
212
|
+
Dir.should_receive(:glob).and_return(["tmp/metric_fu/scratch/flog/app/controllers/user_controller.txt"])
|
|
213
|
+
flog.analyze
|
|
214
|
+
@flog_hash = flog.to_h
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "should put the total in the hash" do
|
|
218
|
+
@flog_hash[:flog][:total].should == 157.9
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "should put the average in the hash" do
|
|
222
|
+
@flog_hash[:flog][:average].should == 11.3
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it "should put pages into the hash" do
|
|
226
|
+
@flog_hash[:flog][:pages].first[:scanned_methods].first[:score].should == 34.8
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it "should put the filename into the hash" do
|
|
230
|
+
@flog_hash[:flog][:pages].first[:path].should == "/app/controllers/user_controller.rb"
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
describe "to_h function ignore files not current" do
|
|
235
|
+
before :each do
|
|
236
|
+
MetricFu::Configuration.run {}
|
|
237
|
+
File.stub!(:directory?).and_return(true)
|
|
238
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
239
|
+
flog.should_receive(:open).and_return(@text)
|
|
240
|
+
flog.stub!(:is_file_current?).and_return(false)
|
|
241
|
+
Dir.should_receive(:glob).and_return(["tmp/metric_fu/scratch/flog/app/controllers/user_controller.txt"])
|
|
242
|
+
flog.analyze
|
|
243
|
+
@flog_hash = flog.to_h
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it "should put the total in the hash" do
|
|
247
|
+
@flog_hash.should == {:flog=>{:total=>0, :pages=>[], :average=>0}}
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
describe "to_h function with zero total" do
|
|
253
|
+
it "should not blow up" do
|
|
254
|
+
MetricFu::Configuration.run {}
|
|
255
|
+
File.stub!(:directory?).and_return(true)
|
|
256
|
+
flog = MetricFu::Flog.new('base_dir')
|
|
257
|
+
flog.should_receive(:open).and_return("") # some sort of empty or unparsable file
|
|
258
|
+
Dir.should_receive(:glob).and_return(["empty_file.txt"])
|
|
259
|
+
flog.analyze
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|