hashdiff 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6af49f121e2b09e5dcdf8a649f6d48c25f63ae03
4
- data.tar.gz: c6738c2b03d36f622ac1e0a3c228a863b691ac29
3
+ metadata.gz: 482b0233e91f747074eada75539247148a14d31d
4
+ data.tar.gz: 0aba247c54a9e96d433d77ecc76b3e4cf1396075
5
5
  SHA512:
6
- metadata.gz: 8dfda8cd1b17af2c64ea4626570e7d858b76a5ed918df4b6a5703c63e0ae43c371cbe5e3573b4382aa1491915f48335e62d3b4300f3c678660f329f39e8d9b62
7
- data.tar.gz: 71ab91ba878e19c436dbad30cc08c85645aadf6aabeed889dc8e3661102d2ddf5a98b12c7a6a8b1007a5115f64e082829f88d99abe11ad87f2a69cf504f28885
6
+ metadata.gz: 10fe5b5b37c1a80d317d509b133a880211723ff4b184e892678eb7211de5bcf41b27d482151237052efabd6c9eee336507d5df4f19e2b0e727de970e47280cb4
7
+ data.tar.gz: 22baf87f78115a872a6df5600b8a31c2d8e3c35991ca114aff60a89af70d29b530f3771386d8bb67578324884f30291e120ed418f78c2768baa746e456f65d71
@@ -0,0 +1,21 @@
1
+ require: rubocop-rspec
2
+ Metrics/PerceivedComplexity:
3
+ Enabled: false
4
+ Metrics/CyclomaticComplexity:
5
+ Enabled: false
6
+ Metrics/MethodLength:
7
+ Enabled: false
8
+ Metrics/AbcSize:
9
+ Enabled: false
10
+ Metrics/LineLength:
11
+ Enabled: false
12
+ Metrics/ClassLength:
13
+ Enabled: false
14
+ Metrics/BlockLength:
15
+ Enabled: false
16
+ Metrics/ModuleLength:
17
+ Enabled: false
18
+ Style/Documentation:
19
+ Enabled: false
20
+ RSpec/ExampleLength:
21
+ Enabled: false
@@ -1,13 +1,10 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 1.9.3
5
4
  - 2.0.0
6
5
  - 2.1.10
7
6
  - 2.2.8
8
7
  - 2.3.4
9
8
  - 2.4.2
10
- script: "bundle exec rake spec"
11
-
12
- before_install:
13
- - gem install bundler
9
+ - 2.5.3
10
+ - 2.6.0
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  group :test do
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # HashDiff [![Build Status](https://secure.travis-ci.org/liufengyun/hashdiff.png)](http://travis-ci.org/liufengyun/hashdiff) [![Gem Version](https://badge.fury.io/rb/hashdiff.png)](http://badge.fury.io/rb/hashdiff)
1
+ # HashDiff [![Build Status](https://secure.travis-ci.org/liufengyun/hashdiff.svg)](http://travis-ci.org/liufengyun/hashdiff) [![Gem Version](https://badge.fury.io/rb/hashdiff.svg)](http://badge.fury.io/rb/hashdiff)
2
2
 
3
3
  HashDiff is a ruby library to compute the smallest difference between two hashes.
4
4
 
data/Rakefile CHANGED
@@ -1,13 +1,16 @@
1
- $:.push File.expand_path("../lib", __FILE__)
1
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
2
+
3
+ require 'rubocop/rake_task'
2
4
 
3
5
  require 'bundler'
4
6
  Bundler::GemHelper.install_tasks
5
7
 
6
8
  require 'rspec/core/rake_task'
7
9
 
8
- task :default => :spec
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %w[spec rubocop]
9
13
 
10
14
  RSpec::Core::RakeTask.new(:spec) do |spec|
11
- spec.pattern = "./spec/**/*_spec.rb"
15
+ spec.pattern = './spec/**/*_spec.rb'
12
16
  end
13
-
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## v0.3.8 2018-12-30
4
+
5
+ * Add Rubocop and drops Ruby 1.9 support #47
6
+
3
7
  ## v0.3.7 2017-10-08
