di_differ 0.0.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.
@@ -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: