app_mode 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -30,7 +30,7 @@ There are two ways to use this gem.
30
30
 
31
31
  See notes below on the :dynamic state, which is the default.
32
32
 
33
- my_mode = AppMode.new
33
+ my_mode = StateManager.new
34
34
 
35
35
  my_mode.state = :test
36
36
 
@@ -44,12 +44,12 @@ There are two ways to use this gem.
44
44
 
45
45
  Or specify the state you want to use when initializing the object:
46
46
 
47
- my_mode = AppMode.new(:development)
47
+ my_mode = StateManager.new(:development)
48
48
 
49
49
  If you would like to use states other than those provided, you are free
50
50
  to do so:
51
51
 
52
- my_mode = AppMode.new(:blue, [:red, :yellow, :green, :blue])
52
+ my_mode = StateManager.new(:blue, [:red, :yellow, :green, :blue])
53
53
 
54
54
  my_mode.state = :yellow
55
55
 
@@ -59,7 +59,7 @@ There are two ways to use this gem.
59
59
 
60
60
  The :dynamic state is still valid with custom states:
61
61
 
62
- my_mode = AppMode.new(:dynamic, [:red, :yellow, :green, :blue])
62
+ my_mode = StateManager.new(:dynamic, [:red, :yellow, :green, :blue])
63
63
 
64
64
  2. Use the class methods:
65
65
  This method is really only recommended for the end application. The initial
@@ -86,18 +86,18 @@ to your gem or anyone else's.
86
86
  The following method is recommended for use in libraries or gems:
87
87
 
88
88
  module MyModule
89
- MyModuleMode = AppMode.new
89
+ MyModuleMode = StateManager.new
90
90
  end
91
91
 
92
92
  or
93
93
 
94
94
  class MyClass
95
- MyClassMode = AppMode.new
95
+ MyClassMode = StateManager.new
96
96
  end
97
97
 
98
98
  == A Word on States
99
99
 
100
- * AppMode assumes the following default "states":
100
+ * StateManager assumes the following default "states":
101
101
 
102
102
  :development
103
103
 
@@ -107,20 +107,20 @@ or
107
107
 
108
108
  :production
109
109
 
110
- * There is a fifth state (:dynamic), which will tell AppMode to determine
110
+ * There is a fifth state (:dynamic), which will tell StateManager to determine
111
111
  the state by examining the stack trace. It is only available when initializing
112
- a new AppMode object and assumes that the first state is 'development',
112
+ a new StateManager object and assumes that the first state is 'development',
113
113
  the second is 'test', the third is 'rake', and the last one (not the fourth)
114
114
  is 'production'. If less than four states are specified, the last one will be
115
115
  used for multiple states. For example, if the states specified are
116
116
  [:orange, :apple, :grape], :grape will be used for both rake and production.
117
117
 
118
- * Only states in the list when the AppMode object were created are valid.
118
+ * Only states in the list when the StateManager object were created are valid.
119
119
  For example, the following code will generate errors:
120
120
 
121
- my_mode = AppMode.new(:blue, [:red, :green]) #=> RuntimeError: Invalid environment setting: 'blue'.
121
+ my_mode = StateManager.new(:blue, [:red, :green]) #=> RuntimeError: Invalid environment setting: 'blue'.
122
122
 
123
- my_mode = AppMode.new(:dynamic, [:red, :green])
123
+ my_mode = StateManager.new(:dynamic, [:red, :green])
124
124
 
125
125
  my_mode.state = :development #=> RuntimeError: Invalid environment setting: 'development'.
126
126
 
@@ -132,7 +132,7 @@ or
132
132
 
133
133
  Check for inclusion in the array of valid states:
134
134
 
135
- my_mode = AppMode.new(:red, [:red, :green])
135
+ my_mode = StateManager.new(:red, [:red, :green])
136
136
 
137
137
  if my_mode.valid_states.include?(:purple) && my_mode.purple
138
138
  # Purple code.
@@ -140,7 +140,7 @@ or
140
140
 
141
141
  Use equivalency:
142
142
 
143
- my_mode = AppMode.new(:red, [:red, :green])
143
+ my_mode = StateManager.new(:red, [:red, :green])
144
144
 
145
145
  if my_mode.state == :purple
146
146
  # Purple code.
@@ -148,7 +148,7 @@ or
148
148
 
149
149
  * If you are compelled to change the states for the global AppMode class,
150
150
  that may be done by using the setup method, which accepts the same