4
8
 
5
9
  * remove 1.8.7 support from gemspec #39
@@ -1,25 +1,27 @@
1
- $LOAD_PATH << File.expand_path("../lib", __FILE__)
1
+ $LOAD_PATH << File.expand_path('lib', __dir__)
2
2
  require 'hashdiff/version'
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.name = %q{hashdiff}
5
+ s.name = 'hashdiff'
6
6
  s.version = HashDiff::VERSION
7
7
  s.license = 'MIT'
8
- s.summary = %q{ HashDiff is a diff lib to compute the smallest difference between two hashes. }
9
- s.description = %q{ HashDiff is a diff lib to compute the smallest difference between two hashes. }
8
+ s.summary = ' HashDiff is a diff lib to compute the smallest difference between two hashes. '
9
+ s.description = ' HashDiff is a diff lib to compute the smallest difference between two hashes. '
10
10
 
11
11
  s.files = `git ls-files`.split("\n")
12
12
  s.test_files = `git ls-files -- Appraisals {spec}/*`.split("\n")
13
13
 
14
14
  s.require_paths = ['lib']
15
- s.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
15
+ s.required_ruby_version = Gem::Requirement.new('>= 1.9.3')
16
16
 
17
- s.authors = ["Liu Fengyun"]
18
- s.email = ["liufengyunchina@gmail.com"]
17
+ s.authors = ['Liu Fengyun']
18
+ s.email = ['liufengyunchina@gmail.com']
19
19
 
20
- s.homepage = "https://github.com/liufengyun/hashdiff"
20
+ s.homepage = 'https://github.com/liufengyun/hashdiff'
21
21
 
22
- s.add_development_dependency("rspec", "~> 2.0")
23
- s.add_development_dependency("yard")
24
- s.add_development_dependency("bluecloth")
22
+ s.add_development_dependency('bluecloth')
23
+ s.add_development_dependency('rspec', '~> 2.0')
24
+ s.add_development_dependency('rubocop')
25
+ s.add_development_dependency('rubocop-rspec')
26
+ s.add_development_dependency('yard')
25
27
  end
@@ -1,5 +1,4 @@
1
1
  module HashDiff
2
-
3
2
  # Best diff two objects, which tries to generate the smallest change set using different similarity values.
4
3
  #
5
4
  # HashDiff.best_diff is useful in case of comparing two objects which include similar hashes in arrays.
@@ -29,20 +28,20 @@ module HashDiff
29
28
  def self.best_diff(obj1, obj2, options = {}, &block)
30
29
  options[:comparison] = block if block_given?
31
30
 
32
- opts = { :similarity => 0.3 }.merge!(options)
33
- diffs_1 = diff(obj1, obj2, opts)
34
- count_1 = count_diff diffs_1
31
+ opts = { similarity: 0.3 }.merge!(options)
32
+ diffs1 = diff(obj1, obj2, opts)
33
+ count1 = count_diff diffs1
35
34
 
36
- opts = { :similarity => 0.5 }.merge!(options)
37
- diffs_2 = diff(obj1, obj2, opts)
38
- count_2 = count_diff diffs_2
35
+ opts = { similarity: 0.5 }.merge!(options)
36
+ diffs2 = diff(obj1, obj2, opts)
37
+ count2 = count_diff diffs2
39
38
 
40
- opts = { :similarity => 0.8 }.merge!(options)
41
- diffs_3 = diff(obj1, obj2, opts)
42
- count_3 = count_diff diffs_3
39
+ opts = { similarity: 0.8 }.merge!(options)
40
+ diffs3 = diff(obj1, obj2, opts)
41
+ count3 = count_diff diffs3
43
42
 
44
- count, diffs = count_1 < count_2 ? [count_1, diffs_1] : [count_2, diffs_2]
45
- diffs = count < count_3 ? diffs : diffs_3
43
+ count, diffs = count1 < count2 ? [count1, diffs1] : [count2, diffs2]
44
+ count < count3 ? diffs : diffs3
46
45
  end
47
46
 
48
47
  # Compute the diff of two hashes or arrays
