Module: Igniter::Extensions::Contracts::Provenance::TextFormatter

Defined in:
lib/igniter/extensions/contracts/provenance/text_formatter.rb

Constant Summary collapse

VALUE_MAX_LENGTH =
60

Class Method Summary collapse

Class Method Details

.format(trace) ⇒ Object



12
13
14
15
16
# File 'lib/igniter/extensions/contracts/provenance/text_formatter.rb', line 12

def format(trace)
  lines = []
  render(trace, lines, prefix: "", is_root: true, is_last: true)
  lines.join("\n")
end

.format_value(value) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/igniter/extensions/contracts/provenance/text_formatter.rb', line 45

def format_value(value)
  rendered = case value
             when nil then "nil"
             when String, Symbol then value.inspect
             when Hash then "{#{value.map { |key, entry| "#{key}: #{entry.inspect}" }.join(", ")}}"
             when Array then "[#{value.map(&:inspect).join(", ")}]"
             else value.inspect
             end

  return rendered if rendered.length <= VALUE_MAX_LENGTH

  "#{rendered[0, VALUE_MAX_LENGTH - 3]}..."
end

.render(trace, lines, prefix:, is_root:, is_last:) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/igniter/extensions/contracts/provenance/text_formatter.rb', line 18

def render(trace, lines, prefix:, is_root:, is_last:)
  if is_root
    connector = ""
    child_padding = ""
  elsif is_last
    connector = "└─ "
    child_padding = "   "
  else
    connector = "├─ "
    child_padding = ""
  end

  child_prefix = prefix + child_padding
  lines << "#{prefix}#{connector}#{trace.name} = #{format_value(trace.value)}  [#{trace.kind}]"

  dependencies = trace.contributing.values
  dependencies.each_with_index do |dependency, index|
    render(
      dependency,
      lines,
      prefix: child_prefix,
      is_root: false,
      is_last: index == dependencies.length - 1
    )
  end
end