Skip to content

Commit c510aff

Browse files
committed
Merge pull request #38 from goosetav/master
symbolize_keys for issue #33
2 parents 52722f1 + f890392 commit c510aff

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

lib/settingslogic.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff 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

spec/settingslogic_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff 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([])

0 commit comments

Comments
 (0)