class GemFootprintAnalyzer::Formatters::Tree

Prints results with the cumulated entry first and details below, indented to give information about the calling order of subsequent requires.

Constants

INDENT

Public Instance Methods

format_list(requires_list) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 60
def format_list(requires_list)
  return if requires_list.size == 1

  entries = init_entries(requires_list)
  info + formatted_entries(entries)
end

Private Instance Methods

count_indent_level(entry) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 114
def count_indent_level(entry)
  @indent_levels ||= []
  parent_hash = @indent_levels.find { |elem| elem.key?(entry.parent) }
  parent_level = parent_hash ? parent_hash.values.first : -1
  indent_level = parent_level + 1
  @indent_levels.unshift(entry.name => indent_level)
  indent_level
end
count_indent_levels(entries) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 123
def count_indent_levels(entries)
  root = entries.last
  indent_levels = {root.name => 0}

  (entries - [root]).reverse_each do |entry|
    indent_levels[entry.name] ||= indent_levels.fetch(entry.parent, 0) + 1
  end
  max_indent = indent_levels.values.max

  [indent_levels, max_indent * INDENT.size]
end
format_entry(entry, indent_level, ljust_value) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 89
def format_entry(entry, indent_level, ljust_value)
  indent = INDENT * indent_level
  time = format('%5dms', entry.time)
  rss = format('%7dKB', entry.rss)

  "#{indent}#{entry.formatted_name}".ljust(ljust_value) + time + rss
end
formatted_entries(entries) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 69
def formatted_entries(entries)
  max_indent = max_indent(entries)
  max_name_length = entries.map { |e| e.formatted_name.length }.max
  ljust_value = max_name_length + max_indent + 1

  lines = entries.reverse.map do |entry|
    indent_level = count_indent_level(entry)
    format_entry(entry, indent_level, ljust_value)
  end

  (legend(ljust_value) + lines)
end
init_entries(requires_list) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 97
def init_entries(requires_list)
  entries = requires_list.last(requires_list.size - 1).map do |entry_hash|
    Entry.new(entry_hash, @options)
  end

  entries.select!(&:top_level?) if @options[:analyze_gemfile]

  entries
end
legend(ljust_value) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 82
def legend(ljust_value)
  [
    'name'.ljust(ljust_value + 2) + 'time' + '   RSS after',
    dash(ljust_value + 16)
  ]
end
max_indent(entries) click to toggle source
# File lib/gem_footprint_analyzer/formatters/tree.rb, line 107
def max_indent(entries)
  entries.reverse_each { |entry| count_indent_level(entry) }
  max_indent_level = @indent_levels.map(&:values).flatten.max
  @indent_levels = []
  max_indent_level * INDENT.size
end