aasm 4.2.0 → 4.3.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -1
- data/Gemfile +2 -2
- data/PLANNED_CHANGES.md +24 -4
- data/README.md +75 -5
- data/lib/aasm/aasm.rb +50 -36
- data/lib/aasm/base.rb +36 -18
- data/lib/aasm/core/event.rb +6 -5
- data/lib/aasm/core/state.rb +3 -2
- data/lib/aasm/core/transition.rb +5 -4
- data/lib/aasm/errors.rb +7 -4
- data/lib/aasm/instance_base.rb +14 -13
- data/lib/aasm/localizer.rb +1 -1
- data/lib/aasm/persistence/active_record_persistence.rb +41 -66
- data/lib/aasm/persistence/base.rb +7 -7
- data/lib/aasm/persistence/mongo_mapper_persistence.rb +34 -51
- data/lib/aasm/persistence/mongoid_persistence.rb +15 -36
- data/lib/aasm/persistence/plain_persistence.rb +8 -7
- data/lib/aasm/persistence/sequel_persistence.rb +12 -10
- data/lib/aasm/state_machine.rb +11 -6
- data/lib/aasm/version.rb +1 -1
- data/spec/database.rb +27 -1
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
- data/spec/models/active_record/complex_active_record_example.rb +33 -0
- data/spec/models/active_record/derivate_new_dsl.rb +4 -0
- data/spec/models/active_record/false_state.rb +18 -0
- data/spec/models/active_record/gate.rb +20 -0
- data/spec/models/active_record/no_direct_assignment.rb +11 -0
- data/spec/models/active_record/no_scope.rb +11 -0
- data/spec/models/active_record/provided_and_persisted_state.rb +3 -3
- data/spec/models/active_record/simple_new_dsl.rb +9 -0
- data/spec/models/active_record/thief.rb +15 -0
- data/spec/models/active_record/with_enum.rb +20 -0
- data/spec/models/active_record/with_false_enum.rb +16 -0
- data/spec/models/active_record/with_true_enum.rb +20 -0
- data/spec/models/basic_two_state_machines_example.rb +25 -0
- data/spec/models/callbacks/basic_multiple.rb +75 -0
- data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
- data/spec/models/callbacks/private_method_multiple.rb +44 -0
- data/spec/models/callbacks/with_args_multiple.rb +61 -0
- data/spec/models/callbacks/{with_state_args.rb → with_state_arg.rb} +0 -0
- data/spec/models/callbacks/with_state_arg_multiple.rb +26 -0
- data/spec/models/complex_example.rb +134 -0
- data/spec/models/conversation.rb +47 -1
- data/spec/models/foo.rb +57 -0
- data/spec/models/foo_callback_multiple.rb +45 -0
- data/spec/models/guardian_multiple.rb +48 -0
- data/spec/models/initial_state_proc.rb +16 -0
- data/spec/models/invalid_persistor.rb +15 -0
- data/spec/models/mongo_mapper/complex_mongo_mapper_example.rb +37 -0
- data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +11 -0
- data/spec/models/mongo_mapper/simple_mongo_mapper.rb +12 -0
- data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +13 -0
- data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
- data/spec/models/mongoid/no_scope_mongoid.rb +11 -0
- data/spec/models/mongoid/simple_mongoid.rb +12 -0
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +13 -0
- data/spec/models/no_initial_state.rb +13 -0
- data/spec/models/parametrised_event.rb +1 -1
- data/spec/models/parametrised_event_multiple.rb +29 -0
- data/spec/models/provided_state.rb +3 -3
- data/spec/models/sequel/complex_sequel_example.rb +45 -0
- data/spec/models/sequel/sequel_multiple.rb +25 -0
- data/spec/models/sequel/sequel_simple.rb +25 -0
- data/spec/models/simple_multiple_example.rb +30 -0
- data/spec/models/sub_class.rb +4 -0
- data/spec/models/sub_class_with_more_states.rb +11 -0
- data/spec/models/super_class.rb +28 -0
- data/spec/models/transactor.rb +27 -0
- data/spec/models/valid_state_name.rb +12 -0
- data/spec/models/validator.rb +39 -0
- data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
- data/spec/unit/callback_multiple_spec.rb +295 -0
- data/spec/unit/callbacks_spec.rb +1 -1
- data/spec/unit/complex_multiple_example_spec.rb +99 -0
- data/spec/unit/edge_cases_spec.rb +16 -0
- data/spec/unit/event_multiple_spec.rb +73 -0
- data/spec/unit/event_spec.rb +11 -6
- data/spec/unit/guard_multiple_spec.rb +60 -0
- data/spec/unit/initial_state_multiple_spec.rb +15 -0
- data/spec/unit/inspection_multiple_spec.rb +201 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +560 -0
- data/spec/unit/persistence/active_record_persistence_spec.rb +17 -12
- data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +146 -0
- data/spec/unit/persistence/{mongo_mapper_persistance_spec.rb → mongo_mapper_persistence_spec.rb} +7 -49
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +127 -0
- data/spec/unit/persistence/mongoid_persistence_spec.rb +79 -0
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +153 -0
- data/spec/unit/persistence/sequel_persistence_spec.rb +7 -24
- data/spec/unit/reloading_spec.rb +1 -1
- data/spec/unit/simple_multiple_example_spec.rb +63 -0
- data/spec/unit/state_spec.rb +3 -1
- data/spec/unit/subclassing_multiple_spec.rb +39 -0
- data/spec/unit/transition_spec.rb +31 -22
- metadata +73 -9
- data/spec/unit/persistence/mongoid_persistance_spec.rb +0 -146
@@ -9,3 +9,15 @@ class SimpleMongoMapper
|
|
9
9
|
state :next
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
class SimpleMongoMapperMultiple
|
14
|
+
include MongoMapper::Document
|
15
|
+
include AASM
|
16
|
+
|
17
|
+
key :status, String
|
18
|
+
|
19
|
+
aasm :left, column: :status do
|
20
|
+
state :unknown_scope
|
21
|
+
state :next
|
22
|
+
end
|
23
|
+
end
|
@@ -10,3 +10,16 @@ class SimpleNewDslMongoMapper
|
|
10
10
|
state :next
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
class SimpleNewDslMongoMapperMultiple
|
15
|
+
include MongoMapper::Document
|
16
|
+
include AASM
|
17
|
+
|
18
|
+
key :status, String
|
19
|
+
|
20
|
+
aasm :left, :column => :status
|
21
|
+
aasm :left do
|
22
|
+
state :unknown_scope
|
23
|
+
state :next
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class ComplexMongoidExample
|
2
|
+
include Mongoid::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :left, :type => String
|
6
|
+
field :right, :type => String
|
7
|
+
|
8
|
+
aasm :left, :column => 'left' do
|
9
|
+
state :one, :initial => true
|
10
|
+
state :two
|
11
|
+
state :three
|
12
|
+
|
13
|
+
event :increment do
|
14
|
+
transitions :from => :one, :to => :two
|
15
|
+
transitions :from => :two, :to => :three
|
16
|
+
end
|
17
|
+
event :reset do
|
18
|
+
transitions :from => :three, :to => :one
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
aasm :right, :column => 'right' do
|
23
|
+
state :alpha, :initial => true
|
24
|
+
state :beta
|
25
|
+
state :gamma
|
26
|
+
|
27
|
+
event :level_up do
|
28
|
+
transitions :from => :alpha, :to => :beta
|
29
|
+
transitions :from => :beta, :to => :gamma
|
30
|
+
end
|
31
|
+
event :level_down do
|
32
|
+
transitions :from => :gamma, :to => :beta
|
33
|
+
transitions :from => :beta, :to => :alpha
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -8,3 +8,14 @@ class NoScopeMongoid
|
|
8
8
|
state :ignored_scope
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
12
|
+
class NoScopeMongoidMultiple
|
13
|
+
include Mongoid::Document
|
14
|
+
include AASM
|
15
|
+
|
16
|
+
field :status, :type => String
|
17
|
+
|
18
|
+
aasm :left, :create_scopes => false, :column => :status do
|
19
|
+
state :ignored_scope
|
20
|
+
end
|
21
|
+
end
|
@@ -9,3 +9,15 @@ class SimpleMongoid
|
|
9
9
|
state :new
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
class SimpleMongoidMultiple
|
14
|
+
include Mongoid::Document
|
15
|
+
include AASM
|
16
|
+
|
17
|
+
field :status, :type => String
|
18
|
+
|
19
|
+
aasm :left, column: :status do
|
20
|
+
state :unknown_scope
|
21
|
+
state :new
|
22
|
+
end
|
23
|
+
end
|
@@ -10,3 +10,16 @@ class SimpleNewDslMongoid
|
|
10
10
|
state :new
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
class SimpleNewDslMongoidMultiple
|
15
|
+
include Mongoid::Document
|
16
|
+
include AASM
|
17
|
+
|
18
|
+
field :status, :type => String
|
19
|
+
|
20
|
+
aasm :left, :column => :status
|
21
|
+
aasm :left do
|
22
|
+
state :unknown_scope, :initial => true
|
23
|
+
state :new
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ParametrisedEventMultiple
|
2
|
+
include AASM
|
3
|
+
aasm(:left) do
|
4
|
+
state :sleeping, :initial => true
|
5
|
+
state :showering
|
6
|
+
state :working
|
7
|
+
state :dating
|
8
|
+
state :prettying_up
|
9
|
+
|
10
|
+
event :wakeup do
|
11
|
+
transitions :from => :sleeping, :to => [:showering, :working]
|
12
|
+
end
|
13
|
+
|
14
|
+
event :dress do
|
15
|
+
transitions :from => :sleeping, :to => :working, :after => :wear_clothes
|
16
|
+
transitions :from => :showering, :to => [:working, :dating], :after => Proc.new { |*args| wear_clothes(*args) }
|
17
|
+
transitions :from => :showering, :to => :prettying_up, :after => [:condition_hair, :fix_hair]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def wear_clothes(shirt_color, trouser_type=nil)
|
22
|
+
end
|
23
|
+
|
24
|
+
def condition_hair
|
25
|
+
end
|
26
|
+
|
27
|
+
def fix_hair
|
28
|
+
end
|
29
|
+
end
|
@@ -10,15 +10,15 @@ class ProvidedState
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
def aasm_read_state
|
13
|
+
def aasm_read_state(*args)
|
14
14
|
:beta
|
15
15
|
end
|
16
16
|
|
17
|
-
def aasm_write_state(new_state)
|
17
|
+
def aasm_write_state(new_state, *args)
|
18
18
|
@persisted_store = new_state
|
19
19
|
end
|
20
20
|
|
21
|
-
def aasm_write_state_without_persistence(new_state)
|
21
|
+
def aasm_write_state_without_persistence(new_state, *args)
|
22
22
|
@transient_store = new_state
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
db = Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
# if you want to see the statements while running the spec enable the following line
|
4
|
+
# db.loggers << Logger.new($stderr)
|
5
|
+
db.create_table(:complex_sequel_examples) do
|
6
|
+
primary_key :id
|
7
|
+
String :left
|
8
|
+
String :right
|
9
|
+
end
|
10
|
+
|
11
|
+
class ComplexSequelExample < Sequel::Model(db)
|
12
|
+
set_dataset(:complex_sequel_examples)
|
13
|
+
|
14
|
+
include AASM
|
15
|
+
|
16
|
+
aasm :left, :column => 'left' do
|
17
|
+
state :one, :initial => true
|
18
|
+
state :two
|
19
|
+
state :three
|
20
|
+
|
21
|
+
event :increment do
|
22
|
+
transitions :from => :one, :to => :two
|
23
|
+
transitions :from => :two, :to => :three
|
24
|
+
end
|
25
|
+
event :reset do
|
26
|
+
transitions :from => :three, :to => :one
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
aasm :right, :column => 'right' do
|
31
|
+
state :alpha, :initial => true
|
32
|
+
state :beta
|
33
|
+
state :gamma
|
34
|
+
|
35
|
+
event :level_up do
|
36
|
+
transitions :from => :alpha, :to => :beta
|
37
|
+
transitions :from => :beta, :to => :gamma
|
38
|
+
end
|
39
|
+
event :level_down do
|
40
|
+
transitions :from => :gamma, :to => :beta
|
41
|
+
transitions :from => :beta, :to => :alpha
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
db = Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
# if you want to see the statements while running the spec enable the following line
|
4
|
+
# db.loggers << Logger.new($stderr)
|
5
|
+
db.create_table(:multiples) do
|
6
|
+
primary_key :id
|
7
|
+
String :status
|
8
|
+
end
|
9
|
+
|
10
|
+
class SequelMultiple < Sequel::Model(db)
|
11
|
+
set_dataset(:multiples)
|
12
|
+
include AASM
|
13
|
+
|
14
|
+
attr_accessor :default
|
15
|
+
|
16
|
+
aasm :left, :column => :status
|
17
|
+
aasm :left do
|
18
|
+
state :alpha, :initial => true
|
19
|
+
state :beta
|
20
|
+
state :gamma
|
21
|
+
event :release do
|
22
|
+
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
db = Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
# if you want to see the statements while running the spec enable the following line
|
4
|
+
# db.loggers << Logger.new($stderr)
|
5
|
+
db.create_table(:simples) do
|
6
|
+
primary_key :id
|
7
|
+
String :status
|
8
|
+
end
|
9
|
+
|
10
|
+
class SequelSimple < Sequel::Model(db)
|
11
|
+
set_dataset(:simples)
|
12
|
+
include AASM
|
13
|
+
|
14
|
+
attr_accessor :default
|
15
|
+
|
16
|
+
aasm :column => :status
|
17
|
+
aasm do
|
18
|
+
state :alpha, :initial => true
|
19
|
+
state :beta
|
20
|
+
state :gamma
|
21
|
+
event :release do
|
22
|
+
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class SimpleMultipleExample
|
2
|
+
include AASM
|
3
|
+
aasm(:move) do
|
4
|
+
state :standing, :initial => true
|
5
|
+
state :walking
|
6
|
+
state :running
|
7
|
+
|
8
|
+
event :walk do
|
9
|
+
transitions :from => :standing, :to => :walking
|
10
|
+
end
|
11
|
+
event :run do
|
12
|
+
transitions :from => [:standing, :walking], :to => :running
|
13
|
+
end
|
14
|
+
event :hold do
|
15
|
+
transitions :from => [:walking, :running], :to => :standing
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
aasm(:work) do
|
20
|
+
state :sleeping, :initial => true
|
21
|
+
state :processing
|
22
|
+
|
23
|
+
event :start do
|
24
|
+
transitions :from => :sleeping, :to => :processing
|
25
|
+
end
|
26
|
+
event :stop do
|
27
|
+
transitions :from => :processing, :to => :sleeping
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/models/sub_class.rb
CHANGED
@@ -1,7 +1,18 @@
|
|
1
1
|
require_relative 'super_class'
|
2
|
+
|
2
3
|
class SubClassWithMoreStates < SuperClass
|
3
4
|
include AASM
|
4
5
|
aasm do
|
5
6
|
state :foo
|
6
7
|
end
|
7
8
|
end
|
9
|
+
|
10
|
+
class SubClassWithMoreStatesMultiple < SuperClassMultiple
|
11
|
+
include AASM
|
12
|
+
aasm(:left) do
|
13
|
+
state :foo
|
14
|
+
end
|
15
|
+
aasm(:right) do
|
16
|
+
state :archived
|
17
|
+
end
|
18
|
+
end
|
data/spec/models/super_class.rb
CHANGED
@@ -16,3 +16,31 @@ class SuperClass
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
class SuperClassMultiple
|
21
|
+
include AASM
|
22
|
+
|
23
|
+
aasm(:left) do
|
24
|
+
state :read
|
25
|
+
state :ended
|
26
|
+
|
27
|
+
event :foo do
|
28
|
+
transitions :to => :ended, :from => [:read]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
aasm(:right) do
|
33
|
+
state :opened
|
34
|
+
state :closed
|
35
|
+
|
36
|
+
event :close do
|
37
|
+
transitions :to => :closed, :from => [:opened]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_state
|
42
|
+
if may_foo?
|
43
|
+
foo!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/spec/models/transactor.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
|
2
3
|
class Transactor < ActiveRecord::Base
|
3
4
|
|
4
5
|
belongs_to :worker
|
@@ -24,3 +25,29 @@ private
|
|
24
25
|
end
|
25
26
|
|
26
27
|
end
|
28
|
+
|
29
|
+
class MultipleTransactor < ActiveRecord::Base
|
30
|
+
|
31
|
+
belongs_to :worker
|
32
|
+
|
33
|
+
include AASM
|
34
|
+
aasm :left, :column => :status do
|
35
|
+
state :sleeping, :initial => true
|
36
|
+
state :running, :before_enter => :start_worker, :after_enter => :fail
|
37
|
+
|
38
|
+
event :run do
|
39
|
+
transitions :to => :running, :from => :sleeping
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def start_worker
|
46
|
+
worker.update_attribute(:status, 'running')
|
47
|
+
end
|
48
|
+
|
49
|
+
def fail
|
50
|
+
raise StandardError.new('failed on purpose')
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -9,3 +9,15 @@ class ValidStateName
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
class ValidStateNameMultiple
|
14
|
+
include AASM
|
15
|
+
aasm(:left) do
|
16
|
+
state :invalid, :initial => true
|
17
|
+
state :valid
|
18
|
+
|
19
|
+
event :valid do
|
20
|
+
transitions :to => :valid, :from => [:invalid]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/models/validator.rb
CHANGED
@@ -38,3 +38,42 @@ class Validator < ActiveRecord::Base
|
|
38
38
|
raise StandardError.new('failed on purpose')
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
class MultipleValidator < ActiveRecord::Base
|
43
|
+
|
44
|
+
include AASM
|
45
|
+
aasm :left, :column => :status do
|
46
|
+
state :sleeping, :initial => true
|
47
|
+
state :running
|
48
|
+
state :failed, :after_enter => :fail
|
49
|
+
|
50
|
+
event :run, :after_commit => :change_name! do
|
51
|
+
transitions :to => :running, :from => :sleeping
|
52
|
+
end
|
53
|
+
event :sleep do
|
54
|
+
after_commit do |name|
|
55
|
+
change_name_on_sleep name
|
56
|
+
end
|
57
|
+
transitions :to => :sleeping, :from => :running
|
58
|
+
end
|
59
|
+
event :fail do
|
60
|
+
transitions :to => :failed, :from => [:sleeping, :running]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
validates_presence_of :name
|
65
|
+
|
66
|
+
def change_name!
|
67
|
+
self.name = "name changed"
|
68
|
+
save!
|
69
|
+
end
|
70
|
+
|
71
|
+
def change_name_on_sleep name
|
72
|
+
self.name = name
|
73
|
+
save!
|
74
|
+
end
|
75
|
+
|
76
|
+
def fail
|
77
|
+
raise StandardError.new('failed on purpose')
|
78
|
+
end
|
79
|
+
end
|