Class: Pact::Matchers::Differ

Inherits:
Object
  • Object
show all
Defined in:
lib/pact/matchers/differ.rb

Instance Method Summary collapse

Constructor Details

#initialize(color = false) ⇒ Differ

Returns a new instance of Differ.



14
15
16
# File 'lib/pact/matchers/differ.rb', line 14

def initialize(color = false)
  @color = color
end

Instance Method Details

#diff_as_object(actual, expected) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/pact/matchers/differ.rb', line 66

def diff_as_object(actual, expected)
  actual_as_string = object_to_string(actual)
  expected_as_string = object_to_string(expected)
  if diff = diff_as_string(actual_as_string, expected_as_string)
    color_diff diff
  end
end

#diff_as_string(input_data_new, input_data_old) ⇒ Object

This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)



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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/pact/matchers/differ.rb', line 19

def diff_as_string(input_data_new, input_data_old)
  output = matching_encoding("", input_data_old)
  data_old = input_data_old.split(matching_encoding("\n", input_data_old)).map! { |e| e.chomp }
  data_new = input_data_new.split(matching_encoding("\n", input_data_new)).map! { |e| e.chomp }
  diffs = Diff::LCS.diff(data_old, data_new)
  return output if diffs.empty?
  oldhunk = hunk = nil
  file_length_difference = 0
  diffs.each do |piece|
    begin
      hunk = Diff::LCS::Hunk.new(
        data_old, data_new, piece, context_lines, file_length_difference
      )
      file_length_difference = hunk.file_length_difference
      next unless oldhunk
      # Hunks may overlap, which is why we need to be careful when our
      # diff includes lines of context. Otherwise, we might print
      # redundant lines.
      if (context_lines > 0) and hunk.overlaps?(oldhunk)
        if hunk.respond_to?(:merge)
          # diff-lcs 1.2.x
          hunk.merge(oldhunk)
        else
          # diff-lcs 1.1.3
          hunk.unshift(oldhunk)
        end
      else
        output << matching_encoding(oldhunk.diff(format).to_s, output)
      end
    ensure
      oldhunk = hunk
      output << matching_encoding("\n", output)
    end
  end
  #Handle the last remaining hunk
  output << matching_encoding(oldhunk.diff(format).to_s, output)
  output << matching_encoding("\n", output)
  color_diff output
rescue Encoding::CompatibilityError
  if input_data_new.encoding != input_data_old.encoding
    "Could not produce a diff because the encoding of the actual string (#{input_data_old.encoding}) "+
    "differs from the encoding of the expected string (#{input_data_new.encoding})"
  else
    "Could not produce a diff because of the encoding of the string (#{input_data_old.encoding})"
  end
end

#green(text) ⇒ Object



79
80
81
82
# File 'lib/pact/matchers/differ.rb', line 79

def green(text)
  return text unless @color
  color(text, 32)
end

#red(text) ⇒ Object



74
75
76
77
# File 'lib/pact/matchers/differ.rb', line 74

def red(text)
  return text unless @color
  color(text, 31)
end