state_machine 1.0.1 → 1.0.2

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.
Files changed (120) hide show
  1. data/.gitignore +11 -0
  2. data/.travis.yml +16 -0
  3. data/.yardopts +5 -0
  4. data/Appraisals +260 -0
  5. data/CHANGELOG.rdoc +15 -0
  6. data/Gemfile +3 -0
  7. data/README.rdoc +156 -29
  8. data/Rakefile +31 -57
  9. data/gemfiles/active_model-3.0.0.gemfile +7 -0
  10. data/gemfiles/active_model-3.0.0.gemfile.lock +32 -0
  11. data/gemfiles/active_model-3.0.5.gemfile +7 -0
  12. data/gemfiles/active_model-3.0.5.gemfile.lock +32 -0
  13. data/gemfiles/active_record-2.0.0.gemfile +8 -0
  14. data/gemfiles/active_record-2.0.0.gemfile.lock +30 -0
  15. data/gemfiles/active_record-2.0.5.gemfile +8 -0
  16. data/gemfiles/active_record-2.0.5.gemfile.lock +30 -0
  17. data/gemfiles/active_record-2.1.0.gemfile +8 -0
  18. data/gemfiles/active_record-2.1.0.gemfile.lock +30 -0
  19. data/gemfiles/active_record-2.1.2.gemfile +8 -0
  20. data/gemfiles/active_record-2.1.2.gemfile.lock +30 -0
  21. data/gemfiles/active_record-2.2.3.gemfile +8 -0
  22. data/gemfiles/active_record-2.2.3.gemfile.lock +30 -0
  23. data/gemfiles/active_record-2.3.12.gemfile +8 -0
  24. data/gemfiles/active_record-2.3.12.gemfile.lock +30 -0
  25. data/gemfiles/active_record-3.0.0.gemfile +8 -0
  26. data/gemfiles/active_record-3.0.0.gemfile.lock +44 -0
  27. data/gemfiles/active_record-3.0.5.gemfile +8 -0
  28. data/gemfiles/active_record-3.0.5.gemfile.lock +43 -0
  29. data/gemfiles/data_mapper-0.10.2.gemfile +12 -0
  30. data/gemfiles/data_mapper-0.10.2.gemfile.lock +45 -0
  31. data/gemfiles/data_mapper-0.9.11.gemfile +12 -0
  32. data/gemfiles/data_mapper-0.9.11.gemfile.lock +47 -0
  33. data/gemfiles/data_mapper-0.9.4.gemfile +12 -0
  34. data/gemfiles/data_mapper-0.9.4.gemfile.lock +61 -0
  35. data/gemfiles/data_mapper-0.9.7.gemfile +12 -0
  36. data/gemfiles/data_mapper-0.9.7.gemfile.lock +57 -0
  37. data/gemfiles/data_mapper-1.0.0.gemfile +12 -0
  38. data/gemfiles/data_mapper-1.0.0.gemfile.lock +53 -0
  39. data/gemfiles/data_mapper-1.0.1.gemfile +12 -0
  40. data/gemfiles/data_mapper-1.0.1.gemfile.lock +53 -0
  41. data/gemfiles/data_mapper-1.0.2.gemfile +12 -0
  42. data/gemfiles/data_mapper-1.0.2.gemfile.lock +53 -0
  43. data/gemfiles/data_mapper-1.1.0.gemfile +12 -0
  44. data/gemfiles/data_mapper-1.1.0.gemfile.lock +51 -0
  45. data/gemfiles/default.gemfile +7 -0
  46. data/gemfiles/default.gemfile.lock +24 -0
  47. data/gemfiles/mongo_mapper-0.5.5.gemfile +8 -0
  48. data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +33 -0
  49. data/gemfiles/mongo_mapper-0.5.8.gemfile +8 -0
  50. data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +33 -0
  51. data/gemfiles/mongo_mapper-0.6.0.gemfile +8 -0
  52. data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +33 -0
  53. data/gemfiles/mongo_mapper-0.6.10.gemfile +8 -0
  54. data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +33 -0
  55. data/gemfiles/mongo_mapper-0.7.0.gemfile +8 -0
  56. data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +33 -0
  57. data/gemfiles/mongo_mapper-0.7.5.gemfile +8 -0
  58. data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +36 -0
  59. data/gemfiles/mongo_mapper-0.8.0.gemfile +10 -0
  60. data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +40 -0
  61. data/gemfiles/mongo_mapper-0.8.3.gemfile +10 -0
  62. data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +40 -0
  63. data/gemfiles/mongo_mapper-0.8.4.gemfile +8 -0
  64. data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +38 -0
  65. data/gemfiles/mongo_mapper-0.8.6.gemfile +8 -0
  66. data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +38 -0
  67. data/gemfiles/mongo_mapper-0.9.0.gemfile +7 -0
  68. data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +41 -0
  69. data/gemfiles/mongoid-2.0.0.gemfile +7 -0
  70. data/gemfiles/mongoid-2.0.0.gemfile.lock +42 -0
  71. data/gemfiles/mongoid-2.1.4.gemfile +7 -0
  72. data/gemfiles/mongoid-2.1.4.gemfile.lock +40 -0
  73. data/gemfiles/sequel-2.11.0.gemfile +8 -0
  74. data/gemfiles/sequel-2.11.0.gemfile.lock +28 -0
  75. data/gemfiles/sequel-2.12.0.gemfile +8 -0
  76. data/gemfiles/sequel-2.12.0.gemfile.lock +28 -0
  77. data/gemfiles/sequel-2.8.0.gemfile +8 -0
  78. data/gemfiles/sequel-2.8.0.gemfile.lock +28 -0
  79. data/gemfiles/sequel-3.0.0.gemfile +8 -0
  80. data/gemfiles/sequel-3.0.0.gemfile.lock +28 -0
  81. data/gemfiles/sequel-3.13.0.gemfile +8 -0
  82. data/gemfiles/sequel-3.13.0.gemfile.lock +28 -0
  83. data/gemfiles/sequel-3.14.0.gemfile +8 -0
  84. data/gemfiles/sequel-3.14.0.gemfile.lock +28 -0
  85. data/gemfiles/sequel-3.23.0.gemfile +8 -0
  86. data/gemfiles/sequel-3.23.0.gemfile.lock +28 -0
  87. data/gemfiles/sequel-3.24.0.gemfile +8 -0
  88. data/gemfiles/sequel-3.24.0.gemfile.lock +28 -0
  89. data/lib/state_machine/event.rb +13 -90
  90. data/lib/state_machine/helper_module.rb +17 -0
  91. data/lib/state_machine/integrations/active_model.rb +35 -0
  92. data/lib/state_machine/integrations/active_record.rb +41 -2
  93. data/lib/state_machine/integrations/data_mapper.rb +17 -2
  94. data/lib/state_machine/integrations/mongo_mapper.rb +34 -7
  95. data/lib/state_machine/integrations/mongoid.rb +34 -26
  96. data/lib/state_machine/integrations/mongoid/versions.rb +29 -3
  97. data/lib/state_machine/integrations/sequel.rb +22 -72
  98. data/lib/state_machine/integrations/sequel/versions.rb +87 -6
  99. data/lib/state_machine/machine.rb +279 -19
  100. data/lib/state_machine/state.rb +2 -2
  101. data/lib/state_machine/state_context.rb +133 -0
  102. data/lib/state_machine/version.rb +3 -0
  103. data/state_machine.gemspec +22 -0
  104. data/test/test_helper.rb +1 -3
  105. data/test/unit/branch_test.rb +1 -3
  106. data/test/unit/event_collection_test.rb +3 -3
  107. data/test/unit/event_test.rb +1 -3
  108. data/test/unit/helper_module_test.rb +17 -0
  109. data/test/unit/integrations/active_model_test.rb +0 -4
  110. data/test/unit/integrations/active_record_test.rb +50 -9
  111. data/test/unit/integrations/data_mapper_test.rb +267 -253
  112. data/test/unit/integrations/mongo_mapper_test.rb +47 -15
  113. data/test/unit/integrations/mongoid_test.rb +50 -8
  114. data/test/unit/integrations/sequel_test.rb +10 -6
  115. data/test/unit/machine_test.rb +206 -25
  116. data/test/unit/state_context_test.rb +421 -0
  117. data/test/unit/state_test.rb +20 -3
  118. metadata +303 -128
  119. data/lib/state_machine/condition_proxy.rb +0 -94
  120. data/test/unit/condition_proxy_test.rb +0 -328
