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.
- 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
|