diff-lcs 1.2.2 → 1.4
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.
- checksums.yaml +7 -0
- data/.rspec +0 -1
- data/Code-of-Conduct.md +74 -0
- data/Contributing.md +84 -0
- data/History.md +247 -0
- data/{License.rdoc → License.md} +0 -0
- data/Manifest.txt +15 -9
- data/README.rdoc +21 -18
- data/Rakefile +35 -23
- data/autotest/discover.rb +3 -1
- data/bin/htmldiff +7 -4
- data/bin/ldiff +4 -1
- data/lib/diff-lcs.rb +1 -1
- data/lib/diff/lcs.rb +181 -254
- data/lib/diff/lcs/array.rb +1 -1
- data/lib/diff/lcs/backports.rb +9 -0
- data/lib/diff/lcs/block.rb +1 -1
- data/lib/diff/lcs/callbacks.rb +15 -12
- data/lib/diff/lcs/change.rb +34 -37
- data/lib/diff/lcs/htmldiff.rb +17 -16
- data/lib/diff/lcs/hunk.rb +59 -47
- data/lib/diff/lcs/internals.rb +44 -40
- data/lib/diff/lcs/ldiff.rb +45 -65
- data/lib/diff/lcs/string.rb +1 -1
- data/spec/change_spec.rb +31 -7
- data/spec/diff_spec.rb +28 -18
- data/spec/fixtures/aX +1 -0
- data/spec/fixtures/bXaX +1 -0
- data/spec/fixtures/ds1.csv +50 -0
- data/spec/fixtures/ds2.csv +51 -0
- data/spec/fixtures/ldiff/output.diff +4 -0
- data/spec/fixtures/ldiff/output.diff-c +7 -0
- data/spec/fixtures/ldiff/output.diff-e +3 -0
- data/spec/fixtures/ldiff/output.diff-f +3 -0
- data/spec/fixtures/ldiff/output.diff-u +5 -0
- data/spec/hunk_spec.rb +54 -45
- data/spec/issues_spec.rb +50 -17
- data/spec/lcs_spec.rb +24 -22
- data/spec/ldiff_spec.rb +72 -0
- data/spec/patch_spec.rb +182 -180
- data/spec/sdiff_spec.rb +99 -87
- data/spec/spec_helper.rb +141 -58
- data/spec/traverse_balanced_spec.rb +177 -177
- data/spec/traverse_sequences_spec.rb +63 -63
- metadata +100 -169
- data.tar.gz.sig +0 -0
- data/.autotest +0 -3
- data/.gemtest +0 -0
- data/.hoerc +0 -2
- data/.travis.yml +0 -22
- data/Contributing.rdoc +0 -64
- data/Gemfile +0 -19
- data/History.rdoc +0 -117
- data/diff-lcs.gemspec +0 -63
- metadata.gz.sig +0 -4
data/spec/diff_spec.rb
CHANGED
@@ -1,41 +1,51 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe
|
5
|
+
describe Diff::LCS, '.diff' do
|
6
6
|
include Diff::LCS::SpecHelper::Matchers
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'correctly diffs seq1 to seq2' do
|
9
9
|
diff_s1_s2 = Diff::LCS.diff(seq1, seq2)
|
10
|
-
change_diff(correct_forward_diff).
|
10
|
+
expect(change_diff(correct_forward_diff)).to eq(diff_s1_s2)
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
13
|
+
it 'correctly diffs seq2 to seq1' do
|
14
14
|
diff_s2_s1 = Diff::LCS.diff(seq2, seq1)
|
15
|
-
change_diff(correct_backward_diff).
|
15
|
+
expect(change_diff(correct_backward_diff)).to eq(diff_s2_s1)
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
18
|
+
it 'correctly diffs against an empty sequence' do
|
19
19
|
diff = Diff::LCS.diff(word_sequence, [])
|
20
20
|
correct_diff = [
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
21
|
+
[
|
22
|
+
['-', 0, 'abcd'],
|
23
|
+
['-', 1, 'efgh'],
|
24
|
+
['-', 2, 'ijkl'],
|
25
|
+
['-', 3, 'mnopqrstuvwxyz']
|
26
|
+
]
|
25
27
|
]
|
26
28
|
|
27
|
-
change_diff(correct_diff).
|
29
|
+
expect(change_diff(correct_diff)).to eq(diff)
|
28
30
|
|
29
31
|
diff = Diff::LCS.diff([], word_sequence)
|
30
|
-
correct_diff.each
|
31
|
-
|
32
|
+
correct_diff.each do |hunk|
|
33
|
+
hunk.each do |change| change[0] = '+' end
|
34
|
+
end
|
35
|
+
expect(change_diff(correct_diff)).to eq(diff)
|
32
36
|
end
|
33
37
|
|
34
|
-
it "
|
35
|
-
|
38
|
+
it "correctly diffs 'xx' and 'xaxb'" do
|
39
|
+
left = 'xx'
|
40
|
+
right = 'xaxb'
|
41
|
+
expect(Diff::LCS.patch(left, Diff::LCS.diff(left, right))).to eq(right)
|
36
42
|
end
|
37
43
|
|
38
|
-
it
|
39
|
-
Diff::LCS.diff(
|
44
|
+
it 'returns an empty diff with (hello, hello)' do
|
45
|
+
expect(Diff::LCS.diff(hello, hello)).to be_empty
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns an empty diff with (hello_ary, hello_ary)' do
|
49
|
+
expect(Diff::LCS.diff(hello_ary, hello_ary)).to be_empty
|
40
50
|
end
|
41
51
|
end
|
data/spec/fixtures/aX
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
aX
|
data/spec/fixtures/bXaX
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
bXaX
|
@@ -0,0 +1,50 @@
|
|
1
|
+
1,3
|
2
|
+
2,7
|
3
|
+
3,13
|
4
|
+
4,21
|
5
|
+
5,31
|
6
|
+
6,43
|
7
|
+
7,57
|
8
|
+
8,73
|
9
|
+
9,91
|
10
|
+
10,111
|
11
|
+
11,133
|
12
|
+
12,157
|
13
|
+
13,183
|
14
|
+
14,211
|
15
|
+
15,241
|
16
|
+
16,273
|
17
|
+
17,307
|
18
|
+
18,343
|
19
|
+
19,381
|
20
|
+
20,421
|
21
|
+
21,463
|
22
|
+
22,507
|
23
|
+
23,553
|
24
|
+
24,601
|
25
|
+
25,651
|
26
|
+
26,703
|
27
|
+
27,757
|
28
|
+
28,813
|
29
|
+
29,871
|
30
|
+
30,931
|
31
|
+
31,993
|
32
|
+
32,1057
|
33
|
+
33,1123
|
34
|
+
34,1191
|
35
|
+
35,1261
|
36
|
+
36,1333
|
37
|
+
37,1407
|
38
|
+
38,1483
|
39
|
+
39,1561
|
40
|
+
40,1641
|
41
|
+
41,1723
|
42
|
+
42,1807
|
43
|
+
43,1893
|
44
|
+
44,1981
|
45
|
+
45,2071
|
46
|
+
46,2163
|
47
|
+
47,2257
|
48
|
+
48,2353
|
49
|
+
49,2451
|
50
|
+
50,2500
|
@@ -0,0 +1,51 @@
|
|
1
|
+
1,3
|
2
|
+
2,7
|
3
|
+
3,13
|
4
|
+
4,21
|
5
|
+
5,31
|
6
|
+
6,42
|
7
|
+
7,57
|
8
|
+
8,73
|
9
|
+
9,91
|
10
|
+
10,111
|
11
|
+
11,133
|
12
|
+
12,157
|
13
|
+
13,183
|
14
|
+
14,211
|
15
|
+
15,241
|
16
|
+
16,273
|
17
|
+
17,307
|
18
|
+
18,343
|
19
|
+
19,200
|
20
|
+
20,421
|
21
|
+
21,463
|
22
|
+
22,507
|
23
|
+
23,553
|
24
|
+
24,601
|
25
|
+
25,651
|
26
|
+
26,703
|
27
|
+
27,757
|
28
|
+
28,813
|
29
|
+
29,871
|
30
|
+
30,931
|
31
|
+
31,123
|
32
|
+
32,1057
|
33
|
+
33,1123
|
34
|
+
34,1000
|
35
|
+
35,1261
|
36
|
+
36,1333
|
37
|
+
37,1407
|
38
|
+
38,1483
|
39
|
+
39,1561
|
40
|
+
40,1641
|
41
|
+
41,1723
|
42
|
+
42,1807
|
43
|
+
43,1893
|
44
|
+
44,1981
|
45
|
+
45,2071
|
46
|
+
46,2163
|
47
|
+
47,1524
|
48
|
+
48,2353
|
49
|
+
49,2451
|
50
|
+
50,2500
|
51
|
+
51,2520
|
data/spec/hunk_spec.rb
CHANGED
@@ -1,63 +1,72 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "Diff::LCS::Hunk" do
|
10
|
-
if String.method_defined?(:encoding)
|
5
|
+
if String.method_defined?(:encoding)
|
6
|
+
require 'diff/lcs/hunk'
|
11
7
|
|
12
|
-
|
13
|
-
let(:
|
8
|
+
describe Diff::LCS::Hunk do
|
9
|
+
let(:old_data) { ['Tu avec carté {count} itém has'.encode('UTF-16LE')] }
|
10
|
+
let(:new_data) { ['Tu avec carte {count} item has'.encode('UTF-16LE')] }
|
14
11
|
let(:pieces) { Diff::LCS.diff old_data, new_data }
|
15
12
|
let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) }
|
16
13
|
|
17
|
-
it '
|
18
|
-
expected =
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
expect(hunk.diff(:unified).
|
14
|
+
it 'produces a unified diff from the two pieces' do
|
15
|
+
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
|
16
|
+
@@ -1 +1 @@
|
17
|
+
-Tu avec carté {count} itém has
|
18
|
+
+Tu avec carte {count} item has
|
19
|
+
EXPECTED
|
20
|
+
|
21
|
+
expect(hunk.diff(:unified)).to eq(expected)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'produces a context diff from the two pieces' do
|
25
|
+
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
|
26
|
+
***************
|
27
|
+
*** 1 ****
|
28
|
+
! Tu avec carté {count} itém has
|
29
|
+
--- 1 ----
|
30
|
+
! Tu avec carte {count} item has
|
31
|
+
EXPECTED
|
32
|
+
|
33
|
+
expect(hunk.diff(:context)).to eq(expected)
|
25
34
|
end
|
26
35
|
|
27
|
-
it '
|
28
|
-
expected =
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
expect(hunk.diff(:context).to_s == expected).to eql true
|
36
|
+
it 'produces an old diff from the two pieces' do
|
37
|
+
expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
|
38
|
+
1c1
|
39
|
+
< Tu avec carté {count} itém has
|
40
|
+
---
|
41
|
+
> Tu avec carte {count} item has
|
42
|
+
|
43
|
+
EXPECTED
|
44
|
+
|
45
|
+
expect(hunk.diff(:old)).to eq(expected)
|
38
46
|
end
|
39
47
|
|
40
|
-
it '
|
41
|
-
expected =
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
---
|
46
|
-
> Tu avec carte {count} item has
|
48
|
+
it 'produces a reverse ed diff from the two pieces' do
|
49
|
+
expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
|
50
|
+
c1
|
51
|
+
Tu avec carte {count} item has
|
52
|
+
.
|
47
53
|
|
48
|
-
|
49
|
-
|
54
|
+
EXPECTED
|
55
|
+
|
56
|
+
expect(hunk.diff(:reverse_ed)).to eq(expected)
|
50
57
|
end
|
51
58
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
59
|
+
context 'with empty first data set' do
|
60
|
+
let(:old_data) { [] }
|
61
|
+
|
62
|
+
it 'produces a unified diff' do
|
63
|
+
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
|
64
|
+
@@ -1 +1,2 @@
|
65
|
+
+Tu avec carte {count} item has
|
66
|
+
EXPECTED
|
58
67
|
|
59
|
-
|
60
|
-
|
68
|
+
expect(hunk.diff(:unified)).to eq(expected)
|
69
|
+
end
|
61
70
|
end
|
62
71
|
end
|
63
72
|
end
|
data/spec/issues_spec.rb
CHANGED
@@ -1,24 +1,57 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe
|
5
|
+
describe 'Diff::LCS Issues' do
|
6
6
|
include Diff::LCS::SpecHelper::Matchers
|
7
7
|
|
8
|
-
|
9
|
-
s1, s2
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
8
|
+
describe 'issue #1' do
|
9
|
+
shared_examples 'handles simple diffs' do |s1, s2, forward_diff|
|
10
|
+
before do
|
11
|
+
@diff_s1_s2 = Diff::LCS.diff(s1, s2)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'creates the correct diff' do
|
15
|
+
expect(change_diff(forward_diff)).to eq(@diff_s1_s2)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'creates the correct patch s1->s2' do
|
19
|
+
expect(Diff::LCS.patch(s1, @diff_s1_s2)).to eq(s2)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'creates the correct patch s2->s1' do
|
23
|
+
expect(Diff::LCS.patch(s2, @diff_s1_s2)).to eq(s1)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'string' do
|
28
|
+
it_has_behavior 'handles simple diffs', 'aX', 'bXaX', [
|
29
|
+
[
|
30
|
+
['+', 0, 'b'],
|
31
|
+
['+', 1, 'X']
|
32
|
+
]
|
33
|
+
]
|
34
|
+
it_has_behavior 'handles simple diffs', 'bXaX', 'aX', [
|
35
|
+
[
|
36
|
+
['-', 0, 'b'],
|
37
|
+
['-', 1, 'X']
|
38
|
+
]
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'array' do
|
43
|
+
it_has_behavior 'handles simple diffs', %w(a X), %w(b X a X), [
|
44
|
+
[
|
45
|
+
['+', 0, 'b'],
|
46
|
+
['+', 1, 'X']
|
47
|
+
]
|
48
|
+
]
|
49
|
+
it_has_behavior 'handles simple diffs', %w(b X a X), %w(a X), [
|
50
|
+
[
|
51
|
+
['-', 0, 'b'],
|
52
|
+
['-', 1, 'X']
|
53
|
+
]
|
54
|
+
]
|
55
|
+
end
|
23
56
|
end
|
24
57
|
end
|
data/spec/lcs_spec.rb
CHANGED
@@ -1,54 +1,56 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe
|
5
|
+
describe Diff::LCS::Internals, '.lcs' do
|
6
6
|
include Diff::LCS::SpecHelper::Matchers
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'returns a meaningful LCS array with (seq1, seq2)' do
|
9
9
|
res = Diff::LCS::Internals.lcs(seq1, seq2)
|
10
10
|
# The result of the LCS (less the +nil+ values) must be as long as the
|
11
11
|
# correct result.
|
12
|
-
res.compact.size.
|
13
|
-
res.
|
12
|
+
expect(res.compact.size).to eq(correct_lcs.size)
|
13
|
+
expect(res).to correctly_map_sequence(seq1).to_other_sequence(seq2)
|
14
14
|
|
15
15
|
# Compact these transformations and they should be the correct LCS.
|
16
16
|
x_seq1 = (0...res.size).map { |ix| res[ix] ? seq1[ix] : nil }.compact
|
17
17
|
x_seq2 = (0...res.size).map { |ix| res[ix] ? seq2[res[ix]] : nil }.compact
|
18
18
|
|
19
|
-
x_seq1.
|
20
|
-
x_seq2.
|
19
|
+
expect(x_seq1).to eq(correct_lcs)
|
20
|
+
expect(x_seq2).to eq(correct_lcs)
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
24
|
-
Diff::LCS::Internals.lcs(hello, hello).
|
23
|
+
it 'returns all indexes with (hello, hello)' do
|
24
|
+
expect(Diff::LCS::Internals.lcs(hello, hello)).to \
|
25
|
+
eq((0...hello.size).to_a)
|
25
26
|
end
|
26
27
|
|
27
|
-
it
|
28
|
-
Diff::LCS::Internals.lcs(hello_ary, hello_ary).
|
28
|
+
it 'returns all indexes with (hello_ary, hello_ary)' do
|
29
|
+
expect(Diff::LCS::Internals.lcs(hello_ary, hello_ary)).to \
|
30
|
+
eq((0...hello_ary.size).to_a)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
describe
|
34
|
+
describe Diff::LCS, '.LCS' do
|
33
35
|
include Diff::LCS::SpecHelper::Matchers
|
34
36
|
|
35
|
-
it
|
37
|
+
it 'returns the correct compacted values from Diff::LCS.LCS' do
|
36
38
|
res = Diff::LCS.LCS(seq1, seq2)
|
37
|
-
res.
|
38
|
-
res.compact.
|
39
|
+
expect(res).to eq(correct_lcs)
|
40
|
+
expect(res.compact).to eq(res)
|
39
41
|
end
|
40
42
|
|
41
|
-
it
|
43
|
+
it 'is transitive' do
|
42
44
|
res = Diff::LCS.LCS(seq2, seq1)
|
43
|
-
res.
|
44
|
-
res.compact.
|
45
|
+
expect(res).to eq(correct_lcs)
|
46
|
+
expect(res.compact).to eq(res)
|
45
47
|
end
|
46
48
|
|
47
|
-
it
|
48
|
-
Diff::LCS.LCS(hello, hello).
|
49
|
+
it 'returns %W(h e l l o) with (hello, hello)' do
|
50
|
+
expect(Diff::LCS.LCS(hello, hello)).to eq(hello.split(//))
|
49
51
|
end
|
50
52
|
|
51
|
-
it
|
52
|
-
Diff::LCS.LCS(hello_ary, hello_ary).
|
53
|
+
it 'returns hello_ary with (hello_ary, hello_ary)' do
|
54
|
+
expect(Diff::LCS.LCS(hello_ary, hello_ary)).to eq(hello_ary)
|
53
55
|
end
|
54
56
|
end
|