diff-lcs 1.1.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -0
  3. data/Code-of-Conduct.md +74 -0
  4. data/Contributing.md +119 -0
  5. data/History.md +400 -0
  6. data/{License.rdoc → License.md} +6 -5
  7. data/Manifest.txt +36 -4
  8. data/README.rdoc +35 -23
  9. data/Rakefile +106 -11
  10. data/bin/htmldiff +7 -4
  11. data/bin/ldiff +4 -1
  12. data/docs/COPYING.txt +21 -22
  13. data/docs/artistic.txt +127 -0
  14. data/lib/diff/lcs/array.rb +1 -15
  15. data/lib/diff/lcs/backports.rb +9 -0
  16. data/lib/diff/lcs/block.rb +4 -18
  17. data/lib/diff/lcs/callbacks.rb +233 -230
  18. data/lib/diff/lcs/change.rb +114 -109
  19. data/lib/diff/lcs/htmldiff.rb +17 -18
  20. data/lib/diff/lcs/hunk.rb +232 -116
  21. data/lib/diff/lcs/internals.rb +308 -0
  22. data/lib/diff/lcs/ldiff.rb +138 -177
  23. data/lib/diff/lcs/string.rb +1 -15
  24. data/lib/diff/lcs.rb +597 -963
  25. data/lib/diff-lcs.rb +1 -3
  26. data/spec/change_spec.rb +89 -0
  27. data/spec/diff_spec.rb +32 -16
  28. data/spec/fixtures/aX +1 -0
  29. data/spec/fixtures/bXaX +1 -0
  30. data/spec/fixtures/ds1.csv +50 -0
  31. data/spec/fixtures/ds2.csv +51 -0
  32. data/spec/fixtures/ldiff/output.diff +4 -0
  33. data/spec/fixtures/ldiff/output.diff-c +7 -0
  34. data/spec/fixtures/ldiff/output.diff-e +3 -0
  35. data/spec/fixtures/ldiff/output.diff-f +3 -0
  36. data/spec/fixtures/ldiff/output.diff-u +5 -0
  37. data/spec/fixtures/ldiff/output.diff.chef +4 -0
  38. data/spec/fixtures/ldiff/output.diff.chef-c +15 -0
  39. data/spec/fixtures/ldiff/output.diff.chef-e +3 -0
  40. data/spec/fixtures/ldiff/output.diff.chef-f +3 -0
  41. data/spec/fixtures/ldiff/output.diff.chef-u +9 -0
  42. data/spec/fixtures/ldiff/output.diff.chef2 +7 -0
  43. data/spec/fixtures/ldiff/output.diff.chef2-c +20 -0
  44. data/spec/fixtures/ldiff/output.diff.chef2-d +7 -0
  45. data/spec/fixtures/ldiff/output.diff.chef2-e +7 -0
  46. data/spec/fixtures/ldiff/output.diff.chef2-f +7 -0
  47. data/spec/fixtures/ldiff/output.diff.chef2-u +16 -0
  48. data/spec/fixtures/new-chef +4 -0
  49. data/spec/fixtures/new-chef2 +17 -0
  50. data/spec/fixtures/old-chef +4 -0
  51. data/spec/fixtures/old-chef2 +14 -0
  52. data/spec/hunk_spec.rb +83 -0
  53. data/spec/issues_spec.rb +154 -0
  54. data/spec/lcs_spec.rb +36 -16
  55. data/spec/ldiff_spec.rb +87 -0
  56. data/spec/patch_spec.rb +198 -172
  57. data/spec/sdiff_spec.rb +99 -89
  58. data/spec/spec_helper.rb +149 -59
  59. data/spec/traverse_balanced_spec.rb +191 -167
  60. data/spec/traverse_sequences_spec.rb +105 -51
  61. metadata +218 -99
  62. data/.gemtest +0 -0
  63. data/History.rdoc +0 -54
  64. data/diff-lcs.gemspec +0 -51
  65. data/docs/artistic.html +0 -289
