hash_deep_diff 0.3.0 → 0.3.3
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 +4 -4
- data/README.md +13 -10
- data/lib/hash_deep_diff/comparison.rb +9 -46
- data/lib/hash_deep_diff/delta/acts_as_delta.rb +7 -0
- data/lib/hash_deep_diff/delta/inner.rb +23 -27
- data/lib/hash_deep_diff/delta/left.rb +13 -7
- data/lib/hash_deep_diff/delta/right.rb +13 -7
- data/lib/hash_deep_diff/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe3724394c10b36b7537f35bce5c7f079cae0ee3344062a78bdfe7256363624b
|
4
|
+
data.tar.gz: e9baa112b03013b91f75ebea9f243a0a6d51ca746ca8c8e66ea6fa38803198fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7393bb437eddfb8e0ed66d4eba3b4135e221c7c2262df14aa4509dba98345c4766b598bd3c3f11f311c84b25b4f9f0b2bca3dfc5083c023c87c582fa607761a
|
7
|
+
data.tar.gz: 57708513050ac1e63c0ce64b9650e0ae0e3128127cbb4dfc5b248cc3caca3267cbd26bed7b939be4413c11f1a7038f5503aef143119a09e336cc113324ae182a
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# HashDeepDiff
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Find the exact difference between two Hash objects and build a report to visualize it
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -21,15 +19,20 @@ Or install it yourself as:
|
|
21
19
|
$ gem install hash_deep_diff
|
22
20
|
|
23
21
|
## Usage
|
22
|
+
Basic example
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
24
|
+
```ruby
|
25
|
+
left = { a: :a }
|
26
|
+
right = { a: :b }
|
30
27
|
|
31
|
-
|
28
|
+
HashDeepDiff::Comparison.new(left, right).report
|
29
|
+
```
|
30
|
+
```diff
|
31
|
+
- left[a] = a
|
32
|
+
+ right[a] = b
|
33
|
+
```
|
32
34
|
|
33
35
|
## Contributing
|
34
36
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
37
|
+
Bug reports and pull requests are welcome on GitHub at [bpohoriletz](https://github.com/bpohoriletz/hash_deep_diff).
|
38
|
+
|
@@ -26,53 +26,22 @@ module HashDeepDiff
|
|
26
26
|
@path = path.to_ary
|
27
27
|
end
|
28
28
|
|
29
|
-
def extra_report(memo, keys, value)
|
30
|
-
if value.respond_to?(:to_hash)
|
31
|
-
value.each_key { |key| extra_report(memo, keys + [key], value[key]) }
|
32
|
-
else
|
33
|
-
memo << Delta::Left.new(path: keys, value: value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def missing_report(memo, keys, value)
|
38
|
-
if value.respond_to?(:to_hash)
|
39
|
-
value.each_key { |key| missing_report(memo, keys + [key], value[key]) }
|
40
|
-
else
|
41
|
-
memo << Delta::Right.new(path: keys, value: value)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def delta_report(memo, keys, value)
|
46
|
-
if value.respond_to?(:to_hash) && value.keys != %i[left right]
|
47
|
-
value.each_key { |key| delta_report(memo, keys + [key], value[key]) }
|
48
|
-
elsif value.instance_of?(Array) && value.size == 3 && value.all? { |el| el.respond_to?(:to_hash) }
|
49
|
-
# [{}, {}, {:i=>:i}]
|
50
|
-
extra_report(memo, keys, value[0]) unless value[0].empty?
|
51
|
-
delta_report(memo, keys, value[1]) unless value[1].empty?
|
52
|
-
missing_report(memo, keys, value[2]) unless value[2].empty?
|
53
|
-
else
|
54
|
-
memo << Delta::Inner.new(path: keys, value: value)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
29
|
def deep_delta(&block)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
if left.dig(*diff.path).respond_to?(:to_hash) && right.dig(*diff.path).respond_to?(:to_hash)
|
63
|
-
self.class.new(left.dig(*diff.path), right.dig(*diff.path), path + diff.path).diff.each do |diff|
|
64
|
-
memo << diff
|
65
|
-
end
|
30
|
+
delta(&block).flat_map do |diff|
|
31
|
+
if diff.complex?
|
32
|
+
self.class.new(diff.left, diff.right, diff.path).diff
|
66
33
|
else
|
67
|
-
|
34
|
+
diff
|
68
35
|
end
|
69
36
|
end
|
70
37
|
end
|
71
38
|
|
39
|
+
def left_delta
|
40
|
+
left_diff_keys.map { |key| Delta::Left.new(path: path + [key], value: left[key]) }
|
41
|
+
end
|
42
|
+
|
72
43
|
def right_delta
|
73
|
-
right_diff_keys.
|
74
|
-
memo << Delta::Right.new(path: path + [key], value: right[key])
|
75
|
-
end
|
44
|
+
right_diff_keys.map { |key| Delta::Right.new(path: path + [key], value: right[key]) }
|
76
45
|
end
|
77
46
|
|
78
47
|
def delta(&block)
|
@@ -88,12 +57,6 @@ module HashDeepDiff
|
|
88
57
|
end
|
89
58
|
end
|
90
59
|
|
91
|
-
def left_delta
|
92
|
-
left_diff_keys.each_with_object([]) do |key, memo|
|
93
|
-
memo << Delta::Left.new(path: path + [key], value: left[key])
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
60
|
def common_keys
|
98
61
|
left.keys & right.keys
|
99
62
|
end
|
@@ -23,6 +23,7 @@ module HashDeepDiff
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# TOFIX poor naming
|
26
|
+
# overrides parameter in initializer
|
26
27
|
def path
|
27
28
|
@prefix + [@delta.keys.first]
|
28
29
|
end
|
@@ -42,6 +43,10 @@ module HashDeepDiff
|
|
42
43
|
def to_str
|
43
44
|
raise NoMethodError, "expected #{self.class} to implement #to_str"
|
44
45
|
end
|
46
|
+
|
47
|
+
def complex?
|
48
|
+
raise NoMethodError, "expected #{self.class} to implement #complex?"
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
# Override #initialize method
|
@@ -50,9 +55,11 @@ module HashDeepDiff
|
|
50
55
|
# TOFIX this may prohibit usage of hashes with Array keys
|
51
56
|
if path.respond_to?(:to_ary)
|
52
57
|
@delta = { path[-1] => value }
|
58
|
+
@value = value
|
53
59
|
@prefix = path[0..-2]
|
54
60
|
else
|
55
61
|
@delta = { path => value }
|
62
|
+
@value = value
|
56
63
|
@prefix = []
|
57
64
|
end
|
58
65
|
end
|
@@ -11,33 +11,29 @@ module HashDeepDiff
|
|
11
11
|
include Delta::ActsAsDelta
|
12
12
|
|
13
13
|
def to_str
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
+right#{diff_prefix} = #{@delta.values.first[:right]}
|
38
|
-
Q
|
39
|
-
lines.strip
|
40
|
-
end
|
14
|
+
return diff unless complex?
|
15
|
+
|
16
|
+
HashDeepDiff::Comparison.new(left, right, path).report
|
17
|
+
end
|
18
|
+
|
19
|
+
def diff
|
20
|
+
lines = <<~Q
|
21
|
+
-left#{diff_prefix} = #{left}
|
22
|
+
+right#{diff_prefix} = #{right}
|
23
|
+
Q
|
24
|
+
lines.strip
|
25
|
+
end
|
26
|
+
|
27
|
+
def complex?
|
28
|
+
left.respond_to?(:to_hash) && right.respond_to?(:to_hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
def left
|
32
|
+
@value[:left]
|
33
|
+
end
|
34
|
+
|
35
|
+
def right
|
36
|
+
@value[:right]
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
@@ -11,13 +11,19 @@ module HashDeepDiff
|
|
11
11
|
include Delta::ActsAsDelta
|
12
12
|
|
13
13
|
def to_str
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
return "+left#{diff_prefix} = #{left}" unless left.respond_to?(:to_hash)
|
15
|
+
|
16
|
+
left.keys.map do |key|
|
17
|
+
self.class.new(path: path + [key], value: left[key])
|
18
|
+
end.join("\n").strip
|
19
|
+
end
|
20
|
+
|
21
|
+
def left
|
22
|
+
@value
|
23
|
+
end
|
24
|
+
|
25
|
+
def right
|
26
|
+
nil
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
@@ -11,13 +11,19 @@ module HashDeepDiff
|
|
11
11
|
include Delta::ActsAsDelta
|
12
12
|
|
13
13
|
def to_str
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
return "-left#{diff_prefix} = #{right}" unless right.respond_to?(:to_hash)
|
15
|
+
|
16
|
+
right.keys.map do |key|
|
17
|
+
self.class.new(path: path + [key], value: right[key])
|
18
|
+
end.join("\n").strip
|
19
|
+
end
|
20
|
+
|
21
|
+
def left
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def right
|
26
|
+
@value
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hash_deep_diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bohdan Pohorilets
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|