Class: MetricFu::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/base/generator.rb

Overview

Generator

The Generator class is an abstract class that provides the skeleton for producing different types of metrics.

It drives the production of the metrics through a template method - #generate_report(options={}). This method calls #emit, #analyze and #to_h in order to produce the metrics.

To implement a concrete class to generate a metric, therefore, the class must implement those three methods.

  • #emit should take care of running the metric tool and gathering its output.

  • #analyze should take care of manipulating the output from #emit and making it possible to store it in a programmatic way.

  • #to_h should provide a hash representation of the output from #analyze ready to be serialized into yaml at some point.

Pre-conditions

Based on the class name of the concrete class implementing a Generator, the Generator class will create a ‘metric_directory’ named after the class under the MetricFu.scratch_directory, where any output from the #emit method should go.

It will also create the MetricFu.output_directory if neccessary, and in general setup the directory structure that the MetricFu system expects.

Direct Known Subclasses

Churn, Flay, Flog, RailsBestPractices, Rcov, Reek, Roodi, Saikuro, Stats

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Generator

Returns a new instance of Generator.



35
36
37
38
39
# File 'lib/base/generator.rb', line 35

def initialize(options={})
  create_metric_dir_if_missing
  create_output_dir_if_missing
  create_data_dir_if_missing
end

Instance Attribute Details

#reportObject (readonly)

Returns the value of attribute report.



33
34
35
# File 'lib/base/generator.rb', line 33

def report
  @report
end

#templateObject (readonly)

Returns the value of attribute template.



33
34
35
# File 'lib/base/generator.rb', line 33

def template
  @template
end

Class Method Details

.class_nameObject

Provides the unqualified class name of an implemented concrete class, as a string. For example:

class Flay < Generator; end
klass = Flay.new
klass.class_name
> "flay"

Returns:

  • String The unqualified class name of this concrete class, returned as a string.



66
67
68
# File 'lib/base/generator.rb', line 66

def self.class_name
  self.to_s.split('::').last.downcase
end

.generate_report(options = {}) ⇒ Object

Creates a new generator and returns the output of the #generate_report method. This is the typical way to generate a new MetricFu report. For more information see the #generate_report instance method.

See Also:



50
51
52
53
# File 'lib/base/generator.rb', line 50

def self.generate_report(options={})
  generator = self.new(options)
  generator.generate_report
end

.metric_directoryObject

Returns the directory where the Generator will write any output



71
72
73
# File 'lib/base/generator.rb', line 71

def self.metric_directory
  File.join(MetricFu.scratch_directory, class_name) 
end

Instance Method Details

#analyzeObject

:nodoc:



146
147
148
149
150
151
152
# File 'lib/base/generator.rb', line 146

def analyze #:nodoc:
  raise <<-EOF
    This method must be implemented by a concrete class descending
    from Generator.  See generator class documentation for more 
    information.
  EOF
end

#create_data_dir_if_missingObject

:nodoc:



87
88
89
90
91
# File 'lib/base/generator.rb', line 87

def create_data_dir_if_missing #:nodoc:
  unless File.directory?(MetricFu.data_directory)
    FileUtils.mkdir_p(MetricFu.data_directory, :verbose => false) 
  end
end

#create_metric_dir_if_missingObject

:nodoc:



75
76
77
78
79
# File 'lib/base/generator.rb', line 75

def create_metric_dir_if_missing #:nodoc:
  unless File.directory?(metric_directory)
    FileUtils.mkdir_p(metric_directory, :verbose => false) 
  end
end

#create_output_dir_if_missingObject

:nodoc:



81
82
83
84
85
# File 'lib/base/generator.rb', line 81

def create_output_dir_if_missing #:nodoc:
  unless File.directory?(MetricFu.output_directory)
    FileUtils.mkdir_p(MetricFu.output_directory, :verbose => false) 
  end
end

#emitObject

:nodoc:



138
139
140
141
142
143
144
# File 'lib/base/generator.rb', line 138

def emit #:nodoc:
  raise <<-EOF
    This method must be implemented by a concrete class descending
    from Generator.  See generator class documentation for more 
    information.
  EOF
end

#generate_reportObject

Provides a template method to drive the production of a metric from a concrete implementation of this class. Each concrete class must implement the three methods that this template method calls: #emit, #analyze and #to_h. For more details, see the class documentation.

This template method also calls before_emit, after_emit… etc. methods to allow extra hooks into the processing methods, and help to keep the logic of your Generators clean.



123
124
125
126
127
128
129
130
131
# File 'lib/base/generator.rb', line 123

def generate_report
  %w[emit analyze].each do |meth|
    send("before_#{meth}".to_sym)
    send("#{meth}".to_sym)
    send("after_#{meth}".to_sym)
  end
  before_to_h()
  to_h()
end

#metric_directoryObject

Returns String The path of the metric directory this class is using.

Returns:

  • String The path of the metric directory this class is using.



95
96
97
# File 'lib/base/generator.rb', line 95

def metric_directory
  self.class.metric_directory
end

#remove_excluded_files(paths, globs_to_remove = MetricFu.file_globs_to_ignore) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/base/generator.rb', line 99

def remove_excluded_files(paths, globs_to_remove = MetricFu.file_globs_to_ignore)
  files_to_remove = []
  globs_to_remove.each do |glob|
    files_to_remove.concat(Dir[glob])
  end
  paths - files_to_remove
end

#round_to_tenths(decimal) ⇒ Object



133
134
135
136
# File 'lib/base/generator.rb', line 133

def round_to_tenths(decimal)
  decimal = 0.0 if decimal.to_s.eql?('NaN')
  (decimal * 10).round / 10.0 
end

#to_graphObject

:nodoc:



154
155
156
157
158
159
160
# File 'lib/base/generator.rb', line 154

def to_graph #:nodoc:
  raise <<-EOF
    This method must be implemented by a concrete class descending
    from Generator.  See generator class documentation for more 
    information.
  EOF
end