state_machine 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. data/.gitignore +7 -11
  2. data/.travis.yml +49 -7
  3. data/Appraisals +255 -87
  4. data/CHANGELOG.md +30 -0
  5. data/README.md +142 -21
  6. data/Rakefile +1 -11
  7. data/examples/Gemfile +5 -0
  8. data/examples/Gemfile.lock +14 -0
  9. data/examples/auto_shop.rb +2 -0
  10. data/examples/car.rb +2 -0
  11. data/examples/doc/AutoShop.html +2856 -0
  12. data/examples/doc/AutoShop_state.png +0 -0
  13. data/examples/doc/Car.html +919 -0
  14. data/examples/doc/Car_state.png +0 -0
  15. data/examples/doc/TrafficLight.html +2230 -0
  16. data/examples/doc/TrafficLight_state.png +0 -0
  17. data/examples/doc/Vehicle.html +7921 -0
  18. data/examples/doc/Vehicle_state.png +0 -0
  19. data/examples/doc/_index.html +136 -0
  20. data/examples/doc/class_list.html +47 -0
  21. data/examples/doc/css/common.css +1 -0
  22. data/examples/doc/css/full_list.css +55 -0
  23. data/examples/doc/css/style.css +322 -0
  24. data/examples/doc/file_list.html +46 -0
  25. data/examples/doc/frames.html +13 -0
  26. data/examples/doc/index.html +136 -0
  27. data/examples/doc/js/app.js +205 -0
  28. data/examples/doc/js/full_list.js +173 -0
  29. data/examples/doc/js/jquery.js +16 -0
  30. data/examples/doc/method_list.html +734 -0
  31. data/examples/doc/top-level-namespace.html +105 -0
  32. data/examples/rails-rest/migration.rb +1 -5
  33. data/examples/rails-rest/view__form.html.erb +34 -0
  34. data/examples/rails-rest/view_edit.html.erb +2 -21
  35. data/examples/rails-rest/view_index.html.erb +6 -4
  36. data/examples/rails-rest/view_new.html.erb +2 -11
  37. data/examples/rails-rest/view_show.html.erb +5 -3
  38. data/examples/traffic_light.rb +2 -0
  39. data/examples/vehicle.rb +2 -0
  40. data/gemfiles/active_model-3.0.0.gemfile.lock +9 -6
  41. data/gemfiles/active_model-3.0.5.gemfile.lock +10 -7
  42. data/gemfiles/active_model-3.1.1.gemfile.lock +12 -10
  43. data/gemfiles/{active_model-3.2.0.gemfile → active_model-3.2.1.gemfile} +1 -1
  44. data/gemfiles/{graphviz-0.9.0.gemfile → active_model-3.2.12.gemfile} +1 -1
  45. data/gemfiles/active_model-3.2.12.gemfile.lock +36 -0
  46. data/gemfiles/{active_record-3.2.0.gemfile → active_model-3.2.13.rc1.gemfile} +1 -2
  47. data/gemfiles/active_model-3.2.13.rc1.gemfile.lock +36 -0
  48. data/gemfiles/active_model-4.0.0.gemfile +9 -0
  49. data/gemfiles/active_model-4.0.0.gemfile.lock +78 -0
  50. data/gemfiles/active_record-2.0.0.gemfile +2 -1
  51. data/gemfiles/active_record-2.0.0.gemfile.lock +15 -6
  52. data/gemfiles/active_record-2.0.5.gemfile +2 -1
  53. data/gemfiles/active_record-2.0.5.gemfile.lock +15 -6
  54. data/gemfiles/active_record-2.1.0.gemfile +2 -1
  55. data/gemfiles/active_record-2.1.0.gemfile.lock +15 -6
  56. data/gemfiles/active_record-2.1.2.gemfile +2 -1
  57. data/gemfiles/active_record-2.1.2.gemfile.lock +15 -6
  58. data/gemfiles/active_record-2.2.3.gemfile +2 -1
  59. data/gemfiles/active_record-2.2.3.gemfile.lock +15 -6
  60. data/gemfiles/active_record-2.3.12.gemfile +2 -1
  61. data/gemfiles/active_record-2.3.12.gemfile.lock +15 -6
  62. data/gemfiles/active_record-2.3.5.gemfile +9 -0
  63. data/gemfiles/active_record-2.3.5.gemfile.lock +39 -0
  64. data/gemfiles/active_record-3.0.0.gemfile +2 -1
  65. data/gemfiles/active_record-3.0.0.gemfile.lock +18 -11
  66. data/gemfiles/active_record-3.0.5.gemfile +2 -1
  67. data/gemfiles/active_record-3.0.5.gemfile.lock +19 -12
  68. data/gemfiles/active_record-3.1.1.gemfile +2 -1
  69. data/gemfiles/active_record-3.1.1.gemfile.lock +22 -16
  70. data/gemfiles/active_record-3.2.12.gemfile +9 -0
  71. data/gemfiles/active_record-3.2.12.gemfile.lock +51 -0
  72. data/gemfiles/active_record-3.2.13.rc1.gemfile +9 -0
  73. data/gemfiles/active_record-3.2.13.rc1.gemfile.lock +51 -0
  74. data/gemfiles/active_record-4.0.0.gemfile +11 -0
  75. data/gemfiles/active_record-4.0.0.gemfile.lock +83 -0
  76. data/gemfiles/data_mapper-0.10.2.gemfile +1 -0
  77. data/gemfiles/data_mapper-0.10.2.gemfile.lock +13 -9
  78. data/gemfiles/data_mapper-0.9.11.gemfile +1 -0
  79. data/gemfiles/data_mapper-0.9.11.gemfile.lock +31 -7
  80. data/gemfiles/data_mapper-0.9.4.gemfile.lock +25 -14
  81. data/gemfiles/data_mapper-0.9.7.gemfile +1 -0
  82. data/gemfiles/data_mapper-0.9.7.gemfile.lock +27 -15
  83. data/gemfiles/data_mapper-1.0.0.gemfile.lock +20 -17
  84. data/gemfiles/data_mapper-1.0.1.gemfile.lock +20 -17
  85. data/gemfiles/data_mapper-1.0.2.gemfile.lock +20 -17
  86. data/gemfiles/data_mapper-1.1.0.gemfile.lock +19 -16
  87. data/gemfiles/data_mapper-1.2.0.gemfile.lock +19 -16
  88. data/gemfiles/default.gemfile.lock +8 -5
  89. data/gemfiles/graphviz-0.9.17.gemfile +7 -0
  90. data/gemfiles/graphviz-0.9.17.gemfile.lock +29 -0
  91. data/gemfiles/graphviz-0.9.21.gemfile.lock +7 -4
  92. data/gemfiles/graphviz-1.0.0.gemfile.lock +7 -4
  93. data/gemfiles/graphviz-1.0.3.gemfile +7 -0
  94. data/gemfiles/graphviz-1.0.3.gemfile.lock +29 -0
  95. data/gemfiles/graphviz-1.0.8.gemfile +7 -0
  96. data/gemfiles/graphviz-1.0.8.gemfile.lock +29 -0
  97. data/gemfiles/mongo_mapper-0.10.0.gemfile +1 -0
  98. data/gemfiles/mongo_mapper-0.10.0.gemfile.lock +14 -11
  99. data/gemfiles/mongo_mapper-0.11.1.gemfile +7 -0
  100. data/gemfiles/mongo_mapper-0.11.1.gemfile.lock +44 -0
  101. data/gemfiles/mongo_mapper-0.11.2.gemfile +9 -0
  102. data/gemfiles/mongo_mapper-0.11.2.gemfile.lock +48 -0
  103. data/gemfiles/mongo_mapper-0.12.0.gemfile +9 -0
  104. data/gemfiles/mongo_mapper-0.12.0.gemfile.lock +48 -0
  105. data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +7 -4
  106. data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +7 -4
  107. data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +7 -4
  108. data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +7 -4
  109. data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +7 -4
  110. data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +7 -4
  111. data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +7 -4
  112. data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +7 -4
  113. data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +7 -4
  114. data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +7 -4
  115. data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +7 -4
  116. data/gemfiles/mongoid-2.0.0.gemfile +2 -0
  117. data/gemfiles/mongoid-2.0.0.gemfile.lock +22 -18
  118. data/gemfiles/mongoid-2.1.4.gemfile +2 -0
  119. data/gemfiles/mongoid-2.1.4.gemfile.lock +21 -17
  120. data/gemfiles/mongoid-2.2.4.gemfile +2 -0
  121. data/gemfiles/mongoid-2.2.4.gemfile.lock +21 -17
  122. data/gemfiles/mongoid-2.3.3.gemfile +2 -0
  123. data/gemfiles/mongoid-2.3.3.gemfile.lock +21 -17
  124. data/gemfiles/mongoid-2.4.0.gemfile +9 -0
  125. data/gemfiles/mongoid-2.4.0.gemfile.lock +47 -0
  126. data/gemfiles/mongoid-2.4.10.gemfile +9 -0
  127. data/gemfiles/mongoid-2.4.10.gemfile.lock +47 -0
  128. data/gemfiles/mongoid-2.5.2.gemfile +9 -0
  129. data/gemfiles/mongoid-2.5.2.gemfile.lock +47 -0
  130. data/gemfiles/mongoid-2.6.0.gemfile +9 -0
  131. data/gemfiles/mongoid-2.6.0.gemfile.lock +47 -0
  132. data/gemfiles/mongoid-3.0.0.gemfile +8 -0
  133. data/gemfiles/mongoid-3.0.0.gemfile.lock +45 -0
  134. data/gemfiles/mongoid-3.0.22.gemfile +8 -0
  135. data/gemfiles/mongoid-3.0.22.gemfile.lock +45 -0
  136. data/gemfiles/mongoid-3.1.0.gemfile +8 -0
  137. data/gemfiles/mongoid-3.1.0.gemfile.lock +45 -0
  138. data/gemfiles/sequel-2.11.0.gemfile +2 -1
  139. data/gemfiles/sequel-2.11.0.gemfile.lock +11 -6
  140. data/gemfiles/sequel-2.12.0.gemfile +2 -1
  141. data/gemfiles/sequel-2.12.0.gemfile.lock +11 -6
  142. data/gemfiles/sequel-2.8.0.gemfile +2 -1
  143. data/gemfiles/sequel-2.8.0.gemfile.lock +11 -6
  144. data/gemfiles/sequel-3.0.0.gemfile +2 -1
  145. data/gemfiles/sequel-3.0.0.gemfile.lock +11 -6
  146. data/gemfiles/sequel-3.10.0.gemfile +9 -0
  147. data/gemfiles/sequel-3.10.0.gemfile.lock +33 -0
  148. data/gemfiles/sequel-3.13.0.gemfile +2 -1
  149. data/gemfiles/sequel-3.13.0.gemfile.lock +11 -6
  150. data/gemfiles/sequel-3.14.0.gemfile +2 -1
  151. data/gemfiles/sequel-3.14.0.gemfile.lock +11 -6
  152. data/gemfiles/sequel-3.23.0.gemfile +2 -1
  153. data/gemfiles/sequel-3.23.0.gemfile.lock +11 -6
  154. data/gemfiles/sequel-3.24.0.gemfile +2 -1
  155. data/gemfiles/sequel-3.24.0.gemfile.lock +11 -6
  156. data/gemfiles/sequel-3.29.0.gemfile +2 -1
  157. data/gemfiles/sequel-3.29.0.gemfile.lock +11 -6
  158. data/gemfiles/sequel-3.34.0.gemfile +9 -0
  159. data/gemfiles/sequel-3.34.0.gemfile.lock +33 -0
  160. data/gemfiles/sequel-3.35.0.gemfile +9 -0
  161. data/gemfiles/sequel-3.35.0.gemfile.lock +33 -0
  162. data/gemfiles/sequel-3.4.0.gemfile +9 -0
  163. data/gemfiles/sequel-3.4.0.gemfile.lock +33 -0
  164. data/gemfiles/sequel-3.44.0.gemfile +9 -0
  165. data/gemfiles/sequel-3.44.0.gemfile.lock +33 -0
  166. data/lib/state_machine.rb +6 -0
  167. data/lib/state_machine/branch.rb +9 -8
  168. data/lib/state_machine/callback.rb +2 -2
  169. data/lib/state_machine/core.rb +10 -0
  170. data/lib/state_machine/core_ext.rb +1 -0
  171. data/lib/state_machine/eval_helpers.rb +5 -3
  172. data/lib/state_machine/event.rb +17 -6
  173. data/lib/state_machine/graph.rb +92 -0
  174. data/lib/state_machine/integrations.rb +13 -1
  175. data/lib/state_machine/integrations/active_model.rb +14 -20
  176. data/lib/state_machine/integrations/active_model/observer.rb +3 -3
  177. data/lib/state_machine/integrations/active_model/observer_update.rb +42 -0
  178. data/lib/state_machine/integrations/active_record.rb +52 -25
  179. data/lib/state_machine/integrations/active_record/locale.rb +1 -1
  180. data/lib/state_machine/integrations/active_record/versions.rb +1 -17
  181. data/lib/state_machine/integrations/base.rb +15 -6
  182. data/lib/state_machine/integrations/data_mapper.rb +98 -35
  183. data/lib/state_machine/integrations/data_mapper/versions.rb +46 -8
  184. data/lib/state_machine/integrations/mongo_mapper.rb +39 -12
  185. data/lib/state_machine/integrations/mongo_mapper/locale.rb +1 -1
  186. data/lib/state_machine/integrations/mongo_mapper/versions.rb +3 -20
  187. data/lib/state_machine/integrations/mongoid.rb +52 -14
  188. data/lib/state_machine/integrations/mongoid/locale.rb +1 -1
  189. data/lib/state_machine/integrations/mongoid/versions.rb +52 -26
  190. data/lib/state_machine/integrations/sequel.rb +82 -33
  191. data/lib/state_machine/integrations/sequel/versions.rb +19 -44
  192. data/lib/state_machine/machine.rb +99 -59
  193. data/lib/state_machine/machine_collection.rb +1 -2
  194. data/lib/state_machine/macro_methods.rb +29 -0
  195. data/lib/state_machine/node_collection.rb +1 -1
  196. data/lib/state_machine/state.rb +18 -10
  197. data/lib/state_machine/state_context.rb +2 -2
  198. data/lib/state_machine/transition.rb +8 -1
  199. data/lib/state_machine/transition_collection.rb +2 -1
  200. data/lib/state_machine/version.rb +1 -1
  201. data/lib/state_machine/yard.rb +8 -0
  202. data/lib/state_machine/yard/handlers.rb +12 -0
  203. data/lib/state_machine/yard/handlers/base.rb +32 -0
  204. data/lib/state_machine/yard/handlers/event.rb +25 -0
  205. data/lib/state_machine/yard/handlers/machine.rb +344 -0
  206. data/lib/state_machine/yard/handlers/state.rb +25 -0
  207. data/lib/state_machine/yard/handlers/transition.rb +47 -0
  208. data/lib/state_machine/yard/templates.rb +3 -0
  209. data/lib/state_machine/yard/templates/default/class/html/setup.rb +30 -0
  210. data/lib/state_machine/yard/templates/default/class/html/state_machines.erb +12 -0
  211. data/lib/tasks/state_machine.rb +2 -1
  212. data/lib/yard-state_machine.rb +2 -0
  213. data/state_machine.gemspec +4 -3
  214. data/test/files/switch.rb +4 -0
  215. data/test/test_helper.rb +5 -0
  216. data/test/unit/branch_test.rb +117 -36
  217. data/test/unit/callback_test.rb +5 -2
  218. data/test/unit/eval_helpers_test.rb +49 -1
  219. data/test/unit/event_collection_test.rb +3 -1
  220. data/test/unit/event_test.rb +182 -12
  221. data/test/unit/graph_test.rb +98 -0
  222. data/test/unit/integrations/active_model_test.rb +82 -12
  223. data/test/unit/integrations/active_record_test.rb +393 -37
  224. data/test/unit/integrations/base_test.rb +7 -2
  225. data/test/unit/integrations/data_mapper_test.rb +326 -72
  226. data/test/unit/integrations/mongo_mapper_test.rb +338 -44
  227. data/test/unit/integrations/mongoid_test.rb +606 -98
  228. data/test/unit/integrations/sequel_test.rb +429 -102
  229. data/test/unit/integrations_test.rb +28 -6
  230. data/test/unit/machine_collection_test.rb +6 -2
  231. data/test/unit/machine_test.rb +134 -82
  232. data/test/unit/node_collection_test.rb +2 -2
  233. data/test/unit/path_test.rb +1 -1
  234. data/test/unit/state_test.rb +65 -21
  235. data/test/unit/transition_collection_test.rb +43 -23
  236. data/test/unit/transition_test.rb +8 -2
  237. metadata +303 -221
  238. data/gemfiles/active_model-3.2.0.gemfile.lock +0 -32
  239. data/gemfiles/active_record-3.2.0.gemfile.lock +0 -43
  240. data/gemfiles/graphviz-0.9.0.gemfile.lock +0 -26
