Module: Igniter::Extensions::Contracts::Differential::Formatter

Defined in:
lib/igniter/extensions/contracts/differential/formatter.rb

Constant Summary collapse

VALUE_MAX =
60

Class Method Summary collapse

Class Method Details

.append_divergences(report, lines) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/igniter/extensions/contracts/differential/formatter.rb', line 42

def append_divergences(report, lines)
  return if report.divergences.empty?

  lines << "DIVERGENCES (#{report.divergences.size}):"
  report.divergences.each do |divergence|
    lines << "  :#{divergence.output_name}"
    lines << "    primary:   #{fmt(divergence.primary_value)}"
    lines << "    candidate: #{fmt(divergence.candidate_value)}"
    next if divergence.delta.nil?

    delta = divergence.delta
    lines << "    delta:     #{delta >= 0 ? "+#{delta}" : delta}"
  end
  lines << ""
end

.append_only_section(label, values, lines) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/igniter/extensions/contracts/differential/formatter.rb', line 58

def append_only_section(label, values, lines)
  return if values.empty?

  lines << "#{label} (#{values.size}):"
  values.each do |name, value|
    lines << "  :#{name} = #{fmt(value)}"
  end
  lines << ""
end

.fmt(value) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/igniter/extensions/contracts/differential/formatter.rb', line 68

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

  string.length > VALUE_MAX ? "#{string[0, VALUE_MAX - 3]}..." : string
end

.format(report) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/igniter/extensions/contracts/differential/formatter.rb', line 12

def format(report)
  lines = []
  lines << "Primary:    #{report.primary_name}"
  lines << "Candidate:  #{report.candidate_name}"
  lines << "Match:      #{report.match? ? "YES" : "NO"}"

  if report.primary_error
    lines << ""
    lines << "PRIMARY ERROR: #{report.primary_error.fetch(:message)}"
    return lines.join("\n")
  end

  if report.candidate_error
    lines << ""
    lines << "CANDIDATE ERROR: #{report.candidate_error.fetch(:message)}"
  end

  lines << ""

  if report.divergences.empty? && report.primary_only.empty? && report.candidate_only.empty?
    lines << "All shared outputs match."
  else
    append_divergences(report, lines)
    append_only_section("CANDIDATE ONLY", report.candidate_only, lines)
    append_only_section("PRIMARY ONLY", report.primary_only, lines)
  end

  lines.join("\n")
end