@@ -1,44 +1,34 @@
1
- #! /usr/env/bin ruby
2
- #--
3
- # Copyright 2004 Austin Ziegler <diff-lcs@halostatue.ca>
4
- # adapted from:
5
- # Algorithm::Diff (Perl) by Ned Konz <perl@bike-nomad.com>
6
- # Smalltalk by Mario I. Wolczko <mario@wolczko.com>
7
- # implements McIlroy-Hunt diff algorithm
8
- #
9
- # This program is free software. It may be redistributed and/or modified under
10
- # the terms of the GPL version 2 (or later), the Perl Artistic licence, or the
11
- # Ruby licence.
12
- #
13
- # $Id$
14
- #++
15
- # Contains definitions for all default callback objects.
1
+ # frozen_string_literal: true
16
2
 
17
3
  require 'diff/lcs/change'
18
4
 
19
- module Diff::LCS
20
- # This callback object implements the default set of callback events, which
21
- # only returns the event itself. Note that #finished_a and #finished_b are
22
- # not implemented -- I haven't yet figured out where they would be useful.
23
- #
24
- # Note that this is intended to be called as is, e.g.,
25
- #
26
- # Diff::LCS.LCS(seq1, seq2, Diff::LCS::DefaultCallbacks)
5
+ module Diff::LCS # rubocop:disable Style/Documentation
6
+ # This callback object implements the default set of callback events,
7
+ # which only returns the event itself. Note that #finished_a and
8
+ # #finished_b are not implemented -- I haven't yet figured out where they
9
+ # would be useful.
10
+ #
11
+ # Note that this is intended to be called as is, e.g.,
12
+ #
13
+ # Diff::LCS.LCS(seq1, seq2, Diff::LCS::DefaultCallbacks)
27
14
  class DefaultCallbacks
28
15
  class << self
29
- # Called when two items match.
16
+ # Called when two items match.
30
17
  def match(event)
31
18
  event
32
19
  end
33
- # Called when the old value is discarded in favour of the new value.
20
+
21
+ # Called when the old value is discarded in favour of the new value.
34
22
  def discard_a(event)
35
23
  event
36
24
  end
37
- # Called when the new value is discarded in favour of the old value.
25
+
26
+ # Called when the new value is discarded in favour of the old value.
38
27
  def discard_b(event)
39
28
  event
40
29
  end
41
- # Called when both the old and new values have changed.
30
+
31
+ # Called when both the old and new values have changed.
42
32
  def change(event)
43
33
  event
44
34
  end
@@ -47,88 +37,97 @@ module Diff::LCS
47
37
  end
48
38
  end
49
39
 
50
- # An alias for DefaultCallbacks that is used in Diff::LCS#traverse_sequences.
51
- #
52
- # Diff::LCS.LCS(seq1, seq2, Diff::LCS::SequenceCallbacks)
40
+ # An alias for DefaultCallbacks that is used in
41
+ # Diff::LCS#traverse_sequences.
42
+ #
43
+ # Diff::LCS.LCS(seq1, seq2, Diff::LCS::SequenceCallbacks)
53
44
  SequenceCallbacks = DefaultCallbacks
54
- # An alias for DefaultCallbacks that is used in Diff::LCS#traverse_balanced.
55
- #
56
- # Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks)
45
+
46
+ # An alias for DefaultCallbacks that is used in
47
+ # Diff::LCS#traverse_balanced.
48
+ #
49
+ # Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks)
57
50
  BalancedCallbacks = DefaultCallbacks
51
+
52
+ def self.callbacks_for(callbacks)
53
+ callbacks.new rescue callbacks
54
+ end
58
55
  end
59
56
 
