Commit c510affe2e7ab96289525b95f50a5dd528854807

Authored by Ben Johnson
2 parents 52722f12 f8903920
Exists in master

Merge pull request #38 from goosetav/master

symbolize_keys for issue #33
lib/settingslogic.rb
@@ -10,7 +10,7 @@ class Settingslogic < Hash @@ -10,7 +10,7 @@ class Settingslogic < Hash
10 def name # :nodoc: 10 def name # :nodoc:
11 self.superclass != Hash && instance.key?("name") ? instance.name : super 11 self.superclass != Hash && instance.key?("name") ? instance.name : super
12 end 12 end
13 - 13 +
14 # Enables Settings.get('nested.key.name') for dynamic access 14 # Enables Settings.get('nested.key.name') for dynamic access
15 def get(key) 15 def get(key)
16 parts = key.split('.') 16 parts = key.split('.')
@@ -167,7 +167,22 @@ class Settingslogic < Hash @@ -167,7 +167,22 @@ class Settingslogic < Hash
167 end 167 end
168 EndEval 168 EndEval
169 end 169 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 +
171 def missing_key(msg) 186 def missing_key(msg)
172 return nil if self.class.suppress_errors 187 return nil if self.class.suppress_errors
173 188
spec/settingslogic_spec.rb
@@ -168,6 +168,23 @@ describe "Settingslogic" do @@ -168,6 +168,23 @@ describe "Settingslogic" do
168 it "should allow a name setting to be overriden" do 168 it "should allow a name setting to be overriden" do
169 Settings.name.should == 'test' 169 Settings.name.should == 'test'
170 end 170 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
171 188
172 it "should handle empty file" do 189 it "should handle empty file" do
173 SettingsEmpty.keys.should eql([]) 190 SettingsEmpty.keys.should eql([])