class KPM::Formatter

def format(data, labels = nil)

def format(data, labels = nil)
  if data.nil? || data.size == 0
    return
  end
  if labels.nil?
    # What we want to output
    labels = [{:label => :plugin_name},
              {:label => :plugin_key},
              {:label => :type},
              {:label => :group_id},
              {:label => :artifact_id},
              {:label => :packaging},
              {:label => :versions, :formatter => VersionFormatter.name}]
  end
  # Compute label to print along with max size for each label
  labels_format_argument = []
  data.keys.each do |key|
    v = data[key]
    labels.each do |e|
      # sanitize entry at the same time
      v[e[:label]] = v[e[:label]] || "???"
      formatter = e[:formatter].nil? ? DefaultFormatter.new(e[:label], v[e[:label]]) : e[:formatter].to_class.new(e[:label], v[e[:label]])
      prev_size = e.key?(:size) ? e[:size] : formatter.label.size
      cur_size = formatter.size
      e[:size] = prev_size < cur_size ? cur_size : prev_size
      labels_format_argument << formatter.label
    end
  end
  border = "_"
  border = (0...labels.size).inject(border) { |res, i| res="#{res}_"; res }
  border = labels.inject(border) { |res, lbl| (0...lbl[:size] + 2).each { |s| res="#{res}_" }; res }
  format = "|"
  format = labels.inject(format) { |res, lbl| res="#{res} %#{lbl[:size]}s |"; res }
  puts "\n#{border}\n"
  puts "#{format}\n" % labels_format_argument
  puts "#{border}\n"
  data.keys.each do |key|
    v = data[key]
    arguments = []
    labels.inject(arguments) do |res, e|
      formatter = e[:formatter].nil? ? DefaultFormatter.new(e[:label], v[e[:label]]) : e[:formatter].to_class.new(e[:label], v[e[:label]])
      res << formatter.to_s
    end
    puts "#{format}\n" % arguments
  end
  puts "#{border}\n\n"
end

def initialize

def initialize
end