Class: MetricFu::SaikuroGenerator

Inherits:
Generator
  • Object
show all
Defined in:
lib/metric_fu/metrics/saikuro/generator.rb

Instance Attribute Summary

Attributes inherited from Generator

#options, #result, #template

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Generator

#generate_result, generators, get_generator, #initialize, #metric, #metric_config, metric_directory, #metric_directory, not_implemented, #remove_excluded_files, #round_to_tenths, #run!, #silence_streams

Constructor Details

This class inherits a constructor from MetricFu::Generator

Class Method Details

.metricObject



8
9
10
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 8

def self.metric
  :saikuro
end

Instance Method Details

#analyzeObject



24
25
26
27
28
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 24

def analyze
  @files = sort_files(assemble_files)
  @classes = sort_classes(assemble_classes(@files))
  @meths = sort_methods(assemble_methods(@files))
end

#build_output_from_line_numbers(out, line_numbers, file_data) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 50

def build_output_from_line_numbers(out, line_numbers, file_data)
  filename = file_data[:filename]
  output = out[filename]
  method_data_for_file_data(file_data) do |method_data|
    line = line_numbers.start_line_for_method(method_data[:name]).to_s
    result = {
      type: :saikuro,
      description: "Complexity #{method_data[:complexity]}"
    }
    output[line] <<  result
  end
  out
end

#emitObject



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 12

def emit
  options_string = options.inject("") do |options, option|
    option[0] == :input_directory ? options : options + "--#{option.join(' ')} "
  end

  options[:input_directory].each do |input_dir|
    options_string += "--input_directory #{input_dir} "
  end

  @output = run!(options_string)
end

#line_numbers_from_file(filename) ⇒ Object



64
65
66
67
68
69
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 64

def line_numbers_from_file(filename)
  MetricFu::LineNumbers.new(File.read(filename))
rescue StandardError => e
  raise e unless e.message =~ /you shouldn't be able to get here/
  mf_log "ruby_parser blew up while trying to parse #{file_path}. You won't have method level Saikuro information for this file."
end

#method_data_for_file_data(file_data, &_block) ⇒ Object



71
72
73
74
75
76
77
78
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 71

def method_data_for_file_data(file_data, &_block)
  return unless block_given?
  file_data[:classes].each do |class_data|
    class_data[:methods].each do |method_data|
      yield method_data
    end
  end
end

#per_file_info(out) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 40

def per_file_info(out)
  @saikuro_data[:files].each do |file_data|
    filename = file_data[:filename]
    next if erb_file?(filename) || file_not_exists?(filename)
    next unless line_numbers = line_numbers_from_file(filename)

    build_output_from_line_numbers(out, line_numbers, file_data)
  end
end

#to_hObject



30
31
32
33
34
35
36
37
38
# File 'lib/metric_fu/metrics/saikuro/generator.rb', line 30

def to_h
  @saikuro_data = {
    files:    files_with_relative_paths(@files),
    classes:  @classes.map(&:to_h),
    methods:  @meths.map(&:to_h),
  }
  clear_scratch_files!
  { saikuro: @saikuro_data }
end