edouard-metric_fu 1.0.2 → 1.0.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 (57) hide show
  1. data/README +1 -1
  2. data/Rakefile +4 -4
  3. data/spec/base/configuration_spec.rb +1 -1
  4. data/spec/base/generator_spec.rb +0 -22
  5. data/spec/generators/churn_spec.rb +7 -7
  6. data/spec/generators/flay_spec.rb +0 -3
  7. data/spec/generators/flog_spec.rb +1 -9
  8. data/spec/generators/reek_spec.rb +0 -1
  9. data/spec/generators/saikuro_spec.rb +11 -21
  10. metadata +18 -56
  11. data/lib/base/base_template.rb +0 -134
  12. data/lib/base/configuration.rb +0 -207
  13. data/lib/base/generator.rb +0 -160
  14. data/lib/base/graph.rb +0 -37
  15. data/lib/base/md5_tracker.rb +0 -52
  16. data/lib/base/report.rb +0 -100
  17. data/lib/generators/churn.rb +0 -91
  18. data/lib/generators/flay.rb +0 -34
  19. data/lib/generators/flog.rb +0 -133
  20. data/lib/generators/rcov.rb +0 -87
  21. data/lib/generators/reek.rb +0 -37
  22. data/lib/generators/roodi.rb +0 -31
  23. data/lib/generators/saikuro.rb +0 -209
  24. data/lib/generators/stats.rb +0 -43
  25. data/lib/graphs/flay_grapher.rb +0 -34
  26. data/lib/graphs/flog_grapher.rb +0 -37
  27. data/lib/graphs/rcov_grapher.rb +0 -34
  28. data/lib/graphs/reek_grapher.rb +0 -44
  29. data/lib/graphs/roodi_grapher.rb +0 -34
  30. data/lib/metric_fu.rb +0 -24
  31. data/lib/templates/awesome/awesome_template.rb +0 -30
  32. data/lib/templates/awesome/churn.html.erb +0 -19
  33. data/lib/templates/awesome/default.css +0 -66
  34. data/lib/templates/awesome/flay.html.erb +0 -27
  35. data/lib/templates/awesome/flog.html.erb +0 -46
  36. data/lib/templates/awesome/index.html.erb +0 -28
  37. data/lib/templates/awesome/layout.html.erb +0 -27
  38. data/lib/templates/awesome/rcov.html.erb +0 -36
  39. data/lib/templates/awesome/reek.html.erb +0 -34
  40. data/lib/templates/awesome/roodi.html.erb +0 -21
  41. data/lib/templates/awesome/saikuro.html.erb +0 -71
  42. data/lib/templates/awesome/stats.html.erb +0 -41
  43. data/lib/templates/standard/churn.html.erb +0 -31
  44. data/lib/templates/standard/default.css +0 -64
  45. data/lib/templates/standard/flay.html.erb +0 -34
  46. data/lib/templates/standard/flog.html.erb +0 -53
  47. data/lib/templates/standard/index.html.erb +0 -38
  48. data/lib/templates/standard/rcov.html.erb +0 -43
  49. data/lib/templates/standard/reek.html.erb +0 -42
  50. data/lib/templates/standard/roodi.html.erb +0 -29
  51. data/lib/templates/standard/saikuro.html.erb +0 -84
  52. data/lib/templates/standard/standard_template.rb +0 -26
  53. data/lib/templates/standard/stats.html.erb +0 -55
  54. data/tasks/metric_fu.rake +0 -19
  55. data/tasks/railroad.rake +0 -39
  56. data/vendor/_fonts/monaco.ttf +0 -0
  57. data/vendor/saikuro/saikuro.rb +0 -1214
@@ -1,37 +0,0 @@
1
- module MetricFu
2
-
3
- class Reek < Generator
4
- REEK_REGEX = /^(\S+) (.*) \((.*)\)$/
5
-
6
- def self.verify_dependencies!
7
- `reek --help`
8
- raise 'sudo gem install reek # if you want the reek tasks' unless $?.success?
9
- end
10
-
11
- def emit
12
- files_to_reek = MetricFu.reek[:dirs_to_reek].map{|dir| Dir[File.join(dir, "**/*.rb")] }
13
- @output = `reek #{files_to_reek.join(" ")}`
14
- end
15
-
16
- def analyze
17
- @matches = @output.chomp.split("\n\n").map{|m| m.split("\n") }
18
- @matches = @matches.map do |match|
19
- file_path = match.shift.split('--').first
20
- file_path = file_path.gsub('"', ' ').strip
21
- code_smells = match.map do |smell|
22
- match_object = smell.match(REEK_REGEX)
23
- next unless match_object
24
- {:method => match_object[1].strip,
25
- :message => match_object[2].strip,
26
- :type => match_object[3].strip}
27
- end.compact
28
- {:file_path => file_path, :code_smells => code_smells}
29
- end
30
- end
31
-
32
- def to_h
33
- {:reek => {:matches => @matches}}
34
- end
35
-
36
- end
37
- end
@@ -1,31 +0,0 @@
1
- module MetricFu
2
- class Roodi < Generator
3
-
4
- def self.verify_dependencies!
5
- `roodi --help`
6
- raise 'sudo gem install roodi # if you want the roodi tasks' unless $?.success?
7
- end
8
-
9
-
10
- def emit
11
- files_to_analyze = MetricFu.roodi[:dirs_to_roodi].map{|dir| Dir[File.join(dir, "**/*.rb")] }
12
- @output = `roodi #{files_to_analyze.join(" ")}`
13
- end
14
-
15
- def analyze
16
- @matches = @output.chomp.split("\n").map{|m| m.split(" - ") }
17
- total = @matches.pop
18
- @matches.reject! {|array| array.empty? }
19
- @matches.map! do |match|
20
- file, line = match[0].split(':')
21
- problem = match[1]
22
- {:file => file, :line => line, :problem => problem}
23
- end
24
- @roodi_results = {:total => total, :problems => @matches}
25
- end
26
-
27
- def to_h
28
- {:roodi => @roodi_results}
29
- end
30
- end
31
- end
@@ -1,209 +0,0 @@
1
- module MetricFu
2
-
3
- class Saikuro < Generator
4
-
5
- def emit
6
- relative_path = [File.dirname(__FILE__), '..', '..',
7
- 'vendor', 'saikuro', 'saikuro.rb']
8
- saikuro = File.expand_path(File.join(relative_path))
9
-
10
- format_directories
11
-
12
- options_string = MetricFu.saikuro.inject("") do |options, option|
13
- options + "--#{option.join(' ')} "
14
- end
15
-
16
- sh %{ruby "#{saikuro}" #{options_string}} do |ok, response|
17
- unless ok
18
- puts "Saikuro failed with exit status: #{response.exitstatus}"
19
- exit 1
20
- end
21
- end
22
- end
23
-
24
- def format_directories
25
- dirs = MetricFu.saikuro[:input_directory].join(" | ")
26
- dirs = "\"#{dirs}\""
27
- MetricFu.saikuro[:input_directory] = dirs
28
- end
29
-
30
- def analyze
31
- @files = []
32
- saikuro_results.each do |path|
33
- if Saikuro::SFile.is_valid_text_file?(path)
34
- file = Saikuro::SFile.new(path)
35
- if file
36
- @files << file
37
- end
38
- end
39
- end
40
- @files = @files.sort_by do |file|
41
- file.elements.
42
- max {|a,b| a.complexity.to_i <=> b.complexity.to_i}.
43
- complexity.to_i
44
- end
45
- @files.reverse!
46
- klasses = []
47
- @files.each {|f| klasses << f.elements}
48
- klasses.flatten!
49
- @classes = klasses.sort_by {|k| k.complexity.to_i}
50
- @classes.reverse!
51
- meths = []
52
- @files.each {|f|
53
- f.elements.each {|el|
54
- el.defs.each {|defn|
55
- defn.name = "#{el.name}##{defn.name}"
56
- meths << defn}
57
- }
58
- }
59
- meths = meths.sort_by {|meth| meth.complexity.to_i}
60
- @meths = meths.reverse
61
- end
62
-
63
- def to_h
64
- files = @files.map do |file|
65
- my_file = file.to_h
66
- my_file[:filename] = file.filename
67
- my_file
68
- end
69
- {:saikuro => {:files => files,
70
- :classes => @classes.map {|c| c.to_h},
71
- :methods => @meths.map {|m| m.to_h}
72
- }
73
- }
74
- end
75
-
76
- def saikuro_results
77
- Dir.glob("#{metric_directory}/**/*.html")
78
- end
79
- end
80
-
81
- class Saikuro::SFile
82
-
83
- attr_reader :elements
84
-
85
- def initialize(path)
86
- @path = path
87
- @file_handle = File.open(@path, "r")
88
- @elements = []
89
- get_elements
90
- end
91
-
92
- def self.is_valid_text_file?(path)
93
- File.open(path, "r") do |f|
94
- if f.eof? || !f.readline.match(/--/)
95
- return false
96
- else
97
- return true
98
- end
99
- end
100
- end
101
-
102
- def filename
103
- File.basename(@path, '_cyclo.html')
104
- end
105
-
106
- def to_h
107
- merge_classes
108
- {:classes => @elements}
109
- end
110
-
111
- def get_elements
112
- begin
113
- while (line = @file_handle.readline) do
114
- return [] if line.nil? || line !~ /\S/
115
- element ||= nil
116
- if line.match /START/
117
- unless element.nil?
118
- @elements << element
119
- element = nil
120
- end
121
- line = @file_handle.readline
122
- element = Saikuro::ParsingElement.new(line)
123
- elsif line.match /END/
124
- @elements << element unless element.nil?
125
- element = nil
126
- else
127
- element << line
128
- end
129
- end
130
- rescue EOFError
131
- nil
132
- end
133
- end
134
-
135
-
136
- def merge_classes
137
- new_elements = []
138
- get_class_names.each do |target_class|
139
- elements = @elements.find_all {|el| el.name == target_class }
140
- complexity = 0
141
- lines = 0
142
- defns = []
143
- elements.each do |el|
144
- complexity += el.complexity.to_i
145
- lines += el.lines.to_i
146
- defns << el.defs
147
- end
148
-
149
- new_element = {:class_name => target_class,
150
- :complexity => complexity,
151
- :lines => lines,
152
- :methods => defns.flatten.map {|d| d.to_h}}
153
- new_element[:methods] = new_element[:methods].
154
- sort_by {|x| x[:complexity] }.
155
- reverse
156
-
157
- new_elements << new_element
158
- end
159
- @elements = new_elements if new_elements
160
- end
161
-
162
- def get_class_names
163
- class_names = []
164
- @elements.each do |element|
165
- unless class_names.include?(element.name)
166
- class_names << element.name
167
- end
168
- end
169
- class_names
170
- end
171
-
172
- end
173
-
174
- class Saikuro::ParsingElement
175
- TYPE_REGEX=/Type:(.*) Name/
176
- NAME_REGEX=/Name:(.*) Complexity/
177
- COMPLEXITY_REGEX=/Complexity:(.*) Lines/
178
- LINES_REGEX=/Lines:(.*)/
179
-
180
- attr_reader :complexity, :lines, :defs, :element_type
181
- attr_accessor :name
182
-
183
- def initialize(line)
184
- @line = line
185
- @element_type = line.match(TYPE_REGEX)[1].strip
186
- @name = line.match(NAME_REGEX)[1].strip
187
- @complexity = line.match(COMPLEXITY_REGEX)[1].strip
188
- @lines = line.match(LINES_REGEX)[1].strip
189
- @defs = []
190
- end
191
-
192
- def <<(line)
193
- @defs << Saikuro::ParsingElement.new(line)
194
- end
195
-
196
- def to_h
197
- base = {:name => @name, :complexity => @complexity.to_i, :lines => @lines.to_i}
198
- unless @defs.empty?
199
- defs = @defs.map do |my_def|
200
- my_def = my_def.to_h
201
- my_def.delete(:defs)
202
- my_def
203
- end
204
- base[:defs] = defs
205
- end
206
- return base
207
- end
208
- end
209
- end
@@ -1,43 +0,0 @@
1
- module MetricFu
2
-
3
- class Stats < Generator
4
-
5
- def emit
6
- `rake stats > #{metric_directory + '/stats.txt'}`
7
- end
8
-
9
- def analyze
10
- output = File.open(metric_directory + '/stats.txt').read
11
- output = output.split("\n")
12
- output = output.find_all {|line| line[0].chr != "+" }
13
- output = output.find_all {|line| line[0].chr != "(" }
14
- output.shift
15
- totals = output.pop
16
- totals = totals.split(" ").find_all {|el| ! el.empty? }
17
- @stats = {}
18
- @stats[:codeLOC] = totals[0].match(/\d.*/)[0].to_i
19
- @stats[:testLOC] = totals[1].match(/\d.*/)[0].to_i
20
- @stats[:code_to_test_ratio] = totals[2].match(/1\:(\d.*)/)[1].to_f
21
-
22
- @stats[:lines] = output.map do |line|
23
- elements = line.split("|")
24
- elements.map! {|el| el.strip }
25
- elements = elements.find_all {|el| ! el.empty? }
26
- info_line = {}
27
- info_line[:name] = elements.shift
28
- elements.map! {|el| el.to_i }
29
- [:lines, :loc, :classes, :methods,
30
- :methods_per_class, :loc_per_method].each do |sym|
31
- info_line[sym] = elements.shift
32
- end
33
- info_line
34
- end
35
- @stats
36
- end
37
-
38
- def to_h
39
- {:stats => @stats}
40
- end
41
-
42
- end
43
- end
@@ -1,34 +0,0 @@
1
- require 'gruff'
2
- module MetricFu
3
-
4
- class FlayGrapher
5
-
6
- attr_accessor :flay_score, :labels
7
-
8
- def initialize
9
- self.flay_score = []
10
- self.labels = {}
11
- end
12
-
13
- def get_metrics(metrics, date)
14
- self.flay_score.push(metrics[:flay][:total_score].to_i)
15
- self.labels.update( { self.labels.size => date })
16
- end
17
-
18
- def graph!
19
- g = Gruff::Line.new(MetricFu.graph_size)
20
- g.title = "Flay: duplication"
21
- g.theme = MetricFu.graph_theme
22
- g.font = MetricFu.graph_font
23
- g.data('flay', self.flay_score)
24
- g.labels = self.labels
25
- g.title_font_size = MetricFu.graph_title_font_size
26
- g.legend_box_size = MetricFu.graph_legend_box_size
27
- g.legend_font_size = MetricFu.graph_legend_font_size
28
- g.marker_font_size = MetricFu.graph_marker_font_size
29
- g.write(File.join(MetricFu.output_directory, 'flay.png'))
30
- end
31
-
32
- end
33
-
34
- end
@@ -1,37 +0,0 @@
1
- require 'gruff'
2
- module MetricFu
3
-
4
- class FlogGrapher
5
-
6
- attr_accessor :flog_total, :flog_average, :labels
7
-
8
- def initialize
9
- self.flog_total = []
10
- self.flog_average = []
11
- self.labels = {}
12
- end
13
-
14
- def get_metrics(metrics, date)
15
- self.flog_total.push(metrics[:flog][:total])
16
- self.flog_average.push(metrics[:flog][:average])
17
- self.labels.update( { self.labels.size => date })
18
- end
19
-
20
- def graph!
21
- g = Gruff::Line.new(MetricFu.graph_size)
22
- g.title = "Flog: code complexity"
23
- g.theme = MetricFu.graph_theme
24
- g.font = MetricFu.graph_font
25
- g.data('flog total', self.flog_total)
26
- g.data('flog average', self.flog_average)
27
- g.labels = self.labels
28
- g.title_font_size = MetricFu.graph_title_font_size
29
- g.legend_box_size = MetricFu.graph_legend_box_size
30
- g.legend_font_size = MetricFu.graph_legend_font_size
31
- g.marker_font_size = MetricFu.graph_marker_font_size
32
- g.write(File.join(MetricFu.output_directory, 'flog.png'))
33
- end
34
-
35
- end
36
-
37
- end
@@ -1,34 +0,0 @@
1
- require 'gruff'
2
- module MetricFu
3
-
4
- class RcovGrapher
5
-
6
- attr_accessor :rcov_percent, :labels
7
-
8
- def initialize
9
- self.rcov_percent = []
10
- self.labels = {}
11
- end
12
-
13
- def get_metrics(metrics, date)
14
- self.rcov_percent.push(metrics[:rcov][:global_percent_run])
15
- self.labels.update( { self.labels.size => date })
16
- end
17
-
18
- def graph!
19
- g = Gruff::Line.new(MetricFu.graph_size)
20
- g.title = "Rcov: code coverage"
21
- g.theme = MetricFu.graph_theme
22
- g.font = MetricFu.graph_font
23
- g.data('rcov', self.rcov_percent)
24
- g.labels = self.labels
25
- g.title_font_size = MetricFu.graph_title_font_size
26
- g.legend_box_size = MetricFu.graph_legend_box_size
27
- g.legend_font_size = MetricFu.graph_legend_font_size
28
- g.marker_font_size = MetricFu.graph_marker_font_size
29
- g.write(File.join(MetricFu.output_directory, 'rcov.png'))
30
- end
31
-
32
- end
33
-
34
- end
@@ -1,44 +0,0 @@
1
- require 'gruff'
2
- module MetricFu
3
-
4
- class ReekGrapher
5
-
6
- attr_accessor :reek_count, :labels
7
-
8
- def initialize
9
- self.reek_count = {}
10
- self.labels= {}
11
- end
12
-
13
- def get_metrics(metrics, date)
14
- counter = self.labels.size
15
- self.labels.update( { counter => date })
16
-
17
- metrics[:reek][:matches].each do |reek_chunk|
18
- reek_chunk[:code_smells].each do |code_smell|
19
- # speaking of code smell...
20
- self.reek_count[code_smell[:type]] = [] if self.reek_count[code_smell[:type]].nil?
21
- self.reek_count[code_smell[:type]][counter].nil? ? self.reek_count[code_smell[:type]][counter] = 1 : self.reek_count[code_smell[:type]][counter] += 1
22
- end
23
- end
24
- end
25
-
26
- def graph!
27
- g = Gruff::Line.new(MetricFu.graph_size)
28
- g.title = "Reek: code smells"
29
- g.theme = MetricFu.graph_theme
30
- g.font = MetricFu.graph_font
31
- self.reek_count.each_pair do |type, count|
32
- g.data(type, count)
33
- end
34
- g.labels = self.labels
35
- g.title_font_size = MetricFu.graph_title_font_size
36
- g.legend_box_size = MetricFu.graph_legend_box_size
37
- g.legend_font_size = MetricFu.graph_legend_font_size
38
- g.marker_font_size = MetricFu.graph_marker_font_size
39
- g.write(File.join(MetricFu.output_directory, 'reek.png'))
40
- end
41
-
42
- end
43
-
44
- end