60
- # This will produce a compound array of simple diff change objects. Each
61
- # element in the #diffs array is a +hunk+ or +hunk+ array, where each
62
- # element in each +hunk+ array is a single Change object representing the
63
- # addition or removal of a single element from one of the two tested
64
- # sequences. The +hunk+ provides the full context for the changes.
65
- #
66
- # diffs = Diff::LCS.diff(seq1, seq2)
67
- # # This example shows a simplified array format.
68
- # # [ [ [ '-', 0, 'a' ] ], # 1
69
- # # [ [ '+', 2, 'd' ] ], # 2
70
- # # [ [ '-', 4, 'h' ], # 3
71
- # # [ '+', 4, 'f' ] ],
72
- # # [ [ '+', 6, 'k' ] ], # 4
73
- # # [ [ '-', 8, 'n' ], # 5
74
- # # [ '-', 9, 'p' ],
75
- # # [ '+', 9, 'r' ],
76
- # # [ '+', 10, 's' ],
77
- # # [ '+', 11, 't' ] ] ]
78
- #
79
- # There are five hunks here. The first hunk says that the +a+ at position 0
80
- # of the first sequence should be deleted (<tt>'-'</tt>). The second hunk
81
- # says that the +d+ at position 2 of the second sequence should be inserted
82
- # (<tt>'+'</tt>). The third hunk says that the +h+ at position 4 of the
83
- # first sequence should be removed and replaced with the +f+ from position 4
84
- # of the second sequence. The other two hunks are described similarly.
85
- #
86
- # === Use
87
- # This callback object must be initialised and is used by the Diff::LCS#diff
88
- # method.
89
- #
90
- # cbo = Diff::LCS::DiffCallbacks.new
91
- # Diff::LCS.LCS(seq1, seq2, cbo)
92
- # cbo.finish
93
- #
94
- # Note that the call to #finish is absolutely necessary, or the last set of
95
- # changes will not be visible. Alternatively, can be used as:
96
- #
97
- # cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
98
- #
99
- # The necessary #finish call will be made.
100
- #
101
- # === Simplified Array Format
102
- # The simplified array format used in the example above can be obtained
103
- # with:
104
- #
105
- # require 'pp'
106
- # pp diffs.map { |e| e.map { |f| f.to_a } }
57
+ # This will produce a compound array of simple diff change objects. Each
58
+ # element in the #diffs array is a +hunk+ or +hunk+ array, where each
59
+ # element in each +hunk+ array is a single Change object representing the
60
+ # addition or removal of a single element from one of the two tested
61
+ # sequences. The +hunk+ provides the full context for the changes.
62
+ #
63
+ # diffs = Diff::LCS.diff(seq1, seq2)
64
+ # # This example shows a simplified array format.
65
+ # # [ [ [ '-', 0, 'a' ] ], # 1
66
+ # # [ [ '+', 2, 'd' ] ], # 2
67
+ # # [ [ '-', 4, 'h' ], # 3
68
+ # # [ '+', 4, 'f' ] ],
69
+ # # [ [ '+', 6, 'k' ] ], # 4
70
+ # # [ [ '-', 8, 'n' ], # 5
71
+ # # [ '-', 9, 'p' ],
72
+ # # [ '+', 9, 'r' ],
73
+ # # [ '+', 10, 's' ],
74
+ # # [ '+', 11, 't' ] ] ]
75
+ #
76
+ # There are five hunks here. The first hunk says that the +a+ at position 0
77
+ # of the first sequence should be deleted (<tt>'-'</tt>). The second hunk
78
+ # says that the +d+ at position 2 of the second sequence should be inserted
79
+ # (<tt>'+'</tt>). The third hunk says that the +h+ at position 4 of the
80
+ # first sequence should be removed and replaced with the +f+ from position 4
81
+ # of the second sequence. The other two hunks are described similarly.
82
+ #
83
+ # === Use
84
+ #
85
+ # This callback object must be initialised and is used by the Diff::LCS#diff
86
+ # method.
87
+ #
88
+ # cbo = Diff::LCS::DiffCallbacks.new
89
+ # Diff::LCS.LCS(seq1, seq2, cbo)
90
+ # cbo.finish
91
+ #
92
+ # Note that the call to #finish is absolutely necessary, or the last set of
93
+ # changes will not be visible. Alternatively, can be used as:
94
+ #
95
+ # cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
96
+ #
97
+ # The necessary #finish call will be made.
98
+ #
99
+ # === Simplified Array Format
100
+ #
101
+ # The simplified array format used in the example above can be obtained
102
+ # with:
103
+ #
104
+ # require 'pp'
105
+ # pp diffs.map { |e| e.map { |f| f.to_a } }
107
106
  class Diff::LCS::DiffCallbacks
108
- # Returns the difference set collected during the diff process.
107
+ # Returns the difference set collected during the diff process.
109
108
  attr_reader :diffs
110
109
 
111
110
  def initialize # :yields self:
112
111
  @hunk = []
113
112
  @diffs = []
114
113
 
115
- if block_given?
116
- begin
117
- yield self
118
- ensure
119
- self.finish
120
- end
114
+ return unless block_given?
115
+
116
+ begin
117
+ yield self
118
+ ensure
119
+ finish
121
120
  end
122
121
  end
123
122
 
124
- # Finalizes the diff process. If an unprocessed hunk still exists, then it
125
- # is appended to the diff list.
123
+ # Finalizes the diff process. If an unprocessed hunk still exists, then it
124
+ # is appended to the diff list.
126
125
  def finish
127
- add_nonempty_hunk
126
+ finish_hunk
128
127
  end
129
128
 
130
- def match(event)
131
- add_nonempty_hunk
129
+ def match(_event)
130
+ finish_hunk
132
131
  end
133
132
 
134
133
  def discard_a(event)
@@ -139,86 +138,88 @@ class Diff::LCS::DiffCallbacks
139
138
  @hunk << Diff::LCS::Change.new('+', event.new_position, event.new_element)
140
139
  end
141
140
 
142
- private
143
- def add_nonempty_hunk
141
+ def finish_hunk
144
142
  @diffs << @hunk unless @hunk.empty?
145
143
  @hunk = []
146
144
  end
145
+ private :finish_hunk
147
146
  end
148
147
 
