navigable_hash 1.0.1 → 1.1.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.
@@ -1,7 +1,9 @@
1
1
  class NavigableHash < Hash
2
2
 
3
- def initialize(constructor = {})
4
- if constructor.is_a?(Hash)
3
+ def initialize(constructor = {}, &block)
4
+ if block_given?
5
+ yield self
6
+ elsif constructor.is_a?(Hash)
5
7
  super()
6
8
  update(constructor)
7
9
  else
@@ -168,14 +170,20 @@ class NavigableHash < Hash
168
170
  value
169
171
  end
170
172
 
173
+ def navigate_hash_from_block(key, &block)
174
+ self[key] = self.class.new &block
175
+ end
176
+
171
177
  private
172
178
 
173
179
  def method_missing(m, *args, &block)
174
180
  m = m.to_s
175
181
  if args.size == 1 && m.gsub!(/(.+)=$/, '\1')
176
- self.send :[]=, m, args.first
182
+ self[m] = args.first
183
+ elsif args.size == 0 && block_given?
184
+ self.navigate_hash_from_block m, &block
177
185
  elsif args.size == 0
178
- self.send :[], m
186
+ self[m]
179
187
  else
180
188
  raise ArgumentError, "wrong number of arguments(#{args.size} for 0)"
181
189
  end
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "navigable_hash"
7
- spec.version = "1.0.1"
7
+ spec.version = "1.1.0"
8
8
  spec.authors = ["Jason Waldrip", "Kevin Wanek"]
9
9
  spec.email = ["jason@waldrip.net", "k@dmcy.us"]
10
10
  spec.description = %q{Allows a hash to be navigated with dot notation or indifferent access.}
@@ -22,6 +22,29 @@ describe NavigableHash do
22
22
  expect { NavigableHash.new({:a => 1}) }.to_not raise_error
23
23
  end
24
24
  end
25
+
26
+ context "given a block" do
27
+ it "should not raise an error" do
28
+ expect do
29
+ NavigableHash.new do |v|
30
+ v.foo = :bar
31
+ end
32
+ end.to_not raise_error
33
+ end
34
+
35
+ it "should create a new navigable hash" do
36
+ navigable = NavigableHash.new do |v|
37
+ end
38
+ navigable.should be_a NavigableHash
39
+ end
40
+
41
+ it "should assign values in the block to the hash" do
42
+ navigable = NavigableHash.new do |v|
43
+ v.foo = :bar
44
+ end
45
+ navigable.foo.should == :bar
46
+ end
47
+ end
25
48
  end
26
49
 
27
50
  describe ".new(TEST_HASH)" do
@@ -71,6 +94,30 @@ describe NavigableHash do
71
94
  it "should raise an error with arguments" do
72
95
  expect { navigable.__any_method__ :foo }.to raise_error
73
96
  end
97
+
98
+ context "given a block" do
99
+ it "should not raise an error" do
100
+ expect do
101
+ navigable.__any_method__ do |v|
102
+ v.foo = :bar
103
+ end
104
+ end.to_not raise_error
105
+ end
106
+
107
+ it "should create a new navigable hash" do
108
+ navigable.__any_method__ do |v|
109
+ end
110
+ navigable.__any_method__.should be_a NavigableHash
111
+ end
112
+
113
+ it "should assign values in the block to the hash" do
114
+ navigable.__any_method__ do |v|
115
+ v.foo = :bar
116
+ end
117
+ navigable.__any_method__.foo.should == :bar
118
+ end
119
+ end
120
+
74
121
  end
75
122
 
76
123
  describe "#__any_method__=" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: navigable_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-04-05 00:00:00.000000000 Z
13
+ date: 2013-04-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler