class MetricFu::StatsGenerator

Public Class Methods

metric() click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 3
def self.metric
  :stats
end

Public Instance Methods

analyze() click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 14
def analyze
  lines = remove_noise(@output).compact

  @stats = {}

  set_global_stats(lines.pop)
  set_granular_stats(lines)

  @stats[:total] = []
  @stats[:total] << "Lines of Code: #{@stats[:codeLOC]}"
  @stats[:total] << "Lines of Test: #{@stats[:testLOC]}"
  @stats[:total] << "Code to test ratio: #{@stats[:code_to_test_ratio]}"

  @stats
end
emit() click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 7
def emit
  require "code_metrics/statistics"
  @output = MetricFu::Utility.capture_output do
    CodeMetrics::Statistics.new(*dirs).to_s
  end
end
to_h() click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 30
def to_h
  { stats: @stats }
end

Private Instance Methods

dirs() click to toggle source

@return [Array<[ 'Acceptance specs', 'spec/acceptance' ]>]

# File lib/metric_fu/metrics/stats/generator.rb, line 74
def dirs
  require "code_metrics/stats_directories"
  require "code_metrics/statistics"
  stats_dirs = CodeMetrics::StatsDirectories.new
  options.fetch(:additional_test_directories).each do |option|
    stats_dirs.add_test_directories(option.fetch(:glob_pattern), option.fetch(:file_pattern))
  end
  options.fetch(:additional_app_directories).each do |option|
    stats_dirs.add_directories(option.fetch(:glob_pattern), option.fetch(:file_pattern))
  end
  stats_dirs.directories
end
remove_noise(output) click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 36
def remove_noise(output)
  lines = output.split("\n")
  lines = lines.find_all { |line| line =~ /^\s*[C|]/ }
  lines.shift
  lines
end
set_global_stats(totals) click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 43
def set_global_stats(totals)
  return if totals.nil?
  parsed_totals = totals.split("  ").find_all { |el| !el.empty? }
  @stats[:codeLOC] = parsed_totals.shift.match(/\d.*/)[0].to_i
  @stats[:testLOC] = parsed_totals.shift.match(/\d.*/)[0].to_i
  matched_numbers  = Array(parsed_totals.shift.match(/1\:(\d.*)/))
  if matched_numbers.size == 2
    @stats[:code_to_test_ratio] = matched_numbers[1].to_f
  else
    mf_log "Unexpected code to test ratio #{matched_numbers.inspect} over directories #{dirs.inspect}"
    @stats[:code_to_test_ratio] = 0.0
  end
end
set_granular_stats(lines) click to toggle source
# File lib/metric_fu/metrics/stats/generator.rb, line 57
def set_granular_stats(lines)
  @stats[:lines] = lines.map do |line|
    elements = line.split("|")
    elements.map!(&:strip)
    elements = elements.find_all { |el| !el.empty? }
    info_line = {}
    info_line[:name] = elements.shift
    elements.map!(&:to_i)
    [:lines, :loc, :classes, :methods,
     :methods_per_class, :loc_per_method].each do |sym|
      info_line[sym] = elements.shift
    end
    info_line
  end
end