class LoadTracer::DotFormatter

Public Class Methods

export(dependencies:) click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 6
def self.export(dependencies:)
  new(dependencies: dependencies).export
end
new(dependencies:) click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 10
def initialize(dependencies:)
  @dependencies = dependencies
  @template = File.read(File.expand_path('templates/default.dot.erb', __dir__))
end

Public Instance Methods

export() click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 15
def export
  graph_data = ERB.new(@template, trim_mode: '-').result(binding)

  graph_data.lines.map(&:rstrip).join("\n")
end

Private Instance Methods

duplicated_label_names() click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 38
def duplicated_label_names
  return @_duplicate_names if defined?(@_duplicate_names)

  checked = Hash.new
  @_duplicate_names = []

  @dependencies.each do |from, deps|
    label1 = File.basename(from)
    @_duplicate_names << label1 if checked[label1]
    checked[label1] = true

    deps.each do |to|
      label2 = File.basename(to)

      @_duplicate_names << label2 if label1 == label2
    end
  end

  @_duplicate_names.uniq!
  @_duplicate_names
end
graph_edges() click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 23
def graph_edges
  @dependencies.flat_map do |from, deps|
    label1 = File.basename(from)

    deps.map do |to|
      label2 = File.basename(to)

      [
        duplicated_label_names.include?(label1) ? node_label(from) : label1,
        duplicated_label_names.include?(label2) ? node_label(to) : label2,
      ]
    end
  end.sort_by(&:first).uniq
end
node_label(absolute_path) click to toggle source
# File lib/load_tracer/formatter/dot.rb, line 60
def node_label(absolute_path)
  s, _, t = Pathname.new(absolute_path).ascend.take(3)
  s.relative_path_from(t).to_s
end