class MetricFu::SaikuroGenerator
Public Class Methods
metric()
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 8 def self.metric :saikuro end
Public Instance Methods
analyze()
click to toggle source
# 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)
click to toggle source
# 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
emit()
click to toggle source
# 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)
click to toggle source
# 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) { |method_data| ... }
click to toggle source
# 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)
click to toggle source
# 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_h()
click to toggle source
# 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
Private Instance Methods
assemble_classes(files)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 111 def assemble_classes(files) files.map(&:elements).flatten end
assemble_files()
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 123 def assemble_files SaikuroScratchFile.assemble_files(Dir.glob("#{metric_directory}/**/*.html")) end
assemble_methods(files)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 94 def assemble_methods(files) methods = [] files.each do |file| file.elements.each do |element| element.defs.each do |defn| defn.name = "#{element.name}##{defn.name}" methods << defn end end end methods end
clear_scratch_files!()
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 141 def clear_scratch_files! MetricFu::Utility.rm_rf(metric_directory) end
erb_file?(filename)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 82 def erb_file?(filename) File.extname(filename) == ".erb" end
file_not_exists?(filename)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 86 def file_not_exists?(filename) !File.exists?(filename) end
file_relative_path(file)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 135 def file_relative_path(file) filepath = file.filepath path = filepath.gsub(/^#{metric_directory}\//, "") "#{path}/#{file.filename}" end
files_with_relative_paths(files)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 127 def files_with_relative_paths(files) files.map do |file| file_hash = file.to_h file_hash[:filename] = file_relative_path(file) file_hash end.to_a end
sort_classes(classes)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 107 def sort_classes(classes) classes.sort_by { |k| k.complexity.to_i }.reverse end
sort_files(files)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 115 def sort_files(files) files.sort_by do |file| file.elements. max { |a, b| a.complexity.to_i <=> b.complexity.to_i }. complexity.to_i end.reverse end
sort_methods(methods)
click to toggle source
# File lib/metric_fu/metrics/saikuro/generator.rb, line 90 def sort_methods(methods) methods.sort_by { |method| method.complexity.to_i }.reverse end