class FlogCLI

This is the CLI interface for Flog, responsible for processing options, finding files, loading plugins, and reporting results.

Public Class Methods

load_plugins() click to toggle source

Loads all flog plugins. Files must be named “flog/*.rb”.

# File lib/flog_cli.rb, line 42
def self.load_plugins
  # TODO: I think I want to do this more like hoe's plugin system. Generalize?
  loaded, found = {}, {}

  Gem.find_files("flog/*.rb").reverse.each do |path|
    found[File.basename(path, ".rb").intern] = path
  end

  found.each do |name, plugin|
    next if loaded[name]
    begin
      warn "loading #{plugin}" # if $DEBUG
      loaded[name] = load plugin
    rescue LoadError => e
      warn "error loading #{plugin.inspect}: #{e.message}. skipping..."
    end
  end

  self.plugins.merge loaded

  names = Flog.constants.map {|s| s.to_s}.reject {|n| n =~ /^[A-Z_]+$/}

  names.each do |name|
    # next unless Hoe.plugins.include? name.downcase.intern
    mod = Flog.const_get(name)
    next if Class === mod
    warn "extend #{mod}" if $DEBUG
    # self.extend mod
  end
end
new(options = {}) click to toggle source

Creates a new Flog instance with options.

# File lib/flog_cli.rb, line 175
def initialize options = {}
  @flog = Flog.new options
end
parse_options(args = ARGV, extra_options = {}) click to toggle source

Parse options in args (defaults to ARGV).

# File lib/flog_cli.rb, line 76
def self.parse_options args = ARGV, extra_options = {}
  option = {
    :quiet    => false,
    :continue => false,
    :parser   => RubyParser,
  }.merge extra_options

  OptionParser.new do |opts|
    opts.separator "Standard options:"

    opts.on("-a", "--all", "Display all flog results, not top 60%.") do
      option[:all] = true
    end

    opts.on("-b", "--blame", "Include blame information for methods.") do
      option[:blame] = true
    end

    opts.on("-c", "--continue", "Continue despite syntax errors.") do
      option[:continue] = true
    end

    opts.on("-d", "--details", "Show method details.") do
      option[:details] = true
    end

    opts.on("-g", "--group", "Group and sort by class.") do
      option[:group] = true
    end

    opts.on("-h", "--help", "Show this message.") do
      puts opts
      exit
    end

    opts.on("-I dir1,dir2,dir3", Array, "Add to LOAD_PATH.") do |dirs|
      dirs.each do |dir|
        $: << dir
      end
    end

    opts.on("-m", "--methods-only", "Skip code outside of methods.") do
      option[:methods] = true
    end

    opts.on("-q", "--quiet", "Don't show parse errors.") do
      option[:quiet] = true
    end

    opts.on("-e", "--extended", "Put file:line on a separate line (for rubymine & friends).") do
      option[:extended] = true
    end

    opts.on("-s", "--score", "Display total score only.") do
      option[:score] = true
    end

    opts.on("-tN", "--threshold=N", Integer, "Set the report cutoff threshold (def: 60%).") do |n|
      option[:threshold] = n / 100.0
    end

    opts.on("-v", "--verbose", "Display progress during processing.") do
      option[:verbose] = true
    end

    next if self.plugins.empty?
    opts.separator "Plugin options:"

    extra = self.method_scores.grep(/parse_options/) - %w(parse_options)

    extra.sort.each do |msg|
      self.send msg, opts, option
    end

  end.parse! Array(args)

  option
end
plugins() click to toggle source

The known plugins for Flog. See Flog.load_plugins.

# File lib/flog_cli.rb, line 158
def self.plugins
  @plugins ||= {}
end
run(args = ARGV, extra = {}) click to toggle source

This kicks off the whole thing.

# File lib/flog_cli.rb, line 23
def self.run args = ARGV, extra = {}
  load_plugins

  expander = PathExpander.new args, "**/*.{rb,rake}"
  files = expander.process

  options = parse_options args, extra

  abort "no files or stdin (-) to process, aborting." if
    files.empty? and args.empty?

  flogger = new options
  flogger.flog(*files)
  flogger.report
end

Public Instance Methods

flog(*files) click to toggle source

Flog the given files. Deals with “-”, syntax errors, and traversing subdirectories intelligently. Use PathExpander to process dirs into files.

# File lib/flog_cli.rb, line 167
def flog(*files)
  files << "-" if files.empty?
  @flog.flog(*files)
end
output_details(io, max = nil) click to toggle source

Output the report up to a given max or report everything, if nil.

# File lib/flog_cli.rb, line 182
def output_details io, max = nil
  io.puts

  each_by_score max do |class_method, score, call_list|
    self.print_score io, class_method, score

    if option[:details] then
      call_list.sort_by { |k,v| -v }.each do |call, count|
        io.puts "  %6.1f:   %s" % [count, call]
      end
      io.puts
    end
  end
end
output_details_grouped(io, threshold = nil) click to toggle source

Output the report, grouped by class/module, up to a given max or report everything, if nil.

# File lib/flog_cli.rb, line 201
def output_details_grouped io, threshold = nil
  calculate

  scores.sort_by { |_, n| -n }.each do |klass, total|
    io.puts

    io.puts "%8.1f: %s" % [total, "#{klass} total"]

    method_scores[klass].each do |name, score|
      self.print_score io, name, score
    end
  end
end
print_score(io, name, score) click to toggle source

Print out one formatted score.

report(io = $stdout) click to toggle source

Report results to io, STDOUT by default.

# File lib/flog_cli.rb, line 232
def report(io = $stdout)
  io.puts "%8.1f: %s" % [total_score, "flog total"]
  io.puts "%8.1f: %s" % [average, "flog/method average"]

  return if option[:score]

  if option[:group] then
    output_details_grouped io, threshold
  else
    output_details io, threshold
  end
ensure
  self.reset
end