settable 1.0 → 1.1

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/examples/example.rb CHANGED
@@ -3,7 +3,7 @@ require 'settable'
3
3
 
4
4
  class Configuration
5
5
  include Settable
6
-
6
+
7
7
  def initialize(&block)
8
8
  instance_eval(&block) if block_given?
9
9
  end
@@ -11,14 +11,19 @@ end
11
11
 
12
12
  config = Configuration.new do
13
13
  set :environment, 'development'
14
-
14
+
15
15
  set :api_token do
16
16
  return 'PRODTOKEN' if environment == 'production'
17
17
  'DEVTOKEN'
18
18
  end
19
-
19
+
20
20
  set :api_endpoint, "http://example.com/api/#{api_token}"
21
21
  set :environment, 'production'
22
+
23
+ namespace :chat do
24
+ set :enabled, true
25
+ set :token, 'abcde90210'
26
+ end
22
27
  end
23
28
 
24
29
  # external stuffs
@@ -33,4 +38,6 @@ puts config.environment
33
38
  puts config.api_token
34
39
  puts config.api_endpoint
35
40
  puts config.something
36
- puts config.debug?
41
+ puts config.debug?
42
+ puts config.chat.enabled?
43
+ puts config.chat.token
data/examples/rails.rb CHANGED
@@ -9,7 +9,7 @@ end
9
9
  class Configuration
10
10
  include Settable
11
11
  include Settable::Rails
12
-
12
+
13
13
  def initialize(&block)
14
14
  instance_eval(&block) if block_given?
15
15
  end
@@ -17,25 +17,36 @@ end
17
17
 
18
18
  @config = Configuration.new do
19
19
  define_environments :blah, :qa
20
-
20
+
21
21
  set :something, in_blah?
22
22
  set :debug, in_environments?(:development, :test)
23
-
23
+
24
24
  if in_production?
25
25
  enable :tracking, :caching
26
26
  else
27
27
  disable :tracking, :caching
28
28
  end
29
-
29
+
30
+ namespace :api do
31
+ set :token do
32
+ in_production { return 'PRODTOKEN' }
33
+ in_development{ return 'DEVTOKEN' }
34
+ 'OTHERTOKEN'
35
+ end
36
+
37
+ set :endpoint do
38
+ in_environments(:development, :test){ return "http://sandbox.example.com/api/#{token}" }
39
+ "http://example.com/api/#{token}"
40
+ end
41
+ end
42
+
30
43
  set :api_token do
31
44
  in_production { return 'PRODTOKEN' }
32
45
  in_development{ return 'DEVTOKEN' }
33
46
  'OTHERTOKEN'
34
47
  end
35
-
48
+
36
49
  set :api_endpoint do
37
- in_environments(:development, :test){ return "http://sandbox.example.com/api/#{api_token}" }
38
- "http://example.com/api/#{api_token}"
39
50
  end
40
51
  end
41
52
 
@@ -44,6 +55,9 @@ puts @config.inspect
44
55
 
45
56
  puts '-' * 80
46
57
 
58
+ puts @config.api.token
59
+ puts @config.api.endpoint
60
+
47
61
  puts @config.tracking?
48
62
  puts @config.caching?
49
63
  puts @config.api_token
data/lib/settable.rb CHANGED
@@ -1,14 +1,16 @@
1
1
  module Settable
2
- VERSION = "1.0"
2
+ VERSION = "1.1"
3
3
 
4
4
  module Rails
5
5
  DEFAULT_ENVIRONMENTS = [:development, :production, :test]
6
+ CUSTOM_ENVIRONMENTS = []
6
7
 
7
8
  # allow us to add custom environment helpers
8
9
  def define_environments(*envs)
9
10
  envs.each do |env|
11
+ CUSTOM_ENVIRONMENTS << env
10
12
  define_metaclass_method(:"in_#{env}"){ |&block| in_environment(env.to_sym, &block) }
11
- define_metaclass_method(:"in_#{env}?"){ in_environment?(env.to_sym) }
13
+ define_metaclass_method(:"in_#{env}?"){ in_environment?(env.to_sym) }
12
14
  end
13
15
  end
14
16
  alias_method :define_environment, :define_environments
@@ -53,6 +55,10 @@ module Settable
53
55
  set key, Proc.new{value}
54
56
  end
55
57
  end
58
+
59
+ def namespace(name, &block)
60
+ set name, Namespace.create(self, &block)
61
+ end
56
62
 
57
63
  def enable(*keys)
58
64
  keys.each{ |key| set key, true }
@@ -61,4 +67,21 @@ module Settable
61
67
  def disable(*keys)
62
68
  keys.each{ |key| set key, false }
63
69
  end