151
- arguments as AppMode.new. Passing in a state of :dynamic will allow it
151
+ arguments as StateManager.new. Passing in a state of :dynamic will allow it
152
152
  to set the state as it is intended.
153
153
 
154
154
  * Although this document explains how to do so,
data/app_mode.gemspec CHANGED
@@ -1,8 +1,8 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'app_mode'
3
- s.version = '0.0.4'
3
+ s.version = '1.0.0'
4
4
 
5
- s.summary = 'Application state management.'
5
+ s.summary = 'State management for objects and applications.'
6
6
  s.description = 'AppMode provides state management for ' +
7
7
  'modules, classes, libraries, and applications.'
8
8
 
@@ -1,5 +1,5 @@
1
- # This file contains a class to manage information about the mode that the
2
- # executing code is running in.
1
+ # This file contains a global class to manage information about the mode
2
+ # that the executing code is running in.
3
3
 
4
4
  #--
5
5
  ################################################################################
@@ -34,19 +34,24 @@
34
34
  #++
35
35
 
36
36
  # This class manages the mode that the executing code is running in.
37
- class AppMode
38
- attr_reader :state, :valid_states
39
-
37
+ class AppMode < StateManager
40
38
  # Tracks a global mode setting.
41
39
  @@mode = nil
42
40
 
41
+ # Constructor.
42
+ def initialize(*args)
43
+ # AppMode.new should not be called.
44
+ raise NotImplementedError, "#{self.class.name}.new is not implemented. " +
45
+ "You probably want #{self.class.superclass.name}.new."
46
+ end
47
+
43
48
  class << self
44
49
  # Override the send method.
45
50
  #
46
51
  # This was implemented to cover the case where test is used as a state.
47
52
  # In that case, the default behavior was to call the private
48
53
  # test method from Kernel. This prevents that behavior in cases where a
49
- # public method is available via method_missing in this class.
54
+ # public method is available via method_missing in the parent class.
50
55
  def send(method, *args)
51
56
  return method_missing(method, *args) if respond_to_missing?(method, false)
52
57
  super
@@ -54,7 +59,7 @@ class AppMode
54
59
 
55
60
  # Initializes the global mode setting.
56
61
  def setup(*args)
57
- @@mode = self.new(*args)
62
+ @@mode = self.superclass.new(*args)
58
63
  end
59
64
 
60
65
  ########################################################################
@@ -78,107 +83,4 @@ class AppMode
78
83
  super
79
84
  end
80
85
  end
