hash_pivot 0.2.0 → 0.3.0
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/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +36 -0
- data/lib/hash_pivot/table.rb +34 -5
- data/lib/hash_pivot/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: 1f2d44b5f76c95c2ad378d60440653827667b9801f5de25495ca8eed2508f68c
|
|
4
|
+
data.tar.gz: ad8545ca39c0209161d6633518ba4e598ed3cceb5a802abc37ac150a12675dda
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fa18ee0660da4d17ec5164b3d9bb0adcb19f538e98331a5c039788961e4ea9a28660c59f819b7a6cf8104e2acf67dc59ecc07f181ea244b1dc75eac2d58db0ff
|
|
7
|
+
data.tar.gz: 56b798dd12140e7fa1b77b2bf807a85eaac4f63792224a475b69f9e12b29f08d0d2bd1019cbc990c5e0cf171fad9877a71513abd9c0eb841e915febe9cb754cc
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -22,6 +22,13 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
|
22
22
|
|
|
23
23
|
Prepare Array of Hash.
|
|
24
24
|
|
|
25
|
+
id | role | team | age
|
|
26
|
+
-- | -- | -- | --
|
|
27
|
+
1 | guest | rabbit | 1
|
|
28
|
+
2 | guest | mouse | 2
|
|
29
|
+
3 | guest | rabbit | 3
|
|
30
|
+
4 | admin | mouse | 4
|
|
31
|
+
|
|
25
32
|
```ruby
|
|
26
33
|
data = [
|
|
27
34
|
{ id: 1, role: 'guest', team: 'rabbit', age: 1 },
|
|
@@ -44,6 +51,11 @@ HashPivot.pivot(data, :role, :team, %w[rabbit mouse])
|
|
|
44
51
|
# { :role => "admin", "rabbit" => [], "mouse" => [{ :id => 4, :role => "admin", :team => "mouse", :age => 4 }] }]
|
|
45
52
|
```
|
|
46
53
|
|
|
54
|
+
role | rabbit | mouse
|
|
55
|
+
-- | -- | --
|
|
56
|
+
guest | {1 guest rabbit 1} {3 guest rabbit 3} | {2 guest mouse 2}
|
|
57
|
+
admin | | {4 admin mouse 4}
|
|
58
|
+
|
|
47
59
|
Grouping by `:role` and pivot in `:team`.
|
|
48
60
|
|
|
49
61
|
Pivot column is nil. This means that pivot column is automatically configured.
|
|
@@ -69,6 +81,30 @@ HashPivot.pivot(data, :role, :team, %w[rabbit mouse]) { |array| array.sum { |h|
|
|
|
69
81
|
# [{ :role => "guest", "rabbit" => 4, "mouse" => 2 }, { :role => "admin", "rabbit" => 0, "mouse" => 4 }]
|
|
70
82
|
```
|
|
71
83
|
|
|
84
|
+
role | rabbit | mouse
|
|
85
|
+
-- | -- | --
|
|
86
|
+
guest | 4 | 2
|
|
87
|
+
admin | 0 | 4
|
|
88
|
+
|
|
89
|
+
#### Pivot with summarize and replacing label.
|
|
90
|
+
|
|
91
|
+
If you give Hash for pivot kinds like this, pivot data is summarized by block and replace with labels.
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
pivot_kinds = { 'rabbit' => 'RABBIT AGE',
|
|
95
|
+
'mouse' => 'MOUSE AGE' }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```ruby
|
|
99
|
+
HashPivot.pivot(data, :role, :team, pivot_kinds) { |array| array.sum { |h| h[:age] } }
|
|
100
|
+
|
|
101
|
+
# [{ :role => "guest", "RABBIT AGE" => 4, "MOUSE AGE" => 2 }, { :role => "admin", "RABBIT AGE" => 0, "MOUSE AGE" => 4 }]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
role | RABBIT AGE | MOUSE AGE
|
|
105
|
+
-- | -- | --
|
|
106
|
+
guest | 4 | 2
|
|
107
|
+
admin | 0 | 4
|
|
72
108
|
|
|
73
109
|
### Pivot Array of Struct
|
|
74
110
|
|
data/lib/hash_pivot/table.rb
CHANGED
|
@@ -24,15 +24,44 @@ module HashPivot
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# @param [Array,Hash] pivot_kinds
|
|
30
|
+
# @param [Array] array
|
|
31
|
+
# @param [Object] pivot_in
|
|
32
|
+
# @param [Proc] block
|
|
33
|
+
# @return [Hash]
|
|
27
34
|
def pivot_with_sum(pivot_kinds, array, pivot_in, &block)
|
|
28
35
|
pivot_kinds ||= array.map { |h| h[pivot_in] }.uniq.compact
|
|
36
|
+
case pivot_kinds
|
|
37
|
+
when Array
|
|
38
|
+
pivot_with_sum_with_array_pivot_kinds(pivot_kinds, array, pivot_in, &block)
|
|
39
|
+
when Hash
|
|
40
|
+
pivot_with_sum_with_hash_pivot_kinds(pivot_kinds, array, pivot_in, &block)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @param [Array,Hash] pivot_kinds
|
|
45
|
+
# @param [Array] array
|
|
46
|
+
# @param [Object] pivot_in
|
|
47
|
+
# @param [Proc] block
|
|
48
|
+
# @return [Hash]
|
|
49
|
+
def pivot_with_sum_with_array_pivot_kinds(pivot_kinds, array, pivot_in, &block)
|
|
29
50
|
pivot_kinds.each_with_object({}) do |pivot_kind, memo|
|
|
30
51
|
pivoted_data = array.select { |h| h[pivot_in] == pivot_kind }
|
|
31
|
-
memo[pivot_kind] =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
52
|
+
memo[pivot_kind] = block ? yield(pivoted_data) : pivoted_data
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @param [Array,Hash] pivot_kinds
|
|
57
|
+
# @param [Array] array
|
|
58
|
+
# @param [Object] pivot_in
|
|
59
|
+
# @param [Proc] block
|
|
60
|
+
# @return [Hash]
|
|
61
|
+
def pivot_with_sum_with_hash_pivot_kinds(pivot_kinds, array, pivot_in, &block)
|
|
62
|
+
pivot_kinds.each_with_object({}) do |(pivot_kind, pivot_label), memo|
|
|
63
|
+
pivoted_data = array.select { |h| h[pivot_in] == pivot_kind }
|
|
64
|
+
memo[pivot_label] = block ? yield(pivoted_data) : pivoted_data
|
|
36
65
|
end
|
|
37
66
|
end
|
|
38
67
|
end
|
data/lib/hash_pivot/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hash_pivot
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- junara
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-06-
|
|
11
|
+
date: 2022-06-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|