70
+
71
+ class Namespace
72
+ def self.create(base, &block)
73
+ include Settable
74
+ klass = new
75
+
76
+ # good lord this is hack. but we need to re-define the custom environments in our
77
+ # namespaces
78
+ if base.class.ancestors.include?(Settable::Rails)
79
+ include Settable::Rails
80
+ klass.instance_eval{ define_environments *CUSTOM_ENVIRONMENTS }
81
+ end
82
+
83
+ klass.instance_eval(&block)
84
+ klass
85
+ end
86
+ end
64
87
  end
@@ -0,0 +1,252 @@
1
+ $:.push File.expand_path("../../lib", __FILE__)
2
+ require 'test/unit'
3
+ require 'settable'
4
+
5
+ module Rails
6
+ class << self; attr_accessor :env; end
7
+ self.env = :development
8
+ end
9
+
10
+ class Configuration
11
+ include Settable
12
+ def initialize(&block)
13
+ instance_eval(&block) if block_given?
14
+ end
15
+ end
16
+
17
+ class RailsConfiguration < Configuration
18
+ include Settable::Rails
19
+ end
20
+
21
+ # test using an instance eval'd config
22
+ class SettableBlockTest < Test::Unit::TestCase
23
+ def setup
24
+ @config = Configuration.new do
25
+ set :string, 'hello world'
26
+ set :numeric, 10
27
+ set :block do
28
+ 'block'
29
+ end
30
+ set :combined, "#{string}-combined"
31
+ enable :tracking
32
+ disable :caching
33
+ end
34
+ end
35
+
36
+ def test_settables
37
+ assert_equal [:string, :numeric, :block, :combined, :tracking, :caching].sort, @config.__settables__.sort
38
+ end
39
+
40
+ def test_strings
41
+ assert_equal 'hello world', @config.string
42
+ end
43
+
44
+ def test_numeric
45
+ assert_equal 10, @config.numeric
46
+ end
47
+
48
+ def test_block
49
+ assert_equal 'block', @config.block
50
+ end
51
+
52
+ def test_string_interpolation
53
+ assert_equal 'hello world-combined', @config.combined
54
+ end
55
+
56
+ def test_enable
57
+ assert @config.tracking
58
+ end
59
+
60
+ def test_disable
61
+ assert !@config.caching
62
+ end
63
+
64
+ def test_question_marks
65
+ assert @config.combined? == true
66
+ end
67
+ end
68
+
69
+ # test individual setting config
70
+ class SettableExternalTest < Test::Unit::TestCase
71
+ def setup
72
+ @config = Configuration.new
73
+ end
74
+
75
+ def test_strings
76
+ @config.set :string, 'hello world'
77
+ assert_equal 'hello world', @config.string
78
+ end
79
+
80
+ def test_numeric
81
+ @config.set :numeric, 10
82
+ assert_equal 10, @config.numeric
83
+ end
84
+
85
+ def test_block
86
+ @config.set :block do
87
+ 'block'
88
+ end
89
+ assert_equal 'block', @config.block
90
+ end
91
+
92
+ def test_enable
93
+ @config.enable :tracking
94
+ assert @config.tracking
95
+ end
96
+
97
+ def test_disable
98
+ @config.disable :caching
99
+ assert !@config.caching
100
+ end
101
+
102
+ def test_block_with_value
103
+ @config.set :value, 'value'
104
+ @config.set :block do
105
+ value
106
+ end
107
+ assert_equal 'value', @config.block
108
+ end
109
+
110
+ def test_string_interpolation
111
+ @config.set :hello, 'hello'
112
+ @config.set :combined, "#{@config.hello}-world"
113
+ assert_equal 'hello-world', @config.combined
114
+ end
115
+
116
+ def test_question_marks
117
+ @config.set :hello, 'world'
118
+ assert @config.hello? == true
119
+ end
120
+ end
121
+
122
+ class SettableRailsTest < Test::Unit::TestCase
123
+ def setup
124
+ @config = RailsConfiguration.new do
125
+ define_environments :custom
126
+ set :debug, in_development?
127
+
128
+ set :api_token do
129
+ in_production{ return 'PROD' }
130
+ in_custom{ return 'CUSTOM' }
131
+ 'DEFAULT'
132
+ end
133
+
134
+ set :api_endpoint do
135
+ in_environments(:development, :test){ return 'dev.example.com' }
136
+ 'example.com'
137
+ end
138
+ end
139
+ end
140
+
141
+ def test_settables
142
+ assert_equal [:debug, :api_endpoint, :api_token].sort, @config.__settables__.sort
143
+ end
144
+
145
+ def test_in_environment_helper
146
+ Rails.env = :development
147
+ assert @config.in_development? == true
148
+ end
149
+
150
+ def test_custom_environments
151
+ Rails.env = :custom
152
+ assert @config.in_custom? == true
153
+ end
154
+
155
+ def test_development_block
156
+ Rails.env = :development
157
+ assert_equal 'DEFAULT', @config.api_token
158
+ end
159
+
160
+ def test_production_block
161
+ Rails.env = :production
162
+ assert_equal 'PROD', @config.api_token
163
+ end
164
+
165
+ def test_custom_block
166
+ Rails.env = :custom
167
+ assert_equal 'CUSTOM', @config.api_token
168
+ end
169
+
170
+ def test_multiple_environments_in_development
171
+ Rails.env = :development
172
+ assert_equal 'dev.example.com', @config.api_endpoint
173
+ end
174
+
175
+ def test_multiple_environments_in_test
176
+ Rails.env = :test
177
+ assert_equal 'dev.example.com', @config.api_endpoint
178
+ end
179
+
180
+ def test_multiple_environments_in_other
181
+ Rails.env = :production
182
+ assert_equal 'example.com', @config.api_endpoint
183
+ end
184
+
185
+ def test_question_marks
186
+ assert @config.api_endpoint? == true
187
+ end
188
+ end
189
+
190
+ # test using namespaces on bare configs
191
+ class SettableNamespaceTest < Test::Unit::TestCase
192
+ def setup
193
+ @config = Configuration.new do
194
+ namespace :email do
195
+ set :from, 'no-reply@example.com'
196
+ set :subject do
197
+ "Mail from #{from}"
198
+ end
199
+ end
200
+
201
+ set :from, 'russia with love'
202
+ end
203
+ end
204
+
205
+ def test_namespace_from
206
+ assert_equal 'no-reply@example.com', @config.email.from
207
+ end
208
+
209
+ def test_from
210
+ assert_equal 'russia with love', @config.from
211
+ end
212
+
213
+ def test_namespace_blocks
214
+ assert_equal 'Mail from no-reply@example.com', @config.email.subject
215
+ end
216
+ end
217
+
218
+ # test using namespaces on rails configs
219
+ class SettableRailsNamespaceTest < Test::Unit::TestCase
220
+ def setup
221
+ @config = RailsConfiguration.new do
222
+ define_environments :custom
223
+
224
+ namespace :api do
225
+ set :token do
226
+ in_production{ return 'PROD' }
227
+ in_custom{ return 'CUSTOM' }
228
+ 'DEFAULT'
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ def test_namespace_environments
235
+ assert @config.api.respond_to?(:in_custom?)
236
+ end
237
+
238
+ def test_namespace_blocks_dev
239
+ Rails.env = :development
240
+ assert_equal 'DEFAULT', @config.api.token
241
+ end
242
+
243
+ def test_namespace_blocks_prod
244
+ Rails.env = :production
245
+ assert_equal 'PROD', @config.api.token
246
+ end
247
+
248
+ def test_namespace_blocks_custom
249
+ Rails.env = :custom
250
+ assert_equal 'CUSTOM', @config.api.token
251
+ end
252
+ end
metadata CHANGED
@@ -1,29 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: settable
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.1'
4
5
  prerelease:
