diff-lcs 1.3 → 1.5.1

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 (56) hide show
  1. checksums.yaml +5 -5
  2. data/Contributing.md +86 -48
  3. data/History.md +370 -159
  4. data/License.md +6 -4
  5. data/Manifest.txt +23 -1
  6. data/README.rdoc +10 -10
  7. data/Rakefile +109 -36
  8. data/bin/htmldiff +9 -6
  9. data/bin/ldiff +4 -1
  10. data/lib/diff/lcs/array.rb +2 -2
  11. data/lib/diff/lcs/backports.rb +9 -0
  12. data/lib/diff/lcs/block.rb +5 -5
  13. data/lib/diff/lcs/callbacks.rb +22 -17
  14. data/lib/diff/lcs/change.rb +42 -49
  15. data/lib/diff/lcs/htmldiff.rb +21 -12
  16. data/lib/diff/lcs/hunk.rb +160 -73
  17. data/lib/diff/lcs/internals.rb +57 -56
  18. data/lib/diff/lcs/ldiff.rb +63 -57
  19. data/lib/diff/lcs/string.rb +1 -1
  20. data/lib/diff/lcs.rb +226 -210
  21. data/lib/diff-lcs.rb +2 -2
  22. data/spec/change_spec.rb +58 -34
  23. data/spec/diff_spec.rb +13 -9
  24. data/spec/fixtures/aX +1 -0
  25. data/spec/fixtures/bXaX +1 -0
  26. data/spec/fixtures/ldiff/output.diff +4 -0
  27. data/spec/fixtures/ldiff/output.diff-c +7 -0
  28. data/spec/fixtures/ldiff/output.diff-e +3 -0
  29. data/spec/fixtures/ldiff/output.diff-f +3 -0
  30. data/spec/fixtures/ldiff/output.diff-u +5 -0
  31. data/spec/fixtures/ldiff/output.diff.chef +4 -0
  32. data/spec/fixtures/ldiff/output.diff.chef-c +15 -0
  33. data/spec/fixtures/ldiff/output.diff.chef-e +3 -0
  34. data/spec/fixtures/ldiff/output.diff.chef-f +3 -0
  35. data/spec/fixtures/ldiff/output.diff.chef-u +9 -0
  36. data/spec/fixtures/ldiff/output.diff.chef2 +7 -0
  37. data/spec/fixtures/ldiff/output.diff.chef2-c +20 -0
  38. data/spec/fixtures/ldiff/output.diff.chef2-d +7 -0
  39. data/spec/fixtures/ldiff/output.diff.chef2-e +7 -0
  40. data/spec/fixtures/ldiff/output.diff.chef2-f +7 -0
  41. data/spec/fixtures/ldiff/output.diff.chef2-u +16 -0
  42. data/spec/fixtures/new-chef +4 -0
  43. data/spec/fixtures/new-chef2 +17 -0
  44. data/spec/fixtures/old-chef +4 -0
  45. data/spec/fixtures/old-chef2 +14 -0
  46. data/spec/hunk_spec.rb +48 -37
  47. data/spec/issues_spec.rb +132 -21
  48. data/spec/lcs_spec.rb +3 -3
  49. data/spec/ldiff_spec.rb +74 -32
  50. data/spec/patch_spec.rb +14 -20
  51. data/spec/sdiff_spec.rb +83 -81
  52. data/spec/spec_helper.rb +146 -91
  53. data/spec/traverse_balanced_spec.rb +138 -136
  54. data/spec/traverse_sequences_spec.rb +7 -9
  55. metadata +76 -48
  56. data/autotest/discover.rb +0 -1
@@ -1,6 +1,6 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  describe "Diff::LCS.traverse_balanced" do
6
6
  include Diff::LCS::SpecHelper::Matchers
@@ -33,9 +33,9 @@ describe "Diff::LCS.traverse_balanced" do
33
33
  s1 = s2 = "abc"
34
34
 
35
35
  result = [
36
- [ '=', 0, 0 ],
37
- [ '=', 1, 1 ],
38
- [ '=', 2, 2 ]
36
+ ["=", 0, 0],
37
+ ["=", 1, 1],
38
+ ["=", 2, 2]
39
39
  ]
40
40
 
41
41
  it_has_behavior "with a #change callback", s1, s2, result
@@ -43,12 +43,12 @@ describe "Diff::LCS.traverse_balanced" do
43
43
  end
44
44
 
45
45
  describe "identical array sequences %w(a b c)" do
46
- s1 = s2 = %w(a b c)
46
+ s1 = s2 = %w[a b c]
47
47
 
48
48
  result = [
49
- [ '=', 0, 0 ],
50
- [ '=', 1, 1 ],
51
- [ '=', 2, 2 ]
49
+ ["=", 0, 0],
50
+ ["=", 1, 1],
51
+ ["=", 2, 2]
52
52
  ]
53
53
 
54
54
  it_has_behavior "with a #change callback", s1, s2, result
@@ -56,13 +56,13 @@ describe "Diff::LCS.traverse_balanced" do
56
56
  end
57
57
 
58
58
  describe "sequences %w(a b c) & %w(a x c)" do
59
- s1 = %w(a b c)
60
- s2 = %w(a x c)
59
+ s1 = %w[a b c]
60
+ s2 = %w[a x c]
61
61
 
62
62
  result = [
63
- [ '=', 0, 0 ],
64
- [ '!', 1, 1 ],
65
- [ '=', 2, 2 ]
63
+ ["=", 0, 0],
64
+ ["!", 1, 1],
65
+ ["=", 2, 2]
66
66
  ]
67
67
 
68
68
  it_has_behavior "with a #change callback", s1, s2, result
@@ -70,14 +70,14 @@ describe "Diff::LCS.traverse_balanced" do
70
70
  end
71
71
 
72
72
  describe "sequences %w(a x y c) & %w(a v w c)" do
73
- s1 = %w(a x y c)
74
- s2 = %w(a v w c)
73
+ s1 = %w[a x y c]
74
+ s2 = %w[a v w c]
75
75
 
76
76
  result = [
77
- [ '=', 0, 0 ],
78
- [ '!', 1, 1 ],
79
- [ '!', 2, 2 ],
80
- [ '=', 3, 3 ]
77
+ ["=", 0, 0],
78
+ ["!", 1, 1],
79
+ ["!", 2, 2],
80
+ ["=", 3, 3]
81
81
  ]
82
82
 
83
83
  it_has_behavior "with a #change callback", s1, s2, result
@@ -85,12 +85,12 @@ describe "Diff::LCS.traverse_balanced" do
85
85
  end
86
86
 
87
87
  describe "sequences %w(x y c) & %w(v w c)" do
88
- s1 = %w(x y c)
89
- s2 = %w(v w c)
88
+ s1 = %w[x y c]
89
+ s2 = %w[v w c]
90
90
  result = [
91
- [ '!', 0, 0 ],
92
- [ '!', 1, 1 ],
93
- [ '=', 2, 2 ]
91
+ ["!", 0, 0],
92
+ ["!", 1, 1],
93
+ ["=", 2, 2]
94
94
  ]
95
95
 
96
96
  it_has_behavior "with a #change callback", s1, s2, result
@@ -98,13 +98,13 @@ describe "Diff::LCS.traverse_balanced" do
98
98
  end
99
99
 
100
100
  describe "sequences %w(a x y z) & %w(b v w)" do
101
- s1 = %w(a x y z)
102
- s2 = %w(b v w)
101
+ s1 = %w[a x y z]
102
+ s2 = %w[b v w]
103
103
  result = [
104
- [ '!', 0, 0 ],
105
- [ '!', 1, 1 ],
106
- [ '!', 2, 2 ],
107
- [ '<', 3, 3 ]
104
+ ["!", 0, 0],
105
+ ["!", 1, 1],
106
+ ["!", 2, 2],
107
+ ["<", 3, 3]
108
108
  ]
109
109
 
110
110
  it_has_behavior "with a #change callback", s1, s2, result
@@ -112,11 +112,11 @@ describe "Diff::LCS.traverse_balanced" do
112
112
  end
113
113
 
114
114
  describe "sequences %w(a z) & %w(a)" do
115
- s1 = %w(a z)
116
- s2 = %w(a)
115
+ s1 = %w[a z]
116
+ s2 = %w[a]
117
117
  result = [
118
- [ '=', 0, 0 ],
119
- [ '<', 1, 1 ]
118
+ ["=", 0, 0],
119
+ ["<", 1, 1]
120
120
  ]
121
121
 
122
122
  it_has_behavior "with a #change callback", s1, s2, result
@@ -124,11 +124,11 @@ describe "Diff::LCS.traverse_balanced" do
124
124
  end
125
125
 
126
126
  describe "sequences %w(z a) & %w(a)" do
127
- s1 = %w(z a)
128
- s2 = %w(a)
127
+ s1 = %w[z a]
128
+ s2 = %w[a]
129
129
  result = [
130
- [ '<', 0, 0 ],
131
- [ '=', 1, 0 ]
130
+ ["<", 0, 0],
131
+ ["=", 1, 0]
132
132
  ]
133
133
 
134
134
  it_has_behavior "with a #change callback", s1, s2, result
@@ -136,12 +136,12 @@ describe "Diff::LCS.traverse_balanced" do
136
136
  end
137
137
 
138
138
  describe "sequences %w(a b c) & %w(x y z)" do
139
- s1 = %w(a b c)
140
- s2 = %w(x y z)
139
+ s1 = %w[a b c]
140
+ s2 = %w[x y z]
141
141
  result = [
142
- [ '!', 0, 0 ],
143
- [ '!', 1, 1 ],
144
- [ '!', 2, 2 ]
142
+ ["!", 0, 0],
143
+ ["!", 1, 1],
144
+ ["!", 2, 2]
145
145
  ]
146
146
 
147
147
  it_has_behavior "with a #change callback", s1, s2, result
@@ -149,160 +149,162 @@ describe "Diff::LCS.traverse_balanced" do
149
149
  end
150
150
 
151
151
  describe "sequences %w(abcd efgh ijkl mnoopqrstuvwxyz) & []" do
152
- s1 = %w(abcd efgh ijkl mnopqrstuvwxyz)
152
+ s1 = %w[abcd efgh ijkl mnopqrstuvwxyz]
153
153
  s2 = []
154
154
  result = [
155
- [ '<', 0, 0 ],
156
- [ '<', 1, 0 ],
157
- [ '<', 2, 0 ],
158
- [ '<', 3, 0 ]
155
+ ["<", 0, 0],
156
+ ["<", 1, 0],
157
+ ["<", 2, 0],
158
+ ["<", 3, 0]
159
159
  ]
160
160
 
161
161
  it_has_behavior "with a #change callback", s1, s2, result
162
162
  it_has_behavior "without a #change callback", s1, s2, result
163
163
  end
164
164
 
165
- describe "strings %Q(a b c) & %Q(a x c)" do
166
- s1 = %Q(a b c)
167
- s2 = %Q(a x c)
165
+ describe "strings %q(a b c) & %q(a x c)" do
166
+ s1 = "a b c"
167
+ s2 = "a x c"
168
168
 
169
169
  result = [
170
- [ '=', 0, 0 ],
171
- [ '=', 1, 1 ],
172
- [ '!', 2, 2 ],
173
- [ '=', 3, 3 ],
174
- [ '=', 4, 4 ]
170
+ ["=", 0, 0],
171
+ ["=", 1, 1],
172
+ ["!", 2, 2],
173
+ ["=", 3, 3],
174
+ ["=", 4, 4]
175
175
  ]
176
176
 
177
177
  it_has_behavior "with a #change callback", s1, s2, result
178
178
  it_has_behavior "without a #change callback", s1, s2, result
179
179
  end
180
180
 
181
- describe "strings %Q(a x y c) & %Q(a v w c)" do
182
- s1 = %Q(a x y c)
183
- s2 = %Q(a v w c)
181
+ describe "strings %q(a x y c) & %q(a v w c)" do
182
+ s1 = "a x y c"
183
+ s2 = "a v w c"
184
184
 
185
185
  result = [
186
- [ '=', 0, 0 ],
187
- [ '=', 1, 1 ],
188
- [ '!', 2, 2 ],
189
- [ '=', 3, 3 ],
190
- [ '!', 4, 4 ],
191
- [ '=', 5, 5 ],
192
- [ '=', 6, 6 ]
186
+ ["=", 0, 0],
187
+ ["=", 1, 1],
188
+ ["!", 2, 2],
189
+ ["=", 3, 3],
190
+ ["!", 4, 4],
191
+ ["=", 5, 5],
192
+ ["=", 6, 6]
193
193
  ]
194
194
 
195
195
  it_has_behavior "with a #change callback", s1, s2, result
196
196
  it_has_behavior "without a #change callback", s1, s2, result
197
197
  end
198
198
 
