devver-metric_fu 1.3.3

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.
Files changed (90) hide show
  1. data/HISTORY +182 -0
  2. data/MIT-LICENSE +22 -0
  3. data/Manifest.txt +25 -0
  4. data/README.textile +27 -0
  5. data/Rakefile +15 -0
  6. data/TODO +9 -0
  7. data/lib/base/base_template.rb +145 -0
  8. data/lib/base/configuration.rb +182 -0
  9. data/lib/base/generator.rb +167 -0
  10. data/lib/base/graph.rb +39 -0
  11. data/lib/base/md5_tracker.rb +52 -0
  12. data/lib/base/report.rb +100 -0
  13. data/lib/generators/churn.rb +34 -0
  14. data/lib/generators/flay.rb +35 -0
  15. data/lib/generators/flog.rb +167 -0
  16. data/lib/generators/rails_best_practices.rb +31 -0
  17. data/lib/generators/rcov.rb +82 -0
  18. data/lib/generators/reek.rb +64 -0
  19. data/lib/generators/roodi.rb +33 -0
  20. data/lib/generators/saikuro.rb +221 -0
  21. data/lib/generators/stats.rb +59 -0
  22. data/lib/graphs/engines/bluff.rb +99 -0
  23. data/lib/graphs/engines/gchart.rb +118 -0
  24. data/lib/graphs/flay_grapher.rb +20 -0
  25. data/lib/graphs/flog_grapher.rb +40 -0
  26. data/lib/graphs/grapher.rb +11 -0
  27. data/lib/graphs/rails_best_practices_grapher.rb +20 -0
  28. data/lib/graphs/rcov_grapher.rb +20 -0
  29. data/lib/graphs/reek_grapher.rb +32 -0
  30. data/lib/graphs/roodi_grapher.rb +20 -0
  31. data/lib/metric_fu.rb +31 -0
  32. data/lib/templates/awesome/awesome_template.rb +37 -0
  33. data/lib/templates/awesome/churn.html.erb +58 -0
  34. data/lib/templates/awesome/css/buttons.css +82 -0
  35. data/lib/templates/awesome/css/default.css +91 -0
  36. data/lib/templates/awesome/css/integrity.css +335 -0
  37. data/lib/templates/awesome/css/reset.css +7 -0
  38. data/lib/templates/awesome/flay.html.erb +34 -0
  39. data/lib/templates/awesome/flog.html.erb +53 -0
  40. data/lib/templates/awesome/index.html.erb +31 -0
  41. data/lib/templates/awesome/layout.html.erb +30 -0
  42. data/lib/templates/awesome/rails_best_practices.html.erb +27 -0
  43. data/lib/templates/awesome/rcov.html.erb +42 -0
  44. data/lib/templates/awesome/reek.html.erb +40 -0
  45. data/lib/templates/awesome/roodi.html.erb +27 -0
  46. data/lib/templates/awesome/saikuro.html.erb +71 -0
  47. data/lib/templates/awesome/stats.html.erb +41 -0
  48. data/lib/templates/javascripts/bluff-min.js +1 -0
  49. data/lib/templates/javascripts/excanvas.js +35 -0
  50. data/lib/templates/javascripts/js-class.js +1 -0
  51. data/lib/templates/standard/churn.html.erb +31 -0
  52. data/lib/templates/standard/default.css +64 -0
  53. data/lib/templates/standard/flay.html.erb +34 -0
  54. data/lib/templates/standard/flog.html.erb +53 -0
  55. data/lib/templates/standard/index.html.erb +41 -0
  56. data/lib/templates/standard/rails_best_practices.html.erb +29 -0
  57. data/lib/templates/standard/rcov.html.erb +43 -0
  58. data/lib/templates/standard/reek.html.erb +42 -0
  59. data/lib/templates/standard/roodi.html.erb +29 -0
  60. data/lib/templates/standard/saikuro.html.erb +84 -0
  61. data/lib/templates/standard/standard_template.rb +26 -0
  62. data/lib/templates/standard/stats.html.erb +55 -0
  63. data/spec/base/base_template_spec.rb +161 -0
  64. data/spec/base/configuration_spec.rb +270 -0
  65. data/spec/base/generator_spec.rb +244 -0
  66. data/spec/base/graph_spec.rb +24 -0
  67. data/spec/base/md5_tracker_spec.rb +57 -0
  68. data/spec/base/report_spec.rb +139 -0
  69. data/spec/generators/churn_spec.rb +43 -0
  70. data/spec/generators/flay_spec.rb +110 -0
  71. data/spec/generators/flog_spec.rb +238 -0
  72. data/spec/generators/reek_spec.rb +125 -0
  73. data/spec/generators/saikuro_spec.rb +58 -0
  74. data/spec/generators/stats_spec.rb +74 -0
  75. data/spec/graphs/engines/bluff_spec.rb +18 -0
  76. data/spec/graphs/engines/gchart_spec.rb +108 -0
  77. data/spec/graphs/flay_grapher_spec.rb +37 -0
  78. data/spec/graphs/flog_grapher_spec.rb +45 -0
  79. data/spec/graphs/rcov_grapher_spec.rb +37 -0
  80. data/spec/graphs/reek_grapher_spec.rb +46 -0
  81. data/spec/graphs/roodi_grapher_spec.rb +37 -0
  82. data/spec/resources/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
  83. data/spec/resources/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
  84. data/spec/resources/saikuro/index_cyclo.html +155 -0
  85. data/spec/resources/saikuro_sfiles/thing.rb_cyclo.html +11 -0
  86. data/spec/resources/yml/20090630.yml +7844 -0
  87. data/spec/spec.opts +6 -0
  88. data/spec/spec_helper.rb +7 -0
  89. data/tasks/metric_fu.rake +22 -0
  90. metadata +253 -0