@@ -13,6 +13,10 @@ module BaseTest
13
13
  assert !StateMachine::Integrations::Base.available?
14
14
  end
15
15
 
16
+ def test_should_not_have_any_matching_ancestors
17
+ assert_equal [], StateMachine::Integrations::Base.matching_ancestors
18
+ end
19
+
16
20
  def test_should_not_match_any_classes
17
21
  assert !StateMachine::Integrations::Base.matches?(Class.new)
18
22
  end
@@ -67,7 +71,7 @@ module BaseTest
67
71
  end
68
72
  end
69
73
 
70
- version1 = @integration.version '1.0' do
74
+ @integration.version '1.0' do
71
75
  def self.active?
72
76
  true
73
77
  end
@@ -77,7 +81,7 @@ module BaseTest
77
81
  end
78
82
  end
79
83
 
80
- version2 = @integration.version '2.0' do
84
+ @integration.version '2.0' do
81
85
  def self.active?
82
86
  false
83
87
  end
@@ -94,6 +98,7 @@ module BaseTest
94
98
 
95
99
  def teardown
96
100
  StateMachine::Integrations.send(:remove_const, 'Custom')
101
+ super
97
102
  end
98
103
  end
99
104
  end
@@ -1,16 +1,16 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
2
 
3
3
  require 'dm-core'
4
- require 'dm-core/version' unless defined?(::DataMapper::VERSION)
4
+ require 'dm-core/version' unless defined?(DataMapper::VERSION)
5
5
  require 'dm-observer'
6
6
 
7
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.3')
7
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.3')
8
8
  require 'dm-migrations'
9
9
  end
10
10
 
11
11
  # Establish database connection
12
12
  DataMapper.setup(:default, 'sqlite3::memory:')
13
- DataObjects::Sqlite3.logger = DataObjects::Logger.new("#{File.dirname(__FILE__)}/../../data_mapper.log", :info)
13
+ DataObjects::Sqlite3.logger = DataObjects::Logger.new("#{File.dirname(__FILE__)}/../../data_mapper.log", :debug)
14
14
 
15
15
  module DataMapperTest
16
16
  class BaseTestCase < Test::Unit::TestCase
@@ -18,14 +18,16 @@ module DataMapperTest
18
18
  end
19
19
 
20
20
  def teardown
21
- @resources.uniq.each {|resource| DataMapperTest.send(:remove_const, resource)} if @resources
21
+ super
22
+ @resources.uniq.each {|resource| DataMapperTest.send(:remove_const, resource)} if instance_variable_defined?('@resources')
22
23
  end
23
24
 
24
25
  protected
