creative_rails_utilities 0.4.5 → 0.4.6

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
2
  SHA1:
3
- metadata.gz: b64a37df9c84fef7bc29b96d589b9f475459ee59
4
- data.tar.gz: 3ccfd498f0d7dcebfa4c896b859c5991dd93e1be
3
+ metadata.gz: 0aeba2d7261337d8ead0a8589484c3810e09f77d
4
+ data.tar.gz: 75c51fa09a75031047752e8dd7d4cf2993a6dd69
5
5
  SHA512:
6
- metadata.gz: 3815e20f599be7cb52c502a898ecc5fc675cb80c39c736888cc48e5ae8e7aef70cb5e24f37e34028636d65ddebff3de8b7e9fbf68d27128861016c00db652d71
7
- data.tar.gz: 372130b0d9e8070ef4005e63b604f6854d89d09315399d6f8ab1f5aab5df84daa68b9e97954989ce0f96bec5361288c8f22a01f110996d185bd90a0ec57b0f5b
6
+ metadata.gz: bcc93b4c92d8ea744b797a8b873380aebeff10e70635d062cc3f4f8a3feb977944f3cc6af06994368129cec73a45db9a9780758be3b10ee3073135b4589388f5
7
+ data.tar.gz: 21dc974ec4b821762f23c6827c8b88a7dc1f6995aa854a6b8d89c4e1356ad91ed7e1a9c8de7c85849ace8744bef406bc8dccfe5e250986cfdba5c4239cd94467
data/CHANGELOG.md CHANGED
@@ -8,6 +8,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
8
8
  -
9
9
  ```
10
10
 
11
+ ## [0.4.6] - 2016-12-06
12
+ ### Added
13
+ - Hash.sum
14
+
11
15
  ## [0.4.5] - 2016-12-05
12
16
  ### Added
13
17
  - URI#merge
data/README.md CHANGED
@@ -77,6 +77,27 @@ some_hash.fast_sort_keys #=> some_sorted_hash
77
77
  {}.populate_with_keys(min: 1, max: 3) #=> {1 => 0, 2 => 0, 3 => 0}
78
78
  ```
79
79
 
80
+ __.sum(h1, h2)__
81
+ ```rb
82
+ # use this to recursively sum-merge two hashes that have strictly numeric and hash-like values
83
+
84
+ # Case 2 Sum arbitrary single depth hash
85
+ h1 = {1 => 2, 2 => 3}
86
+ h2 = {1 => 1, 3 => 2}
87
+ sum = {1 => 3, 2 => 3, 3 => 2}
88
+
89
+ # Case 2 Sum arbitrary two depth hash
90
+ h1 = {1 => {a: 1, b: 2}, 2 => {a: 1, b: 2} }
91
+ h2 = {1 => {a: 1, b: 1}, 3 => {a: 1, b: 2} }
92
+ sum = {1 => {a: 2, b: 3}, 2 => {a: 1, b: 2}, 3 => {a: 1, b: 2} }
93
+
94
+ # Case 3 Sum arbitrary N depth hash
95
+ h1 = {1 => 1, 2 => {a: 1, b: 2} }
96
+ h2 = {2 => {a: 1, b: 1}, 3 => {x: {y: 1}} }
97
+ sum = {1 => 1, 2 => {a: 2, b: 3}, 3 => {x: {y: 1}} }
98
+
99
+ ```
100
+
80
101
  ##### Numeric
81
102
 
82
103
  ```ruby
@@ -36,4 +36,38 @@ class Hash
36
36
  # return result.fast_sort_keys
37
37
  # end
38
38
 
39
+ def self.sum(h1, h2)
40
+ # 1. take keys from both hashes
41
+ keys = (h1.keys + h2.keys).uniq
42
+
43
+ sum_hash = {}
44
+
45
+ # 2. loop over the keys, summing numerics and recursing into hash-like structures
46
+ keys.each do |key|
47
+ v1 = h1[key]
48
+ v2 = h2[key]
49
+
50
+ sum_value = if v1.respond_to?(:keys) && v2.respond_to?(:keys)
51
+ # O-1 recuring needed only if both are hash-like
52
+ sum(v1, v2)
53
+ elsif v1.present? && v2.blank?
54
+ # O-3a sum possibe because either is nil (one of the hashes does not have the key at all)
55
+ v1
56
+ elsif v1.blank? && v2.present?
57
+ # O-3b sum possibe because either is nil (one of the hashes does not have the key at all)
58
+ v2
59
+ elsif v1.respond_to?(:to_f) && v2.respond_to?(:to_f)
60
+ # O-2 sum possible because both numerics
61
+ v1 + v2
62
+ elsif v1.present? && v2.present? && (v1.respond_to?(:to_f) != v2.respond_to?(:to_f))
63
+ # 0-4 error because types mismatch
64
+ raise ArgumentError.new("Sorry, can not sum these hashes, there's value collision in '#{key}' keys")
65
+ end
66
+
67
+ sum_hash[key] = sum_value
68
+ end
69
+
70
+ return sum_hash
71
+ end
72
+
39
73
  end
@@ -1,3 +1,3 @@
1
1
  module CreativeRailsUtilities
2
- VERSION = "0.4.5"
2
+ VERSION = "0.4.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: creative_rails_utilities
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Creative
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-05 00:00:00.000000000 Z
11
+ date: 2016-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport