edouard-metric_fu 1.0.3.8 → 1.0.4
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/README +1 -1
- data/Rakefile +4 -4
- data/lib/base/configuration.rb +15 -0
- data/lib/base/generator.rb +9 -2
- data/lib/base/graph.rb +37 -0
- data/lib/generators/rcov.rb +0 -1
- data/lib/graphs/flay_grapher.rb +31 -0
- data/lib/graphs/flog_grapher.rb +34 -0
- data/lib/graphs/rcov_grapher.rb +31 -0
- data/lib/graphs/reek_grapher.rb +41 -0
- data/lib/graphs/roodi_grapher.rb +31 -0
- data/lib/metric_fu.rb +3 -0
- data/lib/templates/awesome/flay.html.erb +8 -1
- data/lib/templates/awesome/flog.html.erb +6 -0
- data/lib/templates/awesome/rcov.html.erb +6 -0
- data/lib/templates/awesome/reek.html.erb +6 -0
- data/lib/templates/awesome/roodi.html.erb +6 -0
- data/tasks/metric_fu.rake +6 -2
- data/vendor/_fonts/monaco.ttf +0 -0
- metadata +20 -3
data/README
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
Same as jscruggs/metric_fu, but with awesome templates and graphs.
|
data/Rakefile
CHANGED
@@ -20,8 +20,8 @@ namespace :metrics do
|
|
20
20
|
task :all do
|
21
21
|
MetricFu.metrics.each {|metric| MetricFu.report.add(metric) }
|
22
22
|
MetricFu.report.save_output(MetricFu.report.to_yaml,
|
23
|
-
MetricFu.
|
24
|
-
|
23
|
+
MetricFu.data_directory,
|
24
|
+
"#{Time.now.strftime("%Y%m%d")}.yml")
|
25
25
|
MetricFu.report.save_templatized_report
|
26
26
|
if MetricFu.report.open_in_browser?
|
27
27
|
MetricFu.report.show_in_browser(MetricFu.output_directory)
|
@@ -34,8 +34,8 @@ namespace :metrics do
|
|
34
34
|
|
35
35
|
MetricFu.report.add(metric)
|
36
36
|
MetricFu.report.save_output(MetricFu.report.to_yaml,
|
37
|
-
MetricFu.
|
38
|
-
|
37
|
+
MetricFu.data_directory,
|
38
|
+
"#{Time.now.strftime("%Y%m%d")}.yml")
|
39
39
|
MetricFu.report.save_templatized_report
|
40
40
|
if MetricFu.report.open_in_browser?
|
41
41
|
MetricFu.report.show_in_browser(MetricFu.output_directory)
|
data/lib/base/configuration.rb
CHANGED
@@ -8,6 +8,7 @@ module MetricFu
|
|
8
8
|
AVAILABLE_METRICS = [:churn, :flog, :flay, :reek,
|
9
9
|
:roodi, :saikuro, :rcov]
|
10
10
|
|
11
|
+
AVAILABLE_GRAPHS = [:flog, :flay, :reek, :roodi, :rcov]
|
11
12
|
|
12
13
|
# The @@configuration class variable holds a global type configuration
|
13
14
|
# object for any parts of the system to use.
|
@@ -118,12 +119,14 @@ module MetricFu
|
|
118
119
|
@base_directory = ENV['CC_BUILD_ARTIFACTS'] || 'tmp/metric_fu'
|
119
120
|
@scratch_directory = File.join(@base_directory, 'scratch')
|
120
121
|
@output_directory = File.join(@base_directory, 'output')
|
122
|
+
@data_directory = File.join(@base_directory, '_data')
|
121
123
|
@metric_fu_root_directory = File.join(File.dirname(__FILE__),
|
122
124
|
'..', '..')
|
123
125
|
@template_directory = File.join(@metric_fu_root_directory,
|
124
126
|
'lib', 'templates')
|
125
127
|
@template_class = AwesomeTemplate
|
126
128
|
set_metrics
|
129
|
+
set_graphs
|
127
130
|
set_code_dirs
|
128
131
|
@flay = { :dirs_to_flay => @code_dirs }
|
129
132
|
@flog = { :dirs_to_flog => @code_dirs }
|
@@ -147,6 +150,14 @@ module MetricFu
|
|
147
150
|
"--profile",
|
148
151
|
"--rails",
|
149
152
|
"--exclude /gems/,/Library/,/usr/,spec"]}
|
153
|
+
|
154
|
+
@graph_theme = { :colors => %w(orange purple green white red blue pink yellow),
|
155
|
+
:marker_color => 'blue',
|
156
|
+
:background_colors => %w(white white)}
|
157
|
+
|
158
|
+
relative_font_path = [File.dirname(__FILE__), '..', '..', 'vendor', '_fonts', 'monaco.ttf']
|
159
|
+
@graph_font = File.expand_path(File.join(relative_font_path))
|
160
|
+
|
150
161
|
end
|
151
162
|
|
152
163
|
# Perform a simple check to try and guess if we're running
|
@@ -166,6 +177,10 @@ module MetricFu
|
|
166
177
|
@metrics = MetricFu::AVAILABLE_METRICS
|
167
178
|
end
|
168
179
|
end
|
180
|
+
|
181
|
+
def set_graphs
|
182
|
+
@graphs = MetricFu::AVAILABLE_GRAPHS
|
183
|
+
end
|
169
184
|
|
170
185
|
# Add the 'app' directory if we're running within rails.
|
171
186
|
def set_code_dirs
|
data/lib/base/generator.rb
CHANGED
@@ -35,6 +35,7 @@ module MetricFu
|
|
35
35
|
def initialize(options={})
|
36
36
|
create_metric_dir_if_missing
|
37
37
|
create_output_dir_if_missing
|
38
|
+
create_data_dir_if_missing
|
38
39
|
end
|
39
40
|
|
40
41
|
# Creates a new generator and returns the output of the
|
@@ -82,6 +83,12 @@ module MetricFu
|
|
82
83
|
FileUtils.mkdir_p(MetricFu.output_directory, :verbose => false)
|
83
84
|
end
|
84
85
|
end
|
86
|
+
|
87
|
+
def create_data_dir_if_missing #:nodoc:
|
88
|
+
unless File.directory?(MetricFu.data_directory)
|
89
|
+
FileUtils.mkdir_p(MetricFu.data_directory, :verbose => false)
|
90
|
+
end
|
91
|
+
end
|
85
92
|
|
86
93
|
# @return String
|
87
94
|
# The path of the metric directory this class is using.
|
@@ -135,8 +142,8 @@ module MetricFu
|
|
135
142
|
information.
|
136
143
|
EOF
|
137
144
|
end
|
138
|
-
|
139
|
-
def
|
145
|
+
|
146
|
+
def to_graph #:nodoc:
|
140
147
|
raise <<-EOF
|
141
148
|
This method must be implemented by a concrete class descending
|
142
149
|
from Generator. See generator class documentation for more
|
data/lib/base/graph.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module MetricFu
|
2
|
+
|
3
|
+
def self.graph
|
4
|
+
@graph ||= Graph.new
|
5
|
+
end
|
6
|
+
|
7
|
+
class Graph
|
8
|
+
|
9
|
+
attr_accessor :clazz
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
self.clazz = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(graph_type)
|
16
|
+
grapher_name = graph_type.to_s.capitalize + "Grapher"
|
17
|
+
self.clazz.push MetricFu.const_get(grapher_name).new
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def generate
|
22
|
+
puts "Generating graphs"
|
23
|
+
Dir[File.join(MetricFu.data_directory, '*.yml')].each do |metric_file|
|
24
|
+
puts "Generating graphs for #{metric_file}"
|
25
|
+
date = metric_file.split('/')[3].split('.')[0]
|
26
|
+
metrics = YAML::load(File.open(metric_file))
|
27
|
+
|
28
|
+
self.clazz.each do |grapher|
|
29
|
+
grapher.get_metrics(metrics, date)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
self.clazz.each do |grapher|
|
33
|
+
grapher.graph!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/generators/rcov.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'graph'
|
2
|
+
require 'gruff'
|
3
|
+
module MetricFu
|
4
|
+
|
5
|
+
class FlayGrapher
|
6
|
+
|
7
|
+
attr_accessor :flay_score, :labels
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.flay_score = []
|
11
|
+
self.labels = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_metrics(metrics, date)
|
15
|
+
self.flay_score.push(metrics[:flay][:total_score].to_i)
|
16
|
+
self.labels.update( { self.labels.size => date })
|
17
|
+
end
|
18
|
+
|
19
|
+
def graph!
|
20
|
+
g = Gruff::Line.new("1024x768")
|
21
|
+
g.title = "Flay: duplication"
|
22
|
+
g.theme = MetricFu.graph_theme
|
23
|
+
g.font = MetricFu.graph_font
|
24
|
+
g.data('flay', self.flay_score)
|
25
|
+
g.labels = self.labels
|
26
|
+
g.write(File.join(MetricFu.output_directory, 'flay.png'))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'graph'
|
2
|
+
require 'gruff'
|
3
|
+
module MetricFu
|
4
|
+
|
5
|
+
class FlogGrapher
|
6
|
+
|
7
|
+
attr_accessor :flog_total, :flog_average, :labels
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.flog_total = []
|
11
|
+
self.flog_average = []
|
12
|
+
self.labels = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_metrics(metrics, date)
|
16
|
+
self.flog_total.push(metrics[:flog][:total])
|
17
|
+
self.flog_average.push(metrics[:flog][:average])
|
18
|
+
self.labels.update( { self.labels.size => date })
|
19
|
+
end
|
20
|
+
|
21
|
+
def graph!
|
22
|
+
g = Gruff::Line.new("1024x768")
|
23
|
+
g.title = "Flog: code complexity"
|
24
|
+
g.theme = MetricFu.graph_theme
|
25
|
+
g.font = MetricFu.graph_font
|
26
|
+
g.data('flog total', self.flog_total)
|
27
|
+
g.data('flog average', self.flog_average)
|
28
|
+
g.labels = self.labels
|
29
|
+
g.write(File.join(MetricFu.output_directory, 'flog.png'))
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'graph'
|
2
|
+
require 'gruff'
|
3
|
+
module MetricFu
|
4
|
+
|
5
|
+
class RcovGrapher
|
6
|
+
|
7
|
+
attr_accessor :rcov_percent, :labels
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.rcov_percent = []
|
11
|
+
self.labels = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_metrics(metrics, date)
|
15
|
+
self.rcov_percent.push(metrics[:rcov][:global_percent_run])
|
16
|
+
self.labels.update( { self.labels.size => date })
|
17
|
+
end
|
18
|
+
|
19
|
+
def graph!
|
20
|
+
g = Gruff::Line.new("1024x768")
|
21
|
+
g.title = "Rcov: code coverage"
|
22
|
+
g.theme = MetricFu.graph_theme
|
23
|
+
g.font = MetricFu.graph_font
|
24
|
+
g.data('rcov', self.rcov_percent)
|
25
|
+
g.labels = self.labels
|
26
|
+
g.write(File.join(MetricFu.output_directory, 'rcov.png'))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'graph'
|
2
|
+
require 'gruff'
|
3
|
+
module MetricFu
|
4
|
+
|
5
|
+
class ReekGrapher
|
6
|
+
|
7
|
+
attr_accessor :reek_count, :labels
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.reek_count = {}
|
11
|
+
self.labels= {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_metrics(metrics, date)
|
15
|
+
counter = self.labels.size
|
16
|
+
self.labels.update( { counter => date })
|
17
|
+
|
18
|
+
metrics[:reek][:matches].each do |reek_chunk|
|
19
|
+
reek_chunk[:code_smells].each do |code_smell|
|
20
|
+
# speaking of code smell...
|
21
|
+
self.reek_count[code_smell[:type]] = [] if self.reek_count[code_smell[:type]].nil?
|
22
|
+
self.reek_count[code_smell[:type]][counter].nil? ? self.reek_count[code_smell[:type]][counter] = 1 : self.reek_count[code_smell[:type]][counter] += 1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def graph!
|
28
|
+
g = Gruff::Line.new("1024x768")
|
29
|
+
g.title = "Reek: code smells"
|
30
|
+
g.theme = MetricFu.graph_theme
|
31
|
+
g.font = MetricFu.graph_font
|
32
|
+
self.reek_count.each_pair do |type, count|
|
33
|
+
g.data(type, count)
|
34
|
+
end
|
35
|
+
g.labels = self.labels
|
36
|
+
g.write(File.join(MetricFu.output_directory, 'reek.png'))
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'graph'
|
2
|
+
require 'gruff'
|
3
|
+
module MetricFu
|
4
|
+
|
5
|
+
class RoodiGrapher
|
6
|
+
|
7
|
+
attr_accessor :roodi_count, :labels
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.roodi_count = []
|
11
|
+
self.labels = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_metrics(metrics, date)
|
15
|
+
self.roodi_count.push(metrics[:roodi][:problems].size)
|
16
|
+
self.labels.update( { self.labels.size => date })
|
17
|
+
end
|
18
|
+
|
19
|
+
def graph!
|
20
|
+
g = Gruff::Line.new("1024x768")
|
21
|
+
g.title = "Roodi: design problems"
|
22
|
+
g.theme = MetricFu.graph_theme
|
23
|
+
g.font = MetricFu.graph_font
|
24
|
+
g.data('roodi', self.roodi_count)
|
25
|
+
g.labels = self.labels
|
26
|
+
g.write(File.join(MetricFu.output_directory, 'roodi.png'))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/metric_fu.rb
CHANGED
@@ -5,11 +5,13 @@ end
|
|
5
5
|
base_dir = File.join(MetricFu::LIB_ROOT, 'base')
|
6
6
|
generator_dir = File.join(MetricFu::LIB_ROOT, 'generators')
|
7
7
|
template_dir = File.join(MetricFu::LIB_ROOT, 'templates')
|
8
|
+
graph_dir = File.join(MetricFu::LIB_ROOT, 'graphs')
|
8
9
|
|
9
10
|
# We need to require these two things first because our other classes
|
10
11
|
# depend on them.
|
11
12
|
require File.join(base_dir, 'report')
|
12
13
|
require File.join(base_dir, 'generator')
|
14
|
+
require File.join(base_dir, 'graph')
|
13
15
|
|
14
16
|
# Load the rakefile so users of the gem get the default metric_fu task
|
15
17
|
load File.join(MetricFu::LIB_ROOT, '..', 'tasks', 'metric_fu.rake')
|
@@ -19,3 +21,4 @@ Dir[File.join(base_dir, '*.rb')].each{|l| require l }
|
|
19
21
|
Dir[File.join(generator_dir, '*.rb')].each {|l| require l }
|
20
22
|
Dir[File.join(template_dir, 'standard/*.rb')].each {|l| require l}
|
21
23
|
Dir[File.join(template_dir, 'awesome/*.rb')].each {|l| require l}
|
24
|
+
Dir[File.join(graph_dir, '*.rb')].each {|l| require l}
|
@@ -1,6 +1,13 @@
|
|
1
1
|
<h3>Flay Results</h3>
|
2
|
+
|
3
|
+
<p><a href='http://ruby.sadi.st/Flay.html'>Flay</a> analyzes ruby code for structural similarities.</p>
|
4
|
+
|
5
|
+
<a href="flay.png?<%= Time.now.localtime %>">
|
6
|
+
<img src="flay.png?<%= Time.now.localtime %>" width="400">
|
7
|
+
</a>
|
8
|
+
|
2
9
|
<h4>Total Score (lower is better): <%= @flay[:total_score] %></h4>
|
3
|
-
|
10
|
+
|
4
11
|
<table>
|
5
12
|
<tr>
|
6
13
|
<th>Files</th>
|
@@ -1,7 +1,13 @@
|
|
1
1
|
<h3>Flog Results</h3>
|
2
2
|
<p><a href='http://ruby.sadi.st/Flog.html'>Flog</a> measures code complexity.</p>
|
3
|
+
|
4
|
+
<a href="flog.png?<%= Time.now.localtime %>">
|
5
|
+
<img src="flog.png?<%= Time.now.localtime %>" width="400">
|
6
|
+
</a>
|
7
|
+
|
3
8
|
<h2>Total Flog score for all methods: <%= @flog[:total]%></h2>
|
4
9
|
<h2>Average Flog score for all methods: <%= @flog[:average]%></h2>
|
10
|
+
|
5
11
|
<table>
|
6
12
|
<tr>
|
7
13
|
<th>File</th>
|
@@ -1,5 +1,11 @@
|
|
1
1
|
<h3>Rcov Code Coverage Results</h3>
|
2
|
+
|
2
3
|
<p>C0 code coverage information.</p>
|
4
|
+
|
5
|
+
<a href="rcov.png?<%= Time.now.localtime %>">
|
6
|
+
<img src="rcov.png?<%= Time.now.localtime %>" width="400">
|
7
|
+
</a>
|
8
|
+
|
3
9
|
<p>Total Coverage: <%= @rcov.delete(:global_percent_run) %>% </p>
|
4
10
|
<table>
|
5
11
|
<tr>
|
@@ -1,5 +1,11 @@
|
|
1
1
|
<h3>Reek Results</h3>
|
2
|
+
|
2
3
|
<p><a href="http://reek.rubyforge.org/">Reek</a> detects common code smells in ruby code.</p>
|
4
|
+
|
5
|
+
<a href="reek.png?<%= Time.now.localtime %>">
|
6
|
+
<img src="reek.png?<%= Time.now.localtime %>" width="400">
|
7
|
+
</a>
|
8
|
+
|
3
9
|
<table>
|
4
10
|
<tr>
|
5
11
|
<th>File Path</th>
|
@@ -1,5 +1,11 @@
|
|
1
1
|
<h3>Roodi Results</h3>
|
2
|
+
|
2
3
|
<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>
|
4
|
+
|
5
|
+
<a href="roodi.png?<%= Time.now.localtime %>">
|
6
|
+
<img src="roodi.png?<%= Time.now.localtime %>" width="400">
|
7
|
+
</a>
|
8
|
+
|
3
9
|
<table>
|
4
10
|
<tr>
|
5
11
|
<th>File Path</th>
|
data/tasks/metric_fu.rake
CHANGED
@@ -5,9 +5,13 @@ namespace :metrics do
|
|
5
5
|
MetricFu::Configuration.run {}
|
6
6
|
MetricFu.metrics.each {|metric| MetricFu.report.add(metric) }
|
7
7
|
MetricFu.report.save_output(MetricFu.report.to_yaml,
|
8
|
-
MetricFu.
|
9
|
-
|
8
|
+
MetricFu.data_directory,
|
9
|
+
"#{Time.now.strftime("%Y%m%d")}.yml")
|
10
10
|
MetricFu.report.save_templatized_report
|
11
|
+
|
12
|
+
MetricFu.graphs.each {|graph| MetricFu.graph.add(graph) }
|
13
|
+
MetricFu.graph.generate
|
14
|
+
|
11
15
|
if MetricFu.report.open_in_browser?
|
12
16
|
MetricFu.report.show_in_browser(MetricFu.output_directory)
|
13
17
|
end
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: edouard-metric_fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Scruggs
|
@@ -78,8 +78,18 @@ dependencies:
|
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: 0.3.0
|
80
80
|
version:
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: topfunky-gruff
|
83
|
+
type: :runtime
|
84
|
+
version_requirement:
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.5
|
90
|
+
version:
|
81
91
|
description: Code metrics from Flog, Flay, RCov, Saikuro, Churn, Reek, Roodi and Rails' stats task
|
82
|
-
email:
|
92
|
+
email: edouard.briere@gmail.com
|
83
93
|
executables: []
|
84
94
|
|
85
95
|
extensions: []
|
@@ -131,7 +141,14 @@ files:
|
|
131
141
|
- lib/templates/awesome/awesome_template.rb
|
132
142
|
- lib/templates/awesome/stats.html.erb
|
133
143
|
- lib/templates/awesome/layout.html.erb
|
144
|
+
- lib/base/graph.rb
|
145
|
+
- lib/graphs/flay_grapher.rb
|
146
|
+
- lib/graphs/flog_grapher.rb
|
147
|
+
- lib/graphs/rcov_grapher.rb
|
148
|
+
- lib/graphs/reek_grapher.rb
|
149
|
+
- lib/graphs/roodi_grapher.rb
|
134
150
|
- tasks/metric_fu.rake
|
151
|
+
- vendor/_fonts/monaco.ttf
|
135
152
|
- tasks/railroad.rake
|
136
153
|
- vendor/saikuro/saikuro.rb
|
137
154
|
- Manifest.txt
|
@@ -161,7 +178,7 @@ rubyforge_project:
|
|
161
178
|
rubygems_version: 1.2.0
|
162
179
|
signing_key:
|
163
180
|
specification_version: 2
|
164
|
-
summary: A fistful of code metrics
|
181
|
+
summary: A fistful of code metrics, with awesome templates and graphs
|
165
182
|
test_files:
|
166
183
|
- spec/base/base_template_spec.rb
|
167
184
|
- spec/base/configuration_spec.rb
|