199
- describe "strings %Q(x y c) & %Q(v w c)" do
200
- s1 = %Q(x y c)
201
- s2 = %Q(v w c)
199
+ describe "strings %q(x y c) & %q(v w c)" do
200
+ s1 = "x y c"
201
+ s2 = "v w c"
202
202
  result = [
203
- [ '!', 0, 0 ],
204
- [ '=', 1, 1 ],
205
- [ '!', 2, 2 ],
206
- [ '=', 3, 3 ],
207
- [ '=', 4, 4 ]
203
+ ["!", 0, 0],
204
+ ["=", 1, 1],
205
+ ["!", 2, 2],
206
+ ["=", 3, 3],
207
+ ["=", 4, 4]
208
208
  ]
209
209
 
210
210
  it_has_behavior "with a #change callback", s1, s2, result
211
211
  it_has_behavior "without a #change callback", s1, s2, result
212
212
  end
213
213
 
214
- describe "strings %Q(a x y z) & %Q(b v w)" do
215
- s1 = %Q(a x y z)
216
- s2 = %Q(b v w)
214
+ describe "strings %q(a x y z) & %q(b v w)" do
215
+ s1 = "a x y z"
216
+ s2 = "b v w"
217
217
  result = [
218
- [ '!', 0, 0 ],
219
- [ '=', 1, 1 ],
220
- [ '!', 2, 2 ],
221
- [ '=', 3, 3 ],
222
- [ '!', 4, 4 ],
223
- [ '<', 5, 5 ],
224
- [ '<', 6, 5 ]
218
+ ["!", 0, 0],
219
+ ["=", 1, 1],
220
+ ["!", 2, 2],
221
+ ["=", 3, 3],
222
+ ["!", 4, 4],
223
+ ["<", 5, 5],
224
+ ["<", 6, 5]
225
225
  ]
226
226
 
227
227
  it_has_behavior "with a #change callback", s1, s2, result
228
228
  it_has_behavior "without a #change callback", s1, s2, result
229
229
  end
230
230
 
231
- describe "strings %Q(a z) & %Q(a)" do
232
- s1 = %Q(a z)
233
- s2 = %Q(a)
231
+ describe "strings %q(a z) & %q(a)" do
232
+ s1 = "a z"
233
+ s2 = "a"
234
234
  result = [
235
- [ '=', 0, 0 ],
236
- [ '<', 1, 1 ],
237
- [ '<', 2, 1 ]
235
+ ["=", 0, 0],
236
+ ["<", 1, 1],
237
+ ["<", 2, 1]
238
238
  ]
239
239
 
240
240
  it_has_behavior "with a #change callback", s1, s2, result
241
241
  it_has_behavior "without a #change callback", s1, s2, result
242
242
  end
243
243
 
244
- describe "strings %Q(z a) & %Q(a)" do
245
- s1 = %Q(z a)
246
- s2 = %Q(a)
244
+ describe "strings %q(z a) & %q(a)" do
245
+ s1 = "z a"
246
+ s2 = "a"
247
247
  result = [
248
- [ '<', 0, 0 ],
249
- [ '<', 1, 0 ],
250
- [ '=', 2, 0 ]
248
+ ["<", 0, 0],
249
+ ["<", 1, 0],
250
+ ["=", 2, 0]
251
251
  ]
252
252
 
253
253
  it_has_behavior "with a #change callback", s1, s2, result
254
254
  it_has_behavior "without a #change callback", s1, s2, result
255
255
  end
256
256
 
257
- describe "strings %Q(a b c) & %Q(x y z)" do
258
- s1 = %Q(a b c)
259
- s2 = %Q(x y z)
257
+ describe "strings %q(a b c) & %q(x y z)" do
258
+ s1 = "a b c"
259
+ s2 = "x y z"
260
260
  result = [
261
- [ '!', 0, 0 ],
262
- [ '=', 1, 1 ],
263
- [ '!', 2, 2 ],
264
- [ '=', 3, 3 ],
265
- [ '!', 4, 4 ]
261
+ ["!", 0, 0],
262
+ ["=", 1, 1],
263
+ ["!", 2, 2],
264
+ ["=", 3, 3],
265
+ ["!", 4, 4]
266
266
  ]
267
267
 
268
268
  it_has_behavior "with a #change callback", s1, s2, result
269
269
  it_has_behavior "without a #change callback", s1, s2, result
270
270
  end
271
271
 
272
- describe "strings %Q(abcd efgh ijkl mnopqrstuvwxyz) & %Q()" do
273
- s1 = %Q(abcd efgh ijkl mnopqrstuvwxyz)
272
+ describe "strings %q(abcd efgh ijkl mnopqrstuvwxyz) & %q()" do
273
+ s1 = "abcd efgh ijkl mnopqrstuvwxyz"
274
274
  s2 = ""