@@ -74,14 +73,14 @@ module HashDiff
74
73
  # @since 0.0.1
75
74
  def self.diff(obj1, obj2, options = {}, &block)
76
75
  opts = {
77
- :prefix => '',
78
- :similarity => 0.8,
79
- :delimiter => '.',
80
- :strict => true,
81
- :strip => false,
82
- :numeric_tolerance => 0,
83
- :array_path => false,
84
- :use_lcs => true
76
+ prefix: '',
77
+ similarity: 0.8,
78
+ delimiter: '.',
79
+ strict: true,
80
+ strip: false,
81
+ numeric_tolerance: 0,
82
+ array_path: false,
83
+ use_lcs: true
85
84
  }.merge!(options)
86
85
 
87
86
  opts[:prefix] = [] if opts[:array_path] && opts[:prefix] == ''
@@ -92,21 +91,13 @@ module HashDiff
92
91
  result = custom_compare(opts[:comparison], opts[:prefix], obj1, obj2)
93
92
  return result if result
94
93
 
95
- if obj1.nil? and obj2.nil?
96
- return []
97
- end
94
+ return [] if obj1.nil? && obj2.nil?
98
95
 
99
- if obj1.nil?
100
- return [['~', opts[:prefix], nil, obj2]]
101
- end
96
+ return [['~', opts[:prefix], nil, obj2]] if obj1.nil?
102
97
 
103
- if obj2.nil?
104
- return [['~', opts[:prefix], obj1, nil]]
105
- end
98
+ return [['~', opts[:prefix], obj1, nil]] if obj2.nil?
106
99
 
107
- unless comparable?(obj1, obj2, opts[:strict])
108
- return [['~', opts[:prefix], obj1, obj2]]
109
- end
100
+ return [['~', opts[:prefix], obj1, obj2]] unless comparable?(obj1, obj2, opts[:strict])
110
101
 
111
102
  result = []
112
103
  if obj1.is_a?(Array) && opts[:use_lcs]
@@ -114,7 +105,7 @@ module HashDiff
114
105
  # use a's index for similarity
115
106
  lcs.each do |pair|
116
107
  prefix = prefix_append_array_index(opts[:prefix], pair[0], opts)
117
- result.concat(diff(obj1[pair[0]], obj2[pair[1]], opts.merge(:prefix => prefix)))
108
+ result.concat(diff(obj1[pair[0]], obj2[pair[1]], opts.merge(prefix: prefix)))
118
109
  end
119
110
  end
120
111
 
@@ -135,7 +126,7 @@ module HashDiff
135
126
  added_keys = obj2.keys - obj1.keys
136
127
 
137
128
  # add deleted properties
138
- deleted_keys.sort_by{|k,v| k.to_s }.each do |k|
129
+ deleted_keys.sort_by { |k, _v| k.to_s }.each do |k|
139
130
  change_key = prefix_append_key(opts[:prefix], k, opts)
140
131
  custom_result = custom_compare(opts[:comparison], change_key, obj1[k], nil)
141
132
 
@@ -147,26 +138,27 @@ module HashDiff
147
138
  end
148
139
 
149
140
  # recursive comparison for common keys
150
- common_keys.sort_by{|k,v| k.to_s }.each do |k|
141
+ common_keys.sort_by { |k, _v| k.to_s }.each do |k|
151
142
  prefix = prefix_append_key(opts[:prefix], k, opts)
152
- result.concat(diff(obj1[k], obj2[k], opts.merge(:prefix => prefix)))
143
+ result.concat(diff(obj1[k], obj2[k], opts.merge(prefix: prefix)))
153
144
  end
154
145
 
155
146
  # added properties
156
- added_keys.sort_by{|k,v| k.to_s }.each do |k|
147
+ added_keys.sort_by { |k, _v| k.to_s }.each do |k|
157
148
  change_key = prefix_append_key(opts[:prefix], k, opts)
158
- unless obj1.key?(k)
159
- custom_result = custom_compare(opts[:comparison], change_key, nil, obj2[k])
160
-
161
- if custom_result
162
- result.concat(custom_result)
163
- else
164
- result << ['+', change_key, obj2[k]]
165
- end
149
+ next if obj1.key?(k)
150
+
151
+ custom_result = custom_compare(opts[:comparison], change_key, nil, obj2[k])
152
+
153
+ if custom_result
154
+ result.concat(custom_result)
155
+ else
156
+ result << ['+', change_key, obj2[k]]
166
157
  end
167
158
  end
168
159
  else
169
160
  return [] if compare_values(obj1, obj2, opts)
161
+
170
162
  return [['~', opts[:prefix], obj1, obj2]]
171
163
  end
172
164
 
@@ -176,36 +168,36 @@ module HashDiff
176
168
  # @private
177
169
  #
178
170
  # diff array using LCS algorithm
179
- def self.diff_array_lcs(a, b, options = {})
171
+ def self.diff_array_lcs(arraya, arrayb, options = {})
180
172
  opts = {
181
- :prefix => '',
182
- :similarity => 0.8,
183
- :delimiter => '.'
173
+ prefix: '',
174
+ similarity: 0.8,
175
+ delimiter: '.'
184
176
  }.merge!(options)
185
177
 
186
178
  change_set = []
187
- if a.size == 0 and b.size == 0
188
- return []
189
- elsif a.size == 0
190
- b.each_index do |index|
191
- change_set << ['+', index, b[index]]
179
+ return [] if arraya.empty? && arrayb.empty?
180
+
181
+ if arraya.empty?
182
+ arrayb.each_index do |index|
183
+ change_set << ['+', index, arrayb[index]]
192
184
  end
193
185
  return change_set
194
- elsif b.size == 0
195
- a.each_index do |index|
196
- i = a.size - index - 1
197
- change_set << ['-', i, a[i]]
186
+ elsif arrayb.empty?
187
+ arraya.each_index do |index|
188
+ i = arraya.size - index - 1
189
+ change_set << ['-', i, arraya[i]]
198
190
  end
199
191
  return change_set
200
192
  end
201
193
 
202
- links = lcs(a, b, opts)
194
+ links = lcs(arraya, arrayb, opts)
203
195
 
204
196
  # yield common
205
197
  yield links if block_given?
206
198
 
207
199
  # padding the end
208
- links << [a.size, b.size]
200
+ links << [arraya.size, arrayb.size]
209
201
 
210
202
  last_x = -1
211
203
  last_y = -1
@@ -213,13 +205,13 @@ module HashDiff
213
205
  x, y = pair
214
206
 
215
207
  # remove from a, beginning from the end
216
- (x > last_x + 1) and (x - last_x - 2).downto(0).each do |i|
217
- change_set << ['-', last_y + i + 1, a[i + last_x + 1]]
208
+ (x > last_x + 1) && (x - last_x - 2).downto(0).each do |i|
209
+ change_set << ['-', last_y + i + 1, arraya[i + last_x + 1]]
218
210
  end
219
211
 
220
212
  # add from b, beginning from the head
221
- (y > last_y + 1) and 0.upto(y - last_y - 2).each do |i|
222
- change_set << ['+', last_y + i + 1, b[i + last_y + 1]]
213
+ (y > last_y + 1) && 0.upto(y - last_y - 2).each do |i|
214
+ change_set << ['+', last_y + i + 1, arrayb[i + last_y + 1]]
223
215
  end
224
216
 
225
217
  # update flags
@@ -3,44 +3,40 @@ module HashDiff
3
3
  #
4
4
  # caculate array difference using LCS algorithm
5
5
  # http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
6
- def self.lcs(a, b, options = {})
7
- opts = { :similarity => 0.8 }.merge!(options)
6
+ def self.lcs(arraya, arrayb, options = {})
7
+ opts = { similarity: 0.8 }.merge!(options)
8
8
 
9
9
  opts[:prefix] = prefix_append_array_index(opts[:prefix], '*', opts)
10
10
 
11
- return [] if a.size == 0 or b.size == 0
11
+ return [] if arraya.empty? || arrayb.empty?
12
12
 
13
13
  a_start = b_start = 0
