di_differ 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/di_differ.rb +123 -0
- data/lib/diff/table_formatter.rb +21 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cd028e2a52a5ff213391286eddd2372dd528a071
|
4
|
+
data.tar.gz: e9276d5f81d9a4680884326cf21d571c89d5dc71
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bda8c87e3677c5023a71288f47d8d298f862be0a264cc38cabe48dac7ec662b8f2ce163f7f7fd700a04c27fa76abab71ae1eea3942c5c6203b0dddf88603a71d
|
7
|
+
data.tar.gz: cebc6729b2cf0b932c8160e1ccf3e1fcdb8c745ce281b6f7173aca8c94c78790a281edf88cfcf88e108c17fa89512c4b350f30965ed964bcc1eaac50d215a5e5
|
data/lib/di_differ.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# require 'diff/diff'
|
2
|
+
require 'diff/table_formatter'
|
3
|
+
|
4
|
+
module DiDiffer
|
5
|
+
class Differ
|
6
|
+
attr_reader :diff_arr
|
7
|
+
|
8
|
+
def initialize(file1, file2)
|
9
|
+
raise "File #{file1} not found" unless File.exists?(file1)
|
10
|
+
raise "File #{file2} not found" unless File.exists?(file2)
|
11
|
+
|
12
|
+
@s1 = File.readlines(file1)
|
13
|
+
@s2 = File.readlines(file2)
|
14
|
+
|
15
|
+
clean_data
|
16
|
+
|
17
|
+
@matrix = Array.new(@s1.size + 1){ Array.new(@s2.size + 1) { 0 } }
|
18
|
+
@diff_arr = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def diff(formatter: TableFormatter.new)
|
22
|
+
subsequence_matrix
|
23
|
+
build_diff_arr
|
24
|
+
compaq
|
25
|
+
formatter.output(@diff_arr)
|
26
|
+
end
|
27
|
+
|
28
|
+
def common_subsequence
|
29
|
+
seq = []
|
30
|
+
i = @s1.size
|
31
|
+
j = @s2.size
|
32
|
+
|
33
|
+
while i >= 0 && j >= 0 do
|
34
|
+
if @s1[i-1] == @s2[j-1]
|
35
|
+
seq << @s1[i-1]
|
36
|
+
i -= 1
|
37
|
+
j -= 1
|
38
|
+
elsif @matrix[i - 1][j] >= @matrix[i][j - 1]
|
39
|
+
i -= 1
|
40
|
+
else
|
41
|
+
j -= 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
seq.reverse
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def build_diff_arr(i = nil, j = nil)
|
51
|
+
i ||= @s1.size
|
52
|
+
j ||= @s2.size
|
53
|
+
|
54
|
+
if i > 0 && j > 0 && @s1[i-1] == @s2[j-1]
|
55
|
+
build_diff_arr(i - 1, j - 1)
|
56
|
+
@diff_arr << {type: :not_changed, val: @s1[i-1]}
|
57
|
+
elsif j > 0 && (i == 0 || @matrix[i][j - 1] >= @matrix[i - 1][j])
|
58
|
+
build_diff_arr(i, j - 1)
|
59
|
+
@diff_arr << {type: :added, val: @s2[j-1]}
|
60
|
+
elsif i > 0 && (j == 0 || @matrix[i][j - 1] < @matrix[i - 1][j])
|
61
|
+
build_diff_arr(i - 1, j)
|
62
|
+
@diff_arr << {type: :removed, val: @s1[i-1]}
|
63
|
+
else
|
64
|
+
''
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def compaq
|
69
|
+
@diff_arr.each_with_index do |e, i|
|
70
|
+
next unless [:added, :removed].include? e[:type]
|
71
|
+
next if e.empty?
|
72
|
+
|
73
|
+
paired_elem_index = get_pair_index(i)
|
74
|
+
next unless paired_elem_index
|
75
|
+
|
76
|
+
replace_str = ''
|
77
|
+
replace_str << (@diff_arr[paired_elem_index][:type] == :added ? e[:val] : @diff_arr[paired_elem_index][:val])
|
78
|
+
replace_str << '|'
|
79
|
+
replace_str << (@diff_arr[paired_elem_index][:type] == :removed ? e[:val] : @diff_arr[paired_elem_index][:val])
|
80
|
+
|
81
|
+
@diff_arr[i][:val] = replace_str
|
82
|
+
@diff_arr[i][:type] = :changed
|
83
|
+
@diff_arr[paired_elem_index] = {}
|
84
|
+
end
|
85
|
+
|
86
|
+
@diff_arr.delete_if(&:empty?)
|
87
|
+
end
|
88
|
+
|
89
|
+
def subsequence_matrix
|
90
|
+
return if @s1.empty? || @s2.empty?
|
91
|
+
|
92
|
+
@s1.each_with_index do |word1, i|
|
93
|
+
i = i.next
|
94
|
+
@s2.each_with_index do |word2, j|
|
95
|
+
j = j.next
|
96
|
+
|
97
|
+
if word1 == word2
|
98
|
+
@matrix[i][j] = @matrix[i-1][j-1] + 1
|
99
|
+
elsif @matrix[i-1][j] >= @matrix[i][j-1]
|
100
|
+
@matrix[i][j] = @matrix[i-1][j]
|
101
|
+
else
|
102
|
+
@matrix[i][j] = @matrix[i][j-1]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def clean_data
|
109
|
+
@s1.map!{|v| v.gsub(/\r|\n?/, '').strip}
|
110
|
+
@s2.map!{|v| v.gsub(/\r|\n?/, '').strip}
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_pair_index(elem_index)
|
114
|
+
return unless [:added, :removed].include? @diff_arr[elem_index][:type]
|
115
|
+
@diff_arr.drop(elem_index + 1).each_with_index do |e, i|
|
116
|
+
next if e.empty?
|
117
|
+
return unless [:added, :removed].include? e[:type]
|
118
|
+
return i + elem_index + 1 if e[:type] != @diff_arr[elem_index][:type]
|
119
|
+
end
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class TableFormatter
|
2
|
+
def output(diff_arr)
|
3
|
+
diff_arr.each_with_index do |e, i|
|
4
|
+
print i + 1
|
5
|
+
print ' '
|
6
|
+
print case e[:type]
|
7
|
+
when :changed
|
8
|
+
'*'
|
9
|
+
when :removed
|
10
|
+
'-'
|
11
|
+
when :added
|
12
|
+
'+'
|
13
|
+
else
|
14
|
+
' '
|
15
|
+
end
|
16
|
+
print ' '
|
17
|
+
print e[:val]
|
18
|
+
print "\n"
|
19
|
+
end;nil
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: di_differ
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- a.drobazko
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-28 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: The difference between two files using the LCS
|
14
|
+
email: drobazko@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/di_differ.rb
|
20
|
+
- lib/diff/table_formatter.rb
|
21
|
+
homepage: http://rubygems.org/gems/di_differ
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.4.8
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Files Diff
|
45
|
+
test_files: []
|
46
|
+
has_rdoc:
|