hash_selectors 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 530d9c99cacfe3b9c855797115355cad2d52a709
4
- data.tar.gz: d04d9f82a1d9f289ee0af9aeb86cbff729289bf6
3
+ metadata.gz: b54f7f8b25b1ed4b3916fc65153e3126d63813ea
4
+ data.tar.gz: 750f16927853a5e0e67bdaf9f201acecec13ae74
5
5
  SHA512:
6
- metadata.gz: a1682fc0cbb6edb9e3e454be01db2768adea2c16c8fe5db36a050caea97e437bf59ca9c6c2d7212042cc3684e77180946655ad4c5f3f6e517cc7247d528053b3
7
- data.tar.gz: 42e0ca17a6f1dc52739db63cacde137f8ac7364ddb8915f86d566e4c49760b66113f1eec51d4293e7c4017b0cbf9a3b5f7cb6a26c1f551c243e69da8d50bb201
6
+ metadata.gz: 32ec80d8259e884168654271782a4abff1d62bd405812c1607b477d868936be712ba075d96f7a2d6b3be39ea8134d099b9ee60fef5e23327c279960d06a146a6
7
+ data.tar.gz: 44bb7d92ef2c2976c907ddd6d4fbb9b1c69e260f01ab0332d5b49f9eca61a40a6d174ea841ef5d91c676579797d6dd00c3574df3c8e15da40a6c0eb40b072cf5
data/README.md CHANGED
@@ -3,9 +3,11 @@ hash-selectors
3
3
 
4
4
  A small set of select methods for Ruby Hashes
5
5
 
6
- # select_by...
6
+ # select_by... (or filter_by...)
7
+ {a: 1, b: 2, c: 3}.filter_by_keys :a, :b # returns {a: 1, b: 2}
7
8
  {a: 1, b: 2, c: 3}.select_by_keys :a, :b # returns {a: 1, b: 2}
8
9
 
10
+ {a: 1, b: 2, c: 3}.filter_by_values 1, 3 # returns {a: 1, c: 3}
9
11
  {a: 1, b: 2, c: 3}.select_by_values 1, 3 # returns {a: 1, c: 3}
10
12
 
11
13
  # reject_by...
@@ -2,11 +2,22 @@
2
2
  # Automatically mixed-in to Hash on load.
3
3
  module HashSelectors
4
4
 
5
+ # @example
6
+ # {a: {ak: :av}, b: 2, c: 3}.merge_into(:a, {new_k: :new_v}) # returns {a: {ak: :av, new_k: :new_v}, b: 2, c: 3}
7
+ #
8
+ # @param [Any] Key to merge at
9
+ # @param [Hash] Hash of new pairs to merge at the Key
10
+ # @return [Hash] Merged results
11
+ def merge_into(the_key, hash_to_merge)
12
+ sub_hash = self[the_key] || {}
13
+ merge(the_key => sub_hash.merge(hash_to_merge))
14
+ end
15
+
5
16
  # @example
6
17
  # {a: 1, b: 2, c: 3}.partition_by_keys :a, :b # returns [{a: 1, b: 2}, {c: 3}]
7
18
  #
8
19
  # @param [Glob of any type] ks
9
- # @return [Hash] Partitioned results based on whether keys are included within the *ks* argument.
20
+ # @return [Array of Hashes] Partitioned results based on whether keys are included within the *ks* argument.
10
21
  def partition_by_keys(*ks)
11
22
  ### OPTIMIZE: Simple partition with the block results in nested Arrays. Investigate.
12
23
  blk = lambda { |k,v| ks.include?(k) }
@@ -17,7 +28,7 @@ module HashSelectors
17
28
  # {a: 1, b: 2, c: 3}.partition_by_values 2, 3 # returns [{b: 2, c: 3}, {a: 1}]
18
29
  #
19
30
  # @param [Glob of any type] vs
20
- # @return [Hash] Partitioned results based on whether values are included within the *vs* argument.
31
+ # @return [Array of Hashes] Partitioned results based on whether values are included within the *vs* argument.
21
32
  def partition_by_values(*vs)
22
33
  ### OPTIMIZE: Simple partition with the block results in nested Arrays. Investigate.
23
34
  blk = lambda { |k,v| vs.include?(v) }
@@ -50,6 +61,7 @@ module HashSelectors
50
61
  def select_by_keys(*ks)
51
62
  select { |k,v| ks.include?(k) }
52
63
  end
64
+ alias_method :filter_by_keys, :select_by_keys
53
65
 
54
66
  # @example
55
67
  # {a: 1, b: 2, c: 3}.select_by_values 2, 3 # returns {b: 2, c: 3}
@@ -59,6 +71,7 @@ module HashSelectors
59
71
  def select_by_values(*vs)
60
72
  select { |k,v| vs.include?(v) }
61
73
  end
74
+ alias_method :filter_by_values, :select_by_values
62
75
 
63
76
  # @example
64
77
  # {a: 1, b: 2, c: 3}.values_for_keys :a, :b # returns [1, 2]
