File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ class << self
1010 def name # :nodoc:
1111 self . superclass != Hash && instance . key? ( "name" ) ? instance . name : super
1212 end
13-
13+
1414 # Enables Settings.get('nested.key.name') for dynamic access
1515 def get ( key )
1616 parts = key . split ( '.' )
@@ -167,7 +167,22 @@ def #{key}
167167 end
168168 EndEval
169169 end
170-
170+
171+ def symbolize_keys
172+
173+ inject ( { } ) do |memo , tuple |
174+
175+ k = ( tuple . first . to_sym rescue tuple . first ) || tuple . first
176+
177+ v = k . is_a? ( Symbol ) ? send ( k ) : tuple . last # make sure the value is accessed the same way Settings.foo.bar works
178+
179+ memo [ k ] = v && v . respond_to? ( :symbolize_keys ) ? v . symbolize_keys : v #recurse for nested hashes
180+
181+ memo
182+ end
183+
184+ end
185+
171186 def missing_key ( msg )
172187 return nil if self . class . suppress_errors
173188
Original file line number Diff line number Diff line change @@ -168,6 +168,23 @@ class NoSource < Settingslogic; end
168168 it "should allow a name setting to be overriden" do
169169 Settings . name . should == 'test'
170170 end
171+
172+ it "should allow symbolize_keys" do
173+ Settings . reload!
174+ result = Settings . language . haskell . symbolize_keys
175+ result . class . should == Hash
176+ result . should == { :paradigm => "functional" }
177+ end
178+
179+ it "should allow symbolize_keys on nested hashes" do
180+ Settings . reload!
181+ result = Settings . language . symbolize_keys
182+ result . class . should == Hash
183+ result . should == {
184+ :haskell => { :paradigm => "functional" } ,
185+ :smalltalk => { :paradigm => "object oriented" }
186+ }
187+ end
171188
172189 it "should handle empty file" do
173190 SettingsEmpty . keys . should eql ( [ ] )
You can’t perform that action at this time.
0 commit comments