hashdiff 0.3.7 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6af49f121e2b09e5dcdf8a649f6d48c25f63ae03
4
- data.tar.gz: c6738c2b03d36f622ac1e0a3c228a863b691ac29
2
+ SHA256:
3
+ metadata.gz: a9b50073f973250c144bb05272510f462dda18a7f5c9a8719156065773fdcaaa
4
+ data.tar.gz: 903439ed3ea22994d072201509506232fb77482506494bbb8c8419dc9fb8d546
5
5
  SHA512:
6
- metadata.gz: 8dfda8cd1b17af2c64ea4626570e7d858b76a5ed918df4b6a5703c63e0ae43c371cbe5e3573b4382aa1491915f48335e62d3b4300f3c678660f329f39e8d9b62
7
- data.tar.gz: 71ab91ba878e19c436dbad30cc08c85645aadf6aabeed889dc8e3661102d2ddf5a98b12c7a6a8b1007a5115f64e082829f88d99abe11ad87f2a69cf504f28885
6
+ metadata.gz: e1c00d4710a67688a35197197da93ac3bfabca5f5a51edc152bfbd341a16548e762ddf2290364b7fc3a20e99cdb6d8d909ff84e766468fe623eb3977afd6d90f
7
+ data.tar.gz: 2d860929e99458cd89ee60ce877a87557d6bb9d52dcd25e0989f1a0a7b372d026bb646ee2b19498f6637a485f15fcd1e68cf1e1c0dbe666ad5af1792d60a893a
data/.rubocop.yml ADDED
@@ -0,0 +1,32 @@
1
+ require: rubocop-rspec
2
+ AllCops:
3
+ TargetRubyVersion: 2.0 # always the lowest version we support
4
+ Metrics/PerceivedComplexity:
5
+ Enabled: false
6
+ Metrics/CyclomaticComplexity:
7
+ Enabled: false
8
+ Metrics/MethodLength:
9
+ Enabled: false
10
+ Metrics/AbcSize:
11
+ Enabled: false
12
+ Metrics/LineLength:
13
+ Enabled: false
14
+ Metrics/ClassLength:
15
+ Enabled: false
16
+ Metrics/BlockLength:
17
+ Enabled: false
18
+ Metrics/ModuleLength:
19
+ Enabled: false
20
+ Style/Documentation:
21
+ Enabled: false
22
+ Style/FrozenStringLiteralComment:
23
+ Enabled: true
24
+ EnforcedStyle: always
25
+ Style/NumericPredicate:
26
+ Enabled: false
27
+ Style/RedundantFreeze:
28
+ Enabled: false
29
+ RSpec/ExampleLength:
30
+ Enabled: false
31
+ RSpec/DescribeClass:
32
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,13 +1,11 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ cache: bundler
3
4
  rvm:
4
- - 1.9.3
5
5
  - 2.0.0
6
6
  - 2.1.10
7
7
  - 2.2.8
8
8
  - 2.3.4
9
9
  - 2.4.2
10
- script: "bundle exec rake spec"
11
-
12
- before_install:
13
- - gem install bundler
10
+ - 2.5.3
11
+ - 2.6.0
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "http://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'http://rubygems.org'
2
4
  gemspec
3
5
 
4
6
  group :test do
data/README.md CHANGED
@@ -1,14 +1,17 @@
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
- HashDiff is a ruby library to compute the smallest difference between two hashes.
3
+ Hashdiff is a ruby library to compute the smallest difference between two hashes.
4
4
 
5
5
  It also supports comparing two arrays.
6
6
 
7
- HashDiff does not monkey-patch any existing class. All features are contained inside the `HashDiff` module.
7
+ Hashdiff does not monkey-patch any existing class. All features are contained inside the `Hashdiff` module.
8
8
 