149
- # This will produce a compound array of contextual diff change objects. Each
150
- # element in the #diffs array is a "hunk" array, where each element in each
151
- # "hunk" array is a single change. Each change is a Diff::LCS::ContextChange
152
- # that contains both the old index and new index values for the change. The
153
- # "hunk" provides the full context for the changes. Both old and new objects
154
- # will be presented for changed objects. +nil+ will be substituted for a
155
- # discarded object.
156
- #
157
- # seq1 = %w(a b c e h j l m n p)
158
- # seq2 = %w(b c d e f j k l m r s t)
159
- #
160
- # diffs = Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks)
161
- # # This example shows a simplified array format.
162
- # # [ [ [ '-', [ 0, 'a' ], [ 0, nil ] ] ], # 1
163
- # # [ [ '+', [ 3, nil ], [ 2, 'd' ] ] ], # 2
164
- # # [ [ '-', [ 4, 'h' ], [ 4, nil ] ], # 3
165
- # # [ '+', [ 5, nil ], [ 4, 'f' ] ] ],
166
- # # [ [ '+', [ 6, nil ], [ 6, 'k' ] ] ], # 4
167
- # # [ [ '-', [ 8, 'n' ], [ 9, nil ] ], # 5
168
- # # [ '+', [ 9, nil ], [ 9, 'r' ] ],
169
- # # [ '-', [ 9, 'p' ], [ 10, nil ] ],
170
- # # [ '+', [ 10, nil ], [ 10, 's' ] ],
171
- # # [ '+', [ 10, nil ], [ 11, 't' ] ] ] ]
172
- #
173
- # The five hunks shown are comprised of individual changes; if there is a
174
- # related set of changes, they are still shown individually.
175
- #
176
- # This callback can also be used with Diff::LCS#sdiff, which will produce
177
- # results like:
178
- #
179
- # diffs = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextCallbacks)
180
- # # This example shows a simplified array format.
181
- # # [ [ [ "-", [ 0, "a" ], [ 0, nil ] ] ], # 1
182
- # # [ [ "+", [ 3, nil ], [ 2, "d" ] ] ], # 2
183
- # # [ [ "!", [ 4, "h" ], [ 4, "f" ] ] ], # 3
184
- # # [ [ "+", [ 6, nil ], [ 6, "k" ] ] ], # 4
185
- # # [ [ "!", [ 8, "n" ], [ 9, "r" ] ], # 5
186
- # # [ "!", [ 9, "p" ], [ 10, "s" ] ],
187
- # # [ "+", [ 10, nil ], [ 11, "t" ] ] ] ]
188
- #
189
- # The five hunks are still present, but are significantly shorter in total
190
- # presentation, because changed items are shown as changes ("!") instead of
191
- # potentially "mismatched" pairs of additions and deletions.
192
- #
193
- # The result of this operation is similar to that of
194
- # Diff::LCS::SDiffCallbacks. They may be compared as:
195
- #
196
- # s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" }
197
- # c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten
198
- #
199
- # s == c # -> true
200
- #
201
- # === Use
202
- # This callback object must be initialised and can be used by the
203
- # Diff::LCS#diff or Diff::LCS#sdiff methods.
204
- #
205
- # cbo = Diff::LCS::ContextDiffCallbacks.new
206
- # Diff::LCS.LCS(seq1, seq2, cbo)
207
- # cbo.finish
208
- #
209
- # Note that the call to #finish is absolutely necessary, or the last set of
210
- # changes will not be visible. Alternatively, can be used as:
211
- #
212
- # cbo = Diff::LCS::ContextDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
213
- #
214
- # The necessary #finish call will be made.
215
- #
216
- # === Simplified Array Format
217
- # The simplified array format used in the example above can be obtained
218
- # with:
219
- #
220
- # require 'pp'
221
- # pp diffs.map { |e| e.map { |f| f.to_a } }
148
+ # This will produce a compound array of contextual diff change objects. Each
149
+ # element in the #diffs array is a "hunk" array, where each element in each
150
+ # "hunk" array is a single change. Each change is a Diff::LCS::ContextChange
151
+ # that contains both the old index and new index values for the change. The
152
+ # "hunk" provides the full context for the changes. Both old and new objects
153
+ # will be presented for changed objects. +nil+ will be substituted for a
154
+ # discarded object.
155
+ #
156
+ # seq1 = %w(a b c e h j l m n p)
157
+ # seq2 = %w(b c d e f j k l m r s t)
158
+ #
159
+ # diffs = Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks)
160
+ # # This example shows a simplified array format.
161
+ # # [ [ [ '-', [ 0, 'a' ], [ 0, nil ] ] ], # 1
162
+ # # [ [ '+', [ 3, nil ], [ 2, 'd' ] ] ], # 2
163
+ # # [ [ '-', [ 4, 'h' ], [ 4, nil ] ], # 3
164
+ # # [ '+', [ 5, nil ], [ 4, 'f' ] ] ],
165
+ # # [ [ '+', [ 6, nil ], [ 6, 'k' ] ] ], # 4
166
+ # # [ [ '-', [ 8, 'n' ], [ 9, nil ] ], # 5
167
+ # # [ '+', [ 9, nil ], [ 9, 'r' ] ],
168
+ # # [ '-', [ 9, 'p' ], [ 10, nil ] ],
169
+ # # [ '+', [ 10, nil ], [ 10, 's' ] ],
170
+ # # [ '+', [ 10, nil ], [ 11, 't' ] ] ] ]
171
+ #
172
+ # The five hunks shown are comprised of individual changes; if there is a
173
+ # related set of changes, they are still shown individually.
174
+ #
175
+ # This callback can also be used with Diff::LCS#sdiff, which will produce
176
+ # results like:
177
+ #
178
+ # diffs = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextCallbacks)
179
+ # # This example shows a simplified array format.
180
+ # # [ [ [ "-", [ 0, "a" ], [ 0, nil ] ] ], # 1
181
+ # # [ [ "+", [ 3, nil ], [ 2, "d" ] ] ], # 2
182
+ # # [ [ "!", [ 4, "h" ], [ 4, "f" ] ] ], # 3
183
+ # # [ [ "+", [ 6, nil ], [ 6, "k" ] ] ], # 4
184
+ # # [ [ "!", [ 8, "n" ], [ 9, "r" ] ], # 5
185
+ # # [ "!", [ 9, "p" ], [ 10, "s" ] ],
186
+ # # [ "+", [ 10, nil ], [ 11, "t" ] ] ] ]
187
+ #
188
+ # The five hunks are still present, but are significantly shorter in total
189
+ # presentation, because changed items are shown as changes ("!") instead of
190
+ # potentially "mismatched" pairs of additions and deletions.
191
+ #
192
+ # The result of this operation is similar to that of
193
+ # Diff::LCS::SDiffCallbacks. They may be compared as:
194
+ #
195
+ # s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" }
196
+ # c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1)
197
+ #
198
+ # s == c # -> true
199
+ #
200
+ # === Use
201
+ #
202
+ # This callback object must be initialised and can be used by the
203
+ # Diff::LCS#diff or Diff::LCS#sdiff methods.
204
+ #
205
+ # cbo = Diff::LCS::ContextDiffCallbacks.new
206
+ # Diff::LCS.LCS(seq1, seq2, cbo)
207
+ # cbo.finish
208
+ #
209
+ # Note that the call to #finish is absolutely necessary, or the last set of
210
+ # changes will not be visible. Alternatively, can be used as:
211
+ #
212
+ # cbo = Diff::LCS::ContextDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
213
+ #
214
+ # The necessary #finish call will be made.
215
+ #
216
+ # === Simplified Array Format
217
+ #
218
+ # The simplified array format used in the example above can be obtained
219
+ # with:
220
+ #
221
+ # require 'pp'
222
+ # pp diffs.map { |e| e.map { |f| f.to_a } }
222
223
  class Diff::LCS::ContextDiffCallbacks < Diff::LCS::DiffCallbacks
