p8-metric_fu 0.8.0.16 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/README +17 -63
  2. data/Rakefile +1 -1
  3. data/lib/metric_fu/base.rb +8 -114
  4. data/lib/metric_fu/churn.rb +7 -8
  5. data/lib/metric_fu/flay_reporter.rb +17 -0
  6. data/lib/metric_fu/flog_reporter/base.rb +49 -0
  7. data/lib/metric_fu/flog_reporter/generator.rb +39 -0
  8. data/lib/metric_fu/flog_reporter/operator.rb +10 -0
  9. data/lib/metric_fu/flog_reporter/page.rb +33 -0
  10. data/lib/metric_fu/flog_reporter/scanned_method.rb +28 -0
  11. data/lib/metric_fu/flog_reporter.rb +5 -0
  12. data/lib/tasks/churn.rake +3 -1
  13. data/lib/tasks/coverage.rake +35 -49
  14. data/lib/tasks/flay.rake +4 -1
  15. data/lib/tasks/flog.rake +10 -10
  16. data/lib/tasks/metric_fu.rake +4 -8
  17. data/lib/tasks/metric_fu.rb +1 -1
  18. data/lib/tasks/saikuro.rake +1 -1
  19. data/lib/tasks/stats.rake +1 -1
  20. data/lib/templates/churn.css +38 -0
  21. data/lib/templates/churn.html.erb +3 -6
  22. data/lib/templates/flay.css +38 -0
  23. data/lib/templates/flay.html.erb +10 -17
  24. data/lib/templates/flog.css +39 -0
  25. data/lib/templates/flog.html.erb +14 -19
  26. data/lib/templates/flog_page.html.erb +3 -15
  27. data/spec/base_spec.rb +8 -30
  28. data/spec/churn_spec.rb +3 -10
  29. data/spec/{flay_spec.rb → flay_reporter_spec.rb} +2 -9
  30. data/spec/flog_reporter/base_spec.rb +69 -0
  31. data/spec/md5_tracker_spec.rb +3 -1
  32. data/spec/spec_helper.rb +3 -7
  33. metadata +17 -41
  34. data/Manifest.txt +0 -25
  35. data/lib/metric_fu/flay.rb +0 -17
  36. data/lib/metric_fu/flog.rb +0 -139
  37. data/lib/metric_fu/reek.rb +0 -17
  38. data/lib/metric_fu/roodi.rb +0 -17
  39. data/lib/tasks/railroad.rake +0 -36
  40. data/lib/tasks/reek.rake +0 -6
  41. data/lib/tasks/roodi.rake +0 -7
  42. data/lib/templates/default.css +0 -45
  43. data/lib/templates/reek.html.erb +0 -30
  44. data/lib/templates/roodi.html.erb +0 -26
  45. data/spec/config_spec.rb +0 -110
  46. data/spec/flog_spec.rb +0 -147
  47. data/spec/reek_spec.rb +0 -26
@@ -1,139 +0,0 @@
1
- module MetricFu
2
-
3
- def self.generate_flog_report
4
- Flog::Generator.generate_report
5
- system("open #{Flog::Generator.metric_dir}/index.html") if open_in_browser?
6
- end
7
-
8
- module Flog
9
- class Generator < Base::Generator
10
- def generate_report
11
- @base_dir = self.class.metric_dir
12
- pages = []
13
- flog_results.each do |filename|
14
- page = Base.parse(open(filename, "r") { |f| f.read })
15
- if page
16
- page.filename = filename
17
- pages << page
18
- end
19
- end
20
- generate_pages(pages)
21
- end
22
-
23
- def generate_pages(pages)
24
- pages.each do |page|
25
- unless MetricFu::MD5Tracker.file_already_counted?(page.filename)
26
- generate_page(page)
27
- end
28
- end
29
- save_html(ERB.new(File.read(template_file)).result(binding))
30
- end
31
-
32
- def generate_page(page)
33
- save_html(page.to_html, page.path)
34
- end
35
-
36
- def flog_results
37
- Dir.glob("#{@base_dir}/**/*.txt")
38
- end
39
-
40
- def template_name
41
- "flog"
42
- end
43
- end
44
-
45
- SCORE_FORMAT = "%0.2f"
46
-
47
- class Base
48
- MODULE_NAME = "([A-Za-z]+)+"
49
- METHOD_NAME = "#([a-z0-9]+_?)+\\??\\!?"
50
- SCORE = "\\d+\\.\\d+"
51
-
52
- METHOD_NAME_RE = Regexp.new("#{MODULE_NAME}#{METHOD_NAME}")
53
- SCORE_RE = Regexp.new(SCORE)
54
-
55
- METHOD_LINE_RE = Regexp.new("#{MODULE_NAME}#{METHOD_NAME}:\\s\\(#{SCORE}\\)")
56
- OPERATOR_LINE_RE = Regexp.new("\\s+(#{SCORE}):\\s(.*)$")
57
-
58
- class << self
59
-
60
- def parse(text)
61
- score = text[/\w+ = (\d+\.\d+)/, 1]
62
- return nil unless score
63
- page = Page.new(score)
64
-
65
- text.each_line do |method_line|
66
- if METHOD_LINE_RE =~ method_line and
67
- method_name = method_line[METHOD_NAME_RE] and
68
- score = method_line[SCORE_RE]
69
- page.scanned_methods << ScannedMethod.new(method_name, score)
70
- end
71
-
72
- if OPERATOR_LINE_RE =~ method_line and
73
- operator = method_line[OPERATOR_LINE_RE, 2] and
74
- score = method_line[SCORE_RE]
75
- return if page.scanned_methods.empty?
76
- page.scanned_methods.last.operators << Operator.new(score, operator)
77
- end
78
- end
79
- page
80
- end
81
- end
82
- end
83
-
84
- class Page < MetricFu::Base::Generator
85
- attr_accessor :filename, :score, :scanned_methods
86
-
87
- def initialize(score, scanned_methods = [])
88
- @score = score.to_f
89
- @scanned_methods = scanned_methods
90
- end
91
-
92
- def path
93
- @path ||= File.basename(filename, ".txt") + '.html'
94
- end
95
-
96
- def to_html
97
- ERB.new(File.read(template_file)).result(binding)
98
- end
99
-
100
- def average_score
101
- return 0 if scanned_methods.length == 0
102
- sum = 0
103
- scanned_methods.each do |m|
104
- sum += m.score
105
- end
106
- sum / scanned_methods.length
107
- end
108
-
109
- def highest_score
110
- scanned_methods.inject(0) do |highest, m|
111
- m.score > highest ? m.score : highest
112
- end
113
- end
114
-
115
- def template_name
116
- 'flog_page'
117
- end
118
- end
119
-
120
- class Operator
121
- attr_accessor :score, :operator
122
-
123
- def initialize(score, operator)
124
- @score = score.to_f
125
- @operator = operator
126
- end
127
- end
128
-
129
- class ScannedMethod
130
- attr_accessor :name, :score, :operators
131
-
132
- def initialize(name, score, operators = [])
133
- @name = name
134
- @score = score.to_f
135
- @operators = operators
136
- end
137
- end
138
- end
139
- end
@@ -1,17 +0,0 @@
1
- module MetricFu
2
-
3
- def self.generate_reek_report
4
- Reek.generate_report
5
- system("open #{Reek.metric_dir}/index.html") if open_in_browser?
6
- end
7
-
8
- class Reek < Base::Generator
9
-
10
- def analyze
11
- files_to_reek = MetricFu.reek[:dirs_to_reek].map{|dir| Dir[File.join(dir, "**/*.rb")] }
12
- output = `reek #{files_to_reek.join(" ")}`
13
- @matches = output.chomp.split("\n\n").map{|m| m.split("\n") }
14
- end
15
-
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- module MetricFu
2
-
3
- def self.generate_roodi_report
4
- MetricFu::Roodi.generate_report
5
- system("open #{Roodi.metric_dir}/index.html") if open_in_browser?
6
- end
7
-
8
- class Roodi < Base::Generator
9
-
10
- def analyze
11
- files_to_analyze = MetricFu.roodi[:dirs_to_roodi].map{|dir| Dir[File.join(dir, "**/*.rb")] }
12
- output = `roodi #{files_to_analyze.join(" ")}`
13
- @matches = output.chomp.split("\n").map{|m| m.split(" - ") }
14
- end
15
-
16
- end
17
- end
@@ -1,36 +0,0 @@
1
- namespace :metrics do
2
-
3
- RAILROAD_DIR = File.join(MetricFu::BASE_DIRECTORY, 'railroad')
4
- RAILROAD_INDEX = File.join(RAILROAD_DIR, 'index.html')
5
-
6
- task :railroad => ['railroad:all'] do
7
- end
8
-
9
- namespace :railroad do
10
-
11
- desc "Create all railroad reports"
12
- task :all => [:models, :controllers, :aasm] do
13
- #system("open #{RAILROAD_INDEX}") if PLATFORM['darwin']
14
- end
15
-
16
- desc "Create a railroad models report"
17
- task :models do
18
- mkdir_p(RAILROAD_DIR) unless File.directory?(RAILROAD_DIR)
19
- `railroad -M -a -m -l -v | neato -Tpng > #{File.join(RAILROAD_DIR,'models.png')}`
20
- end
21
-
22
- desc "Create a railroad controllers report"
23
- task :controllers do
24
- mkdir_p(RAILROAD_DIR) unless File.directory?(RAILROAD_DIR)
25
- `railroad -C -l -v | neato -Tpng > #{File.join(RAILROAD_DIR,'controllers.png')}`
26
- end
27
-
28
- desc "Create a railroad acts_as_state_machine report"
29
- task :aasm do
30
- mkdir_p(RAILROAD_DIR) unless File.directory?(RAILROAD_DIR)
31
- `railroad -A -l -v | neato -Tpng > #{File.join(RAILROAD_DIR,'aasm.png')}`
32
- end
33
-
34
- end
35
-
36
- end
data/lib/tasks/reek.rake DELETED
@@ -1,6 +0,0 @@
1
- namespace :metrics do
2
- desc "A code smell report using Reek"
3
- task :reek do
4
- MetricFu.generate_reek_report
5
- end
6
- end
data/lib/tasks/roodi.rake DELETED
@@ -1,7 +0,0 @@
1
- namespace :metrics do
2
-
3
- desc "A Ruby coding standards report using Roodi"
4
- task :roodi do
5
- MetricFu.generate_roodi_report
6
- end
7
- end
@@ -1,45 +0,0 @@
1
- body {
2
- background-color: #efefef;
3
- margin: 20px;
4
- padding: 0;
5
- font: 12px verdana, arial, helvetica;
6
- }
7
-
8
- table {
9
- border-collapse: collapse;
10
- border: 1px solid #666;
11
- background: #fff;
12
- margin-bottom: 20px;
13
- }
14
-
15
- table tr.light {
16
- background: #fff;
17
- }
18
-
19
- table tr.dark {
20
- background: #f9f9f9;
21
- }
22
-
23
- table td, table th {
24
- padding: 4px 10px;
25
- font-size: 13px;
26
- }
27
- table th {
28
- text-align: center;
29
- color: #fc0;
30
- background: #336;
31
- font-weight: bold;
32
- border: #d0d0d0 1px solid;
33
- }
34
-
35
- table td {
36
- border: #d0d0d0 1px solid;
37
- }
38
-
39
- table td.score {
40
- text-align: right;
41
- }
42
-
43
- .warning {
44
- background: yellow;
45
- }
@@ -1,30 +0,0 @@
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>
@@ -1,26 +0,0 @@
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/config_spec.rb DELETED
@@ -1,110 +0,0 @@
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