class Chef::Knife::Core::TextFormatter

Attributes

data[R]
ui[R]

Public Class Methods

new(data, ui) click to toggle source
# File lib/chef/knife/core/text_formatter.rb, line 27
def initialize(data, ui)
  @ui = ui
  @data = if data.respond_to?(:display_hash)
            data.display_hash
          elsif data.is_a?(Array)
            data
          elsif data.respond_to?(:to_hash)
            data.to_hash
          else
            data
          end
end

Public Instance Methods

formatted_data() click to toggle source
# File lib/chef/knife/core/text_formatter.rb, line 40
def formatted_data
  @formatted_data ||= text_format(data)
end
is_singleton(value) click to toggle source
# File lib/chef/knife/core/text_formatter.rb, line 79
def is_singleton(value)
  !(value.is_a?(Array) || value.respond_to?(:keys))
end
text_format(data) click to toggle source
# File lib/chef/knife/core/text_formatter.rb, line 44
def text_format(data)
  buffer = ""

  if data.respond_to?(:keys)
    justify_width = data.keys.map { |k| k.to_s.size }.max.to_i + 1
    data.sort.each do |key, value|
      # key: ['value'] should be printed as key: value
      if value.is_a?(Array) && value.size == 1 && is_singleton(value[0])
        value = value[0]
      end
      if is_singleton(value)
        # Strings are printed as key: value.
        justified_key = ui.color("#{key}:".ljust(justify_width), :cyan)
        buffer << "#{justified_key} #{value}\n"
      else
        # Arrays and hashes get indented on their own lines.
        buffer << ui.color("#{key}:\n", :cyan)
        lines = text_format(value).split("\n")
        lines.each { |line| buffer << "  #{line}\n" }
      end
    end
  elsif data.is_a?(Array)
    data.each_index do |index|
      item = data[index]
      buffer << text_format(data[index])
      # Separate items with newlines if it's an array of hashes or an
      # array of arrays
      buffer << "\n" if !is_singleton(data[index]) && index != data.size - 1
    end
  else
    buffer << "#{data}\n"
  end
  buffer
end