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,207 +0,0 @@
1
- module MetricFu
2
-
3
- # A list of metrics which are available in the MetricFu system.
4
- #
5
- # These are metrics which have been developed for the system. Of
6
- # course, in order to use these metrics, their respective gems must
7
- # be installed on the system.
8
- AVAILABLE_METRICS = [:churn, :flog, :flay, :reek,
9
- :roodi, :saikuro, :rcov]
10
-
11
- AVAILABLE_GRAPHS = [:flog, :flay, :reek, :roodi, :rcov]
12
-
13
- # The @@configuration class variable holds a global type configuration
14
- # object for any parts of the system to use.
15
- def self.configuration
16
- @@configuration ||= Configuration.new
17
- end
18
-
19
- # = Configuration
20
- #
21
- # The Configuration class, as it sounds, provides methods for
22
- # configuring the behaviour of MetricFu.
23
- #
24
- # == Customization for Rails
25
- #
26
- # The Configuration class checks for the presence of a
27
- # 'config/environment.rb' file. If the file is present, it assumes
28
- # it is running in a Rails project. If it is, it will:
29
- #
30
- # * Add 'app' to the @code_dirs directory to include the
31
- # code in the app directory in the processing
32
- # * Add :stats to the list of metrics to run to get the Rails stats
33
- # task
34
- #
35
- # == Customization for CruiseControl.rb
36
- #
37
- # The Configuration class checks for the presence of a
38
- # 'CC_BUILD_ARTIFACTS' environment variable. If it's found
39
- # it will change the default output directory from the default
40
- # "tmp/metric_fu to the directory represented by 'CC_BUILD_ARTIFACTS'
41
- #
42
- # == Deprications
43
- #
44
- # The Configuration class checks for several deprecated constants
45
- # that were previously used to configure MetricFu. These include
46
- # CHURN_OPTIONS, DIRECTORIES_TO_FLOG, SAIKURO_OPTIONS,
47
- # and MetricFu::SAIKURO_OPTIONS.
48
- #
49
- # These have been replaced by config.churn, config.flog and
50
- # config.saikuro respectively.
51
- class Configuration
52
-
53
- def initialize #:nodoc:#
54
- warn_about_deprecated_config_options
55
- reset
56
- add_attr_accessors_to_self
57
- add_class_methods_to_metric_fu
58
- end
59
-
60
- # Searches through the instance variables of the class and
61
- # creates a class method on the MetricFu module to read the value
62
- # of the instance variable from the Configuration class.
63
- def add_class_methods_to_metric_fu
64
- instance_variables.each do |name|
65
- method_name = name[1..-1].to_sym
66
- method = <<-EOF
67
- def self.#{method_name}
68
- configuration.send(:#{method_name})
69
- end
70
- EOF
71
- MetricFu.module_eval(method)
72
- end
73
- end
74
-
75
- # Searches through the instance variables of the class and creates
76
- # an attribute accessor on this instance of the Configuration
77
- # class for each instance variable.
78
- def add_attr_accessors_to_self
79
- instance_variables.each do |name|
80
- method_name = name[1..-1].to_sym
81
- MetricFu::Configuration.send(:attr_accessor, method_name)
82
- end
83
- end
84
-
85
- # Check if certain constants that are deprecated have been
86
- # assigned. If so, warn the user about them, and the
87
- # fact that they will have no effect.
88
- def warn_about_deprecated_config_options
89
- if defined?(::MetricFu::CHURN_OPTIONS)
90
- raise("Use config.churn instead of MetricFu::CHURN_OPTIONS")
91
- end
92
- if defined?(::MetricFu::DIRECTORIES_TO_FLOG)
93
- raise("Use config.flog[:dirs_to_flog] "+
94
- "instead of MetricFu::DIRECTORIES_TO_FLOG")
95
- end
96
- if defined?(::MetricFu::SAIKURO_OPTIONS)
97
- raise("Use config.saikuro instead of MetricFu::SAIKURO_OPTIONS")
98
- end
99
- if defined?(SAIKURO_OPTIONS)
100
- raise("Use config.saikuro instead of SAIKURO_OPTIONS")
101
- end
102
- end
103
-
104
- # This allows us to have a nice syntax like:
105
- #
106
- # MetricFu.run do |config|
107
- # config.base_directory = 'tmp/metric_fu'
108
- # end
109
- #
110
- # See the README for more information on configuration options.
111
- def self.run
112
- yield MetricFu.configuration
113
- end
114
-
115
- # This does the real work of the Configuration class, by setting
116
- # up a bunch of instance variables to represent the configuration
117
- # of the MetricFu app.
118
- def reset
119
- @base_directory = ENV['CC_BUILD_ARTIFACTS'] || 'tmp/metric_fu'
120
- @scratch_directory = File.join(@base_directory, 'scratch')
121
- @output_directory = File.join(@base_directory, 'output')
122
- @data_directory = File.join(@base_directory, '_data')
123
- @metric_fu_root_directory = File.join(File.dirname(__FILE__),
124
- '..', '..')
125
- @template_directory = File.join(@metric_fu_root_directory,
126
- 'lib', 'templates')
127
- @template_class = AwesomeTemplate
128
- set_metrics
129
- set_graphs
130
- set_code_dirs
131
- @flay = { :dirs_to_flay => @code_dirs }
132
- @flog = { :dirs_to_flog => @code_dirs }
133
- @reek = { :dirs_to_reek => @code_dirs }
134
- @roodi = { :dirs_to_roodi => @code_dirs }
135
- @saikuro = { :output_directory => @scratch_directory + '/saikuro',
136
- :input_directory => @code_dirs,
137
- :cyclo => "",
138
- :filter_cyclo => "0",
139
- :warn_cyclo => "5",
140
- :error_cyclo => "7",
141
- :formater => "text"}
142
- @churn = {}
143
- @stats = {}
144
- @rcov = { :test_files => ['test/**/*_test.rb',
145
- 'spec/**/*_spec.rb'],
146
- :rcov_opts => ["--sort coverage",
147
- "--no-html",
148
- "--text-coverage",
149
- "--no-color",
150
- "--profile",
151
- "--rails",
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
- @graph_size = "1000x400"
161
- @graph_title_font_size = 12
162
- @graph_legend_box_size = 12
163
- @graph_legend_font_size = 10
164
- @graph_marker_font_size = 10
165
-
166
- end
167
-
168
- # Perform a simple check to try and guess if we're running
169
- # against a rails app.
170
- #
171
- # @todo This should probably be made a bit more robust.
172
- def rails?
173
- @rails = File.exist?("config/environment.rb")
174
- end
175
-
176
- # Add the :stats task to the AVAILABLE_METRICS constant if we're
177
- # running within rails.
178
- def set_metrics
179
- if rails?
180
- @metrics = MetricFu::AVAILABLE_METRICS + [:stats]
181
- else
182
- @metrics = MetricFu::AVAILABLE_METRICS
183
- end
184
- end
185
-
186
- def set_graphs
187
- @graphs = MetricFu::AVAILABLE_GRAPHS
188
- end
189
-
190
- # Add the 'app' directory if we're running within rails.
191
- def set_code_dirs
192
- if rails?
193
- @code_dirs = ['app', 'lib']
194
- else
195
- @code_dirs = ['lib']
196
- end
197
- end
198
-
199
- def platform #:nodoc:
200
- return PLATFORM
201
- end
202
-
203
- def is_cruise_control_rb?
204
- !!ENV['CC_BUILD_ARTIFACTS']
205
- end
206
- end
207
- end
@@ -1,160 +0,0 @@
1
- module MetricFu
2
-
3
- # = Generator
4
- #
5
- # The Generator class is an abstract class that provides the
6
- # skeleton for producing different types of metrics.
7
- #
8
- # It drives the production of the metrics through a template
9
- # method - #generate_report(options={}). This method calls
10
- # #emit, #analyze and #to_h in order to produce the metrics.
11
- #
12
- # To implement a concrete class to generate a metric, therefore,
13
- # the class must implement those three methods.
14
- #
15
- # * #emit should take care of running the metric tool and
16
- # gathering its output.
17
- # * #analyze should take care of manipulating the output from
18
- # #emit and making it possible to store it in a programmatic way.
19
- # * #to_h should provide a hash representation of the output from
20
- # #analyze ready to be serialized into yaml at some point.
21
- #
22
- # == Pre-conditions
23
- #
24
- # Based on the class name of the concrete class implementing a
25
- # Generator, the Generator class will create a 'metric_directory'
26
- # named after the class under the MetricFu.scratch_directory, where
27
- # any output from the #emit method should go.
28
- #
29
- # It will also create the MetricFu.output_directory if neccessary, and
30
- # in general setup the directory structure that the MetricFu system
31
- # expects.
32
- class Generator
33
- attr_reader :report, :template
34
-
35
- def initialize(options={})
36
- self.class.verify_dependencies!
37
- create_metric_dir_if_missing
38
- create_output_dir_if_missing
39
- create_data_dir_if_missing
40
- end
41
-
42
- # Creates a new generator and returns the output of the
43
- # #generate_report method. This is the typical way to
44
- # generate a new MetricFu report. For more information see
45
- # the #generate_report instance method.
46
- #
47
- # @params options Hash
48
- # A currently unused hash to configure the Generator
49
- #
50
- # @see generate_report
51
- def self.generate_report(options={})
52
- generator = self.new(options)
53
- generator.generate_report
54
- end
55
-
56
- # Provides the unqualified class name of an implemented concrete
57
- # class, as a string. For example:
58
- #
59
- # class Flay < Generator; end
60
- # klass = Flay.new
61
- # klass.class_name
62
- # > "flay"
63
- #
64
- # @return String
65
- # The unqualified class name of this concrete class, returned
66
- # as a string.
67
- def self.class_name
68
- self.to_s.split('::').last.downcase
69
- end
70
-
71
- # Returns the directory where the Generator will write any output
72
- def self.metric_directory
73
- File.join(MetricFu.scratch_directory, class_name)
74
- end
75
-
76
- def create_metric_dir_if_missing #:nodoc:
77
- unless File.directory?(metric_directory)
78
- FileUtils.mkdir_p(metric_directory, :verbose => false)
79
- end
80
- end
81
-
82
- def create_output_dir_if_missing #:nodoc:
83
- unless File.directory?(MetricFu.output_directory)
84
- FileUtils.mkdir_p(MetricFu.output_directory, :verbose => false)
85
- end
86
- end
87
-
88
- def create_data_dir_if_missing #:nodoc:
89
- unless File.directory?(MetricFu.data_directory)
90
- FileUtils.mkdir_p(MetricFu.data_directory, :verbose => false)
91
- end
92
- end
93
-
94
- # @return String
95
- # The path of the metric directory this class is using.
96
- def metric_directory
97
- self.class.metric_directory
98
- end
99
-
100
-
101
- # Defines some hook methods for the concrete classes to hook into.
102
- %w[emit analyze].each do |meth|
103
- define_method("before_#{meth}".to_sym) {}
104
- define_method("after_#{meth}".to_sym) {}
105
- end
106
- define_method("before_to_h".to_sym) {}
107
-
108
- # Provides a template method to drive the production of a metric
109
- # from a concrete implementation of this class. Each concrete
110
- # class must implement the three methods that this template method
111
- # calls: #emit, #analyze and #to_h. For more details, see the
112
- # class documentation.
113
- #
114
- # This template method also calls before_emit, after_emit... etc.
115
- # methods to allow extra hooks into the processing methods, and help
116
- # to keep the logic of your Generators clean.
117
- def generate_report
118
- %w[emit analyze].each do |meth|
119
- send("before_#{meth}".to_sym)
120
- send("#{meth}".to_sym)
121
- send("after_#{meth}".to_sym)
122
- end
123
- before_to_h()
124
- to_h()
125
- end
126
-
127
- def round_to_tenths(decimal)
128
- (decimal * 10).round / 10.0
129
- end
130
-
131
- # Allows subclasses to check for required gems
132
- def self.verify_dependencies!
133
- true
134
- end
135
-
136
- def emit #:nodoc:
137
- raise <<-EOF
138
- This method must be implemented by a concrete class descending
139
- from Generator. See generator class documentation for more
140
- information.
141
- EOF
142
- end
143
-
144
- def analyze #:nodoc:
145
- raise <<-EOF
146
- This method must be implemented by a concrete class descending
147
- from Generator. See generator class documentation for more
148
- information.
149
- EOF
150
- end
151
-
152
- def to_graph #:nodoc:
153
- raise <<-EOF
154
- This method must be implemented by a concrete class descending
155
- from Generator. See generator class documentation for more
156
- information.
157
- EOF
158
- end
159
- end
160
- end
data/lib/base/graph.rb DELETED
@@ -1,37 +0,0 @@
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')].sort.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
@@ -1,52 +0,0 @@
1
- require 'digest/md5'
2
- require 'fileutils'
3
-
4
- module MetricFu
5
- class MD5Tracker
6
-
7
- @@unchanged_md5s = []
8
-
9
- class << self
10
- def md5_dir(path_to_file, base_dir)
11
- File.join(base_dir,
12
- path_to_file.split('/')[0..-2].join('/'))
13
- end
14
-
15
- def md5_file(path_to_file, base_dir)
16
- File.join(md5_dir(path_to_file, base_dir),
17
- path_to_file.split('/').last.sub(/\.[a-z]+/, '.md5'))
18
- end
19
-
20
- def track(path_to_file, base_dir)
21
- md5 = Digest::MD5.hexdigest(File.read(path_to_file))
22
- FileUtils.mkdir_p(md5_dir(path_to_file, base_dir), :verbose => false)
23
- f = File.new(md5_file(path_to_file, base_dir), "w")
24
- f.puts(md5)
25
- f.close
26
- md5
27
- end
28
-
29
- def file_changed?(path_to_file, base_dir)
30
- orig_md5_file = md5_file(path_to_file, base_dir)
31
- return !!track(path_to_file, base_dir) unless File.exist?(orig_md5_file)
32
-
33
- current_md5 = ""
34
- file = File.open(orig_md5_file, 'r')
35
- file.each_line { |line| current_md5 << line }
36
- file.close
37
- current_md5.chomp!
38
-
39
- new_md5 = Digest::MD5.hexdigest(File.read(path_to_file))
40
- new_md5.chomp!
41
-
42
- @@unchanged_md5s << path_to_file if new_md5 == current_md5
43
-
44
- return new_md5 != current_md5
45
- end
46
-
47
- def file_already_counted?(path_to_file)
48
- return @@unchanged_md5s.include?(path_to_file)
49
- end
50
- end
51
- end
52
- end