14
- a_finish = a.size - 1
15
- b_finish = b.size - 1
14
+ a_finish = arraya.size - 1
15
+ b_finish = arrayb.size - 1
16
16
  vector = []
17
17
 
18
18
  lcs = []
19
19
  (b_start..b_finish).each do |bi|
20
- lcs[bi] = []
20
+ lcs[bi] = []
21
21
  (a_start..a_finish).each do |ai|
22
- if similar?(a[ai], b[bi], opts)
23
- topleft = (ai > 0 and bi > 0)? lcs[bi-1][ai-1][1] : 0
22
+ if similar?(arraya[ai], arrayb[bi], opts)
23
+ topleft = (ai > 0) && (bi > 0) ? lcs[bi - 1][ai - 1][1] : 0
24
24
  lcs[bi][ai] = [:topleft, topleft + 1]
25
- elsif
26
- top = (bi > 0)? lcs[bi-1][ai][1] : 0
27
- left = (ai > 0)? lcs[bi][ai-1][1] : 0
28
- count = (top > left) ? top : left
25
+ elsif (top = bi > 0 ? lcs[bi - 1][ai][1] : 0)
26
+ left = ai > 0 ? lcs[bi][ai - 1][1] : 0
27
+ count = top > left ? top : left
29
28
 
30
- direction = :both
31
- if top > left
32
- direction = :top
33
- elsif top < left
34
- direction = :left
35
- else
36
- if bi == 0
37
- direction = :top
38
- elsif ai == 0
39
- direction = :left
40
- else
41
- direction = :both
42
- end
43
- end
29
+ direction = if top > left
30
+ :top
31
+ elsif top < left
32
+ :left
33
+ elsif bi.zero?
34
+ :top
35
+ elsif ai.zero?
36
+ :left
37
+ else
38
+ :both
39
+ end
44
40
 
45
41
  lcs[bi][ai] = [direction, count]
46
42
  end
@@ -49,7 +45,7 @@ module HashDiff
49
45
 
50
46
  x = a_finish
51
47
  y = b_finish
52
- while x >= 0 and y >= 0 and lcs[y][x][1] > 0
48
+ while (x >= 0) && (y >= 0) && (lcs[y][x][1] > 0)
53
49
  if lcs[y][x][0] == :both
54
50
  x -= 1
55
51
  elsif lcs[y][x][0] == :topleft
@@ -65,5 +61,4 @@ module HashDiff
65
61
 
66
62
  vector
67
63
  end
68
-
69
64
  end
@@ -5,7 +5,7 @@ module HashDiff
5
5
  # than using the lcs algorithm but is considerably faster
6
6
  class LinearCompareArray
7
7
  def self.call(old_array, new_array, options = {})
8
- instance = self.new(old_array, new_array, options)
8
+ instance = new(old_array, new_array, options)
9
9
  instance.call
10
10
  end
11
11
 
@@ -79,7 +79,7 @@ module HashDiff
79
79
 
80
80
  def item_difference(old_item, new_item, item_index)
81
81
  prefix = HashDiff.prefix_append_array_index(options[:prefix], item_index, options)
82
- HashDiff.diff(old_item, new_item, options.merge(:prefix => prefix))
82
+ HashDiff.diff(old_item, new_item, options.merge(prefix: prefix))
83
83
  end
84
84
 
85
85
  # look ahead in the new array to see if the current item appears later
@@ -120,6 +120,7 @@ module HashDiff
120
120
 
121
121
  def append_addititions_before_match(match_index)
122
122
  return unless match_index
123
+
123
124
  (new_index...match_index).each { |i| append_addition(new_array[i], i) }
124
125
  self.expected_additions = expected_additions - (match_index - new_index)
125
126
  self.new_index = match_index
@@ -127,6 +128,7 @@ module HashDiff
127
128
 
128
129
  def append_deletions_before_match(match_index)
129
130
  return unless match_index
131
+
130
132
  (old_index...match_index).each { |i| append_deletion(old_array[i], i) }
131
133
  self.expected_additions = expected_additions + (match_index - new_index)
132
134
  self.old_index = match_index