metric_fu 1.1.5 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -130,6 +130,8 @@ module MetricFu
130
130
  "--profile",
131
131
  "--rails",
132
132
  "--exclude /gems/,/Library/,/usr/,spec"]}
133
+
134
+ @file_globs_to_ignore = []
133
135
 
134
136
  @graph_theme = { :colors => %w(orange purple green white red blue pink yellow),
135
137
  :marker_color => 'blue',
@@ -97,6 +97,13 @@ module MetricFu
97
97
  self.class.metric_directory
98
98
  end
99
99
 
100
+ def remove_excluded_files(paths, globs_to_remove = MetricFu.file_globs_to_ignore)
101
+ files_to_remove = []
102
+ globs_to_remove.each do |glob|
103
+ files_to_remove.concat(Dir[glob])
104
+ end
105
+ paths - files_to_remove
106
+ end
100
107
 
101
108
  # Defines some hook methods for the concrete classes to hook into.
102
109
  %w[emit analyze].each do |meth|
@@ -9,7 +9,8 @@ module MetricFu
9
9
 
10
10
  def emit
11
11
  files_to_flay = MetricFu.flay[:dirs_to_flay].map{|dir| Dir[File.join(dir, "**/*.rb")] }
12
- @output = `flay #{files_to_flay.join(" ")}`
12
+ files = remove_excluded_files(files_to_flay.flatten)
13
+ @output = `flay #{files.join(" ")}`
13
14
  end
14
15
 
15
16
  def analyze
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  module MetricFu
2
4
 
3
5
  class Flog < Generator
@@ -15,11 +17,17 @@ module MetricFu
15
17
  def emit
16
18
  metric_dir = MetricFu::Flog.metric_directory
17
19
  MetricFu.flog[:dirs_to_flog].each do |directory|
18
- Dir.glob("#{directory}/**/*.rb").each do |filename|
20
+ directory = "." if directory=='./'
21
+ files = Dir.glob("#{directory}/**/*.rb")
22
+ files = remove_excluded_files(files)
23
+ files.each do |filename|
19
24
  output_dir = "#{metric_dir}/#{filename.split("/")[0..-2].join("/")}"
20
25
  mkdir_p(output_dir, :verbose => false) unless File.directory?(output_dir)
21
- if MetricFu::MD5Tracker.file_changed?(filename, metric_dir)
22
- `flog -ad #{filename} > #{metric_dir}/#{filename.split('.')[0]}.txt`
26
+ pathname = Pathname.new(filename)
27
+ if MetricFu::MD5Tracker.file_changed?(filename, metric_dir)
28
+ base_name = pathname.basename.to_s.gsub(/\..*$/,'.txt')
29
+ editted_filename = File.join(pathname.dirname.to_s, base_name)
30
+ `flog -ad #{filename} > #{metric_dir}/#{editted_filename}`
23
31
  end
24
32
  end
25
33
  end
@@ -54,7 +62,10 @@ module MetricFu
54
62
  page = parse(open(path, "r") { |f| f.read })
55
63
  if page
56
64
  page.path = path.sub(metric_directory, "").sub(".txt", ".rb")
57
- @pages << page
65
+ #don't include old cached flog results for files that no longer exist.
66
+ if is_file_current?(page.path.to_s)
67
+ @pages << page
68
+ end
58
69
  end
59
70
  end
60
71
  end
@@ -69,7 +80,23 @@ module MetricFu
69
80
  end
70
81
 
71
82
  private
72
-
83
+
84
+ def is_file_current?(pathname)
85
+ pathname = pathname.gsub(/^\//,'')
86
+ local_pathname = "./#{pathname}"
87
+ exists = false
88
+
89
+ MetricFu.flog[:dirs_to_flog].each do |directory|
90
+ directory = "." if directory=='./'
91
+ files = Dir.glob("#{directory}/**/*.rb")
92
+ if files.include?(pathname) || files.include?(local_pathname)
93
+ exists = true
94
+ break
95
+ end
96
+ end
97
+ exists
98
+ end
99
+
73
100
  def average_score(total_flog_score, number_of_methods)
74
101
  return 0 if total_flog_score == 0
75
102
  round_to_tenths(total_flog_score/number_of_methods)
@@ -10,7 +10,34 @@ module MetricFu
10
10
 
11
11
  def emit
12
12
  files_to_reek = MetricFu.reek[:dirs_to_reek].map{|dir| Dir[File.join(dir, "**/*.rb")] }
13
- @output = `reek #{files_to_reek.join(" ")}`
13
+ files = remove_excluded_files(files_to_reek.flatten)
14
+ @output = `reek #{files.join(" ")}`
15
+ @output = massage_for_reek_12 if reek_12?
16
+ end
17
+
18
+ def reek_12?
19
+ return false if @output.length == 0
20
+ (@output =~ /^"/) != 0
21
+ end
22
+
23
+ def massage_for_reek_12
24
+ section_break = ''
25
+ @output.split("\n").map do |line|
26
+ case line
27
+ when /^ /
28
+ "#{line.gsub(/^ /, '')}\n"
29
+ else
30
+ parts = line.split(" -- ")
31
+ if parts[1].nil?
32
+ "#{line}\n"
33
+ else
34
+ warnings = parts[1].gsub(/ \(.*\):/, ':')
35
+ result = "#{section_break}\"#{parts[0]}\" -- #{warnings}\n"
36
+ section_break = "\n"
37
+ result
38
+ end
39
+ end
40
+ end.join
14
41
  end
15
42
 
16
43
  def analyze
@@ -9,7 +9,8 @@ module MetricFu
9
9
 
10
10
  def emit
11
11
  files_to_analyze = MetricFu.roodi[:dirs_to_roodi].map{|dir| Dir[File.join(dir, "**/*.rb")] }
12
- @output = `roodi #{files_to_analyze.join(" ")}`
12
+ files = remove_excluded_files(files_to_analyze.flatten)
13
+ @output = `roodi #{files.join(" ")}`
13
14
  end
14
15
 
15
16
  def analyze
@@ -2,6 +2,8 @@ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
2
 
3
3
  describe MetricFu::Generator do
4
4
 
5
+ include Construct::Helpers
6
+
5
7
  MetricFu::Configuration.run do |config|
6
8
  end
7
9
 
@@ -177,5 +179,66 @@ describe MetricFu::Generator do
177
179
  ConcreteClass.new()
178
180
  end
179
181
  end
182
+
183
+ describe "path filter" do
184
+
185
+ context "given a list of paths" do
186
+
187
+ before do
188
+ @paths = %w(lib/fake/fake.rb
189
+ lib/this/dan_file.rb
190
+ lib/this/ben_file.rb
191
+ lib/this/avdi_file.rb
192
+ basic.rb
193
+ lib/bad/one.rb
194
+ lib/bad/two.rb
195
+ lib/bad/three.rb
196
+ lib/worse/four.rb)
197
+ @container = create_construct
198
+ @paths.each do |path|
199
+ @container.file(path)
200
+ end
201
+ @old_dir = Dir.pwd
202
+ Dir.chdir(@container)
203
+ end
204
+
205
+ after do
206
+ Dir.chdir(@old_dir)
207
+ @container.destroy!
208
+ end
209
+
210
+ it "should return entire pathlist given no exclude pattens" do
211
+ files = @concrete_class.remove_excluded_files(@paths)
212
+ files.should be == @paths
213
+ end
214
+
215
+ it "should filter filename at root level" do
216
+ files = @concrete_class.remove_excluded_files(@paths, ['basic.rb'])
217
+ files.should_not include('basic.rb')
218
+ end
219
+
220
+ it "should remove files that are two levels deep" do
221
+ files = @concrete_class.remove_excluded_files(@paths, ['**/fake.rb'])
222
+ files.should_not include('lib/fake/fake.rb')
223
+ end
224
+
225
+ it "should remove files from an excluded directory" do
226
+ files = @concrete_class.remove_excluded_files(@paths, ['lib/bad/**'])
227
+ files.should_not include('lib/bad/one.rb')
228
+ files.should_not include('lib/bad/two.rb')
229
+ files.should_not include('lib/bad/three.rb')
230
+ end
231
+
232
+ it "should support shell alternation globs" do
233
+ files = @concrete_class.remove_excluded_files(@paths, ['lib/this/{ben,dan}_file.rb'])
234
+ files.should_not include('lib/this/dan_file.rb')
235
+ files.should_not include('lib/this/ben_file.rb')
236
+ files.should include('lib/this/avdi_file.rb')
237
+ end
238
+
239
+ end
240
+
241
+
242
+ end
180
243
 
181
244
  end
@@ -184,6 +184,7 @@ describe Flog do
184
184
  File.stub!(:directory?).and_return(true)
185
185
  flog = MetricFu::Flog.new('base_dir')
186
186
  flog.should_receive(:open).and_return(@text)
187
+ flog.stub!(:is_file_current?).and_return(true)
187
188
  Dir.should_receive(:glob).and_return(["tmp/metric_fu/scratch/flog/app/controllers/user_controller.txt"])
188
189
  flog.analyze
189
190
  @flog_hash = flog.to_h
@@ -206,6 +207,24 @@ describe Flog do
206
207
  end
207
208
  end
208
209
 
210
+ describe "to_h function ignore files not current" do
211
+ before :each do
212
+ MetricFu::Configuration.run {}
213
+ File.stub!(:directory?).and_return(true)
214
+ flog = MetricFu::Flog.new('base_dir')
215
+ flog.should_receive(:open).and_return(@text)
216
+ flog.stub!(:is_file_current?).and_return(false)
217
+ Dir.should_receive(:glob).and_return(["tmp/metric_fu/scratch/flog/app/controllers/user_controller.txt"])
218
+ flog.analyze
219
+ @flog_hash = flog.to_h
220
+ end
221
+
222
+ it "should put the total in the hash" do
223
+ @flog_hash.should == {:flog=>{:total=>0, :pages=>[], :average=>0}}
224
+ end
225
+
226
+ end
227
+
209
228
  describe "to_h function with zero total" do
210
229
  it "should not blow up" do
211
230
  MetricFu::Configuration.run {}
@@ -58,3 +58,69 @@ NewlineController#some_method calls current_user.<< "new line\n" multiple times
58
58
  end
59
59
 
60
60
  end
61
+
62
+ describe Reek do
63
+ before :each do
64
+ @reek = MetricFu::Reek.new
65
+ @lines11 = <<-HERE
66
+ "app/controllers/activity_reports_controller.rb" -- 4 warnings:
67
+ ActivityReportsController#authorize_user calls current_user.primary_site_ids multiple times (Duplication)
68
+ ActivityReportsController#authorize_user calls params[id] multiple times (Duplication)
69
+ ActivityReportsController#authorize_user calls params[primary_site_id] multiple times (Duplication)
70
+ ActivityReportsController#authorize_user has approx 6 statements (Long Method)
71
+
72
+ "app/controllers/application.rb" -- 1 warnings:
73
+ ApplicationController#start_background_task/block/block is nested (Nested Iterators)
74
+
75
+ "app/controllers/link_targets_controller.rb" -- 1 warnings:
76
+ LinkTargetsController#authorize_user calls current_user.role multiple times (Duplication)
77
+
78
+ "app/controllers/newline_controller.rb" -- 1 warnings:
79
+ NewlineController#some_method calls current_user.<< "new line\n" multiple times (Duplication)
80
+ HERE
81
+ @lines12 = <<-HERE
82
+ app/controllers/activity_reports_controller.rb -- 4 warnings (+3 masked):
83
+ ActivityReportsController#authorize_user calls current_user.primary_site_ids multiple times (Duplication)
84
+ ActivityReportsController#authorize_user calls params[id] multiple times (Duplication)
85
+ ActivityReportsController#authorize_user calls params[primary_site_id] multiple times (Duplication)
86
+ ActivityReportsController#authorize_user has approx 6 statements (Long Method)
87
+ app/controllers/application.rb -- 1 warnings:
88
+ ApplicationController#start_background_task/block/block is nested (Nested Iterators)
89
+ app/controllers/link_targets_controller.rb -- 1 warnings (+1 masked):
90
+ LinkTargetsController#authorize_user calls current_user.role multiple times (Duplication)
91
+ app/controllers/newline_controller.rb -- 1 warnings:
92
+ NewlineController#some_method calls current_user.<< "new line\n" multiple times (Duplication)
93
+ HERE
94
+ end
95
+
96
+ context 'with Reek 1.1 output format' do
97
+ it 'reports 1.1 style when the output is empty' do
98
+ @reek.instance_variable_set(:@output, "")
99
+ @reek.should_not be_reek_12
100
+ end
101
+ it 'detects 1.1 format output' do
102
+ @reek.instance_variable_set(:@output, @lines11)
103
+ @reek.should_not be_reek_12
104
+ end
105
+
106
+ it 'massages empty output to be unchanged' do
107
+ @reek.instance_variable_set(:@output, "")
108
+ @reek.massage_for_reek_12.should be_empty
109
+ end
110
+ end
111
+
112
+ context 'with Reek 1.2 output format' do
113
+ before :each do
114
+ @reek = MetricFu::Reek.new
115
+ end
116
+ it 'detects 1.2 format output' do
117
+ @reek.instance_variable_set(:@output, @lines12)
118
+ @reek.should be_reek_12
119
+ end
120
+
121
+ it 'correctly massages 1.2 output' do
122
+ @reek.instance_variable_set(:@output, @lines12)
123
+ @reek.massage_for_reek_12.should == @lines11
124
+ end
125
+ end
126
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'spec/autorun'
3
3
  require 'date'
4
+ require 'construct'
4
5
 
5
6
  require File.join(File.dirname(__FILE__), '/../lib/metric_fu.rb')
6
7
  include MetricFu
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metric_fu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Scruggs
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2009-12-02 00:00:00 -06:00
18
+ date: 2009-12-14 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,9 +34,9 @@ dependencies:
34
34
  version_requirement:
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
37
+ - - "="
38
38
  - !ruby/object:Gem::Version
39
- version: 2.1.0
39
+ version: 2.2.0
40
40
  version:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: relevance-rcov