Commit c510affe2e7ab96289525b95f50a5dd528854807
Exists in
master
Merge pull request #38 from goosetav/master
symbolize_keys for issue #33
Showing
2 changed files
with
34 additions
and
2 deletions
Show diff stats
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([]) |