hashie 2.1.0 → 2.1.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/CHANGELOG.md +5 -1
- data/lib/hashie/hash.rb +13 -3
- data/lib/hashie/version.rb +1 -1
- data/spec/hashie/clash_spec.rb +11 -11
- data/spec/hashie/dash_spec.rb +69 -60
- data/spec/hashie/extensions/coercion_spec.rb +22 -22
- data/spec/hashie/extensions/deep_fetch_spec.rb +7 -7
- data/spec/hashie/extensions/deep_merge_spec.rb +2 -2
- data/spec/hashie/extensions/indifferent_access_spec.rb +24 -24
- data/spec/hashie/extensions/key_conversion_spec.rb +14 -14
- data/spec/hashie/extensions/merge_initializer_spec.rb +4 -4
- data/spec/hashie/extensions/method_access_spec.rb +22 -22
- data/spec/hashie/hash_spec.rb +19 -7
- data/spec/hashie/mash_spec.rb +122 -123
- data/spec/hashie/rash_spec.rb +13 -13
- data/spec/hashie/trash_spec.rb +30 -30
- data/spec/hashie/version_spec.rb +1 -1
- metadata +2 -2
@@ -29,22 +29,22 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
29
29
|
shared_examples_for 'hash with indifferent access' do
|
30
30
|
it 'is able to access via string or symbol' do
|
31
31
|
h = subject.build(abc: 123)
|
32
|
-
h[:abc].
|
33
|
-
h['abc'].
|
32
|
+
expect(h[:abc]).to eq 123
|
33
|
+
expect(h['abc']).to eq 123
|
34
34
|
end
|
35
35
|
|
36
36
|
describe '#values_at' do
|
37
37
|
it 'indifferently finds values' do
|
38
38
|
h = subject.build(:foo => 'bar', 'baz' => 'qux')
|
39
|
-
h.values_at('foo', :baz).
|
39
|
+
expect(h.values_at('foo', :baz)).to eq %w(bar qux)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
describe '#fetch' do
|
44
44
|
it 'works like normal fetch, but indifferent' do
|
45
45
|
h = subject.build(foo: 'bar')
|
46
|
-
h.fetch(:foo).
|
47
|
-
h.fetch(:foo).
|
46
|
+
expect(h.fetch(:foo)).to eq h.fetch('foo')
|
47
|
+
expect(h.fetch(:foo)).to eq 'bar'
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -53,7 +53,7 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
53
53
|
h = subject.build(:foo => 'bar', 'baz' => 'qux')
|
54
54
|
h.delete('foo')
|
55
55
|
h.delete(:baz)
|
56
|
-
h.
|
56
|
+
expect(h).to be_empty
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -61,14 +61,14 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
61
61
|
let(:h) { subject.build(foo: 'bar') }
|
62
62
|
|
63
63
|
it 'finds it indifferently' do
|
64
|
-
h.
|
65
|
-
h.
|
64
|
+
expect(h).to be_key(:foo)
|
65
|
+
expect(h).to be_key('foo')
|
66
66
|
end
|
67
67
|
|
68
68
|
%w(include? member? has_key?).each do |key_alias|
|
69
69
|
it "is aliased as #{key_alias}" do
|
70
|
-
h.send(key_alias.to_sym, :foo).
|
71
|
-
h.send(key_alias.to_sym, 'foo').
|
70
|
+
expect(h.send(key_alias.to_sym, :foo)).to be(true)
|
71
|
+
expect(h.send(key_alias.to_sym, 'foo')).to be(true)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -78,18 +78,18 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
78
78
|
|
79
79
|
it 'allows keys to be indifferent still' do
|
80
80
|
h.update(baz: 'qux')
|
81
|
-
h['foo'].
|
82
|
-
h['baz'].
|
81
|
+
expect(h['foo']).to eq 'bar'
|
82
|
+
expect(h['baz']).to eq 'qux'
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'recursively injects indifference into sub-hashes' do
|
86
86
|
h.update(baz: { qux: 'abc' })
|
87
|
-
h['baz']['qux'].
|
87
|
+
expect(h['baz']['qux']).to eq 'abc'
|
88
88
|
end
|
89
89
|
|
90
90
|
it 'does not change the ancestors of the injected object class' do
|
91
91
|
h.update(baz: { qux: 'abc' })
|
92
|
-
Hash.new.
|
92
|
+
expect(Hash.new).not_to be_respond_to(:indifferent_access?)
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
@@ -97,22 +97,22 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
97
97
|
let(:h) { subject.build(foo: 'bar').replace(bar: 'baz', hi: 'bye') }
|
98
98
|
|
99
99
|
it 'returns self' do
|
100
|
-
h.
|
100
|
+
expect(h).to be_a(subject)
|
101
101
|
end
|
102
102
|
|
103
103
|
it 'removes old keys' do
|
104
104
|
[:foo, 'foo'].each do |k|
|
105
|
-
h[k].
|
106
|
-
h.key?(k).
|
105
|
+
expect(h[k]).to be_nil
|
106
|
+
expect(h.key?(k)).to be_false
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'creates new keys with indifferent access' do
|
111
|
-
[:bar, 'bar', :hi, 'hi'].each { |k| h.key?(k).
|
112
|
-
h[:bar].
|
113
|
-
h['bar'].
|
114
|
-
h[:hi].
|
115
|
-
h['hi'].
|
111
|
+
[:bar, 'bar', :hi, 'hi'].each { |k| expect(h.key?(k)).to be_true }
|
112
|
+
expect(h[:bar]).to eq 'baz'
|
113
|
+
expect(h['bar']).to eq 'baz'
|
114
|
+
expect(h[:hi]).to eq 'bye'
|
115
|
+
expect(h['hi']).to eq 'bye'
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
@@ -121,7 +121,7 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
121
121
|
let(:h) { subject.try_convert(foo: 'bar') }
|
122
122
|
|
123
123
|
it 'is a subject' do
|
124
|
-
h.
|
124
|
+
expect(h).to be_a(subject)
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
@@ -129,7 +129,7 @@ describe Hashie::Extensions::IndifferentAccess do
|
|
129
129
|
let(:h) { subject.try_convert('{ :foo => bar }') }
|
130
130
|
|
131
131
|
it 'is nil' do
|
132
|
-
h.
|
132
|
+
expect(h).to be_nil
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end
|
@@ -14,7 +14,7 @@ describe Hashie::Extensions::KeyConversion do
|
|
14
14
|
instance[:abc] = 'abc'
|
15
15
|
instance[123] = '123'
|
16
16
|
instance.stringify_keys!
|
17
|
-
(instance.keys & %w(abc 123)).size.
|
17
|
+
expect((instance.keys & %w(abc 123)).size).to eq 2
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'performs deep conversion within nested hashes' do
|
@@ -22,7 +22,7 @@ describe Hashie::Extensions::KeyConversion do
|
|
22
22
|
instance[:ab][:cd] = subject.new
|
23
23
|
instance[:ab][:cd][:ef] = 'abcdef'
|
24
24
|
instance.stringify_keys!
|
25
|
-
instance.
|
25
|
+
expect(instance).to eq('ab' => { 'cd' => { 'ef' => 'abcdef' } })
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'performs deep conversion within nested arrays' do
|
@@ -32,11 +32,11 @@ describe Hashie::Extensions::KeyConversion do
|
|
32
32
|
instance[:ab][0][:cd] = 'abcd'
|
33
33
|
instance[:ab][1][:ef] = 'abef'
|
34
34
|
instance.stringify_keys!
|
35
|
-
instance.
|
35
|
+
expect(instance).to eq('ab' => [{ 'cd' => 'abcd' }, { 'ef' => 'abef' }])
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'returns itself' do
|
39
|
-
instance.stringify_keys
|
39
|
+
expect(instance.stringify_keys!).to eq instance
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -44,14 +44,14 @@ describe Hashie::Extensions::KeyConversion do
|
|
44
44
|
it 'converts keys to strings' do
|
45
45
|
instance[:abc] = 'def'
|
46
46
|
copy = instance.stringify_keys
|
47
|
-
copy['abc'].
|
47
|
+
expect(copy['abc']).to eq 'def'
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'does not alter the original' do
|
51
51
|
instance[:abc] = 'def'
|
52
52
|
copy = instance.stringify_keys
|
53
|
-
instance.keys.
|
54
|
-
copy.keys.
|
53
|
+
expect(instance.keys).to eq [:abc]
|
54
|
+
expect(copy.keys).to eq %w(abc)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -60,7 +60,7 @@ describe Hashie::Extensions::KeyConversion do
|
|
60
60
|
instance['abc'] = 'abc'
|
61
61
|
instance['def'] = 'def'
|
62
62
|
instance.symbolize_keys!
|
63
|
-
(instance.keys & [:abc, :def]).size.
|
63
|
+
expect((instance.keys & [:abc, :def]).size).to eq 2
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'performs deep conversion within nested hashes' do
|
@@ -68,7 +68,7 @@ describe Hashie::Extensions::KeyConversion do
|
|
68
68
|
instance['ab']['cd'] = subject.new
|
69
69
|
instance['ab']['cd']['ef'] = 'abcdef'
|
70
70
|
instance.symbolize_keys!
|
71
|
-
instance.
|
71
|
+
expect(instance).to eq(ab: { cd: { ef: 'abcdef' } })
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'performs deep conversion within nested arrays' do
|
@@ -78,11 +78,11 @@ describe Hashie::Extensions::KeyConversion do
|
|
78
78
|
instance['ab'][0]['cd'] = 'abcd'
|
79
79
|
instance['ab'][1]['ef'] = 'abef'
|
80
80
|
instance.symbolize_keys!
|
81
|
-
instance.
|
81
|
+
expect(instance).to eq(ab: [{ cd: 'abcd' }, { ef: 'abef' }])
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'returns itself' do
|
85
|
-
instance.symbolize_keys
|
85
|
+
expect(instance.symbolize_keys!).to eq instance
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -90,14 +90,14 @@ describe Hashie::Extensions::KeyConversion do
|
|
90
90
|
it 'converts keys to symbols' do
|
91
91
|
instance['abc'] = 'def'
|
92
92
|
copy = instance.symbolize_keys
|
93
|
-
copy[:abc].
|
93
|
+
expect(copy[:abc]).to eq 'def'
|
94
94
|
end
|
95
95
|
|
96
96
|
it 'does not alter the original' do
|
97
97
|
instance['abc'] = 'def'
|
98
98
|
copy = instance.symbolize_keys
|
99
|
-
instance.keys.
|
100
|
-
copy.keys.
|
99
|
+
expect(instance.keys).to eq ['abc']
|
100
|
+
expect(copy.keys).to eq [:abc]
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
@@ -8,16 +8,16 @@ describe Hashie::Extensions::MergeInitializer do
|
|
8
8
|
subject { MergeInitializerHash }
|
9
9
|
|
10
10
|
it 'initializes with no arguments' do
|
11
|
-
subject.new.
|
11
|
+
expect(subject.new).to eq({})
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'initializes with a hash' do
|
15
|
-
subject.new(abc: 'def').
|
15
|
+
expect(subject.new(abc: 'def')).to eq(abc: 'def')
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'initializes with a hash and a default' do
|
19
19
|
h = subject.new({ abc: 'def' }, 'bar')
|
20
|
-
h[:foo].
|
21
|
-
h[:abc].
|
20
|
+
expect(h[:foo]).to eq 'bar'
|
21
|
+
expect(h[:abc]).to eq 'def'
|
22
22
|
end
|
23
23
|
end
|
@@ -12,34 +12,34 @@ describe Hashie::Extensions::MethodReader do
|
|
12
12
|
subject { ReaderHash }
|
13
13
|
|
14
14
|
it 'reads string keys from the method' do
|
15
|
-
subject.new('awesome' => 'sauce').awesome.
|
15
|
+
expect(subject.new('awesome' => 'sauce').awesome).to eq 'sauce'
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'reads symbol keys from the method' do
|
19
|
-
subject.new(awesome: 'sauce').awesome.
|
19
|
+
expect(subject.new(awesome: 'sauce').awesome).to eq 'sauce'
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'reads nil and false values out properly' do
|
23
23
|
h = subject.new(nil: nil, false: false)
|
24
|
-
h.nil.
|
25
|
-
h.false.
|
24
|
+
expect(h.nil).to eq nil
|
25
|
+
expect(h.false).to eq false
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'raises a NoMethodError for undefined keys' do
|
29
|
-
|
29
|
+
expect { subject.new.awesome }.to raise_error(NoMethodError)
|
30
30
|
end
|
31
31
|
|
32
32
|
describe '#respond_to?' do
|
33
33
|
it 'is true for string keys' do
|
34
|
-
subject.new('awesome' => 'sauce').
|
34
|
+
expect(subject.new('awesome' => 'sauce')).to be_respond_to(:awesome)
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'is true for symbol keys' do
|
38
|
-
subject.new(awesome: 'sauce').
|
38
|
+
expect(subject.new(awesome: 'sauce')).to be_respond_to(:awesome)
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'is false for non-keys' do
|
42
|
-
subject.new.
|
42
|
+
expect(subject.new).not_to be_respond_to(:awesome)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -53,22 +53,22 @@ describe Hashie::Extensions::MethodWriter do
|
|
53
53
|
|
54
54
|
it 'writes from a method call' do
|
55
55
|
subject.awesome = 'sauce'
|
56
|
-
subject['awesome'].
|
56
|
+
expect(subject['awesome']).to eq 'sauce'
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'converts the key using the #convert_key method' do
|
60
|
-
subject.
|
60
|
+
allow(subject).to receive(:convert_key).and_return(:awesome)
|
61
61
|
subject.awesome = 'sauce'
|
62
|
-
subject[:awesome].
|
62
|
+
expect(subject[:awesome]).to eq 'sauce'
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'raises NoMethodError on non equals-ending methods' do
|
66
|
-
|
66
|
+
expect { subject.awesome }.to raise_error(NoMethodError)
|
67
67
|
end
|
68
68
|
|
69
69
|
it '#respond_to? correctly' do
|
70
|
-
subject.
|
71
|
-
subject.
|
70
|
+
expect(subject).to be_respond_to(:abc=)
|
71
|
+
expect(subject).not_to be_respond_to(:abc)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -84,31 +84,31 @@ describe Hashie::Extensions::MethodQuery do
|
|
84
84
|
subject { QueryHash }
|
85
85
|
|
86
86
|
it 'is true for non-nil string key values' do
|
87
|
-
subject.new('abc' => 123).
|
87
|
+
expect(subject.new('abc' => 123)).to be_abc
|
88
88
|
end
|
89
89
|
|
90
90
|
it 'is true for non-nil symbol key values' do
|
91
|
-
subject.new(abc: 123).
|
91
|
+
expect(subject.new(abc: 123)).to be_abc
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'is false for nil key values' do
|
95
|
-
subject.new(abc: false).
|
95
|
+
expect(subject.new(abc: false)).not_to be_abc
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'raises a NoMethodError for non-set keys' do
|
99
|
-
|
99
|
+
expect { subject.new.abc? }.to raise_error(NoMethodError)
|
100
100
|
end
|
101
101
|
|
102
102
|
it '#respond_to? for existing string keys' do
|
103
|
-
subject.new('abc' => 'def').
|
103
|
+
expect(subject.new('abc' => 'def')).to be_respond_to('abc?')
|
104
104
|
end
|
105
105
|
|
106
106
|
it '#respond_to? for existing symbol keys' do
|
107
|
-
subject.new(abc: 'def').
|
107
|
+
expect(subject.new(abc: 'def')).to be_respond_to(:abc?)
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'does not #respond_to? for non-existent keys' do
|
111
|
-
subject.new.
|
111
|
+
expect(subject.new).not_to be_respond_to('abc?')
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -116,6 +116,6 @@ describe Hashie::Extensions::MethodAccess do
|
|
116
116
|
it 'includes all of the other method mixins' do
|
117
117
|
klass = Class.new(Hash)
|
118
118
|
klass.send :include, Hashie::Extensions::MethodAccess
|
119
|
-
(klass.ancestors & [Hashie::Extensions::MethodReader, Hashie::Extensions::MethodWriter, Hashie::Extensions::MethodQuery]).size.
|
119
|
+
expect((klass.ancestors & [Hashie::Extensions::MethodReader, Hashie::Extensions::MethodWriter, Hashie::Extensions::MethodQuery]).size).to eq 3
|
120
120
|
end
|
121
121
|
end
|
data/spec/hashie/hash_spec.rb
CHANGED
@@ -3,32 +3,44 @@ require 'spec_helper'
|
|
3
3
|
describe Hash do
|
4
4
|
it 'is convertible to a Hashie::Mash' do
|
5
5
|
mash = Hashie::Hash[some: 'hash'].to_mash
|
6
|
-
mash.is_a?(Hashie::Mash).
|
7
|
-
mash.some.
|
6
|
+
expect(mash.is_a?(Hashie::Mash)).to be_true
|
7
|
+
expect(mash.some).to eq 'hash'
|
8
8
|
end
|
9
9
|
|
10
10
|
it '#stringify_keys! turns all keys into strings' do
|
11
11
|
hash = Hashie::Hash[:a => 'hey', 123 => 'bob']
|
12
12
|
hash.stringify_keys!
|
13
|
-
hash.
|
13
|
+
expect(hash).to eq Hashie::Hash['a' => 'hey', '123' => 'bob']
|
14
14
|
end
|
15
15
|
|
16
16
|
it '#stringify_keys returns a hash with stringified keys' do
|
17
17
|
hash = Hashie::Hash[:a => 'hey', 123 => 'bob']
|
18
18
|
stringified_hash = hash.stringify_keys
|
19
|
-
hash.
|
20
|
-
stringified_hash.
|
19
|
+
expect(hash).to eq Hashie::Hash[:a => 'hey', 123 => 'bob']
|
20
|
+
expect(stringified_hash).to eq Hashie::Hash['a' => 'hey', '123' => 'bob']
|
21
21
|
end
|
22
22
|
|
23
23
|
it '#to_hash returns a hash with stringified keys' do
|
24
24
|
hash = Hashie::Hash['a' => 'hey', 123 => 'bob', 'array' => [1, 2, 3]]
|
25
25
|
stringified_hash = hash.to_hash
|
26
|
-
stringified_hash.
|
26
|
+
expect(stringified_hash).to eq('a' => 'hey', '123' => 'bob', 'array' => [1, 2, 3])
|
27
27
|
end
|
28
28
|
|
29
29
|
it '#to_hash with symbolize_keys set to true returns a hash with symbolized keys' do
|
30
30
|
hash = Hashie::Hash['a' => 'hey', 123 => 'bob', 'array' => [1, 2, 3]]
|
31
31
|
symbolized_hash = hash.to_hash(symbolize_keys: true)
|
32
|
-
symbolized_hash.
|
32
|
+
expect(symbolized_hash).to eq(:a => 'hey', :"123" => 'bob', :array => [1, 2, 3])
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#to_hash should not blow up when #to_hash doesn't accept arguments" do
|
36
|
+
class BareCustomMash < Hashie::Mash
|
37
|
+
def to_hash
|
38
|
+
{}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
h = Hashie::Hash.new
|
43
|
+
h[:key] = BareCustomMash.new
|
44
|
+
expect { h.to_hash }.not_to raise_error
|
33
45
|
end
|
34
46
|
end
|