class Chef::Knife::Core::NodePresenter

output formats for displaying node data
A customized presenter for Chef::Node objects. Supports variable-length

def format(data)

def format(data)
  if parse_format_option == :json
    summarize_json(data)
  else
    super
  end
end

def key(key_text)

def key(key_text)
  ui.color(key_text, :cyan)
end

def summarize(data)

in the ui object.
the volume of output is adjusted accordingly. Uses colors if enabled
terminal. If config[:medium_output] or config[:long_output] are set
Converts a Chef::Node object to a string suitable for output to a
def summarize(data)
  if data.is_a?(Chef::Node)
    node = data
    # special case clouds with their split horizon thing.

    ip = (node[:cloud] && node[:cloud][:public_ipv4_addrs] && node[:cloud][:public_ipv4_addrs].first) || node[:ipaddress]
    summarized = <<~SUMMARY

      #{ui.color("Node Name:", :bold)}   #{ui.color(node.name, :bold)}
    SUMMARY

    show_policy = !(node.policy_name.nil? && node.policy_group.nil?)
    if show_policy
      summarized << <<~POLICY

        #{key("Policy Name:")}  #{node.policy_name}
        #{key("Policy Group:")} #{node.policy_group}
      POLICY

    else
      summarized << <<~ENV

        #{key("Environment:")} #{node.chef_environment}
      ENV

    end
    summarized << <<~SUMMARY

      #{key("FQDN:")}        #{node[:fqdn]}
      #{key("IP:")}          #{ip}
      #{key("Run List:")}    #{node.run_list}
    SUMMARY

    unless show_policy
      summarized << <<~ROLES

        #{key("Roles:")}       #{Array(node[:roles]).join(", ")}
      ROLES

    end
    summarized << <<~SUMMARY

      #{key("Recipes:")}     #{Array(node[:recipes]).join(", ")}
      #{key("Platform:")}    #{node[:platform]} #{node[:platform_version]}
      #{key("Tags:")}        #{node.tags.join(", ")}
    SUMMARY

    if config[:medium_output] || config[:long_output]
      summarized += <<~MORE

        #{key("Attributes:")}
        #{text_format(node.normal_attrs)}
      MORE

    end
    if config[:long_output]
      summarized += <<~MOST

        #{key("Default Attributes:")}
        #{text_format(node.default_attrs)}
        #{key("Override Attributes:")}
        #{text_format(node.override_attrs)}
        #{key("Automatic Attributes (Ohai Data):")}
        #{text_format(node.automatic_attrs)}
      MOST

    end
    summarized
  else
    super
  end
end

def summarize_json(data)

def summarize_json(data)
  if data.is_a?(Chef::Node)
    node = data
    result = {}
    result["name"] = node.name
    if node.policy_name.nil? && node.policy_group.nil?
      result["chef_environment"] = node.chef_environment
    else
      result["policy_name"] = node.policy_name
      result["policy_group"] = node.policy_group
    end
    result["run_list"] = node.run_list
    result["normal"] = node.normal_attrs
    if config[:long_output]
      result["default"]   = node.default_attrs
      result["override"]  = node.override_attrs
      result["automatic"] = node.automatic_attrs
    end
    Chef::JSONCompat.to_json_pretty(result)
  else
    Chef::JSONCompat.to_json_pretty(data)
  end
end