25
26
  # Creates a new DataMapper resource (and the associated table)
26
27
  def new_resource(create_table = :foo, &block)
27
- table_name = create_table || :foo
28
- name = table_name.to_s.capitalize
28
+ base_table_name = create_table || :foo
29
+ name = base_table_name.to_s.capitalize
30
+ table_name = "#{base_table_name}_#{rand(1000000)}"
29
31
 
30
32
  resource = Class.new
31
33
  DataMapperTest.send(:remove_const, name) if DataMapperTest.const_defined?(name)
@@ -74,7 +76,7 @@ module DataMapperTest
74
76
  end
75
77
 
76
78
  def test_should_have_defaults
77
- assert_equal e = {:action => :save, :use_transactions => false}, StateMachine::Integrations::DataMapper.defaults
79
+ assert_equal({:action => :save, :use_transactions => false}, StateMachine::Integrations::DataMapper.defaults)
78
80
  end
79
81
 
80
82
  def test_should_not_have_a_locale_path
@@ -114,10 +116,10 @@ module DataMapperTest
114
116
  end
115
117
 
116
118
  def test_should_define_field_with_string_type
117
- property = @resource.properties.detect {|property| property.name == :status}
119
+ property = @resource.properties.detect {|p| p.name == :status}
118
120
  assert_not_nil property
119
121
 
120
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('1.0.0')
122
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('1.0.0')
121
123
  assert_instance_of DataMapper::Property::String, property
122
124
  else
123
125
  assert_equal String, property.type
@@ -134,10 +136,10 @@ module DataMapperTest
134
136
  end
135
137
 
136
138
  def test_should_not_redefine_field
137
- property = @resource.properties.detect {|property| property.name == :status}
139
+ property = @resource.properties.detect {|p| p.name == :status}
138
140
  assert_not_nil property
139
141
 
140
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('1.0.0')
142
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('1.0.0')
141
143
  assert_instance_of DataMapper::Property::Integer, property
142
144
  else
143
145
  assert_equal Integer, property.type
@@ -182,7 +184,7 @@ module DataMapperTest
182
184
 
183
185
  class MachineWithStaticInitialStateTest < BaseTestCase
184
186
  def setup
185
- @resource = new_resource do
187
+ @resource = new_resource(:vehicle) do
186
188
  attr_accessor :value
187
189
  end
188
190
  @machine = StateMachine::Machine.new(@resource, :initial => :parked)
@@ -211,7 +213,7 @@ module DataMapperTest
211
213
 
212
214
  def test_should_not_allow_initialize_blocks
213
215
  block_args = nil
214
- record = @resource.new do |*args|
216
+ @resource.new do |*args|
215
217
  block_args = args
216
218
  end
217
219
 
@@ -222,6 +224,7 @@ module DataMapperTest
222
224
  @resource.class_eval do
223
225
  attr_accessor :state_during_setter
224
226
 
227
+ remove_method :value=
225
228
  define_method(:value=) do |value|
226
229
  self.state_during_setter = state
227
230
  end
@@ -240,6 +243,20 @@ module DataMapperTest
240
243
  assert_equal 'idling', record.state
241
244
  end
242
245
 
246
+ def test_should_persist_initial_state
247
+ record = @resource.new
248
+ record.save
249
+ record.reload
250
+ assert_equal 'parked', record.state
251
+ end
252
+
253
+ def test_should_persist_initial_state_on_dup
254
+ record = @resource.create.dup
255
+ record.save
256
+ record.reload
257
+ assert_equal 'parked', record.state
258
+ end
259
+
243
260
  def test_should_use_stored_values_when_loading_from_database
244
261
  @machine.state :idling
245
262
 
@@ -253,6 +270,52 @@ module DataMapperTest
253
270
  record = @resource.get(@resource.create(:state => nil).id)
254
271
  assert_nil record.state
255
272
  end
273
+
274
+ def test_should_use_stored_values_when_loading_for_many_association
275
+ @machine.state :idling
276
+
277
+ @resource.property :owner_id, Integer
278
+ @resource.auto_migrate!
279
+
280
+ owner_resource = new_resource(:owner) do
281
+ has n, :vehicles
282
+ end
283
+
284
+ owner = owner_resource.create
285
+ record = @resource.new(:state => 'idling')
286
+ record.owner_id = owner.id
287
+ record.save
288
+ assert_equal 'idling', owner.vehicles[0].state
289
+ end
290
+
291
+ def test_should_use_stored_values_when_loading_for_one_association
292
+ @machine.state :idling
293
+
294
+ @resource.property :owner_id, Integer
295
+ @resource.auto_migrate!
296
+
297
+ owner_resource = new_resource(:owner) do
298
+ has 1, :vehicle
299
+ end
300
+
301
+ owner = owner_resource.create
302
+ record = @resource.new(:state => 'idling')
303
+ record.owner_id = owner.id
304
+ record.save
305
+ assert_equal 'idling', owner.vehicle.state
306
+ end
307
+
308
+ def test_should_use_stored_values_when_loading_for_belongs_to_association
309
+ @machine.state :idling
310
+
311
+ driver_resource = new_resource(:driver) do
312
+ belongs_to :vehicle
313
+ end
314
+
315
+ record = @resource.create(:state => 'idling')
316
+ driver = driver_resource.create(:vehicle_id => record.id)
317
+ assert_equal 'idling', driver.vehicle.state
318
+ end
256
319
  end
257
320
 
258
321
  class MachineWithDynamicInitialStateTest < BaseTestCase
@@ -276,7 +339,7 @@ module DataMapperTest
276
339
 
277
340
  def test_should_not_allow_initialize_blocks
278
341
  block_args = nil
279
- record = @resource.new do |*args|
342
+ @resource.new do |*args|
280
343
  block_args = args
281
344
  end
282
345
 
@@ -287,6 +350,7 @@ module DataMapperTest
287
350
  @resource.class_eval do
288
351
  attr_accessor :state_during_setter
289
352
 
353
+ remove_method :value=
290
354
  define_method(:value=) do |value|
291
355
  self.state_during_setter = state || 'nil'
292
356
  end
@@ -305,6 +369,20 @@ module DataMapperTest
305
369
  assert_equal 'idling', record.state
306
370
  end
307
371
 
372
+ def test_should_persist_initial_state
373
+ record = @resource.new
374
+ record.save
375
+ record.reload
376
+ assert_equal 'parked', record.state
377
+ end
378
+
379
+ def test_should_persist_initial_state_on_dup
380
+ record = @resource.create.dup
381
+ record.save
382
+ record.reload
383
+ assert_equal 'parked', record.state
384
+ end
385
+
308
386
  def test_should_use_stored_values_when_loading_from_database
309
387
  @machine.state :idling
310
388
 
@@ -332,8 +410,35 @@ module DataMapperTest
332
410
  end
333
411
  end
334
412
 
335
- class MachineWithColumnDefaultTest < BaseTestCase
413
+ class MachineWithSameColumnDefaultTest < BaseTestCase
336
414
  def setup
415
+ @original_stderr, $stderr = $stderr, StringIO.new
416
+
417
+ @resource = new_resource do
418
+ property :status, String, :default => 'parked'
419
+ end
420
+ @machine = StateMachine::Machine.new(@resource, :status, :initial => :parked)
421
+ @record = @resource.new
422
+ end
423
+
424
+ def test_should_use_machine_default
425
+ assert_equal 'parked', @record.status
426
+ end
427
+
428
+ def test_should_not_generate_a_warning
429
+ assert_no_match(/have defined a different default/, $stderr.string)
430
+ end
431
+
432
+ def teardown
433
+ $stderr = @original_stderr
434
+ super
435
+ end
436
+ end
437
+
438
+ class MachineWithDifferentColumnDefaultTest < BaseTestCase
439
+ def setup
440
+ @original_stderr, $stderr = $stderr, StringIO.new
441
+
337
442
  @resource = new_resource do
338
443
  property :status, String, :default => 'idling'
339
444
  end
@@ -344,6 +449,41 @@ module DataMapperTest
344
449
  def test_should_use_machine_default
345
450
  assert_equal 'parked', @record.status
346
451
  end
452
+
453
+ def test_should_generate_a_warning
454
+ assert_match(/Both DataMapperTest::Foo and its :status machine have defined a different default for "status". Use only one or the other for defining defaults to avoid unexpected behaviors\./, $stderr.string)
455
+ end
456
+
457
+ def teardown
458
+ $stderr = @original_stderr
459
+ super
460
+ end
461
+ end
462
+
463
+ class MachineWithDifferentIntegerColumnDefaultTest < BaseTestCase
464
+ def setup
465
+ @original_stderr, $stderr = $stderr, StringIO.new
466
+
467
+ @resource = new_resource do
468
+ property :status, Integer, :default => 0
469
+ end
470
+ @machine = StateMachine::Machine.new(@resource, :status, :initial => :parked)
471
+ @machine.state :parked, :value => 1
472
+ @record = @resource.new
473
+ end
474
+
475
+ def test_should_use_machine_default
476
+ assert_equal 1, @record.status
477
+ end
478
+
479
+ def test_should_generate_a_warning
480
+ assert_match(/Both DataMapperTest::Foo and its :status machine have defined a different default for "status". Use only one or the other for defining defaults to avoid unexpected behaviors\./, $stderr.string)
481
+ end
482
+
483
+ def teardown
484
+ $stderr = @original_stderr
485
+ super
486
+ end
347
487
  end
348
488
 
349
489
  class MachineWithConflictingPredicateTest < BaseTestCase
@@ -375,14 +515,14 @@ module DataMapperTest
375
515
  @machine = StateMachine::Machine.new(@resource)
376
516
  @machine.state :state
377
517
 
378
- assert_match /^Instance method "state\?" is already defined in DataMapperTest::Foo :state instance helpers, use generic helper instead.*\n$/, $stderr.string
518
+ assert_match(/^Instance method "state\?" is already defined in DataMapperTest::Foo :state instance helpers, use generic helper instead.*\n$/, $stderr.string)
379
519
  end
380
520
 
381
- def test_should_not_output_warning_with_same_machine_name
521
+ def test_should_not_output_warning_with_same_machine_attribute
382
522
  @machine = StateMachine::Machine.new(@resource, :public_state, :attribute => :state)
383
523
  @machine.state :state
384
524
 
385
- assert_equal '', $stderr.string
525
+ assert_no_match(/^Instance method "state\?" is already defined.*\n$/, $stderr.string)
386
526
  end
387
527
 
388
528
  def teardown
@@ -415,8 +555,7 @@ module DataMapperTest
415
555
  end
416
556
 
417
557
  def test_should_raise_exception_for_predicate_without_parameters
418
- exception = assert_raise(ArgumentError) { @record.state? }
419
- assert_equal 'wrong number of arguments (1 for 2)', exception.message
558
+ assert_raise(ArgumentError) { @record.state? }
420
559
  end
421
560
 
422
561
  def test_should_return_false_for_predicate_if_does_not_match_current_value
@@ -524,7 +663,7 @@ module DataMapperTest
524
663
  assert_equal 'idling', record.state
525
664
  end
526
665
 
527
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.9.8')
666
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.9.8')
528
667
  def test_should_raise_exception_if_protected
529
668
  resource = new_resource do
530
669
  protected :state=
@@ -595,14 +734,14 @@ module DataMapperTest
595
734
  end
596
735
 
597
736
  def test_should_include_state_in_changed_attributes
598
- assert_equal e = {@resource.properties[:state] => 'idling'}, @record.dirty_attributes
737
+ assert_equal({@resource.properties[:state] => 'idling'}, @record.dirty_attributes)
599
738
  end
600
739
 
601
740
  def test_should_track_attribute_change
602
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
603
- assert_equal e = {@resource.properties[:state] => 'parked'}, @record.original_attributes
741
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
742
+ assert_equal({@resource.properties[:state] => 'parked'}, @record.original_attributes)
604
743
  else
605
- assert_equal e = {:state => 'parked'}, @record.original_values
744
+ assert_equal({:state => 'parked'}, @record.original_values)
606
745
  end
607
746
  end
608
747
 
@@ -610,10 +749,10 @@ module DataMapperTest
610
749
  transition = StateMachine::Transition.new(@record, @machine, :ignite, :idling, :idling)
611
750
  transition.perform(false)
612
751
 
613
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
614
- assert_equal e = {@resource.properties[:state] => 'parked'}, @record.original_attributes
752
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
753
+ assert_equal({@resource.properties[:state] => 'parked'}, @record.original_attributes)
615
754
  else
616
- assert_equal e = {:state => 'parked'}, @record.original_values
755
+ assert_equal({:state => 'parked'}, @record.original_values)
617
756
  end
618
757
  end
619
758
 
@@ -636,14 +775,14 @@ module DataMapperTest
636
775
  end
637
776
 
638
777
  def test_should_not_include_state_in_changed_attributes
639
- assert_equal e = {}, @record.dirty_attributes
778
+ assert_equal({}, @record.dirty_attributes)
640
779
  end
641
780
  end
642
781
 
643
782
  class MachineWithDirtyAttributesAndCustomAttributeTest < BaseTestCase
644
783
  def setup
645
784
  @resource = new_resource do
646
- property :status, String, :default => 'idling'
785
+ property :status, String
647
786
  end
648
787
  @machine = StateMachine::Machine.new(@resource, :status, :initial => :parked)
649
788
  @machine.event :ignite
@@ -656,14 +795,14 @@ module DataMapperTest
656
795
  end
657
796
 
658
797
  def test_should_include_state_in_changed_attributes
659
- assert_equal e = {@resource.properties[:status] => 'idling'}, @record.dirty_attributes
798
+ assert_equal({@resource.properties[:status] => 'idling'}, @record.dirty_attributes)
660
799
  end
661
800
 
662
801
  def test_should_track_attribute_change
663
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
664
- assert_equal e = {@resource.properties[:status] => 'parked'}, @record.original_attributes
802
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
803
+ assert_equal({@resource.properties[:status] => 'parked'}, @record.original_attributes)
665
804
  else
666
- assert_equal e = {:status => 'parked'}, @record.original_values
805
+ assert_equal({:status => 'parked'}, @record.original_values)
667
806
  end
668
807
  end
669
808
 
@@ -671,10 +810,10 @@ module DataMapperTest
671
810
  transition = StateMachine::Transition.new(@record, @machine, :ignite, :idling, :idling)
672
811
  transition.perform(false)
673
812
 
674
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
675
- assert_equal e = {@resource.properties[:status] => 'parked'}, @record.original_attributes
813
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
814
+ assert_equal({@resource.properties[:status] => 'parked'}, @record.original_attributes)
676
815
  else
677
- assert_equal e = {:status => 'parked'}, @record.original_values
816
+ assert_equal({:status => 'parked'}, @record.original_values)
678
817
  end
679
818
  end
680
819
  end
@@ -682,7 +821,7 @@ module DataMapperTest
682
821
  class MachineWithDirtyAttributeAndCustomAttributesDuringLoopbackTest < BaseTestCase
683
822
  def setup
684
823
  @resource = new_resource do
685
- property :status, String, :default => 'idling'
824
+ property :status, String
686
825
  end
687
826
  @machine = StateMachine::Machine.new(@resource, :status, :initial => :parked)
688
827
  @machine.event :park
@@ -694,7 +833,7 @@ module DataMapperTest
694
833
  end
695
834
 
696
835
  def test_should_not_include_state_in_changed_attributes
697
- assert_equal e = {}, @record.dirty_attributes
836
+ assert_equal({}, @record.dirty_attributes)
698
837
  end
699
838
  end
700
839
 
@@ -709,14 +848,14 @@ module DataMapperTest
709
848
  end
710
849
 
711
850
  def test_should_not_include_state_in_changed_attributes
712
- assert_equal e = {}, @record.dirty_attributes
851
+ assert_equal({}, @record.dirty_attributes)
713
852
  end
714
853
 
715
854
  def test_should_not_track_attribute_change
716
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
717
- assert_equal e = {}, @record.original_attributes
855
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
856
+ assert_equal({}, @record.original_attributes)
718
857
  else
719
- assert_equal e = {}, @record.original_values
858
+ assert_equal({}, @record.original_values)
720
859
  end
721
860
  end
722
861
  end
@@ -747,7 +886,7 @@ module DataMapperTest
747
886
  end
748
887
 
749
888
  begin
750
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.3')
889
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.3')
751
890
  require 'dm-transactions'
752
891
  end
753
892
 
@@ -848,12 +987,22 @@ module DataMapperTest
848
987
 
849
988
  def test_should_run_around_callbacks
850
989
  before_called = false
851
- after_called = [false]
852
- @machine.around_transition {|block| before_called = true; block.call; after_called[0] = true}
990
+ after_called = false
991
+ ensure_called = 0
992
+ @machine.around_transition do |block|
993
+ before_called = true
994
+ begin
995
+ block.call
996
+ ensure
997
+ ensure_called += 1
998
+ end
999
+ after_called = true
1000
+ end
853
1001
 
854
1002
  @transition.perform
855
1003
  assert before_called
856
- assert after_called[0]
1004
+ assert after_called
1005
+ assert_equal ensure_called, 1
857
1006
  end
858
1007
 
859
1008
  def test_should_run_around_callbacks_with_the_context_of_the_record
@@ -888,6 +1037,36 @@ module DataMapperTest
888
1037
 
889
1038
  assert_equal [1, 2, 3], @record.callback_result
890
1039
  end
