Class: Spec::Expectations::Differs::Default

Inherits:
Object
  • Object
show all
Defined in:
lib/spec/expectations/differs/default.rb

Overview

TODO add colour support TODO add some rdoc

Instance Method Summary collapse

Constructor Details

#initialize(format = :unified, context_lines = nil, colour = nil) ⇒ Default

Returns a new instance of Default.



16
17
18
19
20
21
22
# File 'lib/spec/expectations/differs/default.rb', line 16

def initialize(format=:unified,context_lines=nil,colour=nil)

  context_lines ||= 3
  colour        ||= false

  @format,@context_lines,@colour = format,context_lines,colour
end

Instance Method Details

#diff_as_object(target, expected) ⇒ Object



56
57
58
# File 'lib/spec/expectations/differs/default.rb', line 56

def diff_as_object(target,expected)
  diff_as_string(PP.pp(target,""), PP.pp(expected,""))
end

#diff_as_string(data_old, data_new) ⇒ Object

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



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
# File 'lib/spec/expectations/differs/default.rb', line 25

def diff_as_string(data_old, data_new)
  data_old = data_old.split(/\n/).map! { |e| e.chomp }
  data_new = data_new.split(/\n/).map! { |e| e.chomp }
  output = ""
  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)
        hunk.unshift(oldhunk)
      else
        output << oldhunk.diff(@format)
      end
    ensure
      oldhunk = hunk
      output << "\n"
    end
  end  
  #Handle the last remaining hunk
  output << oldhunk.diff(@format) << "\n"
end