settingslogic 2.0.6 → 2.0.7
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/Gemfile +6 -0
- data/Gemfile.lock +41 -0
- data/README.rdoc +23 -1
- data/Rakefile +1 -1
- data/VERSION.yml +2 -2
- data/lib/settingslogic.rb +21 -5
- data/settingslogic.gemspec +40 -35
- data/spec/settings4.rb +4 -0
- data/spec/settingslogic_spec.rb +21 -0
- data/spec/spec_helper.rb +3 -5
- metadata +74 -40
- data/.gitignore +0 -8
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
archive-tar-minitar (0.5.2)
|
5
|
+
columnize (0.3.6)
|
6
|
+
diff-lcs (1.1.3)
|
7
|
+
git (1.2.5)
|
8
|
+
jeweler (1.6.4)
|
9
|
+
bundler (~> 1.0)
|
10
|
+
git (>= 1.2.5)
|
11
|
+
rake
|
12
|
+
linecache19 (0.5.12)
|
13
|
+
ruby_core_source (>= 0.1.4)
|
14
|
+
rake (0.9.2.2)
|
15
|
+
rspec (2.8.0)
|
16
|
+
rspec-core (~> 2.8.0)
|
17
|
+
rspec-expectations (~> 2.8.0)
|
18
|
+
rspec-mocks (~> 2.8.0)
|
19
|
+
rspec-core (2.8.0)
|
20
|
+
rspec-expectations (2.8.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.8.0)
|
23
|
+
ruby-debug-base19 (0.11.25)
|
24
|
+
columnize (>= 0.3.1)
|
25
|
+
linecache19 (>= 0.5.11)
|
26
|
+
ruby_core_source (>= 0.1.4)
|
27
|
+
ruby-debug19 (0.11.6)
|
28
|
+
columnize (>= 0.3.1)
|
29
|
+
linecache19 (>= 0.5.11)
|
30
|
+
ruby-debug-base19 (>= 0.11.19)
|
31
|
+
ruby_core_source (0.1.5)
|
32
|
+
archive-tar-minitar (>= 0.5.2)
|
33
|
+
|
34
|
+
PLATFORMS
|
35
|
+
ruby
|
36
|
+
|
37
|
+
DEPENDENCIES
|
38
|
+
jeweler
|
39
|
+
rake
|
40
|
+
rspec
|
41
|
+
ruby-debug19
|
data/README.rdoc
CHANGED
@@ -48,7 +48,7 @@ to a key in the YAML file.
|
|
48
48
|
|
49
49
|
Using a namespace allows us to change our configuration depending on our environment:
|
50
50
|
|
51
|
-
#
|
51
|
+
# config/application.yml
|
52
52
|
defaults: &defaults
|
53
53
|
cool:
|
54
54
|
saweet: nested settings
|
@@ -65,6 +65,12 @@ Using a namespace allows us to change our configuration depending on our environ
|
|
65
65
|
production:
|
66
66
|
<<: *defaults
|
67
67
|
|
68
|
+
_Note_: Certain Ruby/Bundler versions include a version of the Psych YAML parser which incorrectly handles merges (the `<<` in the example above.)
|
69
|
+
If your default settings seem to be overwriting your environment-specific settings, including the following lines in your config/boot.rb file may solve the problem:
|
70
|
+
|
71
|
+
require 'yaml'
|
72
|
+
YAML::ENGINE.yamler= 'syck'
|
73
|
+
|
68
74
|
=== 3. Access your settings
|
69
75
|
|
70
76
|
>> Rails.env
|
@@ -114,6 +120,22 @@ Modifying our model example:
|
|
114
120
|
This would allow you to specify a custom value for per_page just for posts, or
|
115
121
|
to fall back to your default value if not specified.
|
116
122
|
|
123
|
+
=== 5. Suppressing Exceptions Conditionally
|
124
|
+
|
125
|
+
Raising exceptions for missing settings helps highlight configuration problems. However, in a
|
126
|
+
Rails app it may make sense to suppress this in production and return nil for missing settings.
|
127
|
+
While it's useful to stop and highlight an error in development or test environments, this is
|
128
|
+
often not the right answer for production.
|
129
|
+
|
130
|
+
class Settings < Settingslogic
|
131
|
+
source "#{Rails.root}/config/application.yml"
|
132
|
+
namespace Rails.env
|
133
|
+
suppress_errors Rails.env.production?
|
134
|
+
end
|
135
|
+
|
136
|
+
>> Settings.non_existent_key
|
137
|
+
=> nil
|
138
|
+
|
117
139
|
== Note on Sinatra / Capistrano / Vlad
|
118
140
|
|
119
141
|
Each of these frameworks uses a +set+ convention for settings, which actually defines methods
|
data/Rakefile
CHANGED
data/VERSION.yml
CHANGED
data/lib/settingslogic.rb
CHANGED
@@ -7,7 +7,7 @@ class Settingslogic < Hash
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
def name # :nodoc:
|
10
|
-
instance.key?("name") ? instance.name : super
|
10
|
+
self.superclass != Hash && instance.key?("name") ? instance.name : super
|
11
11
|
end
|
12
12
|
|
13
13
|
# Enables Settings.get('nested.key.name') for dynamic access
|
@@ -35,7 +35,15 @@ class Settingslogic < Hash
|
|
35
35
|
@namespace = value
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
|
+
def suppress_errors(value = nil)
|
40
|
+
if value.nil?
|
41
|
+
@suppress_errors
|
42
|
+
else
|
43
|
+
@suppress_errors = value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
39
47
|
def [](key)
|
40
48
|
instance.fetch(key.to_s, nil)
|
41
49
|
end
|
@@ -103,7 +111,9 @@ class Settingslogic < Hash
|
|
103
111
|
self.replace hash_or_file
|
104
112
|
else
|
105
113
|
hash = YAML.load(ERB.new(File.read(hash_or_file)).result).to_hash
|
106
|
-
|
114
|
+
if self.class.namespace
|
115
|
+
hash = hash[self.class.namespace] or return missing_key("Missing setting '#{self.class.namespace}' in #{hash_or_file}")
|
116
|
+
end
|
107
117
|
self.replace hash
|
108
118
|
end
|
109
119
|
@section = section || self.class.source # so end of error says "in application.yml"
|
@@ -114,7 +124,7 @@ class Settingslogic < Hash
|
|
114
124
|
# Otherwise, create_accessors! (called by new) will have created actual methods for each key.
|
115
125
|
def method_missing(name, *args, &block)
|
116
126
|
key = name.to_s
|
117
|
-
|
127
|
+
return missing_key("Missing setting '#{key}' in #{@section}") unless has_key? key
|
118
128
|
value = fetch(key)
|
119
129
|
create_accessor_for(key)
|
120
130
|
value.is_a?(Hash) ? self.class.new(value, "'#{key}' section in #{@section}") : value
|
@@ -150,10 +160,16 @@ class Settingslogic < Hash
|
|
150
160
|
self.class.class_eval <<-EndEval
|
151
161
|
def #{key}
|
152
162
|
return @#{key} if @#{key}
|
153
|
-
|
163
|
+
return missing_key("Missing setting '#{key}' in #{@section}") unless has_key? '#{key}'
|
154
164
|
value = fetch('#{key}')
|
155
165
|
@#{key} = value.is_a?(Hash) ? self.class.new(value, "'#{key}' section in #{@section}") : value
|
156
166
|
end
|
157
167
|
EndEval
|
158
168
|
end
|
169
|
+
|
170
|
+
def missing_key(msg)
|
171
|
+
return nil if self.class.suppress_errors
|
172
|
+
|
173
|
+
raise MissingSetting, msg
|
174
|
+
end
|
159
175
|
end
|
data/settingslogic.gemspec
CHANGED
@@ -1,59 +1,64 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "2.0.
|
7
|
+
s.name = "settingslogic"
|
8
|
+
s.version = "2.0.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Johnson of Binary Logic"]
|
12
|
-
s.date =
|
13
|
-
s.email =
|
12
|
+
s.date = "2012-01-06"
|
13
|
+
s.email = "bjohnson@binarylogic.com"
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
16
|
-
|
16
|
+
"README.rdoc"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
|
-
".
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
"spec/settings.yml",
|
31
|
-
"spec/settings2.rb",
|
32
|
-
"spec/settings3.rb",
|
33
|
-
"spec/settingslogic_spec.rb",
|
34
|
-
"spec/spec_helper.rb"
|
35
|
-
]
|
36
|
-
s.homepage = %q{http://github.com/binarylogic/settingslogic}
|
37
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
38
|
-
s.require_paths = ["lib"]
|
39
|
-
s.rubygems_version = %q{1.3.5}
|
40
|
-
s.summary = %q{A simple and straightforward settings solution that uses an ERB enabled YAML file and a singleton design pattern.}
|
41
|
-
s.test_files = [
|
19
|
+
"CHANGELOG.rdoc",
|
20
|
+
"Gemfile",
|
21
|
+
"Gemfile.lock",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION.yml",
|
26
|
+
"init.rb",
|
27
|
+
"lib/settingslogic.rb",
|
28
|
+
"rails/init.rb",
|
29
|
+
"settingslogic.gemspec",
|
42
30
|
"spec/settings.rb",
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
31
|
+
"spec/settings.yml",
|
32
|
+
"spec/settings2.rb",
|
33
|
+
"spec/settings3.rb",
|
34
|
+
"spec/settings4.rb",
|
35
|
+
"spec/settingslogic_spec.rb",
|
36
|
+
"spec/spec_helper.rb"
|
47
37
|
]
|
38
|
+
s.homepage = "http://github.com/binarylogic/settingslogic"
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = "1.8.10"
|
41
|
+
s.summary = "A simple and straightforward settings solution that uses an ERB enabled YAML file and a singleton design pattern."
|
48
42
|
|
49
43
|
if s.respond_to? :specification_version then
|
50
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
51
44
|
s.specification_version = 3
|
52
45
|
|
53
|
-
if Gem::Version.new(Gem::
|
46
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
+
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
48
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<rspec>, [">= 0"])
|
50
|
+
s.add_runtime_dependency(%q<ruby-debug19>, [">= 0"])
|
54
51
|
else
|
52
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
53
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
54
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
55
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
55
56
|
end
|
56
57
|
else
|
58
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
59
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
60
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
61
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
data/spec/settings4.rb
ADDED
data/spec/settingslogic_spec.rb
CHANGED
@@ -107,6 +107,10 @@ describe "Settingslogic" do
|
|
107
107
|
e.should_not be_nil
|
108
108
|
end
|
109
109
|
|
110
|
+
it "should allow suppressing errors" do
|
111
|
+
Settings4.non_existent_key.should be_nil
|
112
|
+
end
|
113
|
+
|
110
114
|
# This one edge case currently does not pass, because it requires very
|
111
115
|
# esoteric code in order to make it pass. It was judged not worth fixing,
|
112
116
|
# as it introduces significant complexity for minor gain.
|
@@ -133,9 +137,26 @@ describe "Settingslogic" do
|
|
133
137
|
Settings.get('setting1.deep.child.value').should == 2
|
134
138
|
end
|
135
139
|
|
140
|
+
# If .name is not a property, delegate to superclass
|
141
|
+
it "should respond with Module.name" do
|
142
|
+
Settings2.name.should == "Settings2"
|
143
|
+
end
|
144
|
+
|
145
|
+
# If .name is called on Settingslogic itself, handle appropriately
|
146
|
+
# by delegating to Hash
|
147
|
+
it "should have the parent class always respond with Module.name" do
|
148
|
+
Settingslogic.name.should == 'Settingslogic'
|
149
|
+
end
|
150
|
+
|
151
|
+
# If .name is a property, respond with that instead of delegating to superclass
|
152
|
+
it "should allow a name setting to be overriden" do
|
153
|
+
Settings.name.should == 'test'
|
154
|
+
end
|
155
|
+
|
136
156
|
# Put this test last or else call to .instance will load @instance,
|
137
157
|
# masking bugs.
|
138
158
|
it "should be a hash" do
|
139
159
|
Settings.send(:instance).should be_is_a(Hash)
|
140
160
|
end
|
161
|
+
|
141
162
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,18 +1,16 @@
|
|
1
|
-
require 'spec'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'ruby-debug' if RUBY_VERSION < '1.9' # ruby-debug does not work on 1.9.1 yet
|
4
|
-
|
5
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
6
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rspec'
|
7
4
|
require 'settingslogic'
|
8
5
|
require 'settings'
|
9
6
|
require 'settings2'
|
10
7
|
require 'settings3'
|
8
|
+
require 'settings4'
|
11
9
|
|
12
10
|
# Needed to test Settings3
|
13
11
|
Object.send :define_method, 'collides' do
|
14
12
|
'collision'
|
15
13
|
end
|
16
14
|
|
17
|
-
|
15
|
+
RSpec.configure do |config|
|
18
16
|
end
|
metadata
CHANGED
@@ -1,30 +1,71 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: settingslogic
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.7
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Ben Johnson of Binary Logic
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
date: 2012-01-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70310322933480 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70310322933480
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: jeweler
|
27
|
+
requirement: &70310322933000 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70310322933000
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70310322932520 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70310322932520
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ruby-debug19
|
49
|
+
requirement: &70310322932040 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70310322932040
|
16
58
|
description:
|
17
59
|
email: bjohnson@binarylogic.com
|
18
60
|
executables: []
|
19
|
-
|
20
61
|
extensions: []
|
21
|
-
|
22
|
-
extra_rdoc_files:
|
62
|
+
extra_rdoc_files:
|
23
63
|
- LICENSE
|
24
64
|
- README.rdoc
|
25
|
-
files:
|
26
|
-
- .gitignore
|
65
|
+
files:
|
27
66
|
- CHANGELOG.rdoc
|
67
|
+
- Gemfile
|
68
|
+
- Gemfile.lock
|
28
69
|
- LICENSE
|
29
70
|
- README.rdoc
|
30
71
|
- Rakefile
|
@@ -37,39 +78,32 @@ files:
|
|
37
78
|
- spec/settings.yml
|
38
79
|
- spec/settings2.rb
|
39
80
|
- spec/settings3.rb
|
81
|
+
- spec/settings4.rb
|
40
82
|
- spec/settingslogic_spec.rb
|
41
83
|
- spec/spec_helper.rb
|
42
|
-
has_rdoc: true
|
43
84
|
homepage: http://github.com/binarylogic/settingslogic
|
44
85
|
licenses: []
|
45
|
-
|
46
86
|
post_install_message:
|
47
|
-
rdoc_options:
|
48
|
-
|
49
|
-
require_paths:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
50
89
|
- lib
|
51
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
63
102
|
requirements: []
|
64
|
-
|
65
103
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.
|
104
|
+
rubygems_version: 1.8.10
|
67
105
|
signing_key:
|
68
106
|
specification_version: 3
|
69
|
-
summary: A simple and straightforward settings solution that uses an ERB enabled YAML
|
70
|
-
|
71
|
-
|
72
|
-
- spec/settings2.rb
|
73
|
-
- spec/settings3.rb
|
74
|
-
- spec/settingslogic_spec.rb
|
75
|
-
- spec/spec_helper.rb
|
107
|
+
summary: A simple and straightforward settings solution that uses an ERB enabled YAML
|
108
|
+
file and a singleton design pattern.
|
109
|
+
test_files: []
|