class MetricFu::Saikuro

Public Instance Methods

analyze() click to toggle source
# File lib/generators/saikuro.rb, line 28
def analyze
  @files = sort_files(assemble_files)
  @classes = sort_classes(assemble_classes(@files))
  @meths = sort_methods(assemble_methods(@files))
end
emit() click to toggle source
# File lib/generators/saikuro.rb, line 6
def emit
  options_string = MetricFu.saikuro.inject("") do |options, option|
    option[0] == :input_directory ? options : options + "--#{option.join(' ')} "
  end

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

  saikuro_bin= $:.map{|d| d+'/../bin/saikuro'}.select{|f| File.exists? f}.first || 'saikuro'
  sh %{#{saikuro_bin} #{options_string}} do |ok, response|
    unless ok
      puts "Saikuro failed with exit status: #{response.exitstatus}"
    end
  end
end
format_directories() click to toggle source
# File lib/generators/saikuro.rb, line 23
def format_directories
  dirs = MetricFu.saikuro[:input_directory].join(" | ")
  "\"#{dirs}\""
end
per_file_info(out) click to toggle source
# File lib/generators/saikuro.rb, line 52
def per_file_info(out)
  @saikuro_data[:files].each do |file_data|
    next if File.extname(file_data[:filename]) == '.erb' || !File.exists?(file_data[:filename])
    begin
      line_numbers = MetricFu::LineNumbers.new(File.open(file_data[:filename], 'r').read)
    rescue StandardError => e
      raise e unless e.message =~ /you shouldn't be able to get here/
      puts "ruby_parser blew up while trying to parse #{file_path}. You won't have method level Saikuro information for this file."
      next
    end

    out[file_data[:filename]] ||= {}
    file_data[:classes].each do |class_data|
      class_data[:methods].each do |method_data|
        line = line_numbers.start_line_for_method(method_data[:name])
        out[file_data[:filename]][line.to_s] ||= []
        out[file_data[:filename]][line.to_s] << {:type => :saikuro,
                                                  :description => "Complexity #{method_data[:complexity]}"}
      end
    end
  end
end
to_h() click to toggle source
# File lib/generators/saikuro.rb, line 34
def to_h
  files = @files.map do |file|
    my_file = file.to_h

    f = file.filepath
    f.gsub!(%r{^#{metric_directory}/}, '')
    f << "/#{file.filename}"

    my_file[:filename] = f
    my_file
  end
  @saikuro_data = {:files => files,
                   :classes => @classes.map {|c| c.to_h},
                   :methods => @meths.map {|m| m.to_h}
                  }
  {:saikuro => @saikuro_data}
end

Private Instance Methods

assemble_classes(files) click to toggle source
# File lib/generators/saikuro.rb, line 97
def assemble_classes(files)
  files.map {|f| f.elements}.flatten
end
assemble_files() click to toggle source
# File lib/generators/saikuro.rb, line 109
def assemble_files
  files = []
  Dir.glob("#{metric_directory}/**/*.html").each do |path|
    if Saikuro::SFile.is_valid_text_file?(path)
      file = Saikuro::SFile.new(path)
      if file
        files << file
      end
    end
  end
  files
end
assemble_methods(files) click to toggle source
# File lib/generators/saikuro.rb, line 80
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
sort_classes(classes) click to toggle source
# File lib/generators/saikuro.rb, line 93
def sort_classes(classes)
  classes.sort_by {|k| k.complexity.to_i}.reverse
end
sort_files(files) click to toggle source
# File lib/generators/saikuro.rb, line 101
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/generators/saikuro.rb, line 76
def sort_methods(methods)
  methods.sort_by {|method| method.complexity.to_i}.reverse
end