diff 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,13 @@
1
+ Manifest
2
+ README
3
+ Rakefile
4
+ TODO
5
+ diff.gemspec
6
+ lib/diff.rb
7
+ lib/emaildiff.rb
8
+ lib/unixdiff.rb
9
+ test/test_cases.rb
10
+ test/test_diff.rb
11
+ test/test_emailcases.rb
12
+ test/test_emaildiff.rb
13
+ test/test_unixdiff.rb
data/README ADDED
@@ -0,0 +1,69 @@
1
+
2
+ diff.rb README
3
+
4
+ Diff Algorithm Implementation, Copyright (C) 2001 Lars
5
+ Christensen, larsch@cs.auc.dk.
6
+
7
+ LEGAL NOTICE
8
+
9
+ This program is free software; you can redistribute it and/or
10
+ modify it under the terms of the GNU General Public License as
11
+ published by the Free Software Foundation; either version 2 of the
12
+ License, or (at your option) any later version.
13
+
14
+ This program is distributed in the hope that it will be useful,
15
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
+ General Public License for more details.
18
+
19
+ You should have received a copy of the GNU General Public License
20
+ along with this program; if not, write to the Free Software
21
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22
+ 02111-1307, USA.
23
+
24
+ ABOUT
25
+
26
+ This implementation is basically a Ruby conversion of the Perl
27
+ Algorithm::Diff module in CPAN.
28
+
29
+ Diff is an algorithm which computes the differences between two
30
+ lists a and b. The resulting set of differences can be applied to
31
+ a (also called "patching") to get b. This is also what the Unix
32
+ command line tools "diff" and "patch" are able to do.
33
+
34
+ diff.rb generates a "minimal diff". This means that the set of
35
+ changes that should be applied to a to get b can not be fewer than
36
+ those generated by diff.rb. diff.rb does not generate contextual
37
+ diffs. Therefor, the diff can only be succesfully applied to a
38
+ list exactly equal to to original a.
39
+
40
+ Documentation is in RD format in diff.rb. Ruby rd2 on it to
41
+ extract into other formats.
42
+
43
+ INSTALLATION
44
+
45
+ You should not installed this library system wide, because it is a
46
+ work in progress and the API may still change. You should place
47
+ the file "diff.rb" together with the source that needs to use it
48
+ and simply put "require 'diff'" at the top of your program file.
49
+
50
+ REVISION HISTORY
51
+
52
+ Version 0.1
53
+
54
+ Initial release. Diff algorithm works.
55
+
56
+ Version 0.2
57
+
58
+ Speed improvements and code clean up
59
+
60
+ Version 0.3
61
+
62
+ Added unixdiff.rb, an implementation of Unix Diff (simple
63
+ format only)
64
+
65
+ CREDITS
66
+
67
+ Thanks to authors of Perl's Algorithm::Diff (originally written by
68
+ Mark-Jason Dominus, currently maintained by Ned Konz).
69
+
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('diff','0.3.1') do |s|
6
+ s.description = "Diff Algorithm Implementation"
7
+ s.url = "http://users.cybercity.dk/~dsl8950/ruby/diff.html"
8
+ s.author = "Wayne Walter"
9
+ s.email = "diffgem@tickzoom.com"
10
+ s.ignore_pattern = []
11
+ s.development_dependencies = []
12
+ end
data/TODO ADDED
@@ -0,0 +1,17 @@
1
+ = For 1.0:
2
+
3
+ * Settle on a diff format, e.g. what should the first field look like:
4
+ [ '+', 23, "foo" ]
5
+ [ :add, 23, "foo" ]
6
+ [ DiffAdd, 23, "foo" ]
7
+ or should we have classed
8
+ class DiffAdd
9
+ attr_reader :position, :element
10
+ end
11
+
12
+ = Other Ideas:
13
+
14
+ * Contextual diffs?
15
+ * Unix diff/patch compatible wrapper
16
+
17
+
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{diff}
5
+ s.version = "0.3.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Wayne Walter"]
9
+ s.cert_chain = ["/root/.ssh/gem-public_cert.pem"]
10
+ s.date = %q{2010-06-27}
11
+ s.description = %q{Diff Algorithm Implementation}
12
+ s.email = %q{diffgem@tickzoom.com}
13
+ s.extra_rdoc_files = ["README", "TODO", "lib/diff.rb", "lib/emaildiff.rb", "lib/unixdiff.rb"]
14
+ s.files = ["Manifest", "README", "Rakefile", "TODO", "diff.gemspec", "lib/diff.rb", "lib/emaildiff.rb", "lib/unixdiff.rb", "test/test_cases.rb", "test/test_diff.rb", "test/test_emailcases.rb", "test/test_emaildiff.rb", "test/test_unixdiff.rb"]
15
+ s.homepage = %q{http://users.cybercity.dk/~dsl8950/ruby/diff.html}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Diff", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{diff}
19
+ s.rubygems_version = %q{1.3.7}
20
+ s.signing_key = %q{/root/.ssh/gem-private_key.pem}
21
+ s.summary = %q{Diff Algorithm Implementation}
22
+ s.test_files = ["test/test_emailcases.rb", "test/test_emaildiff.rb", "test/test_unixdiff.rb", "test/test_diff.rb", "test/test_cases.rb"]
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 3
27
+
28
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
29
+ else
30
+ end
31
+ else
32
+ end
33
+ end
@@ -0,0 +1,278 @@
1
+ class Diff
2
+
3
+ def Diff.lcs(a, b)
4
+ astart = 0
5
+ bstart = 0
6
+ afinish = a.length-1
7
+ bfinish = b.length-1
8
+ mvector = []
9
+
10
+ # First we prune off any common elements at the beginning
11
+ while (astart <= afinish && bstart <= afinish && a[astart] == b[bstart])
12
+ mvector[astart] = bstart
13
+ astart += 1
14
+ bstart += 1
15
+ end
16
+
17
+ # now the end
18
+ while (astart <= afinish && bstart <= bfinish && a[afinish] == b[bfinish])
19
+ mvector[afinish] = bfinish
20
+ afinish -= 1
21
+ bfinish -= 1
22
+ end
23
+
24
+ bmatches = b.reverse_hash(bstart..bfinish)
25
+ thresh = []
26
+ links = []
27
+
28
+ (astart..afinish).each { |aindex|
29
+ aelem = a[aindex]
30
+ next unless bmatches.has_key? aelem
31
+ k = nil
32
+ bmatches[aelem].reverse.each { |bindex|
33
+ if k && (thresh[k] > bindex) && (thresh[k-1] < bindex)
34
+ thresh[k] = bindex
35
+ else
36
+ k = thresh.replacenextlarger(bindex, k)
37
+ end
38
+ links[k] = [ (k==0) ? nil : links[k-1], aindex, bindex ] if k
39
+ }
40
+ }
41
+
42
+ if !thresh.empty?
43
+ link = links[thresh.length-1]
44
+ while link
45
+ mvector[link[1]] = link[2]
46
+ link = link[0]
47
+ end
48
+ end
49
+
50
+ return mvector
51
+ end
52
+
53
+ def makediff(a, b)
54
+ mvector = Diff.lcs(a, b)
55
+ ai = bi = 0
56
+ while ai < mvector.length
57
+ bline = mvector[ai]
58
+ if bline
59
+ while bi < bline
60
+ discardb(bi, b[bi])
61
+ bi += 1
62
+ end
63
+ match(ai, bi)
64
+ bi += 1
65
+ else
66
+ discarda(ai, a[ai])
67
+ end
68
+ ai += 1
69
+ end
70
+ while ai < a.length
71
+ discarda(ai, a[ai])
72
+ ai += 1
73
+ end
74
+ while bi < b.length
75
+ discardb(bi, b[bi])
76
+ bi += 1
77
+ end
78
+ match(ai, bi)
79
+ 1
80
+ end
81
+
82
+ def compactdiffs
83
+ diffs = []
84
+ @diffs.each { |df|
85
+ i = 0
86
+ curdiff = []
87
+ while i < df.length
88
+ whot = df[i][0]
89
+ s = @isstring ? df[i][2].chr : [df[i][2]]
90
+ p = df[i][1]
91
+ last = df[i][1]
92
+ i += 1
93
+ while df[i] && df[i][0] == whot && df[i][1] == last+1
94
+ s << df[i][2]
95
+ last = df[i][1]
96
+ i += 1
97
+ end
98
+ curdiff.push [whot, p, s]
99
+ end
100
+ diffs.push curdiff
101
+ }
102
+ return diffs
103
+ end
104
+
105
+ attr_reader :diffs, :difftype
106
+
107
+ def initialize(diffs_or_a, b = nil, isstring = nil)
108
+ if b.nil?
109
+ @diffs = diffs_or_a
110
+ @isstring = isstring
111
+ else
112
+ @diffs = []
113
+ @curdiffs = []
114
+ makediff(diffs_or_a, b)
115
+ @difftype = diffs_or_a.class
116
+ end
117
+ end
118
+
119
+ def match(ai, bi)
120
+ @diffs.push @curdiffs unless @curdiffs.empty?
121
+ @curdiffs = []
122
+ end
123
+
124
+ def discarda(i, elem)
125
+ @curdiffs.push ['-', i, elem]
126
+ end
127
+
128
+ def discardb(i, elem)
129
+ @curdiffs.push ['+', i, elem]
130
+ end
131
+
132
+ def compact
133
+ return Diff.new(compactdiffs)
134
+ end
135
+
136
+ def compact!
137
+ @diffs = compactdiffs
138
+ end
139
+
140
+ def inspect
141
+ @diffs.inspect
142
+ end
143
+
144
+ end
145
+
146
+ module Diffable
147
+ def diff(b)
148
+ Diff.new(self, b)
149
+ end
150
+
151
+ # Create a hash that maps elements of the array to arrays of indices
152
+ # where the elements are found.
153
+
154
+ def reverse_hash(range = (0...self.length))
155
+ revmap = {}
156
+ range.each { |i|
157
+ elem = self[i]
158
+ if revmap.has_key? elem
159
+ revmap[elem].push i
160
+ else
161
+ revmap[elem] = [i]
162
+ end
163
+ }
164
+ return revmap
165
+ end
166
+
167
+ def replacenextlarger(value, high = nil)
168
+ high ||= self.length
169
+ if self.empty? || value > self[-1]
170
+ push value
171
+ return high
172
+ end
173
+ # binary search for replacement point
174
+ low = 0
175
+ while low < high
176
+ index = (high+low)/2
177
+ found = self[index]
178
+ return nil if value == found
179
+ if value > found
180
+ low = index + 1
181
+ else
182
+ high = index
183
+ end
184
+ end
185
+
186
+ self[low] = value
187
+ # $stderr << "replace #{value} : 0/#{low}/#{init_high} (#{steps} steps) (#{init_high-low} off )\n"
188
+ # $stderr.puts self.inspect
189
+ #gets
190
+ #p length - low
191
+ return low
192
+ end
193
+
194
+ def patch(diff)
195
+ newary = nil
196
+ if diff.difftype == String
197
+ newary = diff.difftype.new('')
198
+ else
199
+ newary = diff.difftype.new
200
+ end
201
+ ai = 0
202
+ bi = 0
203
+ diff.diffs.each { |d|
204
+ d.each { |mod|
205
+ case mod[0]
206
+ when '-'
207
+ while ai < mod[1]
208
+ newary << self[ai]
209
+ ai += 1
210
+ bi += 1
211
+ end
212
+ ai += 1
213
+ when '+'
214
+ while bi < mod[1]
215
+ newary << self[ai]
216
+ ai += 1
217
+ bi += 1
218
+ end
219
+ newary << mod[2]
220
+ bi += 1
221
+ else
222
+ raise "Unknown diff action"
223
+ end
224
+ }
225
+ }
226
+ while ai < self.length
227
+ newary << self[ai]
228
+ ai += 1
229
+ bi += 1
230
+ end
231
+ return newary
232
+ end
233
+ end
234
+
235
+ class Array
236
+ include Diffable
237
+ end
238
+
239
+ class String
240
+ include Diffable
241
+ end
242
+
243
+ =begin
244
+ = Diff
245
+ (({diff.rb})) - computes the differences between two arrays or
246
+ strings. Copyright (C) 2001 Lars Christensen
247
+
248
+ == Synopsis
249
+
250
+ diff = Diff.new(a, b)
251
+ b = a.patch(diff)
252
+
253
+ == Class Diff
254
+ === Class Methods
255
+ --- Diff.new(a, b)
256
+ --- a.diff(b)
257
+ Creates a Diff object which represent the differences between
258
+ ((|a|)) and ((|b|)). ((|a|)) and ((|b|)) can be either be arrays
259
+ of any objects, strings, or object of any class that include
260
+ module ((|Diffable|))
261
+
262
+ == Module Diffable
263
+ The module ((|Diffable|)) is intended to be included in any class for
264
+ which differences are to be computed. Diffable is included into String
265
+ and Array when (({diff.rb})) is (({require}))'d.
266
+
267
+ Classes including Diffable should implement (({[]})) to get element at
268
+ integer indices, (({<<})) to append elements to the object and
269
+ (({ClassName#new})) should accept 0 arguments to create a new empty
270
+ object.
271
+
272
+ === Instance Methods
273
+ --- Diffable#patch(diff)
274
+ Applies the differences from ((|diff|)) to the object ((|obj|))
275
+ and return the result. ((|obj|)) is not changed. ((|obj|)) and
276
+ can be either an array or a string, but must match the object
277
+ from which the ((|diff|)) was created.
278
+ =end
@@ -0,0 +1,73 @@
1
+ require 'diff'
2
+
3
+ module HTMLCollapsable
4
+ def diff(b)
5
+ Diff.new(self, b)
6
+ end
7
+
8
+ def collapse(diff,starttoken,endtoken)
9
+ newary = nil
10
+ if diff.difftype == String
11
+ newary = diff.difftype.new('')
12
+ else
13
+ newary = diff.difftype.new
14
+ end
15
+ ai = 0
16
+ bi = 0
17
+ diff.diffs.each { |d|
18
+ d.each { |mod|
19
+ quoted = 0
20
+ case mod[0]
21
+ when '-'
22
+ if ai < mod[1]
23
+ quoted = 1
24
+ end
25
+ newary << starttoken if quoted == 1
26
+ while ai < mod[1]
27
+ newary << self[ai]
28
+ ai += 1
29
+ bi += 1
30
+ end
31
+ newary << endtoken if quoted == 1
32
+ ai += 1
33
+ when '+'
34
+ if bi < mod[1]
35
+ quoted = 1
36
+ end
37
+ newary << starttoken if quoted == 1
38
+ while bi < mod[1]
39
+ newary << self[ai]
40
+ ai += 1
41
+ bi += 1
42
+ end
43
+ newary << endtoken if quoted == 1
44
+ newary << mod[2]
45
+ bi += 1
46
+ else
47
+ raise "Unknown diff action"
48
+ end
49
+ }
50
+ }
51
+ quoted = 0
52
+ if ai < self.length
53
+ quoted = 1
54
+ end
55
+ newary << starttoken if quoted == 1
56
+ while ai < self.length
57
+ newary << self[ai]
58
+ ai += 1
59
+ bi += 1
60
+ end
61
+ newary << endtoken if quoted == 1
62
+ return newary
63
+ end
64
+ end
65
+
66
+ class Array
67
+ include HTMLCollapsable
68
+ end
69
+
70
+ class String
71
+ include HTMLCollapsable
72
+ end
73
+
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'diff'
4
+
5
+ def loadfile(filename)
6
+ lines = nil
7
+ File.open(filename, "r") { |f|
8
+ lines = f.readlines
9
+ }
10
+ return lines
11
+ end
12
+
13
+ def diffrange(a, b)
14
+ if (a == b)
15
+ "#{a}"
16
+ else
17
+ "#{a},#{b}"
18
+ end
19
+ end
20
+
21
+ class Diff
22
+ def to_diff(io = $defout)
23
+ offset = 0
24
+ @diffs.each { |b|
25
+ first = b[0][1]
26
+ length = b.length
27
+ action = b[0][0]
28
+ addcount = 0
29
+ remcount = 0
30
+ b.each { |l|
31
+ if l[0] == "+"
32
+ addcount += 1
33
+ elsif l[0] == "-"
34
+ remcount += 1
35
+ end
36
+ }
37
+ if addcount == 0
38
+ puts "#{diffrange(first+1, first+remcount)}d#{first+offset}"
39
+ elsif remcount == 0
40
+ puts "#{first-offset}a#{diffrange(first+1, first+addcount)}"
41
+ else
42
+ puts "#{diffrange(first+1, first+remcount)}c#{diffrange(first+offset+1, first+offset+addcount)}"
43
+ end
44
+ lastdel = (b[0][0] == "-")
45
+ b.each { |l|
46
+ if l[0] == "-"
47
+ offset -= 1
48
+ print "< "
49
+ elsif l[0] == "+"
50
+ offset += 1
51
+ if lastdel
52
+ lastdel = false
53
+ puts "---"
54
+ end
55
+ print "> "
56
+ end
57
+ print l[2]
58
+ }
59
+ }
60
+ end
61
+ end
62
+
63
+ if $0 == __FILE__
64
+
65
+ file1 = ARGV.shift
66
+ file2 = ARGV.shift
67
+
68
+ ary1 = loadfile file1
69
+ ary2 = loadfile file2
70
+
71
+ diff = Diff.new(ary1, ary2)
72
+ diff.to_diff
73
+
74
+ end
@@ -0,0 +1,137 @@
1
+ module DiffArrayTests
2
+
3
+ def test_array_append
4
+ difftest [1,2,3], [1,2,3,4]
5
+ difftest [1,2,3], [1,2,3,4,5]
6
+ end
7
+
8
+ def test_array_prepend
9
+ difftest [1,2,3], [0,1,2,3]
10
+ difftest [1,2,3], [-1,0,1,2,3]
11
+ end
12
+
13
+ def test_array_insert
14
+ difftest [1,2,3], [1,2,4,3]
15
+ difftest [1,2,3], [1,2,4,5,3]
16
+ end
17
+
18
+ def test_array_remove
19
+ difftest [1,2,3], [1,3]
20
+ end
21
+
22
+ def test_array_cutfront
23
+ difftest [1,2,3], [2,3]
24
+ difftest [1,2,3], [3]
25
+ end
26
+
27
+ def test_array_cutback
28
+ difftest [1,2,3], [1,2]
29
+ difftest [1,2,3], [1]
30
+ end
31
+
32
+ def test_array_empty
33
+ difftest [1,2,3], []
34
+ end
35
+
36
+ def test_array_fill
37
+ difftest [], [1,2,3]
38
+ end
39
+
40
+ def test_array_change
41
+ difftest [1,2,3], [1,4,3]
42
+ difftest [1,2,3], [1,4,5]
43
+ difftest [1,2,3,4], [1,5,4]
44
+ end
45
+
46
+ def test_array_noop
47
+ difftest [1,2,3], [1,2,3]
48
+ end
49
+
50
+ def test_array_grow
51
+ difftest [1,2,3], [4,1,5,2,6,3,7]
52
+ end
53
+
54
+ def test_array_shrink
55
+ difftest [1,2,3,4,5,6,7], [2,4,6]
56
+ end
57
+
58
+ end
59
+
60
+ module DiffStringTests
61
+
62
+ def test_string_append
63
+ difftest "abc", "abcd"
64
+ difftest "abc", "abcde"
65
+ end
66
+
67
+ def test_string_preprend
68
+ difftest "abc", "qabc"
69
+ difftest "abc", "qrabc"
70
+ end
71
+
72
+ def test_string_insert
73
+ difftest "abc", "abqc"
74
+ difftest "abc", "abqrc"
75
+ end
76
+
77
+ def test_string_cutfront
78
+ difftest "abc", "bc"
79
+ difftest "abc", "c"
80
+ end
81
+
82
+ def test_string_cutback
83
+ difftest "abc", "ab"
84
+ difftest "abc", "a"
85
+ end
86
+
87
+ def test_string_empty
88
+ difftest "abc", ""
89
+ end
90
+
91
+ def test_string_fill
92
+ difftest "", "abc"
93
+ end
94
+
95
+ def test_string_change
96
+ difftest "abc", "aqc"
97
+ difftest "abc", "aqrc"
98
+ difftest "abcd", "aqd"
99
+ end
100
+
101
+ def test_string_noop
102
+ difftest "abc", "abc"
103
+ end
104
+
105
+ def test_string_grow
106
+ difftest "abc", "qarbsct"
107
+ end
108
+
109
+ def test_string_shrink
110
+ difftest "abcdefg", "bdf"
111
+ end
112
+
113
+ def test_string_remove
114
+ difftest "abc", "ac"
115
+ end
116
+
117
+ end
118
+
119
+ module DiffStressTest
120
+ Elems = [1,2,3]
121
+ def generate_array
122
+ length = (16 + 16 * rand).to_i
123
+ ary = []
124
+ length.times {
125
+ ary << Elems[(rand * Elems.length).to_i]
126
+ }
127
+ return ary
128
+ end
129
+
130
+ def test_stress
131
+ 256.times {
132
+ a = generate_array
133
+ b = generate_array
134
+ difftest(a, b)
135
+ }
136
+ end
137
+ end
@@ -0,0 +1,24 @@
1
+ require 'runit/testcase'
2
+ require 'runit/cui/testrunner'
3
+ require 'runit/testsuite'
4
+ require 'diff'
5
+ require 'test_cases'
6
+
7
+ class DiffTest < RUNIT::TestCase
8
+
9
+ include DiffStringTests
10
+ include DiffArrayTests
11
+ include DiffStressTest
12
+
13
+ def difftest(a, b)
14
+ diff = Diff.new(a, b)
15
+ c = a.patch(diff)
16
+ assert_equal(b, c)
17
+ diff = Diff.new(b, a)
18
+ c = b.patch(diff)
19
+ assert_equal(a, c)
20
+ end
21
+
22
+ end
23
+
24
+ RUNIT::CUI::TestRunner.run(DiffTest.suite)
@@ -0,0 +1,60 @@
1
+ module DiffArrayTests
2
+
3
+ def test_array_append
4
+ difftest [1,2,3], [1,2,3,4], [888,1,2,3,999,4]
5
+ difftest [1,2,3], [1,2,3,4,5], [888,1,2,3,999,4,5]
6
+ end
7
+
8
+ def test_array_prepend
9
+ difftest [1,2,3], [0,1,2,3], [0,888,1,2,3,999]
10
+ difftest [1,2,3], [-1,0,1,2,3], [-1,0,888,1,2,3,999]
11
+ end
12
+
13
+ def test_array_insert
14
+ difftest [1,2,3], [1,2,4,3], [888,1,2,999,4,888,3,999]
15
+ difftest [1,2,3], [1,2,4,5,3], [888,1,2,999,4,5,888,3,999]
16
+ end
17
+
18
+ def test_array_remove
19
+ difftest [1,2,3], [1,3], [888,1,999,888,3,999]
20
+
21
+ end
22
+
23
+ def test_array_cutfront
24
+ difftest [1,2,3], [2,3], [888,2,3,999]
25
+ difftest [1,2,3], [3], [888,3,999]
26
+ end
27
+
28
+ def test_array_cutback
29
+ difftest [1,2,3], [1,2], [888,1,2,999]
30
+ difftest [1,2,3], [1], [888,1,999]
31
+ end
32
+
33
+ def test_array_empty
34
+ difftest [1,2,3], [], []
35
+ end
36
+
37
+ def test_array_fill
38
+ difftest [], [1,2,3], [1,2,3]
39
+ end
40
+
41
+ def test_array_change
42
+ difftest [1,2,3], [1,4,3], [888,1,999,4,888,3,999]
43
+ difftest [1,2,3], [1,4,5], [888,1,999,4,5]
44
+ difftest [1,2,3,4], [1,5,4], [888,1,999,5,888,4,999]
45
+ end
46
+
47
+ def test_array_noop
48
+ difftest [1,2,3], [1,2,3], [888,1,2,3,999]
49
+ end
50
+
51
+ def test_array_grow
52
+ difftest [1,2,3], [4,1,5,2,6,3,7], [4,888,1,999,5,888,2,999,6,888,3,999,7]
53
+ end
54
+
55
+ def test_array_shrink
56
+ difftest [1,2,3,4,5,6,7], [2,4,6], [888,2,999,888,4,999,888,6,999]
57
+ end
58
+
59
+ end
60
+
@@ -0,0 +1,26 @@
1
+ require 'runit/testcase'
2
+ require 'runit/cui/testrunner'
3
+ require 'runit/testsuite'
4
+ require 'diff'
5
+ require 'emaildiff'
6
+ require 'test_emailcases'
7
+
8
+ class EmailDiffTest < RUNIT::TestCase
9
+
10
+ include DiffArrayTests
11
+
12
+ def difftest(a, b, c)
13
+ #puts "old string:"
14
+ #puts a
15
+ #puts "new string:"
16
+ #puts b
17
+ diff = Diff.new(a, b)
18
+ d = a.collapse(diff,888,999)
19
+ #puts "result:"
20
+ #puts c
21
+ assert_equal(c,d)
22
+ end
23
+ end
24
+
25
+
26
+ RUNIT::CUI::TestRunner.run(EmailDiffTest.suite)
@@ -0,0 +1,39 @@
1
+ require 'runit/testcase'
2
+ require 'runit/cui/testrunner'
3
+ require 'runit/testsuite'
4
+ require 'diff'
5
+ require 'test_cases'
6
+
7
+ class UnixDiffTest < RUNIT::TestCase
8
+
9
+ include DiffArrayTests
10
+ #include DiffStressTest
11
+
12
+ def makefile(filename, ary)
13
+ File.open(filename, "w") { |f|
14
+ ary.each { |elem|
15
+ f.puts elem.to_s
16
+ }
17
+ }
18
+ end
19
+
20
+ def rundiff(prog)
21
+ res = []
22
+ IO.popen("#{prog} file1 file2") { |f|
23
+ while ln = f.gets
24
+ res << ln
25
+ end
26
+ }
27
+ res
28
+ end
29
+
30
+ def difftest(a, b)
31
+ makefile("file1", a)
32
+ makefile("file2", b)
33
+ result1 = rundiff("diff")
34
+ result2 = rundiff("lib/unixdiff.rb");
35
+ assert_equal(result1, result2)
36
+ end
37
+ end
38
+
39
+ RUNIT::CUI::TestRunner.run(UnixDiffTest.suite)
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: diff
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 1
9
+ version: 0.3.1
10
+ platform: ruby
11
+ authors:
12
+ - Wayne Walter
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain:
16
+ - |
17
+ -----BEGIN CERTIFICATE-----
18
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkaWZm
19
+ Z2VtMRgwFgYKCZImiZPyLGQBGRYIdGlja3pvb20xEzARBgoJkiaJk/IsZAEZFgNj
20
+ b20wHhcNMTAwNjI3MDUwNjEyWhcNMTEwNjI3MDUwNjEyWjBBMRAwDgYDVQQDDAdk
21
+ aWZmZ2VtMRgwFgYKCZImiZPyLGQBGRYIdGlja3pvb20xEzARBgoJkiaJk/IsZAEZ
22
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbPiHhbX0yQuqX
23
+ NONpzyqFHMSIM6aUXrOMWv1VWJejRli2ssdixBEL3laSCbAIpBwPQXlUbkl5Keq6
24
+ kZK9LmztDK3S8y37YSJ/ojFjdX8AM/MVByC2BJGQGEzIrHikiKwlJ8GxM3pLow4+
25
+ +av0dyWCUgVn9bGvDIcay780i4wmaSC2Sf9Obkgu1TiR0hc48AtUOToN4RwdScL0
26
+ oAmKG/lSYGUhkhUROdghMEaGMotCFHm5szM5miOxK5PqCq14cQP5W+ubKo2oE6iF
27
+ 3YH7iG+qspCGOGjKcz8g+AYmMsN8sO2oh1orM7EG6Bm1RI6gKeruC6ez1woF8jn2
28
+ 6WGa9a4rAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
29
+ BBRYb3kBzatxDzFkBANlHfc1S5u7yjANBgkqhkiG9w0BAQUFAAOCAQEAhISiSEuF
30
+ RbvSpMfZe4g/9O2e+A6pE7BCmmR6EzGanQFf39DMSdwd8GbtW1p7ZQYGuxiFVGQw
31
+ OZiRnP5QNqqtR5LjArw9obt9BgeJjhAs0WI97G9LJdKu4kz1Yee+6kN5Dt5hjrVX
32
+ tHxTUv4oyN8PxyKnQt+pevLsp7TkaYHtl2+VLg9iU5syNPhASx7erHwiMu6yNOjZ
33
+ uwsQ4lOsT6OM45inY82GupysnaP5BrZh/WBQ3m8mdA47pGBmHH3Vm57hooA+RSW7
34
+ NYrQY6HQkU2llwX9w8Ts8rO45tig6pSbgkim0V0ewjxWUI4D7zzc1t55ZsJJZu9o
35
+ nbAv9FEyqLVW8Q==
36
+ -----END CERTIFICATE-----
37
+
38
+ date: 2010-06-27 00:00:00 +00:00
39
+ default_executable:
40
+ dependencies: []
41
+
42
+ description: Diff Algorithm Implementation
43
+ email: diffgem@tickzoom.com
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ extra_rdoc_files:
49
+ - README
50
+ - TODO
51
+ - lib/diff.rb
52
+ - lib/emaildiff.rb
53
+ - lib/unixdiff.rb
54
+ files:
55
+ - Manifest
56
+ - README
57
+ - Rakefile
58
+ - TODO
59
+ - diff.gemspec
60
+ - lib/diff.rb
61
+ - lib/emaildiff.rb
62
+ - lib/unixdiff.rb
63
+ - test/test_cases.rb
64
+ - test/test_diff.rb
65
+ - test/test_emailcases.rb
66
+ - test/test_emaildiff.rb
67
+ - test/test_unixdiff.rb
68
+ has_rdoc: true
69
+ homepage: http://users.cybercity.dk/~dsl8950/ruby/diff.html
70
+ licenses: []
71
+
72
+ post_install_message:
73
+ rdoc_options:
74
+ - --line-numbers
75
+ - --inline-source
76
+ - --title
77
+ - Diff
78
+ - --main
79
+ - README
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ segments:
96
+ - 1
97
+ - 2
98
+ version: "1.2"
99
+ requirements: []
100
+
101
+ rubyforge_project: diff
102
+ rubygems_version: 1.3.7
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Diff Algorithm Implementation
106
+ test_files:
107
+ - test/test_emailcases.rb
108
+ - test/test_emaildiff.rb
109
+ - test/test_unixdiff.rb
110
+ - test/test_diff.rb
111
+ - test/test_cases.rb
Binary file