@@ -7,6 +7,30 @@ RSpec.describe HashSelectors do
7
7
 
8
8
  ### INSTANCE METHODS
9
9
 
10
+ describe "#merge_into" do
11
+ context "assuming a Hash: {a: {}, b: 2, c: 3}}" do
12
+ let(:the_hash) { {a: {}, b: 2, c: 3} }
13
+ context "and given :a, {a1: :a2}" do
14
+ subject { the_hash.merge_into(:a, {a1: :a2}) }
15
+ it { is_expected.to eq({a: {a1: :a2}, b: 2, c: 3}) }
16
+ end
17
+ end
18
+ context "assuming a Hash: {a: {1 => 2}, b: 2, c: 3}}" do
19
+ let(:the_hash) { {a: {1 => 2}, b: 2, c: 3} }
20
+ context "and given :a, {a1: :a2}" do
21
+ subject { the_hash.merge_into(:a, {a1: :a2}) }
22
+ it { is_expected.to eq({a: {:a1 => :a2, 1 => 2}, b: 2, c: 3}) }
23
+ end
24
+ end
25
+ context "assuming a Hash: {a: {1 => 2}, b: 2, c: 3}}" do
26
+ let(:the_hash) { {a: {1 => 2}, b: 2, c: 3} }
27
+ context "and given :d, {d1: :d2}" do
28
+ subject { the_hash.merge_into(:d, {d1: :d2}) }
29
+ it { is_expected.to eq({a: {1 => 2}, b: 2, c: 3, d: {d1: :d2}}) }
30
+ end
31
+ end
32
+ end
33
+
10
34
  describe "#partition_by_keys" do
11
35
  context "assuming a Hash: {a: 1, b: 2, c: {c2: [:d, :e]}}" do
12
36
  let(:the_hash) { {a: 1, b: 2, c: {c2: [:d, :e]}} }
@@ -63,30 +87,35 @@ RSpec.describe HashSelectors do
63
87
  end
64
88
  end
65
89
 
66
- describe "#select_by_keys" do
67
- context "assuming a Hash: {a: 1, b: 2, c: {c2: [:d, :e]}}" do
68
- let(:the_hash) { {a: 1, b: 2, c: {c2: [:d, :e]}} }
69
- context "and given :a, :d" do
70
- subject { the_hash.select_by_keys :a, :d }
71
- it { is_expected.to eq({a: 1}) }
72
- end
73
- context "and given :a, :b" do
74
- subject { the_hash.select_by_keys :a, :b }
75
- it { is_expected.to eq({a: 1, b: 2}) }
76
- end
77
- context "and given :b, :c" do
78
- subject { the_hash.select_by_keys :b, :c }
79
- it { is_expected.to eq({b: 2, c: {c2: [:d, :e]}}) }
90
+ selection_prefixes = %w{ select filter }
91
+ selection_prefixes.each do |selection_prefix|
92
+ describe "##{selection_prefix}_by_keys" do
93
+ context "assuming a Hash: {a: 1, b: 2, c: {c2: [:d, :e]}}" do
94
+ let(:the_hash) { {a: 1, b: 2, c: {c2: [:d, :e]}} }
95
+ let(:the_meth) { "#{selection_prefix}_by_keys" }
96
+ context "and given :a, :d" do
97
+ subject { the_hash.send(the_meth, :a, :d) }
98
+ it { is_expected.to eq({a: 1}) }
99
+ end
100
+ context "and given :a, :b" do
101
+ subject { the_hash.send(the_meth, :a, :b) }
102
+ it { is_expected.to eq({a: 1, b: 2}) }
103
+ end
104
+ context "and given :b, :c" do
105
+ subject { the_hash.send(the_meth, :b, :c) }
106
+ it { is_expected.to eq({b: 2, c: {c2: [:d, :e]}}) }
107
+ end
80
108
  end
81
109
  end
82
- end
83
110
 
84
- describe "#select_by_values" do
85
- context "assuming a Hash: {a: 1, b: 2, c: {c2: [:d, :e]}}" do
86
- let(:the_hash) { {a: 1, b: 2, c: {c2: [:d, :e]}} }
87
- context "and given 1, 2" do
88
- subject { the_hash.select_by_values 1, 2 }
89
- it { is_expected.to eq({a: 1, b: 2}) }
111
+ describe "##{selection_prefix}_by_values" do
112
+ let(:the_meth) { "#{selection_prefix}_by_values" }
113
+ context "assuming a Hash: {a: 1, b: 2, c: {c2: [:d, :e]}}" do
114
+ let(:the_hash) { {a: 1, b: 2, c: {c2: [:d, :e]}} }
115
+ context "and given 1, 2" do
116
+ subject { the_hash.send(the_meth, 1, 2) }
117
+ it { is_expected.to eq({a: 1, b: 2}) }
118
+ end
90
119
  end
91
120
  end
92
121
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_selectors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin C. Baird
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-14 00:00:00.000000000 Z
11
+ date: 2014-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec