Class: Diff::LCS::DiffCallbacks

Inherits:
Object
  • Object
show all
Defined in:
lib/watobo/external/diff/lcs/callbacks.rb

Overview

This will produce a compound array of simple diff change objects. Each element in the #diffs array is a hunk or hunk array, where each element in each hunk array is a single Change object representing the addition or removal of a single element from one of the two tested sequences. The hunk provides the full context for the changes.

diffs = Diff::LCS.diff(seq1, seq2)
  # This example shows a simplified array format.
  # [ [ [ '-',  0, 'a' ] ],   # 1
  #   [ [ '+',  2, 'd' ] ],   # 2
  #   [ [ '-',  4, 'h' ],     # 3
  #     [ '+',  4, 'f' ] ],
  #   [ [ '+',  6, 'k' ] ],   # 4
  #   [ [ '-',  8, 'n' ],     # 5
  #     [ '-',  9, 'p' ],
  #     [ '+',  9, 'r' ],
  #     [ '+', 10, 's' ],
  #     [ '+', 11, 't' ] ] ]

There are five hunks here. The first hunk says that the a at position 0 of the first sequence should be deleted ('-'). The second hunk says that the d at position 2 of the second sequence should be inserted ('+'). The third hunk says that the h at position 4 of the first sequence should be removed and replaced with the f from position 4 of the second sequence. The other two hunks are described similarly.

Use

This callback object must be initialised and is used by the Diff::LCS#diff method.

cbo = Diff::LCS::DiffCallbacks.new
Diff::LCS.LCS(seq1, seq2, cbo)
cbo.finish

Note that the call to #finish is absolutely necessary, or the last set of changes will not be visible. Alternatively, can be used as:

cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }

The necessary #finish call will be made.

Simplified Array Format

The simplified array format used in the example above can be obtained with:

require 'pp'
pp diffs.map { |e| e.map { |f| f.to_a } }

Direct Known Subclasses

ContextDiffCallbacks

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDiffCallbacks

:yields self:


132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 132

def initialize # :yields self:
  @hunk = []
  @diffs = []

  if block_given?
    begin
      yield self
    ensure
      self.finish
    end
  end
end

Instance Attribute Details

#diffsObject (readonly)

Returns the difference set collected during the diff process.


130
131
132
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 130

def diffs
  @diffs
end

Instance Method Details

#discard_a(event) ⇒ Object


155
156
157
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 155

def discard_a(event)
  @hunk << Diff::LCS::Change.new('-', event.old_position, event.old_element)
end

#discard_b(event) ⇒ Object


159
160
161
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 159

def discard_b(event)
  @hunk << Diff::LCS::Change.new('+', event.new_position, event.new_element)
end

#finishObject

Finalizes the diff process. If an unprocessed hunk still exists, then it is appended to the diff list.


147
148
149
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 147

def finish
  add_nonempty_hunk
end

#match(event) ⇒ Object


151
152
153
# File 'lib/watobo/external/diff/lcs/callbacks.rb', line 151

def match(event)
  add_nonempty_hunk
end