@@ -0,0 +1,3 @@
1
+ module StateMachine
2
+ VERSION = '1.0.2'
3
+ end
@@ -0,0 +1,22 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'state_machine/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "state_machine"
6
+ s.version = StateMachine::VERSION
7
+ s.authors = ["Aaron Pfeifer"]
8
+ s.email = "aaron@pluginaweek.org"
9
+ s.homepage = "http://www.pluginaweek.org"
10
+ s.description = "Adds support for creating state machines for attributes on any Ruby class"
11
+ s.summary = "State machines for attributes"
12
+ s.require_paths = ["lib"]
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- test/*`.split("\n")
15
+ s.rdoc_options = %w(--line-numbers --inline-source --title state_machine --main README.rdoc)
16
+ s.extra_rdoc_files = %w(README.rdoc CHANGELOG.rdoc LICENSE)
17
+
18
+ s.add_development_dependency("rake")
19
+ s.add_development_dependency("rcov")
20
+ s.add_development_dependency("appraisal", "~> 0.3.8")
21
+ s.add_development_dependency("ruby-graphviz", "~> 1.0")
22
+ end
data/test/test_helper.rb CHANGED
@@ -1,4 +1,2 @@
1
1
  require 'test/unit'
2
-
3
- $:.unshift(File.dirname(__FILE__) + '/../lib')
4
- require File.dirname(__FILE__) + '/../init'
2
+ require 'state_machine'
@@ -756,8 +756,6 @@ end
756
756
 
757
757
  begin
758
758
  # Load library
759
- require 'rubygems'
760
- gem 'ruby-graphviz', '>=0.9.0'
761
759
  require 'graphviz'
762
760
 
763
761
  class BranchDrawingTest < Test::Unit::TestCase
@@ -887,4 +885,4 @@ begin
887
885
  end
888
886
  rescue LoadError
889
887
  $stderr.puts 'Skipping GraphViz StateMachine::Branch tests. `gem install ruby-graphviz` >= v0.9.0 and try again.'
890
- end
888
+ end unless ENV['TRAVIS']
@@ -127,12 +127,12 @@ class EventCollectionWithMultipleEventsTest < Test::Unit::TestCase
127
127
  @events = StateMachine::EventCollection.new(@machine)
128
128
 
129
129
  @machine.state :first_gear
130
- @machine.event :park, :shift_down
130
+ @park, @shift_down = @machine.event :park, :shift_down
131
131
 
132
- @events << @park = StateMachine::Event.new(@machine, :park)
132
+ @events << @park
133
133
  @park.transition :first_gear => :parked
134
134
 
135
- @events << @shift_down = StateMachine::Event.new(@machine, :shift_down)
135
+ @events << @shift_down
136
136
  @shift_down.transition :first_gear => :parked
137
137
 
138
138
  @machine.events.concat(@events)
@@ -950,8 +950,6 @@ end
950
950
 
951
951
  begin
952
952
  # Load library
953
- require 'rubygems'
954
- gem 'ruby-graphviz', '>=0.9.0'
955
953
  require 'graphviz'
956
954
 
957
955
  class EventDrawingTest < Test::Unit::TestCase
@@ -982,4 +980,4 @@ begin
982
980
  end
983
981
  rescue LoadError
984
982
  $stderr.puts 'Skipping GraphViz StateMachine::Event tests. `gem install ruby-graphviz` >= v0.9.0 and try again.'
985
- end
983
+ end unless ENV['TRAVIS']
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class HelperModuleTest < Test::Unit::TestCase
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachine::Machine.new(@klass)
7
+ @helper_module = StateMachine::HelperModule.new(@machine, :instance)
8
+ end
9
+
10
+ def test_should_not_have_a_name
11
+ assert_equal '', @helper_module.name.to_s
12
+ end
13
+
14
+ def test_should_provide_human_readable_to_s
15
+ assert_equal "#{@klass} :state instance helpers", @helper_module.to_s
16
+ end
17
+ end
@@ -1,9 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
2
 
3
- # Load library
4
- require 'rubygems'
5
-
6
- gem 'activemodel', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=3.0.0.beta'
7
3
  require 'active_model'
8
4
  require 'active_model/observing'
9
5
  require 'active_support/all'
@@ -1,10 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
2
 
3
- # Load library
4
- require 'rubygems'
5
-
6
- gem 'i18n', '<0.5' if ENV['VERSION'] && ENV['VERSION'] >= '2.3.5' && ENV['VERSION'] < '3.0.0'
7
- gem 'activerecord', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=2.0.0'
8
3
  require 'active_record'
9
4
 
10
5
  FIXTURES_ROOT = File.dirname(__FILE__) + '/../../fixtures/'
@@ -359,6 +354,33 @@ module ActiveRecordTest
359
354
  end
360
355
  end
361
356
 
357
+ class MachineWithConflictingStateNameTest < BaseTestCase
358
+ def setup
359
+ require 'stringio'
360
+ @original_stderr, $stderr = $stderr, StringIO.new
361
+
362
+ @model = new_model
363
+ end
364
+
365
+ def test_should_output_warning_with_same_machine_name
366
+ @machine = StateMachine::Machine.new(@model)
367
+ @machine.state :state
368
+
369
+ assert_equal "Instance method \"state?\" is already defined in ActiveRecordTest::Foo, use generic helper instead.\n", $stderr.string
370
+ end
371
+
372
+ def test_should_output_warning_with_same_machine_attribute
373
+ @machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
374
+ @machine.state :state
375
+
376
+ assert_equal "Instance method \"state?\" is already defined in ActiveRecordTest::Foo, use generic helper instead.\n", $stderr.string
377
+ end
378
+
379
+ def teardown
380
+ $stderr = @original_stderr
381
+ end
382
+ end
383
+
362
384
  class MachineWithColumnStateAttributeTest < BaseTestCase
363
385
  def setup
364
386
  @model = new_model
@@ -489,6 +511,25 @@ module ActiveRecordTest
489
511
  end
490
512
  end
491
513
 
514
+ class MachineWithCustomAttributeTest < BaseTestCase
515
+ def setup
516
+ require 'stringio'
517
+ @original_stderr, $stderr = $stderr, StringIO.new
518
+
519
+ @model = new_model
520
+ @machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
521
+ @record = @model.new
522
+ end
523
+
524
+ def test_should_not_delegate_attribute_predicate_with_different_attribute
525
+ assert_raise(ArgumentError) { @record.public_state? }
526
+ end
527
+
528
+ def teardown
529
+ $stderr = @original_stderr
530
+ end
531
+ end
532
+
492
533
  class MachineWithInitializedStateTest < BaseTestCase
493
534
  def setup
494
535
  @model = new_model
@@ -710,7 +751,7 @@ module ActiveRecordTest
710
751
  end
711
752
  end
712
753
  else
713
- $stderr.puts 'Skipping ActiveRecord Dirty tests. `gem install active_record` >= v2.1.0 and try again.'
754
+ $stderr.puts 'Skipping ActiveRecord Dirty tests.'
714
755
  end
715
756
 
716
757
  class MachineWithoutTransactionsTest < BaseTestCase
@@ -1828,7 +1869,7 @@ module ActiveRecordTest
1828
1869
  end
1829
1870
  end
1830
1871
  else
1831
- $stderr.puts 'Skipping ActiveRecord Scope tests. `gem install active_record` >= v2.1.0 and try again.'
1872
+ $stderr.puts 'Skipping ActiveRecord Scope tests.'
1832
1873
  end
1833
1874
 
1834
1875
  if ActiveRecord.const_defined?(:Relation)
@@ -1849,7 +1890,7 @@ module ActiveRecordTest
1849
1890
  end
1850
1891
  end
1851
1892
  else
1852
- $stderr.puts 'Skipping ActiveRecord Default Scope tests. `gem install active_record` >= v3.0.0 and try again.'
1893
+ $stderr.puts 'Skipping ActiveRecord Default Scope tests.'
1853
1894
  end
1854
1895
 
1855
1896
  if Object.const_defined?(:I18n)
@@ -2016,6 +2057,6 @@ module ActiveRecordTest
2016
2057
  end
2017
2058
  end
2018
2059
  else
2019
- $stderr.puts 'Skipping ActiveRecord I18n tests. `gem install active_record` >= v2.2.0 and try again.'
2060
+ $stderr.puts 'Skipping ActiveRecord I18n tests.'
2020
2061
  end
2021
2062
  end
@@ -1,14 +1,10 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
2
 
3
- # Load library
4
- require 'rubygems'
5
-
6
- gem 'dm-core', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.9.4'
7
3
  require 'dm-core'
8
4
  require 'dm-core/version' unless defined?(::DataMapper::VERSION)
5
+ require 'dm-observer'
9
6
 
10
7
  if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.3')
11
- gem 'dm-migrations', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.10.3'
12
8
  require 'dm-migrations'
13
9
  end
14
10
 
@@ -327,6 +323,33 @@ module DataMapperTest
327
323
  end
328
324
  end
329
325
 
326
+ class MachineWithConflictingStateNameTest < BaseTestCase
327
+ def setup
328
+ require 'stringio'
329
+ @original_stderr, $stderr = $stderr, StringIO.new
330
+
331
+ @resource = new_resource
332
+ end
333
+
334
+ def test_should_output_warning_with_same_machine_name
335
+ @machine = StateMachine::Machine.new(@resource)
336
+ @machine.state :state
337
+
338
+ assert_equal "Instance method \"state?\" is already defined in DataMapperTest::Foo :state instance helpers, use generic helper instead.\n", $stderr.string
339
+ end
340
+
341
+ def test_should_not_output_warning_with_same_machine_name
342
+ @machine = StateMachine::Machine.new(@resource, :public_state, :attribute => :state)
343
+ @machine.state :state
344
+
345
+ assert_equal '', $stderr.string
346
+ end
347
+
348
+ def teardown
349
+ $stderr = @original_stderr
350
+ end
351
+ end
352
+
330
353
  class MachineWithColumnStateAttributeTest < BaseTestCase
331
354
  def setup
332
355
  @resource = new_resource
@@ -726,7 +749,6 @@ module DataMapperTest
726
749
 
727
750
  begin
728
751
  if Gem::Version.new(::DataMapper::VERSION) >= Gem::Version.new('0.10.3')
729
- gem 'dm-transactions', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.10.3'
730
752
  require 'dm-transactions'
731
753
  end
732
754
 
@@ -755,7 +777,7 @@ module DataMapperTest
755
777
  end
756
778
  end
757
779
  rescue LoadError
758
- $stderr.puts "Skipping DataMapper Transaction tests. `gem install dm-transactions#{" -v #{ENV['VERSION']}" if ENV['VERSION']}` and try again."
780
+ $stderr.puts "Skipping DataMapper Transaction tests."
759
781
  end
760
782
 
761
783
  class MachineWithCallbacksTest < BaseTestCase
@@ -983,7 +1005,6 @@ module DataMapperTest
983
1005
  end
984
1006
 
985
1007
  begin
986
- gem 'dm-validations', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.9.4'
987
1008
  require 'dm-validations'
988
1009
 
989
1010
  class MachineWithValidationsTest < BaseTestCase
@@ -1462,310 +1483,303 @@ module DataMapperTest
1462
1483
  end
1463
1484
  end
1464
1485
  rescue LoadError
1465
- $stderr.puts "Skipping DataMapper Validation tests. `gem install dm-validations#{" -v #{ENV['VERSION']}" if ENV['VERSION']}` and try again."
1486
+ $stderr.puts "Skipping DataMapper Validation tests."
1466
1487
  end
1467
1488
 
1468
- begin
1469
- gem 'dm-observer', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.9.4'
1470
- require 'dm-observer'
1489
+ class MachineWithObserversTest < BaseTestCase
1490
+ def setup
1491
+ @resource = new_resource
1492
+ @machine = StateMachine::Machine.new(@resource)
1493
+ @machine.state :parked, :idling
1494
+ @machine.event :ignite
1495
+ @record = @resource.new(:state => 'parked')
1496
+ @transition = StateMachine::Transition.new(@record, @machine, :ignite, :parked, :idling)
1497
+ end
1471
1498
 
1472
- class MachineWithObserversTest < BaseTestCase
1473
- def setup
1474
- @resource = new_resource
1475
- @machine = StateMachine::Machine.new(@resource)
1476
- @machine.state :parked, :idling
1477
- @machine.event :ignite
1478
- @record = @resource.new(:state => 'parked')
1479
- @transition = StateMachine::Transition.new(@record, @machine, :ignite, :parked, :idling)
1480
- end
1499
+ def test_should_provide_matcher_helpers
1500
+ matchers = []
1481
1501
 
1482
- def test_should_provide_matcher_helpers
1483
- matchers = []
1484
-
1485
- new_observer(@resource) do
1486
- matchers = [all, any, same]
1487
- end
1488
-
1489
- assert_equal [StateMachine::AllMatcher.instance, StateMachine::AllMatcher.instance, StateMachine::LoopbackMatcher.instance], matchers
1502
+ new_observer(@resource) do
1503
+ matchers = [all, any, same]
1490
1504
  end
1491
1505
 
1492
- def test_should_call_before_transition_callback_if_requirements_match
1493
- called = false
1494
-
1495
- observer = new_observer(@resource) do
1496
- before_transition :from => :parked do
1497
- called = true
1498
- end
1506
+ assert_equal [StateMachine::AllMatcher.instance, StateMachine::AllMatcher.instance, StateMachine::LoopbackMatcher.instance], matchers
1507
+ end
1508
+
1509
+ def test_should_call_before_transition_callback_if_requirements_match
1510
+ called = false
1511
+
1512
+ observer = new_observer(@resource) do
1513
+ before_transition :from => :parked do
1514
+ called = true
1499
1515
  end
1500
-
1501
- @transition.perform
1502
- assert called
1503
1516
  end
1504
1517
 
1505
- def test_should_not_call_before_transition_callback_if_requirements_do_not_match
1506
- called = false
1507
-
1508
- observer = new_observer(@resource) do
1509
- before_transition :from => :idling do
1510
- called = true
1511
- end
1518
+ @transition.perform
1519
+ assert called
1520
+ end
1521
+
1522
+ def test_should_not_call_before_transition_callback_if_requirements_do_not_match
1523
+ called = false
1524
+
1525
+ observer = new_observer(@resource) do
1526
+ before_transition :from => :idling do
1527
+ called = true
1512
1528
  end
1513
-
1514
- @transition.perform
1515
- assert !called
1516
1529
  end
1517
1530
 
1518
- def test_should_pass_transition_to_before_callbacks
1519
- callback_args = nil
1520
-
1521
- observer = new_observer(@resource) do
1522
- before_transition do |*args|
1523
- callback_args = args
1524
- end
1531
+ @transition.perform
1532
+ assert !called
1533
+ end
1534
+
1535
+ def test_should_pass_transition_to_before_callbacks
1536
+ callback_args = nil
1537
+
1538
+ observer = new_observer(@resource) do
1539
+ before_transition do |*args|
1540
+ callback_args = args
1525
1541
  end
1526
-
1527
- @transition.perform
1528
- assert_equal [@transition], callback_args
1529
1542
  end
1530
1543
 
1531
- def test_should_call_after_transition_callback_if_requirements_match
1532
- called = false
1533
-
1534
- observer = new_observer(@resource) do
1535
- after_transition :from => :parked do
1536
- called = true
1537
- end
1544
+ @transition.perform
1545
+ assert_equal [@transition], callback_args
1546
+ end
1547
+
1548
+ def test_should_call_after_transition_callback_if_requirements_match
1549
+ called = false
1550
+
1551
+ observer = new_observer(@resource) do
1552
+ after_transition :from => :parked do
1553
+ called = true
1538
1554
  end
1539
-
1540
- @transition.perform
1541
- assert called
1542
1555
  end
1543
1556
 
1544
- def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1545
- called = false
1546
-
1547
- observer = new_observer(@resource) do
1548
- after_transition :from => :idling do
1549
- called = true
1550
- end
1557
+ @transition.perform
1558
+ assert called
1559
+ end
1560
+
1561
+ def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1562
+ called = false
1563
+
1564
+ observer = new_observer(@resource) do
1565
+ after_transition :from => :idling do
1566
+ called = true
1551
1567
  end
1552
-
1553
- @transition.perform
1554
- assert !called
1555
1568
  end
1556
1569
 
1557
- def test_should_pass_transition_to_after_callbacks
1558
- callback_args = nil
1559
-
1560
- observer = new_observer(@resource) do
1561
- after_transition do |*args|
1562
- callback_args = args
1563
- end
1570
+ @transition.perform
1571
+ assert !called
1572
+ end
1573
+
1574
+ def test_should_pass_transition_to_after_callbacks
1575
+ callback_args = nil
1576
+
1577
+ observer = new_observer(@resource) do
1578
+ after_transition do |*args|
1579
+ callback_args = args
1564
1580
  end
1565
-
1566
- @transition.perform
1567
- assert_equal [@transition], callback_args
1568
1581
  end
1569
1582
 
1570
- def test_should_call_around_transition_callback_if_requirements_match
1571
- called = false
1572
-
1573
- observer = new_observer(@resource) do
1574
- around_transition :from => :parked do |block|
1575
- called = true
1576
- block.call
1577
- end
1583
+ @transition.perform
1584
+ assert_equal [@transition], callback_args
1585
+ end
1586
+
1587
+ def test_should_call_around_transition_callback_if_requirements_match
1588
+ called = false
1589
+
1590
+ observer = new_observer(@resource) do
1591
+ around_transition :from => :parked do |block|
1592
+ called = true
1593
+ block.call
1578
1594
  end
1579
-
1580
- @transition.perform
1581
- assert called
1582
1595
  end
1583
1596
 
1584
- def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1585
- called = false
1586
-
1587
- observer = new_observer(@resource) do
1588
- around_transition :from => :idling do |block|
1589
- called = true
1590
- block.call
1591
- end
1597
+ @transition.perform
1598
+ assert called
1599
+ end
1600
+
1601
+ def test_should_not_call_after_transition_callback_if_requirements_do_not_match
1602
+ called = false
1603
+
1604
+ observer = new_observer(@resource) do
1605
+ around_transition :from => :idling do |block|
1606
+ called = true
1607
+ block.call
1592
1608
  end
1593
-
1594
- @transition.perform
1595
- assert !called
1596
1609
  end
1597
1610
 
1598
- def test_should_pass_transition_to_around_callbacks
1599
- callback_args = nil
1600
-
1601
- observer = new_observer(@resource) do
1602
- around_transition do |*args|
1603
- block = args.pop
1604
- callback_args = args
1605
- block.call
1606
- end
1611
+ @transition.perform
1612
+ assert !called
1613
+ end
1614
+
1615
+ def test_should_pass_transition_to_around_callbacks
1616
+ callback_args = nil
1617
+
1618
+ observer = new_observer(@resource) do
1619
+ around_transition do |*args|
1620
+ block = args.pop
1621
+ callback_args = args
1622
+ block.call
1607
1623
  end
1608
-
1609
- @transition.perform
1610
- assert_equal [@transition], callback_args
1611
1624
  end
1612
1625
 
1613
- def test_should_call_failure_callback_if_requirements_match
1614
- @resource.before(:create) { throw :halt }
1615
-
1616
- called = false
1617
-
1618
- observer = new_observer(@resource) do
1619
- after_transition_failure :on => :ignite do
1620
- called = true
1621
- end
1626
+ @transition.perform
1627
+ assert_equal [@transition], callback_args
1628
+ end
1629
+
1630
+ def test_should_call_failure_callback_if_requirements_match
1631
+ @resource.before(:create) { throw :halt }
1632
+
1633
+ called = false
1634
+
1635
+ observer = new_observer(@resource) do
1636
+ after_transition_failure :on => :ignite do
1637
+ called = true
1622
1638
  end
1623
-
1624
- @transition.perform
1625
- assert called
1626
1639
  end
1627
1640
 
1628
- def test_should_not_call_failure_callback_if_requirements_do_not_match
1629
- @resource.before(:create) { throw :halt }
1630
-
1631
- called = false
1632
-
1633
- observer = new_observer(@resource) do
1634
- after_transition_failure :on => :park do
1635
- called = true
1636
- end
1641
+ @transition.perform
1642
+ assert called
1643
+ end
1644
+
1645
+ def test_should_not_call_failure_callback_if_requirements_do_not_match
1646
+ @resource.before(:create) { throw :halt }
1647
+
1648
+ called = false
1649
+
1650
+ observer = new_observer(@resource) do
1651
+ after_transition_failure :on => :park do
1652
+ called = true
1637
1653
  end
1638
-
1639
- @transition.perform
1640
- assert !called
1641
1654
  end
1642
1655
 
1643
- def test_should_pass_transition_to_failure_callbacks
1644
- @resource.before(:create) { throw :halt }
1645
-
1646
- callback_args = nil
1647
-
1648
- observer = new_observer(@resource) do
1649
- after_transition_failure do |*args|
1650
- callback_args = args
1651
- end
1656
+ @transition.perform
1657
+ assert !called
1658
+ end
1659
+
1660
+ def test_should_pass_transition_to_failure_callbacks
1661
+ @resource.before(:create) { throw :halt }
1662
+
1663
+ callback_args = nil
1664
+
1665
+ observer = new_observer(@resource) do
1666
+ after_transition_failure do |*args|
1667
+ callback_args = args
1652
1668
  end
1653
-
1654
- @transition.perform
1655
- assert_equal [@transition], callback_args
1656
1669
  end
1657
1670
 
1658
- def test_should_raise_exception_if_targeting_invalid_machine
1659
- assert_raise(RUBY_VERSION < '1.9' ? IndexError : KeyError) do
1660
- new_observer(@resource) do
1661
- before_transition :invalid, :from => :parked do
1662
- end
1671
+ @transition.perform
1672
+ assert_equal [@transition], callback_args
1673
+ end
1674
+
1675
+ def test_should_raise_exception_if_targeting_invalid_machine
1676
+ assert_raise(RUBY_VERSION < '1.9' ? IndexError : KeyError) do
1677
+ new_observer(@resource) do
1678
+ before_transition :invalid, :from => :parked do
1663
1679
  end
1664
1680
  end
1665
1681
  end
1682
+ end
1683
+
1684
+ def test_should_allow_targeting_specific_machine
1685
+ @second_machine = StateMachine::Machine.new(@resource, :status, :namespace => 'alarm')
1686
+ @resource.auto_migrate!
1666
1687
 
1667
- def test_should_allow_targeting_specific_machine
1668
- @second_machine = StateMachine::Machine.new(@resource, :status, :namespace => 'alarm')
1669
- @resource.auto_migrate!
1670
-
1671
- called_state = false
1672
- called_status = false
1673
-
1674
- observer = new_observer(@resource) do
1675
- before_transition :state, :from => :parked do
1676
- called_state = true
1677
- end
1678
-
1679
- before_transition :status, :from => :parked do
1680
- called_status = true
1681
- end
1688
+ called_state = false
1689
+ called_status = false
1690
+
1691
+ observer = new_observer(@resource) do
1692
+ before_transition :state, :from => :parked do
1693
+ called_state = true
1682
1694
  end
1683
1695
 
1684
- @transition.perform
1685
-
1686
- assert called_state
1687
- assert !called_status
1696
+ before_transition :status, :from => :parked do
1697
+ called_status = true
1698
+ end
1688
1699
  end
1689
1700
 
1690
- def test_should_allow_targeting_multiple_specific_machines
1691
- @second_machine = StateMachine::Machine.new(@resource, :status, :namespace => 'alarm')
1692
- @second_machine.state :parked, :idling
1693
- @second_machine.event :ignite
1694
- @resource.auto_migrate!
1695
-
1696
- called_attribute = nil
1697
-
1698
- attributes = []
1699
- observer = new_observer(@resource) do
1700
- before_transition :state, :status, :from => :parked do |transition|
1701
- called_attribute = transition.attribute
1702
- end
1701
+ @transition.perform
1702
+
1703
+ assert called_state
1704
+ assert !called_status
1705
+ end
1706
+
1707
+ def test_should_allow_targeting_multiple_specific_machines
1708
+ @second_machine = StateMachine::Machine.new(@resource, :status, :namespace => 'alarm')
1709
+ @second_machine.state :parked, :idling
1710
+ @second_machine.event :ignite
1711
+ @resource.auto_migrate!
1712
+
1713
+ called_attribute = nil
1714
+
1715
+ attributes = []
1716
+ observer = new_observer(@resource) do
1717
+ before_transition :state, :status, :from => :parked do |transition|
1718
+ called_attribute = transition.attribute
1703
1719
  end
1704
-
1705
- @transition.perform
1706
- assert_equal :state, called_attribute
1707
-
1708
- StateMachine::Transition.new(@record, @second_machine, :ignite, :parked, :idling).perform
1709
- assert_equal :status, called_attribute
1710
1720
  end
1721
+
1722
+ @transition.perform
1723
+ assert_equal :state, called_attribute
1724
+
1725
+ StateMachine::Transition.new(@record, @second_machine, :ignite, :parked, :idling).perform
1726
+ assert_equal :status, called_attribute
1711
1727
  end
1712
-
1713
- class MachineWithMixedCallbacksTest < BaseTestCase
1714
- def setup
1715
- @resource = new_resource
1716
- @machine = StateMachine::Machine.new(@resource)
1717
- @machine.state :parked, :idling
1718
- @machine.event :ignite
1719
- @record = @resource.new(:state => 'parked')
1720
- @transition = StateMachine::Transition.new(@record, @machine, :ignite, :parked, :idling)
1721
-
1722
- @notifications = notifications = []
1723
-
1724
- # Create callbacks
1725
- @machine.before_transition {notifications << :callback_before_transition}
1726
- @machine.after_transition {notifications << :callback_after_transition}
1727
- @machine.around_transition do |block|
1728
- notifications << :callback_around_before_transition
1729
- block.call
1730
- notifications << :callback_around_after_transition
1728
+ end
1729
+
1730
+ class MachineWithMixedCallbacksTest < BaseTestCase
1731
+ def setup
1732
+ @resource = new_resource
1733
+ @machine = StateMachine::Machine.new(@resource)
1734
+ @machine.state :parked, :idling
1735
+ @machine.event :ignite
1736
+ @record = @resource.new(:state => 'parked')
1737
+ @transition = StateMachine::Transition.new(@record, @machine, :ignite, :parked, :idling)
1738
+
1739
+ @notifications = notifications = []
1740
+
1741
+ # Create callbacks
1742
+ @machine.before_transition {notifications << :callback_before_transition}
1743
+ @machine.after_transition {notifications << :callback_after_transition}
1744
+ @machine.around_transition do |block|
1745
+ notifications << :callback_around_before_transition
1746
+ block.call
1747
+ notifications << :callback_around_after_transition
1748
+ end
1749
+
1750
+ observer = new_observer(@resource) do
1751
+ before_transition do
1752
+ notifications << :observer_before_transition
1731
1753
  end
1732
1754
 
1733
- observer = new_observer(@resource) do
1734
- before_transition do
1735
- notifications << :observer_before_transition
1736
- end
1737
-
1738
- after_transition do
1739
- notifications << :observer_after_transition
1740
- end
1741
-
1742
- around_transition do |block|
1743
- notifications << :observer_around_before_transition
1744
- block.call
1745
- notifications << :observer_around_after_transition
1746
- end
1755
+ after_transition do
1756
+ notifications << :observer_after_transition
1747
1757
  end
1748
1758
 
1749
- @transition.perform
1750
- end
1751
-
1752
- def test_should_invoke_callbacks_in_specific_order
1753
- expected = [
1754
- :callback_before_transition,
1755
- :callback_around_before_transition,
1756
- :observer_before_transition,
1757
- :observer_around_before_transition,
1758
- :observer_around_after_transition,
1759
- :callback_around_after_transition,
1760
- :callback_after_transition,
1761
- :observer_after_transition
1762
- ]
1763
-
1764
- assert_equal expected, @notifications
1759
+ around_transition do |block|
1760
+ notifications << :observer_around_before_transition
1761
+ block.call
1762
+ notifications << :observer_around_after_transition
1763
+ end
1765
1764
  end
1765
+
1766
+ @transition.perform
1767
+ end
1768
+
1769
+ def test_should_invoke_callbacks_in_specific_order
1770
+ expected = [
1771
+ :callback_before_transition,
1772
+ :callback_around_before_transition,
1773
+ :observer_before_transition,
1774
+ :observer_around_before_transition,
1775
+ :observer_around_after_transition,
1776
+ :callback_around_after_transition,
1777
+ :callback_after_transition,
1778
+ :observer_after_transition
1779
+ ]
1780
+
1781
+ assert_equal expected, @notifications
1766
1782
  end
1767
- rescue LoadError
1768
- $stderr.puts "Skipping DataMapper Observer tests. `gem install dm-observer#{" -v #{ENV['VERSION']}" if ENV['VERSION']}` and try again."
1769
1783
  end
1770
1784
 
1771
1785
  class MachineWithScopesTest < BaseTestCase