settable 1.0 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
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