citrusbyte-settings 0.0.2 → 0.0.3
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.
- data/lib/{rails.rb → settings.rb} +4 -1
- data/lib/settings_hash.rb +38 -12
- data/rails/init.rb +1 -0
- data/test/settings_test.rb +25 -9
- metadata +7 -8
- data/init.rb +0 -1
- data/lib/readonly_hash.rb +0 -12
@@ -1,6 +1,9 @@
|
|
1
1
|
# Rails-specific initialization, only here because if you try to set a global
|
2
2
|
# constant in init.rb it gets removed, but if you require a file that sets a
|
3
3
|
# global constant it seems to work -- not sure why?
|
4
|
-
|
4
|
+
#
|
5
|
+
# Also, Rails gem-dependencies expect a file with the name of the gem in lib
|
6
|
+
# that defines a constant with the same name -- hence we have to file called
|
7
|
+
# settings.rb which defines Settings for Rails to be happy =)
|
5
8
|
require 'settings_hash'
|
6
9
|
Settings = SettingsHash.new(File.join(Rails.root, 'config', 'settings.yml'), Rails.env)
|
data/lib/settings_hash.rb
CHANGED
@@ -1,9 +1,44 @@
|
|
1
|
-
require 'readonly_hash'
|
2
1
|
require 'yaml'
|
3
2
|
|
3
|
+
class Hash
|
4
|
+
# From ActiveSupport lib/active_support/core_ext/hash/keys.rb line 22-27
|
5
|
+
# Altered to recursively symbolize all keys in nested hashes
|
6
|
+
def symbolize_keys
|
7
|
+
inject({}) do |options, (key, value)|
|
8
|
+
options[(key.to_sym rescue key) || key] = (value.is_a?(Hash) ? value.symbolize_keys : value)
|
9
|
+
options
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# A very simple "readonly" hash implementation. Freezes itselfs on
|
15
|
+
# initialization so that any attempts to change will result in a TypeError
|
16
|
+
class ReadonlyHash < Hash
|
17
|
+
class << self
|
18
|
+
def [](*args)
|
19
|
+
new(super(*args))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(hash)
|
24
|
+
update hash
|
25
|
+
freeze
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
4
29
|
class SettingsHash < ReadonlyHash
|
30
|
+
# Raised when attempting to access a key which has not been set.
|
5
31
|
class SettingNotFound < StandardError;end;
|
6
32
|
|
33
|
+
# Creates a new SettingsHash from a YAML file located at the given path.
|
34
|
+
#
|
35
|
+
# Optionally loads only the settings within the given namespace (if a
|
36
|
+
# namespace is given)
|
37
|
+
#
|
38
|
+
# SettingsHash.new('/path/to/settings.yml') => { :foo => { :bar => 'baz' }, :bam => 'bang' }
|
39
|
+
# SettingsHash.new('/path/to/settings.yml, 'foo') => { :bar => 'baz' }
|
40
|
+
#
|
41
|
+
# Note that hash keys are symbolized (as seen in example above)
|
7
42
|
def initialize(path, namespace=nil)
|
8
43
|
raise "No settings file found: #{path}" unless File.exists?(path)
|
9
44
|
settings = YAML.load_file(path)
|
@@ -16,19 +51,10 @@ class SettingsHash < ReadonlyHash
|
|
16
51
|
super(settings.symbolize_keys)
|
17
52
|
end
|
18
53
|
|
54
|
+
# Access the value at the given key, raises SettingsHash::SettingNotFound if
|
55
|
+
# the key is not set.
|
19
56
|
def [](key)
|
20
57
|
raise SettingNotFound.new("No setting found for #{key}") unless has_key?(key)
|
21
58
|
super
|
22
59
|
end
|
23
60
|
end
|
24
|
-
|
25
|
-
class Hash
|
26
|
-
# from ActiveSupport
|
27
|
-
# lib/active_support/core_ext/hash/keys.rb line 22-27
|
28
|
-
def symbolize_keys
|
29
|
-
inject({}) do |options, (key, value)|
|
30
|
-
options[(key.to_sym rescue key) || key] = value
|
31
|
-
options
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'settings'
|
data/test/settings_test.rb
CHANGED
@@ -16,21 +16,37 @@ class SettingsTest < Test::Unit::TestCase
|
|
16
16
|
@settings = SettingsHash.new(File.join(fixture_path, 'settings.yml'), 'test')
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
should "return hash of settings" do
|
20
|
+
assert @settings.is_a?(SettingsHash)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
should "symbolize keys" do
|
24
|
+
assert @settings.has_key?(:foo)
|
25
|
+
end
|
26
|
+
|
27
|
+
should "symbolize nested keys" do
|
28
|
+
assert @settings[:abc].has_key?(:def)
|
29
|
+
end
|
30
|
+
|
31
|
+
should "set nested values" do
|
32
|
+
assert_equal 123, @settings[:abc][:def]
|
33
|
+
end
|
34
|
+
|
35
|
+
should "have bar for :foo" do
|
36
|
+
assert_equal 'bar', @settings[:foo]
|
37
|
+
end
|
38
|
+
|
39
|
+
should "freeze settings" do
|
24
40
|
assert_raise TypeError do
|
25
41
|
@settings[:foo] = 'baz'
|
26
42
|
end
|
27
43
|
end
|
28
44
|
|
29
|
-
|
45
|
+
should "return value for key if set" do
|
30
46
|
assert_equal 'bar', @settings[:foo]
|
31
47
|
end
|
32
48
|
|
33
|
-
|
49
|
+
should "raise if key is not set" do
|
34
50
|
assert_raise SettingsHash::SettingNotFound do
|
35
51
|
@settings[:bar]
|
36
52
|
end
|
@@ -38,16 +54,16 @@ class SettingsTest < Test::Unit::TestCase
|
|
38
54
|
end
|
39
55
|
|
40
56
|
context "and namespace doesnt exist" do
|
41
|
-
|
57
|
+
should "raise" do
|
42
58
|
assert_raise RuntimeError do
|
43
59
|
SettingsHash.new(File.join(fixture_path, 'settings.yml'), 'foo')
|
44
60
|
end
|
45
61
|
end
|
46
62
|
end
|
47
63
|
end
|
48
|
-
|
64
|
+
|
49
65
|
context "outside of test namespace" do
|
50
|
-
|
66
|
+
should "return hash of settings" do
|
51
67
|
assert_equal({ :baz => 'bang' }, SettingsHash.new(File.join(fixture_path, 'no_namespace.yml')))
|
52
68
|
end
|
53
69
|
end
|
@@ -55,7 +71,7 @@ class SettingsTest < Test::Unit::TestCase
|
|
55
71
|
end
|
56
72
|
|
57
73
|
context "settings file doesnt exist" do
|
58
|
-
|
74
|
+
should "raise" do
|
59
75
|
assert_raise RuntimeError do
|
60
76
|
SettingsHash.new(File.join(fixture_path, 'missing.yml'))
|
61
77
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: citrusbyte-settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Alavi
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-25 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,19 +22,18 @@ extensions: []
|
|
22
22
|
extra_rdoc_files: []
|
23
23
|
|
24
24
|
files:
|
25
|
-
-
|
25
|
+
- lib/settings.rb
|
26
|
+
- lib/settings_hash.rb
|
26
27
|
- README.markdown
|
27
28
|
- LICENSE
|
28
29
|
- Rakefile
|
29
|
-
-
|
30
|
-
- lib/settings_hash.rb
|
31
|
-
- lib/readonly_hash.rb
|
32
|
-
- test/settings_test.rb
|
30
|
+
- rails/init.rb
|
33
31
|
- test/fixtures/empty.yml
|
34
32
|
- test/fixtures/no_namespace.yml
|
35
33
|
- test/fixtures/settings.yml
|
34
|
+
- test/settings_test.rb
|
36
35
|
has_rdoc: false
|
37
|
-
homepage: http://
|
36
|
+
homepage: http://labs.citrusbyte.com/projects/settings
|
38
37
|
post_install_message:
|
39
38
|
rdoc_options: []
|
40
39
|
|
data/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'rails'
|