5
- version: "1.0"
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Rob Hurring
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-09 00:00:00 -04:00
14
- default_executable:
12
+ date: 2012-01-20 00:00:00.000000000Z
15
13
  dependencies: []
16
-
17
14
  description: Small include to make config files better
18
- email:
15
+ email:
19
16
  - robhurring@gmail.com
20
17
  executables: []
21
-
22
18
  extensions: []
23
-
24
19
  extra_rdoc_files: []
25
-
26
- files:
20
+ files:
27
21
  - .gitignore
28
22
  - Gemfile
29
23
  - Rakefile
@@ -32,33 +26,30 @@ files:
32
26
  - examples/rails.rb
33
27
  - lib/settable.rb
34
28
  - settable.gemspec
35
- has_rdoc: true
36
- homepage: ""
29
+ - test/settable_test.rb
30
+ homepage: ''
37
31
  licenses: []
38
-
39
32
  post_install_message:
40
33
  rdoc_options: []
41
-
42
- require_paths:
34
+ require_paths:
43
35
  - lib
44
- required_ruby_version: !ruby/object:Gem::Requirement
36
+ required_ruby_version: !ruby/object:Gem::Requirement
45
37
  none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: "0"
50
- required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
43
  none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: "0"
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
56
48
  requirements: []
57
-
58
49
  rubyforge_project: settable
59
- rubygems_version: 1.5.0
50
+ rubygems_version: 1.8.6
60
51
  signing_key:
61
52
  specification_version: 3
62
53
  summary: Small include to make config files better
63
- test_files: []
64
-
54
+ test_files:
55
+ - test/settable_test.rb