81
-
82
- # Constructor.
83
- # ==== Input
84
- # [env : Symbol] The environment that the mode should be set to.
85
- # [valid_states : Array : (:development, :test, :production)] Valid states.
86
- # ==== Notes
87
- # <tt>env</tt> must be a member of <tt>states</tt>.
88
- # ==== Examples
89
- # AppMode.new #=> <AppMode @state=:production, @valid_states=[:development, :test, :production]>
90
- # AppMode.new(:test) #=> <AppMode @state=:test, @valid_states=[:development, :test, :production]>
91
- # AppMode.new(:dev, [:abc, :dev]) #=> <AppMode @state=:dev, @valid_states=[:abc, :dev]>
92
- def initialize(
93
- state = :dynamic,
94
- valid_states = [:development, :test, :rake, :production])
95
- @state = state
96
- @valid_states = valid_states
97
- set_state @state
98
- end
99
-
100
- # Sets the environment instance variable.
101
- # ==== Input
102
- # [value : Symbol] The value that will be used for the environment.
103
- def state=(value)
104
- set_state value
105
- end
106
-
107
- # Override the send method.
108
- #
109
- # This was implemented to cover the case where test is used as a state.
110
- # In that case, the default behavior was to call the private
111
- # test method from Kernel. This prevents that behavior in cases where a
112
- # public method is available via method_missing in this class.
113
- def send(method, *args)
114
- return method_missing(method, *args) if respond_to_missing?(method, false)
115
- super
116
- end
117
-
118
- ############################################################################
119
- private
120
- ############################################################################
121
-
122
- # Returns the appropriate state to use when setting the state dynamically.
123
- # ==== Output
124
- # [Symbol] The state that should be used when setting the state dynamically.
125
- def dynamic_state
126
- call = origin
127
- return @valid_states[0] unless call.sub(/^\.\//, '').match(/\//)
128
-
129
- case call
130
- when /rake_test_loader\.rb/,
131
- %r[/tests?/test_\w+?.rb], %r[/tests?/\w+?_test.rb]
132
- return @valid_states[1]
133
- when %r[/bin/rake]
134
- return @valid_states[2]
135
- end
136
-
137
- return @valid_states.last
138
- end
139
-
140
- # Returns the first call in the stack.
141
- # ==== Output
142
- # [String] The file that made the first call in the stack.
143
- # ==== Notes
144
- # This method is overridden during tests.
145
- def origin
146
- caller.last
147
- end
148
-
149
- # Allows the getting of the mode.
150
- # ==== Input
151
- # [method : Symbol] The method that was called.
152
- # [*args : Array] Any arguments that were passed in.
153
- # [&block : Block] A block, if specified.
154
- def method_missing(method, *args, &block)
155
- return method == @state if respond_to_missing?(method, false)
156
- super
157
- end
158
-
159
- # Ensure that the object knows what it can respond to via method_missing.
160
- # ==== Input
161
- # [method : Symbol] The method to check for a response to.
162
- # [include_private : Boolean] Whether to include private methods.
163
- # ==== Output
164
- # [Boolean] Indicates whether the object will respond to the specified method.
165
- def respond_to_missing?(method, include_private)
166
- return true if @valid_states.include?(method)
167
- super
168
- end
169
-
170
- # Sets the state.
171
- # ==== Input
172
- # [value : Symbol] The value to use for the state.
173
- def set_state(value)
174
- unless @valid_states.include?(value) || value == :dynamic
175
- raise "Invalid environment setting: '#{value}'."
176
- end
177
-
178
- if value == :dynamic
179
- @state = dynamic_state || @valid_states.last
180
- else
181
- @state = value
182
- end
183
- end
184
86
  end
@@ -0,0 +1,147 @@
1
+ # This file contains a class to manage information about the state of
2
+ # a module, class, object, or application.
3
+
4
+ #--
5
+ ################################################################################
6
+ # Copyright (C) 2011 Travis Herrick #
7
+ ################################################################################
8
+ # #
9
+ # \v^V,^!v\^/ #
10
+ # ~% %~ #
11
+ # { _ _ } #
12
+ # ( * - ) #
13
+ # | / | #
14
+ # \ _, / #
15
+ # \__.__/ #
16
+ # #
17
+ ################################################################################
18
+ # This program is free software: you can redistribute it #
19
+ # and/or modify it under the terms of the GNU General Public License #
20
+ # as published by the Free Software Foundation, #
21
+ # either version 3 of the License, or (at your option) any later version. #
22
+ # #
23
+ # Commercial licensing may be available for a fee under a different license. #
24
+ ################################################################################
25
+ # This program is distributed in the hope that it will be useful, #
26
+ # but WITHOUT ANY WARRANTY; #
27
+ # without even the implied warranty of MERCHANTABILITY #
28
+ # or FITNESS FOR A PARTICULAR PURPOSE. #
29
+ # See the GNU General Public License for more details. #
30
+ # #
31
+ # You should have received a copy of the GNU General Public License #
32
+ # along with this program. If not, see <http://www.gnu.org/licenses/>. #
33
+ ################################################################################
34
+ #++
35
+
36
+ # This class assists in managing the state of
37
+ # a module, class, object, or application.
38
+ class StateManager
39
+ attr_reader :state, :valid_states
40
+
41
+ # Constructor.
42
+ # ==== Input
43
+ # [state : Symbol] The state that should be used initially.
44
+ #
45
+ # :dynamic is a special state that will determine the best
46
+ # state based on the environment that the code is running in.
47
+ # [valid_states : Array : (:development, :test, :production)] Valid states.
48
+ # ==== Notes
49
+ # <tt>env</tt> must be a member of <tt>states</tt>.
50
+ # ==== Examples
51
+ # StateManager.new #=> <StateManager @state=:rake, @valid_states=[:development, :test, :rake, :production]>
52
+ # StateManager.new(:test) #=> <StateManager @state=:test, @valid_states=[:development, :test, :rake, :production]>
53
+ # StateManager.new(:dev, [:abc, :dev]) #=> <StateManager @state=:dev, @valid_states=[:abc, :dev]>
54
+ def initialize(
55
+ state = :dynamic,
56
+ valid_states = [:development, :test, :rake, :production])
57
+ @state = state
58
+ @valid_states = valid_states
59
+ set_state @state
60
+ end
61
+
62
+ # Override the send method.
63
+ #
64
+ # This was implemented to cover the case where test is used as a state.
65
+ # In that case, the default behavior was to call the private
66
+ # test method from Kernel. This prevents that behavior in cases where a
67
+ # public method is available via method_missing in this class.
68
+ def send(method, *args)
69
+ return method_missing(method, *args) if respond_to_missing?(method, false)
70
+ super
71
+ end
72
+
73
+ # Sets the state instance variable.
74
+ # ==== Input
75
+ # [value : Symbol] The value that will be used for the state.
76
+ def state=(value)
77
+ set_state value
78
+ end
79
+
80
+ ############################################################################
81
+ private
82
+ ############################################################################
83
+
84
+ # Returns the appropriate state to use when setting the state dynamically.
85
+ # ==== Output
86
+ # [Symbol] The state that should be used when setting the state dynamically.
87
+ def dynamic_state
88
+ call = origin
89
+ return @valid_states[0] unless call.sub(/^\.\//, '').match(/\//)
90
+
91
+ case call
92
+ when /rake_test_loader\.rb/,
93
+ %r[/tests?/test_\w+?.rb], %r[/tests?/\w+?_test.rb]
94
+ return @valid_states[1]
95
+ when %r[/bin/rake]
96
+ return @valid_states[2]
97
+ end
98
+
99
+ return @valid_states.last
100
+ end
101
+
102
+ # Allows the getting of the state since valid states
103
+ # may be specified at run time.
104
+ # ==== Input
105
+ # [method : Symbol] The method that was called.
106
+ # [*args : Array] Any arguments that were passed in.
107
+ # [&block : Block] A block, if specified.
108
+ def method_missing(method, *args, &block)
109
+ return method == @state if respond_to_missing?(method, false)
110
+ super
111
+ end
112
+
113
+ # Returns the first call in the stack.
114
+ # ==== Output
115
+ # [String] The file that made the first call in the stack.
116
+ # ==== Notes
117
+ # This method is overridden during tests.
118
+ def origin
119
+ caller.last
120
+ end
121
+
122
+ # Ensure that the object knows what it can respond to via method_missing.
123
+ # ==== Input
124
+ # [method : Symbol] The method to check for a response to.
125
+ # [include_private : Boolean] Whether to include private methods.
126
+ # ==== Output
127
+ # [Boolean] Indicates whether the object will respond to the specified method.
128
+ def respond_to_missing?(method, include_private)
129
+ return true if @valid_states.include?(method)
130
+ super
131
+ end
132
+
133
+ # Sets the state.
134
+ # ==== Input
135
+ # [value : Symbol] The value to use for the state.
136
+ def set_state(value)
137
+ unless @valid_states.include?(value) || value == :dynamic
138
+ raise "Invalid environment setting: '#{value}'."
139
+ end
140
+
141
+ if value == :dynamic
142
+ @state = dynamic_state || @valid_states.last
143
+ else
144
+ @state = value
145
+ end
146
+ end
147
+ end
data/lib/app_mode.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  gem_name = File.basename(__FILE__, '.rb')
2
2
 
3
+ require_relative File.join(gem_name, 'state_manager')
3
4
  require_relative File.join(gem_name, gem_name)
@@ -33,217 +33,14 @@
33
33
  require_relative 'require'
34
34
 
35
35
  class AppModeTest < Test::Unit::TestCase
36
- include AppModeSupport
36
+ include StateManagerSupport
37
37
 
38
38
  def setup
39
39
  @class = AppMode
40
40
  @class.setup
41
- @obj = nil
42
41
  super
43
42
  end
44
43
 
45
- def test_class_type
46
- assert_equal AppMode, @class
47
- end
48
-
49
- ############################################################################
50
- # Instance tests.
51
- ############################################################################
52
-
53
- def test_default_settings
54
- create
55
-
56
- assert_equal :production, @obj.state
57
- assert_equal states(:default), @obj.valid_states
58
-
59
- assert_true @obj.production
60
- assert_false @obj.development
61
- assert_false @obj.test
62
- end
63
-
64
- def test_setting_state
65
- create :test
66
-
67
- assert_equal :test, @obj.state
68
- assert_true @obj.test
69
-
70
- assert_nothing_raised { @obj.state = :development }
71
-
72
- assert_equal :development, @obj.state
73
- assert_true @obj.development
74
- end
75
-
76
- def test_new_object
77
- create :test
78
- assert_equal :test, @obj.state
79
- assert_false @obj.development
80
- assert_true @obj.test
81
- assert_false @obj.rake
82
- assert_false @obj.production
83
-
84
- create :development
85
- assert_equal :development, @obj.state
86
- assert_true @obj.development
87
- assert_false @obj.test
88
- assert_false @obj.rake
89
- assert_false @obj.production
90
-
91
- create :production
92
- assert_equal :production, @obj.state
93
- assert_false @obj.development
94
- assert_false @obj.test
95
- assert_false @obj.rake
96
- assert_true @obj.production
97
-
98
- create :rake
99
- assert_equal :rake, @obj.state
100
- assert_false @obj.development
101
- assert_false @obj.test
102
- assert_true @obj.rake
103
- assert_false @obj.production
104
- end
105
-
106
- def test_dynamic_state
107
- assert_nothing_raised { create :dynamic }
108
- assert_false @obj.development
109
- assert_false @obj.test
110
- assert_false @obj.rake
111
- assert_true @obj.production
112
-
113
- assert_nothing_raised { create :dynamic, states(:dev) }
114
- assert_true @obj.dev_dev
115
- assert_false @obj.dev_test
116
- assert_false @obj.dev_rake
117
- assert_false @obj.dev_prod
118
-
119
- assert_nothing_raised { create :dynamic, states(:test) }
120
- assert_false @obj.test_dev
121
- assert_true @obj.test_test
122
- assert_false @obj.test_rake
123
- assert_false @obj.test_prod
124
-
125
- assert_nothing_raised { create :dynamic, states(:rake) }
126
- assert_false @obj.rake_dev
127
- assert_false @obj.rake_test
128
- assert_true @obj.rake_rake
129
- assert_false @obj.rake_prod
130
-
131
- assert_nothing_raised { create :dynamic, states(:prod) }
132
- assert_false @obj.prod_dev
133
- assert_false @obj.prod_test
134
- assert_false @obj.prod_rake
135
- assert_true @obj.prod_prod
136
-
137
- assert_raise(NoMethodError) { @obj.dynamic }
138
- assert_raise(NoMethodError) { @obj.test }
139
-
140
- assert_nothing_raised { create :dynamic, states(:test_test_class) }
141
- assert_false @obj.test_test_class_dev
142
- assert_true @obj.test_ttc
143
- assert_false @obj.rake
144
- assert_false @obj.prod
145
-
146
- assert_nothing_raised { create :dynamic, states(:tests_test_class) }
147
- assert_false @obj.tests_test_class_dev
148
- assert_true @obj.test_stc
149
- assert_false @obj.rake
150
- assert_false @obj.prod
151
-
152
- assert_nothing_raised { create :dynamic, states(:test_class_test) }
153
- assert_false @obj.test_class_test_dev
154
- assert_true @obj.test_tct
155
- assert_false @obj.rake
156
- assert_false @obj.prod
157
-
158
- assert_nothing_raised { create :dynamic, states(:tests_class_test) }
159
- assert_false @obj.tests_class_test_dev
160
- assert_true @obj.test_sct
161
- assert_false @obj.rake
162
- assert_false @obj.prod
163
- end
164
-
165
- def test_dynamic_state_with_less_than_ideal_number_of_states
166
- [
167
- :dev,
168
- :test,
169
- :rake,
170
- :prod,
171
- ].each do |state|
172
- state_array = states(state)[0..3]
173
- end_value = state_array.length - 1
174
-
175
- (0..end_value).each do |i|
176
- assert_nothing_raised { create :dynamic, states(state)[0..i] }
177
- case i
178
- when 0
179
- assert_true @obj.send("#{state}_dev")
180
- when 1
181
- case state
182
- when :dev
183
- assert_true @obj.dev_dev
184
- else
185
- assert_true @obj.send("#{state}_test")
186
- end
187
- when 2
188
- case state
189
- when :dev
190
- assert_true @obj.dev_dev
191
- when :test
192
- assert_true @obj.test_test
193
- else
194
- assert_true @obj.send("#{state}_rake")
195
- end
196
- when 3
197
- case state
198
- when :dev
199
- assert_true @obj.dev_dev
200
- when :test
201
- assert_true @obj.test_test
202
- when :rake
203
- assert_true @obj.rake_rake
204
- when :prod
205
- assert_true @obj.prod_prod
206
- end
207
- end
208
- end
209
- end
210
- end
211
-
212
- def test_invalid_state
213
- assert_raise(RuntimeError) { create :invalid }
214
- assert_raise(NoMethodError) { create :test; @obj.invalid }
215
- end
216
-
217
- def test_respond_to
218
- create :test
219
-
220
- method_list.each_value do |method|
221
- assert_respond_to @obj, method
222
- end
223
-
224
- states(:default).each do |method|
225
- assert_respond_to @obj, method
226
- end
227
-
228
- assert_not_respond_to @obj, :invalid
229
- end
230
-
231
- # This test exists because of Kernel::test.
232
- def test_send_method
233
- create :test
234
- assert_equal :test, @obj.send(:state)
235
- assert_false @obj.send(:development)
236
- assert_true @obj.send(:test)
237
- assert_false @obj.send(:rake)
238
- assert_false @obj.send(:production)
239
-
240
- create :development, [:development, :production]
241
- assert_equal :development, @obj.send(:state)
242
- assert_true @obj.send(:development)
243
- assert_false @obj.send(:production)
244
- assert_raise(ArgumentError) { @obj.send(:test) }
245
- end
246
-
247
44
  ############################################################################
248
45
  # Class tests.
249
46
  ############################################################################
@@ -305,14 +102,14 @@ class AppModeTest < Test::Unit::TestCase
305
102
  assert_raise(ArgumentError) { @class.send(:test) }
306
103
  end
307
104
 
105
+ def test_initialize_object_should_fail
106
+ assert_raise(NotImplementedError) { @class.new }
107
+ end
108
+
308
109
  ############################################################################
309
110
  private
310
111
  ############################################################################
311
112
 
312
- def create(*args)
313
- @obj = @class.new(*args)
314
- end
315
-
316
113
  ############################################################################
317
114
  # Assertions - stolen from test_internals.
318
115
  ############################################################################
@@ -32,7 +32,7 @@
32
32
  ################################################################################
33
33
  #++
34
34
 
35
- class AppMode
35
+ class StateManager
36
36
  ############################################################################
37
37
  private
38
38
  ############################################################################
@@ -36,7 +36,7 @@
36
36
  # This module is provided to be used as an include in any necessary class.
37
37
  #
38
38
  # This serves as a bridge between test code and application code.
39
- module AppModeSupport
39
+ module StateManagerSupport
40
40
  # These are things that will be used throughout testing in multiple locations.
41
41
  ITEMS = {
42
42
  :states => {
data/test/require.rb CHANGED
@@ -2,7 +2,7 @@ Bundler.require :test
2
2
 
3
3
  require 'test/unit'
4
4
 
5
- require_relative '../lib/app_mode/app_mode'
5
+ require_relative '../lib/app_mode'
6
6
 
7
- require_relative 'lib/app_mode_support'
8
- require_relative 'lib/app_mode'
7
+ require_relative 'lib/state_manager_support'
8
+ require_relative 'lib/state_manager'
@@ -0,0 +1,265 @@
1
+ #--
2
+ ################################################################################
3
+ # Copyright (C) 2011 Travis Herrick #
4
+ ################################################################################
5
+ # #
6
+ # \v^V,^!v\^/ #
7
+ # ~% %~ #
8
+ # { _ _ } #
9
+ # ( * - ) #
10
+ # | / | #
11
+ # \ _, / #
12
+ # \__.__/ #
13
+ # #
14
+ ################################################################################
15
+ # This program is free software: you can redistribute it #
16
+ # and/or modify it under the terms of the GNU General Public License #
17
+ # as published by the Free Software Foundation, #
18
+ # either version 3 of the License, or (at your option) any later version. #
19
+ # #
20
+ # Commercial licensing may be available for a fee under a different license. #
21
+ ################################################################################
22
+ # This program is distributed in the hope that it will be useful, #
23
+ # but WITHOUT ANY WARRANTY; #
24
+ # without even the implied warranty of MERCHANTABILITY #
25
+ # or FITNESS FOR A PARTICULAR PURPOSE. #
26
+ # See the GNU General Public License for more details. #
27
+ # #
28
+ # You should have received a copy of the GNU General Public License #
29
+ # along with this program. If not, see <http://www.gnu.org/licenses/>. #
30
+ ################################################################################
31
+ #++
32
+
33
+ require_relative 'require'
34
+
35
+ class StateManagerTest < Test::Unit::TestCase
36
+ include StateManagerSupport
37
+
38
+ def setup
39
+ @class = StateManager
40
+ @obj = nil
41
+ super
42
+ end
43
+
44
+ def test_default_settings
45
+ create
46
+
47
+ assert_equal :production, @obj.state
48
+ assert_equal states(:default), @obj.valid_states
49
+
50
+ assert_true @obj.production
51
+ assert_false @obj.development
52
+ assert_false @obj.test
53
+ end
54
+
55
+ def test_setting_state
56
+ create :test
57
+
58
+ assert_equal :test, @obj.state
59
+ assert_true @obj.test
60
+
61
+ assert_nothing_raised { @obj.state = :development }
62
+
63
+ assert_equal :development, @obj.state
64
+ assert_true @obj.development
65
+ end
66
+
67
+ def test_new_object
68
+ create :test
69
+ assert_equal :test, @obj.state
70
+ assert_false @obj.development
71
+ assert_true @obj.test
72
+ assert_false @obj.rake
73
+ assert_false @obj.production
74
+
75
+ create :development
76
+ assert_equal :development, @obj.state
77
+ assert_true @obj.development
78
+ assert_false @obj.test
79
+ assert_false @obj.rake
80
+ assert_false @obj.production
81
+
82
+ create :production
83
+ assert_equal :production, @obj.state
84
+ assert_false @obj.development
85
+ assert_false @obj.test
86
+ assert_false @obj.rake
87
+ assert_true @obj.production
88
+
89
+ create :rake
90
+ assert_equal :rake, @obj.state
91
+ assert_false @obj.development
92
+ assert_false @obj.test
93
+ assert_true @obj.rake
94
+ assert_false @obj.production
95
+ end
96
+
97
+ def test_dynamic_state
98
+ assert_nothing_raised { create :dynamic }
99
+ assert_false @obj.development
100
+ assert_false @obj.test
101
+ assert_false @obj.rake
102
+ assert_true @obj.production
103
+
104
+ assert_nothing_raised { create :dynamic, states(:dev) }
105
+ assert_true @obj.dev_dev
106
+ assert_false @obj.dev_test
107
+ assert_false @obj.dev_rake
108
+ assert_false @obj.dev_prod
109
+
110
+ assert_nothing_raised { create :dynamic, states(:test) }
111
+ assert_false @obj.test_dev
112
+ assert_true @obj.test_test
113
+ assert_false @obj.test_rake
114
+ assert_false @obj.test_prod
115
+
116
+ assert_nothing_raised { create :dynamic, states(:rake) }
117
+ assert_false @obj.rake_dev
118
+ assert_false @obj.rake_test
119
+ assert_true @obj.rake_rake
120
+ assert_false @obj.rake_prod
121
+
122
+ assert_nothing_raised { create :dynamic, states(:prod) }
123
+ assert_false @obj.prod_dev
124
+ assert_false @obj.prod_test
125
+ assert_false @obj.prod_rake
126
+ assert_true @obj.prod_prod
127
+
128
+ assert_raise(NoMethodError) { @obj.dynamic }
129
+ assert_raise(NoMethodError) { @obj.test }
130
+
131
+ assert_nothing_raised { create :dynamic, states(:test_test_class) }
132
+ assert_false @obj.test_test_class_dev
133
+ assert_true @obj.test_ttc
134
+ assert_false @obj.rake
135
+ assert_false @obj.prod
136
+
137
+ assert_nothing_raised { create :dynamic, states(:tests_test_class) }
138
+ assert_false @obj.tests_test_class_dev
139
+ assert_true @obj.test_stc
140
+ assert_false @obj.rake
141
+ assert_false @obj.prod
142
+
143
+ assert_nothing_raised { create :dynamic, states(:test_class_test) }
144
+ assert_false @obj.test_class_test_dev
145
+ assert_true @obj.test_tct
146
+ assert_false @obj.rake
147
+ assert_false @obj.prod
148
+
149
+ assert_nothing_raised { create :dynamic, states(:tests_class_test) }
150
+ assert_false @obj.tests_class_test_dev
151
+ assert_true @obj.test_sct
152
+ assert_false @obj.rake
153
+ assert_false @obj.prod
154
+ end
155
+
156
+ def test_dynamic_state_with_less_than_ideal_number_of_states
157
+ [
158
+ :dev,
159
+ :test,
160
+ :rake,
161
+ :prod,
162
+ ].each do |state|
163
+ state_array = states(state)[0..3]
164
+ end_value = state_array.length - 1
165
+
166
+ (0..end_value).each do |i|
167
+ assert_nothing_raised { create :dynamic, states(state)[0..i] }
168
+ case i
169
+ when 0
170
+ assert_true @obj.send("#{state}_dev")
171
+ when 1
172
+ case state
173
+ when :dev
174
+ assert_true @obj.dev_dev
175
+ else
176
+ assert_true @obj.send("#{state}_test")
177
+ end
178
+ when 2
179
+ case state
180
+ when :dev
181
+ assert_true @obj.dev_dev
182
+ when :test
183
+ assert_true @obj.test_test
184
+ else
185
+ assert_true @obj.send("#{state}_rake")
186
+ end
187
+ when 3
188
+ case state
189
+ when :dev
190
+ assert_true @obj.dev_dev
191
+ when :test
192
+ assert_true @obj.test_test
193
+ when :rake
194
+ assert_true @obj.rake_rake
195
+ when :prod
196
+ assert_true @obj.prod_prod
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
202
+
203
+ def test_invalid_state
204
+ assert_raise(RuntimeError) { create :invalid }
205
+ assert_raise(NoMethodError) { create :test; @obj.invalid }
206
+ end
207
+
208
+ def test_respond_to
209
+ create :test
210
+
211
+ method_list.each_value do |method|
212
+ assert_respond_to @obj, method
213
+ end
214
+
215
+ states(:default).each do |method|
216
+ assert_respond_to @obj, method
217
+ end
218
+
219
+ assert_not_respond_to @obj, :invalid
220
+ end
221
+
222
+ # This test exists because of Kernel::test.
223
+ def test_send_method
224
+ create :test
225
+ assert_equal :test, @obj.send(:state)
226
+ assert_false @obj.send(:development)
227
+ assert_true @obj.send(:test)
228
+ assert_false @obj.send(:rake)
229
+ assert_false @obj.send(:production)
230
+
231
+ create :development, [:development, :production]
232
+ assert_equal :development, @obj.send(:state)
233
+ assert_true @obj.send(:development)
234
+ assert_false @obj.send(:production)
235
+ assert_raise(ArgumentError) { @obj.send(:test) }
236
+ end
237
+
238
+ ############################################################################
239
+ private
240
+ ############################################################################
241
+
242
+ def create(*args)
243
+ @obj = @class.new(*args)
244
+ end
245
+
246
+ ############################################################################
247
+ # Assertions - stolen from test_internals.
248
+ ############################################################################
249
+
250
+ # Asserts that a value is equal to false.
251
+ # ==== Input
252
+ # [value : Any] The value to check for equality against false.
253
+ # [message : String : nil] The message to display if the value is not false.
254
+ def assert_false(value, message = nil)
255
+ assert_equal false, value, message
256
+ end
257
+
258
+ # Asserts that a value is equal to true.
259
+ # ==== Input
260
+ # [value : Any] The value to check for equality against true.
261
+ # [message : String : nil] The message to display if the value is not true.
262
+ def assert_true(value, message = nil)
263
+ assert_equal true, value, message
264
+ end
265
+ end
metadata CHANGED
@@ -3,10 +3,10 @@ name: app_mode
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
8
  - 0
8
- - 4
9
- version: 0.0.4
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Travis Herrick
@@ -42,6 +42,7 @@ extra_rdoc_files:
42
42
  - README
43
43
  files:
44
44
  - lib/app_mode/app_mode.rb
45
+ - lib/app_mode/state_manager.rb
45
46
  - lib/app_mode.rb
46
47
  - Gemfile.lock
47
48
  - Gemfile
@@ -49,9 +50,10 @@ files:
49
50
  - app_mode.gemspec
50
51
  - README
51
52
  - test/require.rb
53
+ - test/lib/state_manager.rb
54
+ - test/lib/state_manager_support.rb
52
55
  - test/app_mode_test.rb
53
- - test/lib/app_mode.rb
54
- - test/lib/app_mode_support.rb
56
+ - test/state_manager_test.rb
55
57
  has_rdoc: true
56
58
  homepage: http://www.bitbucket.org/ToadJamb/gems_app_mode
57
59
  licenses:
@@ -66,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
66
68
  requirements:
67
69
  - - ">="
68
70
  - !ruby/object:Gem::Version
69
- hash: 1255421514984567375
71
+ hash: 3211737509278320283
70
72
  segments:
71
73
  - 0
72
74
  version: "0"
@@ -84,9 +86,10 @@ rubyforge_project:
84
86
  rubygems_version: 1.3.7
85
87
  signing_key:
86
88
  specification_version: 3
87
- summary: Application state management.
89
+ summary: State management for objects and applications.
88
90
  test_files:
89
91
  - test/require.rb
92
+ - test/lib/state_manager.rb
93
+ - test/lib/state_manager_support.rb
90
94
  - test/app_mode_test.rb
91
- - test/lib/app_mode.rb
92
- - test/lib/app_mode_support.rb
95
+ - test/state_manager_test.rb