1040
+
1041
+ def test_should_run_in_expected_order
1042
+ # Avoid Ruby 2.0.0 stack too deep issues
1043
+ @resource.class_eval do
1044
+ def valid?(*)
1045
+ super
1046
+ end
1047
+ end
1048
+
1049
+ expected = [
1050
+ :before_transition, :before_validation, :after_validation,
1051
+ :before_save, :before_create, :after_create, :after_save,
1052
+ :after_transition
1053
+ ]
1054
+
1055
+ callbacks = []
1056
+ @resource.before(:valid?) { callbacks << :before_validation }
1057
+ @resource.after(:valid?) { callbacks << :after_validation }
1058
+ @resource.before(:save) { callbacks << :before_save }
1059
+ @resource.before(:create) { callbacks << :before_create }
1060
+ @resource.after(:create) { callbacks << :after_create }
1061
+ @resource.after(:save) { callbacks << :after_save }
1062
+
1063
+ @machine.before_transition { callbacks << :before_transition }
1064
+ @machine.after_transition { callbacks << :after_transition }
1065
+
1066
+ @transition.perform
1067
+
1068
+ assert_equal expected, callbacks
1069
+ end
891
1070
  end
892
1071
 
893
1072
  class MachineWithFailedBeforeCallbacksTest < BaseTestCase
@@ -927,6 +1106,42 @@ module DataMapperTest
927
1106
  end
928
1107
  end
929
1108
 
1109
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('1.0.0')
1110
+ class MachineNestedActionTest < BaseTestCase
1111
+ def setup
1112
+ @callbacks = []
1113
+
1114
+ @resource = new_resource
1115
+ @machine = StateMachine::Machine.new(@resource)
1116
+ @machine.event :ignite do
1117
+ transition :parked => :idling
1118
+ end
1119
+
1120
+ @record = @resource.new(:state => 'parked')
1121
+ end
1122
+
1123
+ def test_should_allow_transition_prior_to_creation_if_skipping_action
1124
+ record = @record
1125
+ @resource.before(:create) { record.ignite }
1126
+ result = @record.save
1127
+
1128
+ assert_equal true, result
1129
+ assert_equal "idling", @record.state
1130
+ @record.reload
1131
+ assert_equal "idling", @record.state
1132
+ end
1133
+
1134
+ def test_should_not_allow_transition_after_creation
1135
+ record = @record
1136
+ @resource.after(:create) { record.ignite(false) }
1137
+
1138
+ result = @record.save
1139
+
1140
+ assert_equal false, result
1141
+ end
1142
+ end
1143
+ end
1144
+
930
1145
  class MachineWithFailedActionTest < BaseTestCase
931
1146
  def setup
932
1147
  @resource = new_resource do
@@ -968,7 +1183,7 @@ module DataMapperTest
968
1183
  end
969
1184
 
970
1185
  class MachineWithFailedAfterCallbacksTest < BaseTestCase
971
- def setup
1186
+ def setup
972
1187
  callbacks = []
973
1188
 
974
1189
  @resource = new_resource
@@ -1122,7 +1337,7 @@ module DataMapperTest
1122
1337
  end
1123
1338
 
1124
1339
  # See README caveats
1125
- if Gem::Version.new(::DataMapper::VERSION) > Gem::Version.new('0.9.6')
1340
+ if Gem::Version.new(DataMapper::VERSION) > Gem::Version.new('0.9.6')
1126
1341
  class MachineWithEventAttributesOnValidationTest < BaseTestCase
1127
1342
  def setup
1128
1343
  @resource = new_resource
@@ -1164,7 +1379,11 @@ module DataMapperTest
1164
1379
  ran_callback = false
1165
1380
  @machine.around_transition {|block| ran_callback = true; block.call }
1166
1381
 
1167
- @record.valid?
1382
+ begin
1383
+ @record.valid?
1384
+ rescue ArgumentError
1385
+ raise if StateMachine::Transition.pause_supported?
1386
+ end
1168
1387
  assert ran_callback
1169
1388
  end
1170
1389
 
@@ -1219,7 +1438,11 @@ module DataMapperTest
1219
1438
  ran_callback = [false]
1220
1439
  @machine.around_transition {|block| block.call; ran_callback[0] = true }
1221
1440
 
1222
- @record.valid?
1441
+ begin
1442
+ @record.valid?
1443
+ rescue ArgumentError
1444
+ raise if StateMachine::Transition.pause_supported?
1445
+ end
1223
1446
  assert !ran_callback[0]
1224
1447
  end
1225
1448
 
@@ -1236,7 +1459,11 @@ module DataMapperTest
1236
1459
  ran_callback = [false]
1237
1460
  @machine.around_transition {|block| block.call; ran_callback[0] = true }
1238
1461
 
1239
- @record.valid?
1462
+ begin
1463
+ @record.valid?
1464
+ rescue ArgumentError
1465
+ raise if StateMachine::Transition.pause_supported?
1466
+ end
1240
1467
  assert !ran_callback[0]
1241
1468
  end
1242
1469
 
@@ -1378,10 +1605,38 @@ module DataMapperTest
1378
1605
  assert_equal false, @record.save
1379
1606
  assert_equal 1, @resource.all.size
1380
1607
  end
1608
+
1609
+ def test_should_allow_additional_transitions_to_new_state_in_after_transitions
1610
+ @machine.event :park do
1611
+ transition :idling => :parked
1612
+ end
1613
+
1614
+ @machine.after_transition(:on => :ignite) { park }
1615
+
1616
+ @record.save
1617
+ assert_equal 'parked', @record.state
1618
+
1619
+ @record.reload
1620
+ assert_equal 'parked', @record.state
1621
+ end
1622
+
1623
+ def test_should_allow_additional_transitions_to_previous_state_in_after_transitions
1624
+ @machine.event :shift_up do
1625
+ transition :idling => :first_gear
1626
+ end
1627
+
1628
+ @machine.after_transition(:on => :ignite) { shift_up }
1629
+
1630
+ @record.save
1631
+ assert_equal 'first_gear', @record.state
1632
+
1633
+ @record.reload
1634
+ assert_equal 'first_gear', @record.state
1635
+ end
1381
1636
  end
1382
1637
  end
1383
1638
 
1384
- if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.0')
1639
+ if Gem::Version.new(DataMapper::VERSION) >= Gem::Version.new('0.10.0')
1385
1640
  class MachineWithEventAttributesOnSaveBangTest < BaseTestCase
1386
1641
  def setup
1387
1642
  @resource = new_resource
@@ -1464,7 +1719,7 @@ module DataMapperTest
1464
1719
  end
1465
1720
  end
1466
1721
 
