state_machine 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +11 -0
- data/.travis.yml +16 -0
- data/.yardopts +5 -0
- data/Appraisals +260 -0
- data/CHANGELOG.rdoc +15 -0
- data/Gemfile +3 -0
- data/README.rdoc +156 -29
- data/Rakefile +31 -57
- data/gemfiles/active_model-3.0.0.gemfile +7 -0
- data/gemfiles/active_model-3.0.0.gemfile.lock +32 -0
- data/gemfiles/active_model-3.0.5.gemfile +7 -0
- data/gemfiles/active_model-3.0.5.gemfile.lock +32 -0
- data/gemfiles/active_record-2.0.0.gemfile +8 -0
- data/gemfiles/active_record-2.0.0.gemfile.lock +30 -0
- data/gemfiles/active_record-2.0.5.gemfile +8 -0
- data/gemfiles/active_record-2.0.5.gemfile.lock +30 -0
- data/gemfiles/active_record-2.1.0.gemfile +8 -0
- data/gemfiles/active_record-2.1.0.gemfile.lock +30 -0
- data/gemfiles/active_record-2.1.2.gemfile +8 -0
- data/gemfiles/active_record-2.1.2.gemfile.lock +30 -0
- data/gemfiles/active_record-2.2.3.gemfile +8 -0
- data/gemfiles/active_record-2.2.3.gemfile.lock +30 -0
- data/gemfiles/active_record-2.3.12.gemfile +8 -0
- data/gemfiles/active_record-2.3.12.gemfile.lock +30 -0
- data/gemfiles/active_record-3.0.0.gemfile +8 -0
- data/gemfiles/active_record-3.0.0.gemfile.lock +44 -0
- data/gemfiles/active_record-3.0.5.gemfile +8 -0
- data/gemfiles/active_record-3.0.5.gemfile.lock +43 -0
- data/gemfiles/data_mapper-0.10.2.gemfile +12 -0
- data/gemfiles/data_mapper-0.10.2.gemfile.lock +45 -0
- data/gemfiles/data_mapper-0.9.11.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.11.gemfile.lock +47 -0
- data/gemfiles/data_mapper-0.9.4.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.4.gemfile.lock +61 -0
- data/gemfiles/data_mapper-0.9.7.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.7.gemfile.lock +57 -0
- data/gemfiles/data_mapper-1.0.0.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.0.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.0.1.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.1.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.0.2.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.2.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.1.0.gemfile +12 -0
- data/gemfiles/data_mapper-1.1.0.gemfile.lock +51 -0
- data/gemfiles/default.gemfile +7 -0
- data/gemfiles/default.gemfile.lock +24 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.5.8.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.6.0.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.6.10.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.7.0.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.7.5.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +36 -0
- data/gemfiles/mongo_mapper-0.8.0.gemfile +10 -0
- data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +40 -0
- data/gemfiles/mongo_mapper-0.8.3.gemfile +10 -0
- data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +40 -0
- data/gemfiles/mongo_mapper-0.8.4.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +38 -0
- data/gemfiles/mongo_mapper-0.8.6.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +38 -0
- data/gemfiles/mongo_mapper-0.9.0.gemfile +7 -0
- data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +41 -0
- data/gemfiles/mongoid-2.0.0.gemfile +7 -0
- data/gemfiles/mongoid-2.0.0.gemfile.lock +42 -0
- data/gemfiles/mongoid-2.1.4.gemfile +7 -0
- data/gemfiles/mongoid-2.1.4.gemfile.lock +40 -0
- data/gemfiles/sequel-2.11.0.gemfile +8 -0
- data/gemfiles/sequel-2.11.0.gemfile.lock +28 -0
- data/gemfiles/sequel-2.12.0.gemfile +8 -0
- data/gemfiles/sequel-2.12.0.gemfile.lock +28 -0
- data/gemfiles/sequel-2.8.0.gemfile +8 -0
- data/gemfiles/sequel-2.8.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.0.0.gemfile +8 -0
- data/gemfiles/sequel-3.0.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.13.0.gemfile +8 -0
- data/gemfiles/sequel-3.13.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.14.0.gemfile +8 -0
- data/gemfiles/sequel-3.14.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.23.0.gemfile +8 -0
- data/gemfiles/sequel-3.23.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.24.0.gemfile +8 -0
- data/gemfiles/sequel-3.24.0.gemfile.lock +28 -0
- data/lib/state_machine/event.rb +13 -90
- data/lib/state_machine/helper_module.rb +17 -0
- data/lib/state_machine/integrations/active_model.rb +35 -0
- data/lib/state_machine/integrations/active_record.rb +41 -2
- data/lib/state_machine/integrations/data_mapper.rb +17 -2
- data/lib/state_machine/integrations/mongo_mapper.rb +34 -7
- data/lib/state_machine/integrations/mongoid.rb +34 -26
- data/lib/state_machine/integrations/mongoid/versions.rb +29 -3
- data/lib/state_machine/integrations/sequel.rb +22 -72
- data/lib/state_machine/integrations/sequel/versions.rb +87 -6
- data/lib/state_machine/machine.rb +279 -19
- data/lib/state_machine/state.rb +2 -2
- data/lib/state_machine/state_context.rb +133 -0
- data/lib/state_machine/version.rb +3 -0
- data/state_machine.gemspec +22 -0
- data/test/test_helper.rb +1 -3
- data/test/unit/branch_test.rb +1 -3
- data/test/unit/event_collection_test.rb +3 -3
- data/test/unit/event_test.rb +1 -3
- data/test/unit/helper_module_test.rb +17 -0
- data/test/unit/integrations/active_model_test.rb +0 -4
- data/test/unit/integrations/active_record_test.rb +50 -9
- data/test/unit/integrations/data_mapper_test.rb +267 -253
- data/test/unit/integrations/mongo_mapper_test.rb +47 -15
- data/test/unit/integrations/mongoid_test.rb +50 -8
- data/test/unit/integrations/sequel_test.rb +10 -6
- data/test/unit/machine_test.rb +206 -25
- data/test/unit/state_context_test.rb +421 -0
- data/test/unit/state_test.rb +20 -3
- metadata +303 -128
- data/lib/state_machine/condition_proxy.rb +0 -94
- data/test/unit/condition_proxy_test.rb +0 -328
@@ -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
data/test/unit/branch_test.rb
CHANGED
@@ -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
|
132
|
+
@events << @park
|
133
133
|
@park.transition :first_gear => :parked
|
134
134
|
|
135
|
-
@events << @shift_down
|
135
|
+
@events << @shift_down
|
136
136
|
@shift_down.transition :first_gear => :parked
|
137
137
|
|
138
138
|
@machine.events.concat(@events)
|
data/test/unit/event_test.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
1486
|
+
$stderr.puts "Skipping DataMapper Validation tests."
|
1466
1487
|
end
|
1467
1488
|
|
1468
|
-
|
1469
|
-
|
1470
|
-
|
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
|
-
|
1473
|
-
|
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
|
-
|
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
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
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
|
-
|
1506
|
-
|
1507
|
-
|
1508
|
-
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
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
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
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
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
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
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
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
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
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
|
-
|
1571
|
-
|
1572
|
-
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
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
|
-
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
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
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1602
|
-
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
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
|
-
|
1614
|
-
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
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
|
-
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
|
1634
|
-
|
1635
|
-
|
1636
|
-
|
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
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
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
|
-
|
1659
|
-
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
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
|
-
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1672
|
-
|
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
|
-
|
1685
|
-
|
1686
|
-
|
1687
|
-
assert !called_status
|
1696
|
+
before_transition :status, :from => :parked do
|
1697
|
+
called_status = true
|
1698
|
+
end
|
1688
1699
|
end
|
1689
1700
|
|
1690
|
-
|
1691
|
-
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
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
|
-
|
1714
|
-
|
1715
|
-
|
1716
|
-
|
1717
|
-
|
1718
|
-
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
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
|
-
|
1734
|
-
|
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
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
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
|