275
+ # standard:disable Layout/ExtraSpacing
275
276
  result = [
276
- [ '<', 0, 0 ],
277
- [ '<', 1, 0 ],
278
- [ '<', 2, 0 ],
279
- [ '<', 3, 0 ],
280
- [ '<', 4, 0 ],
281
- [ '<', 5, 0 ],
282
- [ '<', 6, 0 ],
283
- [ '<', 7, 0 ],
284
- [ '<', 8, 0 ],
285
- [ '<', 9, 0 ],
286
- [ '<', 10, 0 ],
287
- [ '<', 11, 0 ],
288
- [ '<', 12, 0 ],
289
- [ '<', 13, 0 ],
290
- [ '<', 14, 0 ],
291
- [ '<', 15, 0 ],
292
- [ '<', 16, 0 ],
293
- [ '<', 17, 0 ],
294
- [ '<', 18, 0 ],
295
- [ '<', 19, 0 ],
296
- [ '<', 20, 0 ],
297
- [ '<', 21, 0 ],
298
- [ '<', 22, 0 ],
299
- [ '<', 23, 0 ],
300
- [ '<', 24, 0 ],
301
- [ '<', 25, 0 ],
302
- [ '<', 26, 0 ],
303
- [ '<', 27, 0 ],
304
- [ '<', 28, 0 ],
277
+ ["<", 0, 0],
278
+ ["<", 1, 0],
279
+ ["<", 2, 0],
280
+ ["<", 3, 0],
281
+ ["<", 4, 0],
282
+ ["<", 5, 0],
283
+ ["<", 6, 0],
284
+ ["<", 7, 0],
285
+ ["<", 8, 0],
286
+ ["<", 9, 0],
287
+ ["<", 10, 0],
288
+ ["<", 11, 0],
289
+ ["<", 12, 0],
290
+ ["<", 13, 0],
291
+ ["<", 14, 0],
292
+ ["<", 15, 0],
293
+ ["<", 16, 0],
294
+ ["<", 17, 0],
295
+ ["<", 18, 0],
296
+ ["<", 19, 0],
297
+ ["<", 20, 0],
298
+ ["<", 21, 0],
299
+ ["<", 22, 0],
300
+ ["<", 23, 0],
301
+ ["<", 24, 0],
302
+ ["<", 25, 0],
303
+ ["<", 26, 0],
304
+ ["<", 27, 0],
305
+ ["<", 28, 0]
305
306
  ]
307
+ # standard:enable Layout/ExtraSpacing
306
308
 
307
309
  it_has_behavior "with a #change callback", s1, s2, result
308
310
  it_has_behavior "without a #change callback", s1, s2, result
@@ -1,6 +1,6 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  describe "Diff::LCS.traverse_sequences" do
6
6
  describe "callback with no finishers" do
@@ -48,14 +48,14 @@ describe "Diff::LCS.traverse_sequences" do
48
48
  end
49
49
 
50
50
  it "has the correct LCS result on left-matches" do
51
- expect(@callback.matched_a).to eq(hello.split(//))
51
+ expect(@callback.matched_a).to eq(hello.chars)
52
52
  end
53
53
 
54
54
  it "has the correct LCS result on right-matches" do
55
- expect(@callback.matched_b).to eq(hello.split(//))
55
+ expect(@callback.matched_b).to eq(hello.chars)
56
56
  end
57
57
 
58
- it "has the correct skipped sequences with the left sequence", :only => true do
58
+ it "has the correct skipped sequences with the left sequence" do
59
59
  expect(@callback.discards_a).to be_empty
60
60
  end
61
61
 
@@ -127,13 +127,11 @@ describe "Diff::LCS.traverse_sequences" do
127
127
  end
128
128
 
129
129
  it "has done markers differently-sized sequences" do
130
- expect(@callback_s1_s2.done_a).to eq([[ "p", 9, "s", 10 ]])
130
+ expect(@callback_s1_s2.done_a).to eq([["p", 9, "t", 11]])
131
131
  expect(@callback_s1_s2.done_b).to be_empty
132
132
 
133
- # 20110731 I don't yet understand why this particular behaviour
134
- # isn't transitive.
135
133
  expect(@callback_s2_s1.done_a).to be_empty
136
- expect(@callback_s2_s1.done_b).to be_empty
134
+ expect(@callback_s2_s1.done_b).to eq([["t", 11, "p", 9]])
137
135
  end
138
136
  end
139
137
  end