1467
- if Gem::Version.new(::DataMapper::VERSION) > Gem::Version.new('0.9.6')
1722
+ if Gem::Version.new(DataMapper::VERSION) > Gem::Version.new('0.9.6')
1468
1723
  class MachineWithEventAttributesOnCustomActionTest < BaseTestCase
1469
1724
  def setup
1470
1725
  @superclass = new_resource do
@@ -1526,7 +1781,7 @@ module DataMapperTest
1526
1781
  def test_should_call_before_transition_callback_if_requirements_match
1527
1782
  called = false
1528
1783
 
1529
- observer = new_observer(@resource) do
1784
+ new_observer(@resource) do
1530
1785
  before_transition :from => :parked do
1531
1786
  called = true
1532
1787
  end
@@ -1539,7 +1794,7 @@ module DataMapperTest
1539
1794
  def test_should_not_call_before_transition_callback_if_requirements_do_not_match
1540
1795
  called = false
1541
1796
 
1542
- observer = new_observer(@resource) do
1797
+ new_observer(@resource) do
1543
1798
  before_transition :from => :idling do
1544
1799
  called = true
1545
1800
  end
@@ -1552,7 +1807,7 @@ module DataMapperTest
1552
1807
  def test_should_pass_transition_to_before_callbacks
1553
1808
  callback_args = nil
1554
1809
 
1555
- observer = new_observer(@resource) do
1810
+ new_observer(@resource) do
1556
1811
  before_transition do |*args|
1557
1812
  callback_args = args
1558
1813
  end
@@ -1565,7 +1820,7 @@ module DataMapperTest
1565
1820
  def test_should_call_after_transition_callback_if_requirements_match
1566
1821
  called = false
1567
1822
 
1568
- observer = new_observer(@resource) do
1823
+ new_observer(@resource) do
1569
1824
  after_transition :from => :parked do
1570
1825
  called = true
1571
1826
  end
@@ -1578,7 +1833,7 @@ module DataMapperTest
1578
1833
  def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1579
1834
  called = false
1580
1835
 
1581
- observer = new_observer(@resource) do
1836
+ new_observer(@resource) do
1582
1837
  after_transition :from => :idling do
1583
1838
  called = true
1584
1839
  end
@@ -1591,7 +1846,7 @@ module DataMapperTest
1591
1846
  def test_should_pass_transition_to_after_callbacks
1592
1847
  callback_args = nil
1593
1848
 
1594
- observer = new_observer(@resource) do
1849
+ new_observer(@resource) do
1595
1850
  after_transition do |*args|
1596
1851
  callback_args = args
1597
1852
  end
@@ -1604,7 +1859,7 @@ module DataMapperTest
1604
1859
  def test_should_call_around_transition_callback_if_requirements_match
1605
1860
  called = false
1606
1861
 
1607
- observer = new_observer(@resource) do
1862
+ new_observer(@resource) do
1608
1863
  around_transition :from => :parked do |block|
1609
1864
  called = true
1610
1865
  block.call
@@ -1615,10 +1870,10 @@ module DataMapperTest
1615
1870
  assert called
1616
1871
  end
1617
1872
 
1618
- def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1873
+ def test_should_not_call_around_transition_callback_if_requirements_do_not_match
1619
1874
  called = false
1620
1875
 
1621
- observer = new_observer(@resource) do
1876
+ new_observer(@resource) do
1622
1877
  around_transition :from => :idling do |block|
1623
1878
  called = true
1624
1879
  block.call
@@ -1632,7 +1887,7 @@ module DataMapperTest
1632
1887
  def test_should_pass_transition_to_around_callbacks
1633
1888
  callback_args = nil
1634
1889
 
1635
- observer = new_observer(@resource) do
1890
+ new_observer(@resource) do
1636
1891
  around_transition do |*args|
1637
1892
  block = args.pop
1638
1893
  callback_args = args
@@ -1649,7 +1904,7 @@ module DataMapperTest
1649
1904
 
1650
1905
  called = false
1651
1906
 
1652
- observer = new_observer(@resource) do
1907
+ new_observer(@resource) do
1653
1908
  after_transition_failure :on => :ignite do
1654
1909
  called = true
1655
1910
  end
@@ -1664,7 +1919,7 @@ module DataMapperTest
1664
1919
 
1665
1920
  called = false
1666
1921
 
1667
- observer = new_observer(@resource) do
1922
+ new_observer(@resource) do
1668
1923
  after_transition_failure :on => :park do
1669
1924
  called = true
1670
1925
  end
@@ -1679,7 +1934,7 @@ module DataMapperTest
1679
1934
 
1680
1935
  callback_args = nil
1681
1936
 
1682
- observer = new_observer(@resource) do
1937
+ new_observer(@resource) do
1683
1938
  after_transition_failure do |*args|
1684
1939
  callback_args = args
1685
1940
  end
@@ -1705,7 +1960,7 @@ module DataMapperTest
1705
1960
  called_state = false
1706
1961
  called_status = false
1707
1962
 
1708
- observer = new_observer(@resource) do
1963
+ new_observer(@resource) do
1709
1964
  before_transition :state, :from => :parked do
1710
1965
  called_state = true
1711
1966
  end
@@ -1729,8 +1984,7 @@ module DataMapperTest
1729
1984
 
1730
1985
  called_attribute = nil
1731
1986
 
1732
- attributes = []
1733
- observer = new_observer(@resource) do
1987
+ new_observer(@resource) do
1734
1988
  before_transition :state, :status, :from => :parked do |transition|
1735
1989
  called_attribute = transition.attribute
1736
1990
  end
@@ -1764,7 +2018,7 @@ module DataMapperTest
1764
2018
  notifications << :callback_around_after_transition
1765
2019
  end
1766
2020
 
1767
- observer = new_observer(@resource) do
2021
+ new_observer(@resource) do
1768
2022
  before_transition do
1769
2023
  notifications << :observer_before_transition
1770
2024
  end
@@ -1813,7 +2067,7 @@ module DataMapperTest
1813
2067
 
1814
2068
  def test_should_only_include_records_with_state_in_singular_with_scope
1815
2069
  parked = @resource.create :state => 'parked'
1816
- idling = @resource.create :state => 'idling'
2070
+ @resource.create :state => 'idling'
1817
2071
 
1818
2072
  assert_equal [parked], @resource.with_state(:parked)
1819
2073
  end