darthjee-core_ext 1.4.0 → 1.4.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 +4 -4
- data/HASH_README.md +13 -0
- data/lib/darthjee/core_ext/hash.rb +17 -0
- data/lib/darthjee/core_ext/version.rb +1 -1
- data/spec/lib/hash_spec.rb +1 -0
- data/spec/support/shared_examples/hash_transpose.rb +100 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd5dd16fc0fc9a7a42a9ab2947bd5b2826545c8c
|
4
|
+
data.tar.gz: 66d35f5d8765636a1d47855a746505d0631246b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b44cc8d55182fc41c3374bf6fa63257ac95a693ecaaed69d9ac7d3438b820cc2fdb0927c42acc51ddd2b8d41ce9940322d1e0c77d38710c8e550541f4fefd99a
|
7
|
+
data.tar.gz: 6f2749c189ae42dde35ee2b836485d00612bec1def1f33303fd69a95e59f555d596cf3e1ee39f019931b3db559faa920f29ce884dd94bb77666e5a3e2f041f87
|
data/HASH_README.md
CHANGED
@@ -250,3 +250,16 @@ hash.map_and_find { |k,o| o.v }
|
|
250
250
|
hash.map_and_find { |k,o| o.v && k }
|
251
251
|
:c
|
252
252
|
```
|
253
|
+
|
254
|
+
### #transpose
|
255
|
+
swap keys with values of the hash
|
256
|
+
|
257
|
+
```ruby
|
258
|
+
{ a: 1, b: :a, c: [2, 3] }.transpose
|
259
|
+
```
|
260
|
+
|
261
|
+
returns
|
262
|
+
|
263
|
+
```ruby
|
264
|
+
{ 1 => :a, a: b, [2, 3] => :c }
|
265
|
+
```
|
@@ -181,6 +181,23 @@ class Hash
|
|
181
181
|
Hash::DeepHashConstructor.new(separator).deep_hash(self)
|
182
182
|
end
|
183
183
|
|
184
|
+
def transpose!
|
185
|
+
aux = dup
|
186
|
+
keys.each { |k| self.delete(k) }
|
187
|
+
aux.each do |k, v|
|
188
|
+
self[v] = k
|
189
|
+
end
|
190
|
+
self
|
191
|
+
end
|
192
|
+
|
193
|
+
def transpose
|
194
|
+
{}.tap do |new_hash|
|
195
|
+
each do |k, v|
|
196
|
+
new_hash[v] = k
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
184
201
|
private
|
185
202
|
|
186
203
|
# changes the text of the keys
|
data/spec/lib/hash_spec.rb
CHANGED
@@ -10,6 +10,7 @@ describe Hash do
|
|
10
10
|
it_behaves_like 'a class with remap method'
|
11
11
|
it_behaves_like 'an object with chain_fetch method'
|
12
12
|
it_behaves_like 'a hash with map_to_hash method'
|
13
|
+
it_behaves_like 'a class with transpose methods'
|
13
14
|
|
14
15
|
describe :squash do
|
15
16
|
let(:hash) { { a: { b: 1, c: { d: 2 } } } }
|
@@ -0,0 +1,100 @@
|
|
1
|
+
shared_examples 'a class with transpose method' do |method|
|
2
|
+
let(:hash) { { a: 1 } }
|
3
|
+
|
4
|
+
describe "##{method}" do
|
5
|
+
it 'swap keys with values' do
|
6
|
+
expect(hash.public_send(method)).to eq(1 => :a)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'works when repeating call' do
|
10
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when hash has sub hasehs' do
|
14
|
+
let(:sub_hash) { { b: 1 } }
|
15
|
+
let(:hash) { { a: sub_hash } }
|
16
|
+
|
17
|
+
it 'do not work it recursively' do
|
18
|
+
expect(hash.public_send(method)).to eq(sub_hash => :a)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'works when repeating call' do
|
22
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'whe key is already a hash' do
|
26
|
+
let(:key) { { c: 2 } }
|
27
|
+
let(:hash) { { key => sub_hash } }
|
28
|
+
|
29
|
+
it 'swap keys with values' do
|
30
|
+
expect(hash.public_send(method)).to eq(sub_hash => key)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'works when repeating call' do
|
34
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when value is an array' do
|
40
|
+
let(:hash) { { a: [1, 2] } }
|
41
|
+
|
42
|
+
it 'swap keys with values' do
|
43
|
+
expect(hash.public_send(method)).to eq([1, 2] => :a)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'works when repeating call' do
|
47
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when key is already an array' do
|
51
|
+
let(:hash) { { [1, 2] => [3, 4] } }
|
52
|
+
|
53
|
+
it 'swap keys with values' do
|
54
|
+
expect(hash.public_send(method)).to eq([3, 4] => [1, 2])
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'works when repeating call' do
|
58
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when there is a clash of keys' do
|
64
|
+
let(:hash) { { a: :b, c: :b} }
|
65
|
+
|
66
|
+
it 'uses the last key for value' do
|
67
|
+
expect(hash.public_send(method)).to eq(b: :c)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when there is a key which alreay has been defined' do
|
72
|
+
let(:hash) { { a: :b, b: :c} }
|
73
|
+
|
74
|
+
it 'does not override values' do
|
75
|
+
expect(hash.public_send(method)).to eq(b: :a, c: :b)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'works when repeating call' do
|
79
|
+
expect(hash.public_send(method).public_send(method)).to eq(hash)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
shared_examples 'a class with transpose methods' do
|
86
|
+
it_behaves_like 'a class with transpose method', :transpose do
|
87
|
+
it do
|
88
|
+
expect do
|
89
|
+
hash.transpose
|
90
|
+
end.not_to change { hash }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
it_behaves_like 'a class with transpose method', :transpose! do
|
94
|
+
it do
|
95
|
+
expect do
|
96
|
+
hash.transpose!
|
97
|
+
end.to change { hash }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: darthjee-core_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darthjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- spec/support/shared_examples/date.rb
|
176
176
|
- spec/support/shared_examples/expected.rb
|
177
177
|
- spec/support/shared_examples/hash_keys_changer.rb
|
178
|
+
- spec/support/shared_examples/hash_transpose.rb
|
178
179
|
- spec/support/shared_examples/keys_appender.rb
|
179
180
|
- spec/support/shared_examples/keys_camelizer.rb
|
180
181
|
- spec/support/shared_examples/keys_underscorer.rb
|
@@ -224,6 +225,7 @@ test_files:
|
|
224
225
|
- spec/support/shared_examples/date.rb
|
225
226
|
- spec/support/shared_examples/expected.rb
|
226
227
|
- spec/support/shared_examples/hash_keys_changer.rb
|
228
|
+
- spec/support/shared_examples/hash_transpose.rb
|
227
229
|
- spec/support/shared_examples/keys_appender.rb
|
228
230
|
- spec/support/shared_examples/keys_camelizer.rb
|
229
231
|
- spec/support/shared_examples/keys_underscorer.rb
|