223
224
  def discard_a(event)
224
225
  @hunk << Diff::LCS::ContextChange.simplify(event)
@@ -233,70 +234,72 @@ class Diff::LCS::ContextDiffCallbacks < Diff::LCS::DiffCallbacks
233
234
  end
234
235
  end
235
236
 
236
- # This will produce a simple array of diff change objects. Each element in
237
- # the #diffs array is a single ContextChange. In the set of #diffs provided
238
- # by SDiffCallbacks, both old and new objects will be presented for both
239
- # changed <strong>and unchanged</strong> objects. +nil+ will be substituted
240
- # for a discarded object.
241
- #
242
- # The diffset produced by this callback, when provided to Diff::LCS#sdiff,
243
- # will compute and display the necessary components to show two sequences
244
- # and their minimized differences side by side, just like the Unix utility
245
- # +sdiff+.
246
- #
247
- # same same
248
- # before | after
249
- # old < -
250
- # - > new
251
- #
252
- # seq1 = %w(a b c e h j l m n p)
253
- # seq2 = %w(b c d e f j k l m r s t)
254
- #
255
- # diffs = Diff::LCS.sdiff(seq1, seq2)
256
- # # This example shows a simplified array format.
257
- # # [ [ "-", [ 0, "a"], [ 0, nil ] ],
258
- # # [ "=", [ 1, "b"], [ 0, "b" ] ],
259
- # # [ "=", [ 2, "c"], [ 1, "c" ] ],
260
- # # [ "+", [ 3, nil], [ 2, "d" ] ],
261
- # # [ "=", [ 3, "e"], [ 3, "e" ] ],
262
- # # [ "!", [ 4, "h"], [ 4, "f" ] ],
263
- # # [ "=", [ 5, "j"], [ 5, "j" ] ],
264
- # # [ "+", [ 6, nil], [ 6, "k" ] ],
265
- # # [ "=", [ 6, "l"], [ 7, "l" ] ],
266
- # # [ "=", [ 7, "m"], [ 8, "m" ] ],
267
- # # [ "!", [ 8, "n"], [ 9, "r" ] ],
268
- # # [ "!", [ 9, "p"], [ 10, "s" ] ],
269
- # # [ "+", [ 10, nil], [ 11, "t" ] ] ]
270
- #
271
- # The result of this operation is similar to that of
272
- # Diff::LCS::ContextDiffCallbacks. They may be compared as:
273
- #
274
- # s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" }
275
- # c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten
276
- #
277
- # s == c # -> true
278
- #
279
- # === Use
280
- # This callback object must be initialised and is used by the Diff::LCS#sdiff
281
- # method.
282
- #
283
- # cbo = Diff::LCS::SDiffCallbacks.new
284
- # Diff::LCS.LCS(seq1, seq2, cbo)
285
- #
286
- # As with the other initialisable callback objects, Diff::LCS::SDiffCallbacks
287
- # can be initialised with a block. As there is no "fininishing" to be done,
288
- # this has no effect on the state of the object.
289
- #
290
- # cbo = Diff::LCS::SDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
291
- #
292
- # === Simplified Array Format
293
- # The simplified array format used in the example above can be obtained
294
- # with:
295
- #
296
- # require 'pp'
297
- # pp diffs.map { |e| e.to_a }
237
+ # This will produce a simple array of diff change objects. Each element in
238
+ # the #diffs array is a single ContextChange. In the set of #diffs provided
239
+ # by SDiffCallbacks, both old and new objects will be presented for both
240
+ # changed <strong>and unchanged</strong> objects. +nil+ will be substituted
241
+ # for a discarded object.
242
+ #
243
+ # The diffset produced by this callback, when provided to Diff::LCS#sdiff,
244
+ # will compute and display the necessary components to show two sequences
245
+ # and their minimized differences side by side, just like the Unix utility
246
+ # +sdiff+.
247
+ #
248
+ # same same
249
+ # before | after
250
+ # old < -
251
+ # - > new
252
+ #
253
+ # seq1 = %w(a b c e h j l m n p)
254
+ # seq2 = %w(b c d e f j k l m r s t)
255
+ #
256
+ # diffs = Diff::LCS.sdiff(seq1, seq2)
257
+ # # This example shows a simplified array format.
258
+ # # [ [ "-", [ 0, "a"], [ 0, nil ] ],
259
+ # # [ "=", [ 1, "b"], [ 0, "b" ] ],
260
+ # # [ "=", [ 2, "c"], [ 1, "c" ] ],
261
+ # # [ "+", [ 3, nil], [ 2, "d" ] ],
262
+ # # [ "=", [ 3, "e"], [ 3, "e" ] ],
263
+ # # [ "!", [ 4, "h"], [ 4, "f" ] ],
264
+ # # [ "=", [ 5, "j"], [ 5, "j" ] ],
265
+ # # [ "+", [ 6, nil], [ 6, "k" ] ],
266
+ # # [ "=", [ 6, "l"], [ 7, "l" ] ],
267
+ # # [ "=", [ 7, "m"], [ 8, "m" ] ],
268
+ # # [ "!", [ 8, "n"], [ 9, "r" ] ],
269
+ # # [ "!", [ 9, "p"], [ 10, "s" ] ],
270
+ # # [ "+", [ 10, nil], [ 11, "t" ] ] ]
271
+ #
272
+ # The result of this operation is similar to that of
273
+ # Diff::LCS::ContextDiffCallbacks. They may be compared as:
274
+ #
275
+ # s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" }
276
+ # c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1)
277
+ #
278
+ # s == c # -> true
279
+ #
280
+ # === Use
281
+ #
282
+ # This callback object must be initialised and is used by the Diff::LCS#sdiff
283
+ # method.
284
+ #
285
+ # cbo = Diff::LCS::SDiffCallbacks.new
286
+ # Diff::LCS.LCS(seq1, seq2, cbo)
287
+ #
288
+ # As with the other initialisable callback objects,
289
+ # Diff::LCS::SDiffCallbacks can be initialised with a block. As there is no
290
+ # "fininishing" to be done, this has no effect on the state of the object.
291
+ #
292
+ # cbo = Diff::LCS::SDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) }
293
+ #
294
+ # === Simplified Array Format
295
+ #
296
+ # The simplified array format used in the example above can be obtained
297
+ # with:
298
+ #
299
+ # require 'pp'
300
+ # pp diffs.map { |e| e.to_a }
298
301
  class Diff::LCS::SDiffCallbacks
299
- # Returns the difference set collected during the diff process.
302
+ # Returns the difference set collected during the diff process.
300
303
  attr_reader :diffs
301
304
 
302
305
  def initialize #:yields self: