diff-lcs 1.2.1 → 1.2.2
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.
- data.tar.gz.sig +0 -0
- data/.travis.yml +2 -1
- data/Contributing.rdoc +1 -0
- data/History.rdoc +14 -0
- data/Manifest.txt +1 -0
- data/README.rdoc +3 -3
- data/lib/diff/lcs.rb +2 -2
- data/lib/diff/lcs/hunk.rb +48 -24
- data/spec/hunk_spec.rb +63 -0
- metadata +6 -5
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
data/Contributing.rdoc
CHANGED
data/History.rdoc
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
== 1.2.2 / 2013-03-30
|
2
|
+
|
3
|
+
* Bugs Fixed:
|
4
|
+
* Diff::LCS::Hunk could not properly generate a difference for comparison
|
5
|
+
sets that are not US-ASCII-compatible because of the use of literal regular
|
6
|
+
expressions and strings. Jon Rowe (JonRowe) found this in
|
7
|
+
rspec/rspec-expectations#219 and provided a first pass implementation in
|
8
|
+
diff-lcs#15. I've reworked it because of test failures in Rubinius when
|
9
|
+
running in Ruby 1.9 mode. This coerces the added values to the encoding of
|
10
|
+
the old dataset (as determined by the first piece of the old dataset).
|
11
|
+
https://github.com/rspec/rspec-expectations/issues/219
|
12
|
+
https://github.com/halostatue/diff-lcs/pull/15
|
13
|
+
* Adding Travis CI testing for Ruby 2.0.
|
14
|
+
|
1
15
|
== 1.2.1 / 2013-02-09
|
2
16
|
|
3
17
|
* Bugs Fixed:
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -11,9 +11,9 @@ Diff::LCS computes the difference between two Enumerable sequences using the
|
|
11
11
|
McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities
|
12
12
|
to create a simple HTML diff output format and a standard diff-like tool.
|
13
13
|
|
14
|
-
This is release 1.2.
|
15
|
-
|
16
|
-
|
14
|
+
This is release 1.2.2, fixing a bug that prevented comparison of values that
|
15
|
+
are not US-ASCII-compatible. Thanks to Jon Rowe for finding and providing most
|
16
|
+
of the work behind this issue. This is a recommended release.
|
17
17
|
|
18
18
|
== Synopsis
|
19
19
|
|
data/lib/diff/lcs.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- ruby encoding: utf-8 -*-
|
2
2
|
|
3
3
|
module Diff; end unless defined? Diff
|
4
|
-
# = Diff::LCS 1.2.
|
4
|
+
# = Diff::LCS 1.2.2
|
5
5
|
#
|
6
6
|
# Computes "intelligent" differences between two sequenced Enumerables. This
|
7
7
|
# is an implementation of the McIlroy-Hunt "diff" algorithm for Enumerable
|
@@ -129,7 +129,7 @@ module Diff; end unless defined? Diff
|
|
129
129
|
# Common Subsequences</em>, CACM, vol.20, no.5, pp.350-353, May
|
130
130
|
# 1977, with a few minor improvements to improve the speed."
|
131
131
|
module Diff::LCS
|
132
|
-
VERSION = '1.2.
|
132
|
+
VERSION = '1.2.2'
|
133
133
|
end
|
134
134
|
|
135
135
|
require 'diff/lcs/callbacks'
|
data/lib/diff/lcs/hunk.rb
CHANGED
@@ -11,6 +11,9 @@ class Diff::LCS::Hunk
|
|
11
11
|
def initialize(data_old, data_new, piece, flag_context, file_length_difference)
|
12
12
|
# At first, a hunk will have just one Block in it
|
13
13
|
@blocks = [ Diff::LCS::Block.new(piece) ]
|
14
|
+
if String.method_defined?(:encoding)
|
15
|
+
@preferred_data_encoding = data_old[0].encoding
|
16
|
+
end
|
14
17
|
@data_old = data_old
|
15
18
|
@data_new = data_new
|
16
19
|
|
@@ -120,19 +123,19 @@ class Diff::LCS::Hunk
|
|
120
123
|
# Calculate item number range. Old diff range is just like a context
|
121
124
|
# diff range, except the ranges are on one line with the action between
|
122
125
|
# them.
|
123
|
-
s = "#{context_range(:old)}#{op_act[block.op]}#{context_range(:new)}\n"
|
126
|
+
s = encode("#{context_range(:old)}#{op_act[block.op]}#{context_range(:new)}\n")
|
124
127
|
# If removing anything, just print out all the remove lines in the hunk
|
125
128
|
# which is just all the remove lines in the block.
|
126
|
-
@data_old[@start_old .. @end_old].each { |e| s << "<
|
127
|
-
s << "---\n" if block.op == "!"
|
128
|
-
@data_new[@start_new .. @end_new].each { |e| s << ">
|
129
|
+
@data_old[@start_old .. @end_old].each { |e| s << encode("< ") + e + encode("\n") } unless block.remove.empty?
|
130
|
+
s << encode("---\n") if block.op == "!"
|
131
|
+
@data_new[@start_new .. @end_new].each { |e| s << encode("> ") + e + encode("\n") } unless block.insert.empty?
|
129
132
|
s
|
130
133
|
end
|
131
134
|
private :old_diff
|
132
135
|
|
133
136
|
def unified_diff
|
134
137
|
# Calculate item number range.
|
135
|
-
s = "@@ -#{unified_range(:old)} +#{unified_range(:new)} @@\n"
|
138
|
+
s = encode("@@ -#{unified_range(:old)} +#{unified_range(:new)} @@\n")
|
136
139
|
|
137
140
|
# Outlist starts containing the hunk of the old file. Removing an item
|
138
141
|
# just means putting a '-' in front of it. Inserting an item requires
|
@@ -145,30 +148,30 @@ class Diff::LCS::Hunk
|
|
145
148
|
# file -- don't take removed items into account.
|
146
149
|
lo, hi, num_added, num_removed = @start_old, @end_old, 0, 0
|
147
150
|
|
148
|
-
outlist = @data_old[lo .. hi].
|
151
|
+
outlist = @data_old[lo .. hi].map { |e| e.insert(0, encode(' ')) }
|
149
152
|
|
150
153
|
@blocks.each do |block|
|
151
154
|
block.remove.each do |item|
|
152
|
-
op
|
155
|
+
op = item.action.to_s # -
|
153
156
|
offset = item.position - lo + num_added
|
154
|
-
outlist[offset]
|
157
|
+
outlist[offset][0, 1] = encode(op)
|
155
158
|
num_removed += 1
|
156
159
|
end
|
157
160
|
block.insert.each do |item|
|
158
|
-
op
|
161
|
+
op = item.action.to_s # +
|
159
162
|
offset = item.position - @start_new + num_removed
|
160
|
-
outlist[offset, 0] =
|
163
|
+
outlist[offset, 0] = encode(op) + @data_new[item.position]
|
161
164
|
num_added += 1
|
162
165
|
end
|
163
166
|
end
|
164
167
|
|
165
|
-
s << outlist.join("\n")
|
168
|
+
s << outlist.join(encode("\n"))
|
166
169
|
end
|
167
170
|
private :unified_diff
|
168
171
|
|
169
172
|
def context_diff
|
170
|
-
s = "***************\n"
|
171
|
-
s << "*** #{context_range(:old)} ****\n"
|
173
|
+
s = encode("***************\n")
|
174
|
+
s << encode("*** #{context_range(:old)} ****\n")
|
172
175
|
r = context_range(:new)
|
173
176
|
|
174
177
|
# Print out file 1 part for each block in context diff format if there
|
@@ -176,23 +179,24 @@ class Diff::LCS::Hunk
|
|
176
179
|
lo, hi = @start_old, @end_old
|
177
180
|
removes = @blocks.select { |e| not e.remove.empty? }
|
178
181
|
if removes
|
179
|
-
outlist = @data_old[lo .. hi].
|
182
|
+
outlist = @data_old[lo .. hi].map { |e| e.insert(0, encode(' ')) }
|
183
|
+
|
180
184
|
removes.each do |block|
|
181
185
|
block.remove.each do |item|
|
182
|
-
outlist[item.position - lo]
|
186
|
+
outlist[item.position - lo][0, 1] = encode(block.op) # - or !
|
183
187
|
end
|
184
188
|
end
|
185
189
|
s << outlist.join("\n")
|
186
190
|
end
|
187
191
|
|
188
|
-
s << "\n--- #{r} ----\n"
|
192
|
+
s << encode("\n--- #{r} ----\n")
|
189
193
|
lo, hi = @start_new, @end_new
|
190
194
|
inserts = @blocks.select { |e| not e.insert.empty? }
|
191
195
|
if inserts
|
192
|
-
outlist = @data_new[lo .. hi].collect { |e| e.
|
196
|
+
outlist = @data_new[lo .. hi].collect { |e| e.insert(0, encode(' ')) }
|
193
197
|
inserts.each do |block|
|
194
198
|
block.insert.each do |item|
|
195
|
-
outlist[item.position - lo]
|
199
|
+
outlist[item.position - lo][0, 1] = encode(block.op) # + or !
|
196
200
|
end
|
197
201
|
end
|
198
202
|
s << outlist.join("\n")
|
@@ -206,14 +210,14 @@ class Diff::LCS::Hunk
|
|
206
210
|
warn "Expecting only one block in an old diff hunk!" if @blocks.size > 1
|
207
211
|
|
208
212
|
if format == :reverse_ed
|
209
|
-
s = "#{op_act[@blocks[0].op]}#{context_range(:old)}\n"
|
213
|
+
s = encode("#{op_act[@blocks[0].op]}#{context_range(:old)}\n")
|
210
214
|
else
|
211
|
-
s = "#{context_range(:old
|
215
|
+
s = encode("#{context_range(:old, ' ')}#{op_act[@blocks[0].op]}\n")
|
212
216
|
end
|
213
217
|
|
214
218
|
unless @blocks[0].insert.empty?
|
215
|
-
@data_new[@start_new .. @end_new].each { |e| s << "
|
216
|
-
s << ".\n"
|
219
|
+
@data_new[@start_new .. @end_new].each { |e| s << e + encode("\n") }
|
220
|
+
s << encode(".\n")
|
217
221
|
end
|
218
222
|
s
|
219
223
|
end
|
@@ -221,7 +225,7 @@ class Diff::LCS::Hunk
|
|
221
225
|
|
222
226
|
# Generate a range of item numbers to print. Only print 1 number if the
|
223
227
|
# range has only one item in it. Otherwise, it's 'start,end'
|
224
|
-
def context_range(mode)
|
228
|
+
def context_range(mode, op = ',')
|
225
229
|
case mode
|
226
230
|
when :old
|
227
231
|
s, e = (@start_old + 1), (@end_old + 1)
|
@@ -229,7 +233,7 @@ class Diff::LCS::Hunk
|
|
229
233
|
s, e = (@start_new + 1), (@end_new + 1)
|
230
234
|
end
|
231
235
|
|
232
|
-
(s < e) ? "#{s}
|
236
|
+
(s < e) ? "#{s}#{op}#{e}" : "#{e}"
|
233
237
|
end
|
234
238
|
private :context_range
|
235
239
|
|
@@ -249,4 +253,24 @@ class Diff::LCS::Hunk
|
|
249
253
|
(length == 1) ? "#{first}" : "#{first},#{length}"
|
250
254
|
end
|
251
255
|
private :unified_range
|
256
|
+
|
257
|
+
if String.method_defined?(:encoding)
|
258
|
+
def encode(literal, target_encoding = @preferred_data_encoding)
|
259
|
+
literal.encode target_encoding
|
260
|
+
end
|
261
|
+
|
262
|
+
def encode_as(string, *args)
|
263
|
+
args.map { |arg| arg.encode(string.encoding) }
|
264
|
+
end
|
265
|
+
else
|
266
|
+
def encode(literal, target_encoding = nil)
|
267
|
+
literal
|
268
|
+
end
|
269
|
+
def encode_as(string, *args)
|
270
|
+
args
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
private :encode
|
275
|
+
private :encode_as
|
252
276
|
end
|
data/spec/hunk_spec.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# -*- ruby encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
def h(v)
|
6
|
+
v.to_s.bytes.to_a.map { |e| "%02x" % e }.join
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "Diff::LCS::Hunk" do
|
10
|
+
if String.method_defined?(:encoding)
|
11
|
+
|
12
|
+
let(:old_data) { ["Tu avec carté {count} itém has".encode('UTF-16LE')] }
|
13
|
+
let(:new_data) { ["Tu avec carte {count} item has".encode('UTF-16LE')] }
|
14
|
+
let(:pieces) { Diff::LCS.diff old_data, new_data }
|
15
|
+
let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) }
|
16
|
+
|
17
|
+
it 'should be able to produce a unified diff from the two pieces' do
|
18
|
+
expected =
|
19
|
+
(<<-EOD.encode('UTF-16LE').chomp)
|
20
|
+
@@ -1,2 +1,2 @@
|
21
|
+
-Tu avec carté {count} itém has
|
22
|
+
+Tu avec carte {count} item has
|
23
|
+
EOD
|
24
|
+
expect(hunk.diff(:unified).to_s == expected).to eql true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should be able to produce a context diff from the two pieces' do
|
28
|
+
expected =
|
29
|
+
(<<-EOD.encode('UTF-16LE').chomp)
|
30
|
+
***************
|
31
|
+
*** 1,2 ****
|
32
|
+
!Tu avec carté {count} itém has
|
33
|
+
--- 1,2 ----
|
34
|
+
!Tu avec carte {count} item has
|
35
|
+
EOD
|
36
|
+
|
37
|
+
expect(hunk.diff(:context).to_s == expected).to eql true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should be able to produce an old diff from the two pieces' do
|
41
|
+
expected =
|
42
|
+
(<<-EOD.encode('UTF-16LE').chomp)
|
43
|
+
1,2c1,2
|
44
|
+
< Tu avec carté {count} itém has
|
45
|
+
---
|
46
|
+
> Tu avec carte {count} item has
|
47
|
+
|
48
|
+
EOD
|
49
|
+
expect(hunk.diff(:old).to_s == expected).to eql true
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should be able to produce a reverse ed diff from the two pieces' do
|
53
|
+
expected =
|
54
|
+
(<<-EOD.encode('UTF-16LE').chomp)
|
55
|
+
c1,2
|
56
|
+
Tu avec carte {count} item has
|
57
|
+
.
|
58
|
+
|
59
|
+
EOD
|
60
|
+
expect(hunk.diff(:reverse_ed).to_s == expected).to eql true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diff-lcs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -50,7 +50,7 @@ cert_chain:
|
|
50
50
|
-----END CERTIFICATE-----
|
51
51
|
|
52
52
|
'
|
53
|
-
date: 2013-
|
53
|
+
date: 2013-03-30 00:00:00.000000000 Z
|
54
54
|
dependencies:
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubyforge
|
@@ -236,11 +236,11 @@ description: ! 'Diff::LCS computes the difference between two Enumerable sequenc
|
|
236
236
|
to create a simple HTML diff output format and a standard diff-like tool.
|
237
237
|
|
238
238
|
|
239
|
-
This is release 1.2.
|
239
|
+
This is release 1.2.2, fixing a bug that prevented comparison of values that
|
240
240
|
|
241
|
-
|
241
|
+
are not US-ASCII-compatible. Thanks to Jon Rowe for finding and providing most
|
242
242
|
|
243
|
-
|
243
|
+
of the work behind this issue. This is a recommended release.'
|
244
244
|
email:
|
245
245
|
- austin@rubyforge.org
|
246
246
|
executables:
|
@@ -287,6 +287,7 @@ files:
|
|
287
287
|
- lib/diff/lcs/string.rb
|
288
288
|
- spec/change_spec.rb
|
289
289
|
- spec/diff_spec.rb
|
290
|
+
- spec/hunk_spec.rb
|
290
291
|
- spec/issues_spec.rb
|
291
292
|
- spec/lcs_spec.rb
|
292
293
|
- spec/patch_spec.rb
|
metadata.gz.sig
CHANGED
Binary file
|