@@ -0,0 +1,26 @@
1
+ class StandardTemplate < MetricFu::Template
2
+
3
+
4
+ def write
5
+ report.each_pair do |section, contents|
6
+ if template_exists?(section)
7
+ create_instance_var(section, contents)
8
+ html = erbify(section)
9
+ fn = output_filename(section)
10
+ MetricFu.report.save_output(html, MetricFu.output_directory, fn)
11
+ end
12
+ end
13
+
14
+ # Instance variables we need should already be created from above
15
+ if template_exists?('index')
16
+ html = erbify('index')
17
+ fn = output_filename('index')
18
+ MetricFu.report.save_output(html, MetricFu.output_directory, fn)
19
+ end
20
+ end
21
+
22
+ def this_directory
23
+ File.dirname(__FILE__)
24
+ end
25
+ end
26
+
@@ -0,0 +1,55 @@
1
+ <html>
2
+ <head>
3
+ <title>Rake Stats Results</title>
4
+ <style>
5
+ <%= inline_css("default.css") %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Rake Stats Results</h1>
11
+ <a href="index.html">back to menu</a>
12
+ <p>Rails rake stats results.</p>
13
+ <table>
14
+ <tr>
15
+ <th>Lines of Code</th>
16
+ <th>Lines of Test</th>
17
+ <th>Code to test ratio</th>
18
+ </tr>
19
+ <tr>
20
+ <td><%= @stats[:codeLOC] %></td>
21
+ <td><%= @stats[:testLOC] %></td>
22
+ <td>1:<%= @stats[:code_to_test_ratio] %></td>
23
+ </tr>
24
+ </table>
25
+
26
+ <table>
27
+ <tr>
28
+ <th>Name</th>
29
+ <th>Lines</th>
30
+ <th>LOC</th>
31
+ <th>Classes</th>
32
+ <th>Methods</th>
33
+ <th>Methods per class</th>
34
+ <th>LOC per method</th>
35
+ </tr>
36
+ <% count = 0 %>
37
+ <% @stats[:lines].each do |line| %>
38
+ <tr>
39
+ <td><%= line[:name] %></td>
40
+ <td><%= line[:lines] %></td>
41
+ <td><%= line[:loc] %></td>
42
+ <td><%= line[:classes] %></td>
43
+ <td><%= line[:methods] %></td>
44
+ <td><%= line[:methods_per_class] %></td>
45
+ <td><%= line[:loc_per_method] %></td>
46
+ </tr>
47
+ <% count += 1 %>
48
+ <% end %>
49
+ </table>
50
+
51
+ <p>Generated on <%= Time.now.localtime %></p>
52
+ </body>
53
+ </html>
54
+
55
+
@@ -0,0 +1,161 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+ require 'erb'
3
+
4
+ describe MetricFu::Template do
5
+
6
+ before(:each) do
7
+ @template = Template.new
8
+ end
9
+
10
+ describe "#erbify" do
11
+ it 'should evaluate a erb doc' do
12
+ section = 'section'
13
+ File.stub!(:read).and_return('foo')
14
+ erb = mock('erb')
15
+ erb.should_receive(:result)
16
+ ERB.should_receive(:new).with('foo').and_return(erb)
17
+ @template.should_receive(:template).and_return('foo')
18
+ @template.send(:erbify, section)
19
+ end
20
+ end
21
+
22
+ describe "#template_exists? " do
23
+
24
+ before(:each) do
25
+ @section = mock('section')
26
+ @template.should_receive(:template).
27
+ with(@section).and_return(@section)
28
+ end
29
+
30
+ describe 'if the template exists' do
31
+ it 'should return true' do
32
+ File.should_receive(:exist?).with(@section).and_return(true)
33
+ result = @template.send(:template_exists?, @section)
34
+ result.should be_true
35
+ end
36
+ end
37
+
38
+ describe 'if the template does not exist' do
39
+ it 'should return false' do
40
+ File.should_receive(:exist?).with(@section).and_return(false)
41
+ result = @template.send(:template_exists?, @section)
42
+ result.should be_false
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "#create_instance_var" do
48
+ it 'should set an instance variable with the passed contents' do
49
+ section = 'section'
50
+ contents = 'contents'
51
+ @template.send(:create_instance_var, section, contents)
52
+ @template.instance_variable_get(:@section).should == contents
53
+ end
54
+ end
55
+
56
+ describe "#template" do
57
+ it 'should generate the filename of the template file' do
58
+ section = mock('section')
59
+ section.should_receive(:to_s).and_return('section')
60
+ @template.should_receive(:this_directory).and_return('dir')
61
+ result = @template.send(:template, section)
62
+ result.should == "dir/section.html.erb"
63
+ end
64
+ end
65
+
66
+ describe "#output_filename" do
67
+ it 'should generate the filename of the output file' do
68
+ section = mock('section')
69
+ section.should_receive(:to_s).and_return('section')
70
+ result = @template.send(:output_filename, section)
71
+ result.should == "section.html"
72
+ end
73
+ end
74
+
75
+ describe "#inline_css" do
76
+ it 'should return the contents of a css file' do
77
+ css = 'mycss.css'
78
+ @template.should_receive(:this_directory).and_return('dir')
79
+ io = mock('io', :read => "css contents")
80
+ @template.should_receive(:open).and_yield(io)
81
+ result = @template.send(:inline_css, css)
82
+ result.should == 'css contents'
83
+ end
84
+ end
85
+
86
+ describe "#link_to_filename " do
87
+ describe "when on OS X" do
88
+ before(:each) do
89
+ config = mock("configuration")
90
+ config.stub!(:platform).and_return('universal-darwin-9.0')
91
+ MetricFu.stub!(:configuration).and_return(config)
92
+ end
93
+
94
+ it 'should return a textmate protocol link' do
95
+ File.stub!(:expand_path).with('filename').and_return('/expanded/filename')
96
+ result = @template.send(:link_to_filename, 'filename')
97
+ result.should eql("<a href='txmt://open/?url=file://" \
98
+ + "/expanded/filename'>filename</a>")
99
+ end
100
+
101
+ it "should do the right thing with a filename that starts with a slash" do
102
+ File.stub!(:expand_path).with('filename').and_return('/expanded/filename')
103
+ result = @template.send(:link_to_filename, '/filename')
104
+ result.should eql("<a href='txmt://open/?url=file://" \
105
+ + "/expanded/filename'>/filename</a>")
106
+ end
107
+
108
+ it "should include a line number" do
109
+ File.stub!(:expand_path).with('filename').and_return('/expanded/filename')
110
+ result = @template.send(:link_to_filename, 'filename', 6)
111
+ result.should eql("<a href='txmt://open/?url=file://" \
112
+ + "/expanded/filename&line=6'>filename:6</a>")
113
+ end
114
+
115
+ describe "and given link text" do
116
+ it "should use the submitted link text" do
117
+ File.stub!(:expand_path).with('filename').and_return('/expanded/filename')
118
+ result = @template.send(:link_to_filename, 'filename', 6, 'link content')
119
+ result.should eql("<a href='txmt://open/?url=file://" \
120
+ + "/expanded/filename&line=6'>link content</a>")
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "when on other platforms" do
126
+ before(:each) do
127
+ config = mock("configuration")
128
+ config.should_receive(:platform).and_return('other')
129
+ MetricFu.stub!(:configuration).and_return(config)
130
+ File.should_receive(:expand_path).and_return('filename')
131
+ end
132
+
133
+ it 'should return a file protocol link' do
134
+ name = "filename"
135
+ result = @template.send(:link_to_filename, name)
136
+ result.should == "<a href='file://filename'>filename</a>"
137
+ end
138
+ end
139
+ end
140
+
141
+ describe "#cycle" do
142
+ it 'should return the first_value passed if iteration passed is even' do
143
+ first_val = "first"
144
+ second_val = "second"
145
+ iter = 2
146
+ result = @template.send(:cycle, first_val, second_val, iter)
147
+ result.should == first_val
148
+ end
149
+
150
+ it 'should return the second_value passed if iteration passed is odd' do
151
+ first_val = "first"
152
+ second_val = "second"
153
+ iter = 1
154
+ result = @template.send(:cycle, first_val, second_val, iter)
155
+ result.should == second_val
156
+ end
157
+ end
158
+
159
+ end
160
+
161
+
@@ -0,0 +1,270 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe MetricFu::Configuration do
4
+
5
+ def get_new_config
6
+ @config = Configuration.new
7
+ end
8
+
9
+ def base_directory
10
+ @config.instance_variable_get(:@base_directory)
11
+ end
12
+
13
+ def output_directory
14
+ @config.instance_variable_get(:@output_directory)
15
+ end
16
+
17
+ def scratch_directory
18
+ @config.instance_variable_get(:@scratch_directory)
19
+ end
20
+
21
+ def template_directory
22
+ @config.instance_variable_get(:@template_directory)
23
+ end
24
+
25
+ def template_class
26
+ @config.instance_variable_get(:@template_class)
27
+ end
28
+
29
+ def metric_fu_root
30
+ @config.instance_variable_get(:@metric_fu_root_directory)
31
+ end
32
+
33
+ describe "#reset" do
34
+
35
+ before(:each) { get_new_config }
36
+
37
+ describe 'when there is a CC_BUILD_ARTIFACTS environment variable' do
38
+ before(:each) { ENV['CC_BUILD_ARTIFACTS'] = 'foo' }
39
+
40
+ it 'should return the CC_BUILD_ARTIFACTS environment variable' do
41
+ get_new_config
42
+ base_directory.should == ENV['CC_BUILD_ARTIFACTS']
43
+ end
44
+ end
45
+
46
+ describe 'when there is no CC_BUILD_ARTIFACTS environment variable' do
47
+ before(:each) { ENV['CC_BUILD_ARTIFACTS'] = nil }
48
+
49
+ it 'should return "tmp/metric_fu"' do
50
+ get_new_config
51
+ base_directory.should == "tmp/metric_fu"
52
+ end
53
+ end
54
+
55
+ it 'should set @metric_fu_root_directory to the base of the '+
56
+ 'metric_fu application' do
57
+ app_root = File.join(File.dirname(__FILE__), '..', '..')
58
+ app_root_absolute_path = File.expand_path(app_root)
59
+ metric_fu_absolute_path = File.expand_path(metric_fu_root)
60
+ metric_fu_absolute_path.should == app_root_absolute_path
61
+ end
62
+
63
+ it 'should set @template_directory to the lib/templates relative '+
64
+ 'to @metric_fu_root_directory' do
65
+ template_dir = File.join(File.dirname(__FILE__),
66
+ '..', '..', 'lib','templates')
67
+ template_dir_abs_path = File.expand_path(template_dir)
68
+ calc_template_dir_abs_path = File.expand_path(template_directory)
69
+ calc_template_dir_abs_path.should == template_dir_abs_path
70
+ end
71
+
72
+ it 'should set @scratch_directory to scratch relative '+
73
+ 'to @base_directory' do
74
+ scratch_dir = File.join(base_directory, 'scratch')
75
+ scratch_directory.should == scratch_dir
76
+ end
77
+
78
+ it 'should set @output_directory to output relative '+
79
+ 'to @base_directory' do
80
+ output_dir = File.join(base_directory, 'output')
81
+ output_directory.should == output_dir
82
+ end
83
+
84
+ it 'should set @template_class to AwesomeTemplate' do
85
+ template_class.should == AwesomeTemplate
86
+ end
87
+
88
+ it 'should set @flay to {:dirs_to_flay => @code_dirs}' do
89
+ @config.instance_variable_get(:@flay).
90
+ should == {:dirs_to_flay => ['lib'], :minimum_score => 100}
91
+ end
92
+
93
+ it 'should set @flog to {:dirs_to_flog => @code_dirs}' do
94
+ @config.instance_variable_get(:@flog).
95
+ should == {:dirs_to_flog => ['lib']}
96
+ end
97
+
98
+ it 'should set @reek to {:dirs_to_reek => @code_dirs}' do
99
+ @config.instance_variable_get(:@reek).
100
+ should == {:dirs_to_reek => ['lib']}
101
+ end
102
+
103
+ it 'should set @roodi to {:dirs_to_roodi => @code_dirs}' do
104
+ @config.instance_variable_get(:@roodi).
105
+ should == {:dirs_to_roodi => ['lib']}
106
+ end
107
+
108
+ it 'should set @churn to {}' do
109
+ @config.instance_variable_get(:@churn).
110
+ should == {}
111
+ end
112
+
113
+ it 'should set @stats to {}' do
114
+ @config.instance_variable_get(:@stats).
115
+ should == {}
116
+ end
117
+
118
+ it 'should set @rcov to { :test_files => ["test/**/*_test.rb",
119
+ "spec/**/*_spec.rb"]
120
+ :rcov_opts => ["--sort coverage",
121
+ "--no-html",
122
+ "--text-coverage",
123
+ "--no-color",
124
+ "--profile",
125
+ "--rails",
126
+ "--exclude /gems/,/Library/,/usr/,spec"]}' do
127
+ @config.instance_variable_get(:@rcov).
128
+ should == { :environment => 'test',
129
+ :test_files => ['test/**/*_test.rb',
130
+ 'spec/**/*_spec.rb'],
131
+ :rcov_opts => ["--sort coverage",
132
+ "--no-html",
133
+ "--text-coverage",
134
+ "--no-color",
135
+ "--profile",
136
+ "--rails",
137
+ "--exclude /gems/,/Library/,/usr/,spec"]}
138
+ end
139
+
140
+ it 'should set @saikuro to { :output_directory => @scratch_directory + "/saikuro",
141
+ :input_directory => @code_dirs,
142
+ :cyclo => "",
143
+ :filter_cyclo => "0",
144
+ :warn_cyclo => "5",
145
+ :error_cyclo => "7",
146
+ :formater => "text" }' do
147
+ @config.instance_variable_get(:@saikuro).
148
+ should == { :output_directory => "#{scratch_directory}/saikuro",
149
+ :input_directory => ['lib'],
150
+ :cyclo => "",
151
+ :filter_cyclo => "0",
152
+ :warn_cyclo => "5",
153
+ :error_cyclo => "7",
154
+ :formater => "text"}
155
+ end
156
+
157
+ describe 'if #rails? is true ' do
158
+ before(:each) do
159
+ @config.stub!(:rails?).and_return(true)
160
+ end
161
+
162
+ describe '#set_metrics ' do
163
+ it 'should set the @metrics instance var to AVAILABLE_METRICS + '\
164
+ +'[:stats]' do
165
+ @config.instance_variable_get(:@metrics).
166
+ should == MetricFu::AVAILABLE_METRICS << [:stats]
167
+ end
168
+ end
169
+
170
+ describe '#set_graphs ' do
171
+ it 'should set the @graphs instance var to AVAILABLE_GRAPHS' do
172
+ @config.instance_variable_get(:@graphs).
173
+ should == MetricFu::AVAILABLE_GRAPHS
174
+ end
175
+ end
176
+
177
+ describe '#set_code_dirs ' do
178
+ it 'should set the @code_dirs instance var to ["app", "lib"]' do
179
+ # This is hard to spec properly because the @code_dirs variable
180
+ # is set during the reset process.
181
+ #@config.instance_variable_get(:@code_dirs).
182
+ # should == ['app','lib']
183
+ end
184
+ end
185
+ end
186
+
187
+ describe 'if #rails? is false ' do
188
+ before(:each) do
189
+ @config.stub!(:rails?).and_return(false)
190
+ end
191
+
192
+ describe '#set_metrics ' do
193
+ it 'should set the @metrics instance var to AVAILABLE_METRICS' do
194
+ @config.instance_variable_get(:@metrics).
195
+ should == MetricFu::AVAILABLE_METRICS
196
+ end
197
+ end
198
+
199
+ describe '#set_code_dirs ' do
200
+ it 'should set the @code_dirs instance var to ["lib"]' do
201
+ @config.instance_variable_get(:@code_dirs).should == ['lib']
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#add_attr_accessors_to_self' do
208
+
209
+ before(:each) { get_new_config }
210
+
211
+ MetricFu::AVAILABLE_METRICS.each do |metric|
212
+ it "should have a reader for #{metric}" do
213
+ @config.respond_to?(metric).should be_true
214
+ end
215
+
216
+ it "should have a writer for #{metric}=" do
217
+ @config.respond_to?((metric.to_s + '=').to_sym).should be_true
218
+ end
219
+ end
220
+ end
221
+
222
+ describe '#add_class_methods_to_metric_fu' do
223
+
224
+ before(:each) { get_new_config }
225
+
226
+ MetricFu::AVAILABLE_METRICS.each do |metric|
227
+ it "should add a #{metric} class method to the MetricFu module " do
228
+ MetricFu.should respond_to(metric)
229
+ end
230
+ end
231
+
232
+ MetricFu::AVAILABLE_GRAPHS.each do |graph|
233
+ it "should add a #{graph} class metrhod to the MetricFu module" do
234
+ MetricFu.should respond_to(graph)
235
+ end
236
+ end
237
+ end
238
+
239
+ describe '#platform' do
240
+
241
+ before(:each) { get_new_config }
242
+
243
+ it 'should return the value of the PLATFORM constant' do
244
+ this_platform = RUBY_PLATFORM
245
+ @config.platform.should == this_platform
246
+ end
247
+ end
248
+
249
+ describe '#is_cruise_control_rb? ' do
250
+
251
+ before(:each) { get_new_config }
252
+ describe "when the CC_BUILD_ARTIFACTS env var is not nil" do
253
+
254
+ before(:each) { ENV['CC_BUILD_ARTIFACTS'] = 'is set' }
255
+
256
+ it 'should return true' do
257
+ @config.is_cruise_control_rb?.should be_true
258
+ end
259
+
260
+ end
261
+
262
+ describe "when the CC_BUILD_ARTIFACTS env var is nil" do
263
+ before(:each) { ENV['CC_BUILD_ARTIFACTS'] = nil }
264
+
265
+ it 'should return false' do
266
+ @config.is_cruise_control_rb?.should be_false
267
+ end
268
+ end
269
+ end
270
+ end