9
9
  **Docs**: [Documentation](http://rubydoc.info/gems/hashdiff)
10
10
 
11
- ## Why HashDiff?
11
+
12
+ __WARNING__: Don't use the library for comparing large arrays, say ~10K (see #49).
13
+
14
+ ## Why Hashdiff?
12
15
 
13
16
  Given two Hashes A and B, sometimes you face the question: what's the smallest modification that can be made to change A into B?
14
17
 
@@ -18,7 +21,7 @@ An algorithm that responds to this question has to do following:
18
21
  * Compute recursively -- Arrays and Hashes may be nested arbitrarily in A or B.
19
22
  * Compute the smallest change -- it should recognize similar child Hashes or child Arrays between A and B.
20
23
 
21
- HashDiff answers the question above using an opinionated approach:
24
+ Hashdiff answers the question above using an opinionated approach:
22
25
 
23
26
  * Hash can be represented as a list of (dot-syntax-path, value) pairs. For example, `{a:[{c:2}]}` can be represented as `["a[0].c", 2]`.
24
27
  * The change set can be represented using the dot-syntax representation. For example, `[['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]]`.
@@ -29,7 +32,7 @@ HashDiff answers the question above using an opinionated approach:
29
32
 
30
33
  To use the gem, add the following to your Gemfile:
31
34
 
32
- ```ruby
35
+ ```Ruby
33
36
  gem 'hashdiff'
34
37
  ```
35
38
 
@@ -43,7 +46,7 @@ Two simple hashes:
43
46
  a = {a:3, b:2}
44
47
  b = {}
45
48
 
46
- diff = HashDiff.diff(a, b)
49
+ diff = Hashdiff.diff(a, b)
47
50
  diff.should == [['-', 'a', 3], ['-', 'b', 2]]
48
51
  ```
49
52
 
@@ -53,7 +56,7 @@ More complex hashes:
53
56
  a = {a:{x:2, y:3, z:4}, b:{x:3, z:45}}
54
57
  b = {a:{y:3}, b:{y:3, z:30}}
55
58
 
56
- diff = HashDiff.diff(a, b)
59
+ diff = Hashdiff.diff(a, b)
57
60
  diff.should == [['-', 'a.x', 2], ['-', 'a.z', 4], ['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]]
58
61
  ```
59
62
 
@@ -63,7 +66,7 @@ Arrays in hashes:
63
66
  a = {a:[{x:2, y:3, z:4}, {x:11, y:22, z:33}], b:{x:3, z:45}}
64
67
  b = {a:[{y:3}, {x:11, z:33}], b:{y:22}}
65
68
 
66
- diff = HashDiff.best_diff(a, b)
69
+ diff = Hashdiff.best_diff(a, b)
67
70
  diff.should == [['-', 'a[0].x', 2], ['-', 'a[0].z', 4], ['-', 'a[1].y', 22], ['-', 'b.x', 3], ['-', 'b.z', 45], ['+', 'b.y', 22]]
68
71
  ```
69
72
 
@@ -75,8 +78,8 @@ patch example:
75
78
  a = {'a' => 3}
76
79
  b = {'a' => {'a1' => 1, 'a2' => 2}}
77
80
 
78
- diff = HashDiff.diff(a, b)
79
- HashDiff.patch!(a, diff).should == b
81
+ diff = Hashdiff.diff(a, b)
82
+ Hashdiff.patch!(a, diff).should == b
80
83
  ```
81
84
 
82
85
  unpatch example:
@@ -85,15 +88,15 @@ unpatch example:
85
88
  a = [{'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5}, {'x' => 5, 'y' => 6, 'z' => 3}, 1]
86
89
  b = [1, {'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5}]
87
90
 
88
- diff = HashDiff.diff(a, b) # diff two array is OK
89
- HashDiff.unpatch!(b, diff).should == a
91
+ diff = Hashdiff.diff(a, b) # diff two array is OK
92
+ Hashdiff.unpatch!(b, diff).should == a
90
93
  ```
91
94
 
92
95
  ### Options
93
96
 
94
97
  There are eight options available: `:delimiter`, `:similarity`,
95
- `:strict`, `:numeric_tolerance`, `:strip`, `:case_insensitive`, `:array_path`
96
- and `:use_lcs`
98
+ `:strict`, `:indifferent`, `:numeric_tolerance`, `:strip`, `:case_insensitive`,
99
+ `:array_path` and `:use_lcs`
97
100
 
98
101
  #### `:delimiter`
99
102
 
@@ -103,7 +106,7 @@ You can specify `:delimiter` to be something other than the default dot. For exa
103
106
  a = {a:{x:2, y:3, z:4}, b:{x:3, z:45}}
104
107
  b = {a:{y:3}, b:{y:3, z:30}}
105
108
 
106
- diff = HashDiff.diff(a, b, :delimiter => '\t')
109
+ diff = Hashdiff.diff(a, b, delimiter: '\t')
107
110
  diff.should == [['-', 'a\tx', 2], ['-', 'a\tz', 4], ['-', 'b\tx', 3], ['~', 'b\tz', 45, 30], ['+', 'b\ty', 3]]
108
111
  ```
109
112
 
@@ -113,7 +116,11 @@ In cases where you have similar hash objects in arrays, you can pass a custom va
113
116
 
114
117
  #### `:strict`
115
118
 
116
- The `:strict` option, which defaults to `true`, specifies whether numeric types are compared on type as well as value. By default, a Fixnum will never be equal to a Float (e.g. 4 != 4.0). Setting `:strict` to false makes the comparison looser (e.g. 4 == 4.0).
119
+ The `:strict` option, which defaults to `true`, specifies whether numeric types are compared on type as well as value. By default, an Integer will never be equal to a Float (e.g. 4 != 4.0). Setting `:strict` to false makes the comparison looser (e.g. 4 == 4.0).
120
+
121
+ #### `:indifferent`
122
+
123
+ The `:indifferent` option, which defaults to `false`, specifies whether to treat hash keys indifferently. Setting `:indifferent` to true has the effect of ignoring differences between symbol keys (ie. {a: 1} ~= {'a' => 1})
117
124
 
118
125
  #### `:numeric_tolerance`
119
126
 
@@ -123,7 +130,7 @@ The :numeric_tolerance option allows for a small numeric tolerance.
123
130
  a = {x:5, y:3.75, z:7}
124
131
  b = {x:6, y:3.76, z:7}
125
132
 
126
- diff = HashDiff.diff(a, b, :numeric_tolerance => 0.1)
133
+ diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1)
127
134
  diff.should == [["~", "x", 5, 6]]
128
135
  ```
129
136
 
@@ -135,7 +142,7 @@ The :strip option strips all strings before comparing.
135
142
  a = {x:5, s:'foo '}
136
143
  b = {x:6, s:'foo'}
137
144
 
138
- diff = HashDiff.diff(a, b, :comparison => { :numeric_tolerance => 0.1, :strip => true })
145
+ diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, strip: true)
139
146
  diff.should == [["~", "x", 5, 6]]
140
147
  ```
141
148
 
@@ -147,7 +154,7 @@ The :case_insensitive option makes string comparisons ignore case.
147
154
  a = {x:5, s:'FooBar'}
148
155
  b = {x:6, s:'foobar'}
149
156
 
150
- diff = HashDiff.diff(a, b, :comparison => { :numeric_tolerance => 0.1, :case_insensitive => true })
157
+ diff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, case_insensitive: true)
151
158
  diff.should == [["~", "x", 5, 6]]
152
159
  ```
153
160
 
@@ -161,7 +168,7 @@ is useful for `patch!` when used on hashes without string keys.
161
168
  a = {x:5}
162
169
  b = {'x'=>6}
163
170
 
164
- diff = HashDiff.diff(a, b, :array_path => true)
171
+ diff = Hashdiff.diff(a, b, array_path: true)
165
172
  diff.should == [['-', [:x], 5], ['+', ['x'], 6]]
166
173
  ```
167
174
 
@@ -170,7 +177,7 @@ For cases where there are arrays in paths their index will be added to the path.
170
177
  a = {x:[0,1]}
171
178
  b = {x:[0,2]}
172
179
 
173
- diff = HashDiff.diff(a, b, :array_path => true)
180
+ diff = Hashdiff.diff(a, b, array_path: true)
174
181
  diff.should == [["-", [:x, 1], 1], ["+", [:x, 1], 2]]
175
182
  ```
176
183
 
@@ -180,8 +187,8 @@ This shouldn't cause problems if you are comparing an array with a hash:
180
187
  a = {x:{0=>1}}
181
188
  b = {x:[1]}
182
189
 
183
- diff = HashDiff.diff(a, b, :array_path => true)
184
- diff.should == [["~", [:a], [1], {0=>1}]]
190
+ diff = Hashdiff.diff(a, b, array_path: true)
191
+ diff.should == [["~", [:x], {0=>1}, [1]]]
185
192
  ```
186
193
 
187
194
  #### `:use_lcs`
@@ -202,7 +209,7 @@ Note, currently the :similarity option has no effect when :use_lcs is false.
202
209
  a = {x: [0, 1, 2]}
203
210
  b = {x: [0, 2, 2, 3]}
204
211
 
205
- diff = HashDiff.diff(a, b, :use_lcs => false)
212
+ diff = Hashdiff.diff(a, b, use_lcs: false)
206
213
  diff.should == [["~", "x[1]", 1, 2], ["+", "x[3]", 3]]
207
214
  ```
208
215
 
@@ -214,7 +221,7 @@ It's possible to specify how the values of a key should be compared.
214
221
  a = {a:'car', b:'boat', c:'plane'}
215
222
  b = {a:'bus', b:'truck', c:' plan'}
216
223
 
217
- diff = HashDiff.diff(a, b) do |path, obj1, obj2|
224
+ diff = Hashdiff.diff(a, b) do |path, obj1, obj2|
218
225
  case path
219
226
  when /a|b|c/
220
227
  obj1.length == obj2.length
@@ -230,7 +237,7 @@ The yielded params of the comparison block is `|path, obj1, obj2|`, in which pat
230
237
  a = {a:'car', b:['boat', 'plane'] }
231
238
  b = {a:'bus', b:['truck', ' plan'] }
232
239
 
233
- diff = HashDiff.diff(a, b) do |path, obj1, obj2|
240
+ diff = Hashdiff.diff(a, b) do |path, obj1, obj2|
234
241
  case path
235
242
  when 'b[*]'
236
243
  obj1.length == obj2.length
@@ -252,14 +259,18 @@ An order difference alone between two arrays can create too many diffs to be use
252
259
  a = {a:'car', b:['boat', 'plane'] }
253
260
  b = {a:'car', b:['plane', 'boat'] }
254
261
 
255
- HashDiff.diff(a, b) => [["+", "b[0]", "plane"], ["-", "b[2]", "plane"]]
262
+ Hashdiff.diff(a, b).should == [["+", "b[0]", "plane"], ["-", "b[2]", "plane"]]
256
263
 
257
264
  b[:b].sort!
258
265
 
259
- HashDiff.diff(a, b) => []
266
+ Hashdiff.diff(a, b).should == []
260
267
  ```
261
268
 
262
- ## License
269
+ ## Maintainers
263
270
 
264
- HashDiff is distributed under the MIT-LICENSE.
271
+ - Krzysztof Rybka ([@krzysiek1507](https://github.com/krzysiek1507))
272
+ - Fengyun Liu ([@liufengyun](https://github.com/liufengyun))
273
+
274
+ ## License
265
275
 
276
+ Hashdiff is distributed under the MIT-LICENSE.
data/Rakefile CHANGED
@@ -1,13 +1,18 @@
1
- $:.push File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+
5
+ require 'rubocop/rake_task'
2
6
 
3
7
  require 'bundler'
4
8
  Bundler::GemHelper.install_tasks
5
9
 
6
10
  require 'rspec/core/rake_task'
7
11
 
8
- task :default => :spec
12
+ RuboCop::RakeTask.new
13
+
14
+ task default: %w[spec rubocop]
9
15
 
10
16
  RSpec::Core::RakeTask.new(:spec) do |spec|
11
- spec.pattern = "./spec/**/*_spec.rb"
17
+ spec.pattern = './spec/**/*_spec.rb'
12
18
  end
13
-
data/changelog.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Change Log
2
2
 
3
+ ## v1.0.1 2020-02-25
4
+
5
+ * Add indifferent option
6
+
7
+ ## v1.0.0 2019-06-06
8
+
9
+ * Fix typo in readme (#72 @koic)
10
+ * Fix Rubocop offence (#73 @koic)
11
+ * Bumps version to v1.0.0 (#74 @jfelchner)
12
+
13
+ ## v1.0.0.beta1 2019-06-06
14
+
15
+ * fix warnings in ci (#69 @y-yagi)
16
+ * drop warnings of the constant change (#70 @jfelchner)
17
+
18
+ ## v0.4.0 2019-05-28
19
+
20
+ * refactoring (#56 #57 #59 #61 krzysiek1507)
21
+ * fix typo in README (#64 @pboling)
22
+ * change HashDiff to Hashdiff (#65 @jfelchner)
23
+
24
+ ## v0.3.9 2019-04-22
25
+
26
+ * Performance tweak (thanks @krzysiek1507: #51 #52 #53)
27
+
28
+ ## v0.3.8 2018-12-30
29
+
30
+ * Add Rubocop and drops Ruby 1.9 support #47
31
+
3
32
  ## v0.3.7 2017-10-08
4
33
 
5
34
  * remove 1.8.7 support from gemspec #39
@@ -14,7 +43,7 @@
14
43
 
15
44
  ## v0.3.4 2017-05-01
16
45
 
17
- * performance improvement of HashDiff#similar? #31
46
+ * performance improvement of `#similar?` #31
18
47
 
19
48
  ## v0.3.2 2016-12-27
20
49
 
@@ -56,7 +85,7 @@
56
85
  ## v0.0.5 2012-7-1
57
86
 
58
87
  * fix a bug in judging whehter two objects are similiar.
59
- * add more spec test for HashDiff.best_diff
88
+ * add more spec test for `.best_diff`
60
89
 
61
90
  ## v0.0.4 2012-6-24
62
91
 
@@ -69,4 +98,3 @@ For example, `diff({a:2, c:[4, 5]}, {a:2}) will generate following output:
69
98
  instead of following:
70
99
 
71
100
  [['-', 'c[0]', 4], ['-', 'c[1]', 5], ['-', 'c', []]]
72
-
data/hashdiff.gemspec CHANGED
@@ -1,25 +1,39 @@
1
- $LOAD_PATH << File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH << File.expand_path('lib', __dir__)
2
4
  require 'hashdiff/version'
3
5
 
4
6
  Gem::Specification.new do |s|
5
- s.name = %q{hashdiff}
6
- s.version = HashDiff::VERSION
7
+ s.name = 'hashdiff'
8
+ s.version = Hashdiff::VERSION
7
9
  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. }
10
+ s.summary = ' Hashdiff is a diff lib to compute the smallest difference between two hashes. '
11
+ s.description = ' Hashdiff is a diff lib to compute the smallest difference between two hashes. '
10
12
 
11
13
  s.files = `git ls-files`.split("\n")
12
14
  s.test_files = `git ls-files -- Appraisals {spec}/*`.split("\n")
13
15
 
14
16
  s.require_paths = ['lib']
15
- s.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
17
+ s.required_ruby_version = Gem::Requirement.new('>= 2.0.0')
18
+
19
+ s.authors = ['Liu Fengyun']
20
+ s.email = ['liufengyunchina@gmail.com']
16
21
 
17
- s.authors = ["Liu Fengyun"]
18
- s.email = ["liufengyunchina@gmail.com"]
22
+ s.homepage = 'https://github.com/liufengyun/hashdiff'
19
23
 
20
- s.homepage = "https://github.com/liufengyun/hashdiff"
24
+ s.add_development_dependency('bluecloth')
25
+ s.add_development_dependency('rspec', '~> 2.0')
26
+ s.add_development_dependency('rubocop', '~> 0.49.1') # last version that works with ruby 2.0
27
+ s.add_development_dependency('rubocop-rspec')
28
+ s.add_development_dependency('yard')
21
29
 
22
- s.add_development_dependency("rspec", "~> 2.0")
23
- s.add_development_dependency("yard")
24
- s.add_development_dependency("bluecloth")
30
+ if s.respond_to?(:metadata)
31
+ s.metadata = {
32
+ 'bug_tracker_uri' => 'https://github.com/liufengyun/hashdiff/issues',
33
+ 'changelog_uri' => 'https://github.com/liufengyun/hashdiff/blob/master/changelog.md',
34
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/hashdiff',
35
+ 'homepage_uri' => 'https://github.com/liufengyun/hashdiff',
36
+ 'source_code_uri' => 'https://github.com/liufengyun/hashdiff'
37
+ }
38
+ end
25
39
  end
data/lib/hashdiff.rb CHANGED
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'hashdiff/util'
4
+ require 'hashdiff/compare_hashes'
2
5
  require 'hashdiff/lcs'
6
+ require 'hashdiff/lcs_compare_arrays'
3
7
  require 'hashdiff/linear_compare_array'
4
8
  require 'hashdiff/diff'
5
9
  require 'hashdiff/patch'
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hashdiff
4
+ # @private
5
+ # Used to compare hashes
6
+ class CompareHashes
7
+ class << self
8
+ def call(obj1, obj2, opts = {})
9
+ return [] if obj1.empty? && obj2.empty?
10
+
11
+ obj1_keys = obj1.keys
12
+ obj2_keys = obj2.keys
13
+ obj1_lookup = {}
14
+ obj2_lookup = {}
15
+
16
+ if opts[:indifferent]
17
+ obj1_lookup = obj1_keys.each_with_object({}) { |k, h| h[k.to_s] = k }
18
+ obj2_lookup = obj2_keys.each_with_object({}) { |k, h| h[k.to_s] = k }
19
+ obj1_keys = obj1_keys.map { |k| k.is_a?(Symbol) ? k.to_s : k }
20
+ obj2_keys = obj2_keys.map { |k| k.is_a?(Symbol) ? k.to_s : k }
21
+ end
22
+
23
+ added_keys = (obj2_keys - obj1_keys).sort_by(&:to_s)
24
+ common_keys = (obj1_keys & obj2_keys).sort_by(&:to_s)
25
+ deleted_keys = (obj1_keys - obj2_keys).sort_by(&:to_s)
26
+
27
+ result = []
28
+
29
+ # add deleted properties
30
+ deleted_keys.each do |k|
31
+ k = opts[:indifferent] ? obj1_lookup[k] : k
32
+ change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts)
33
+ custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, obj1[k], nil)
34
+
35
+ if custom_result
36
+ result.concat(custom_result)
37
+ else
38
+ result << ['-', change_key, obj1[k]]
39
+ end
40
+ end
41
+
42
+ # recursive comparison for common keys
43
+ common_keys.each do |k|
44
+ prefix = Hashdiff.prefix_append_key(opts[:prefix], k, opts)
45
+
46
+ k1 = opts[:indifferent] ? obj1_lookup[k] : k
47
+ k2 = opts[:indifferent] ? obj2_lookup[k] : k
48
+ result.concat(Hashdiff.diff(obj1[k1], obj2[k2], opts.merge(prefix: prefix)))
49
+ end
50
+
51
+ # added properties
52
+ added_keys.each do |k|
53
+ change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts)
54
+
55
+ k = opts[:indifferent] ? obj2_lookup[k] : k
56
+ custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, nil, obj2[k])
57
+
58
+ if custom_result
59
+ result.concat(custom_result)
60
+ else
61
+ result << ['+', change_key, obj2[k]]
62
+ end
63
+ end
64
+
65
+ result
66
+ end
67
+ end
68
+ end
69
+ end