di_differ 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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: