aasm 4.12.0 → 4.12.1
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/.travis.yml +5 -1
- data/Appraisals +2 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -1
- data/README.md +102 -8
- data/gemfiles/rails_4.2.gemfile +1 -0
- data/gemfiles/rails_5.0.gemfile +1 -0
- data/lib/aasm/base.rb +8 -0
- data/lib/aasm/core/event.rb +1 -1
- data/lib/aasm/core/transition.rb +1 -1
- data/lib/aasm/instance_base.rb +0 -2
- data/lib/aasm/minitest.rb +5 -0
- data/lib/aasm/minitest/allow_event.rb +13 -0
- data/lib/aasm/minitest/allow_transition_to.rb +13 -0
- data/lib/aasm/minitest/have_state.rb +13 -0
- data/lib/aasm/minitest/transition_from.rb +21 -0
- data/lib/aasm/minitest_spec.rb +15 -0
- data/lib/aasm/persistence/active_record_persistence.rb +25 -101
- data/lib/aasm/persistence/base.rb +7 -3
- data/lib/aasm/persistence/mongoid_persistence.rb +15 -60
- data/lib/aasm/persistence/orm.rb +142 -0
- data/lib/aasm/persistence/redis_persistence.rb +16 -11
- data/lib/aasm/persistence/sequel_persistence.rb +36 -63
- data/lib/aasm/version.rb +1 -1
- data/lib/generators/active_record/templates/migration.rb +1 -1
- data/lib/generators/active_record/templates/migration_existing.rb +1 -1
- data/lib/motion-aasm.rb +2 -0
- data/spec/models/active_record/complex_active_record_example.rb +5 -1
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/namespaced_multiple_example.rb +14 -0
- data/spec/models/redis/complex_redis_example.rb +40 -0
- data/spec/models/redis/redis_multiple.rb +20 -0
- data/spec/models/redis/redis_simple.rb +20 -0
- data/spec/models/sequel/complex_sequel_example.rb +4 -3
- data/spec/models/sequel/invalid_persistor.rb +52 -0
- data/spec/models/sequel/sequel_multiple.rb +13 -13
- data/spec/models/sequel/sequel_simple.rb +13 -12
- data/spec/models/sequel/silent_persistor.rb +50 -0
- data/spec/models/sequel/transactor.rb +112 -0
- data/spec/models/sequel/validator.rb +93 -0
- data/spec/models/sequel/worker.rb +12 -0
- data/spec/spec_helpers/redis.rb +8 -0
- data/spec/unit/guard_spec.rb +17 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +22 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +4 -4
- data/spec/unit/persistence/active_record_persistence_spec.rb +4 -4
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
- data/spec/unit/persistence/redis_persistence_spec.rb +5 -25
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +2 -2
- data/spec/unit/persistence/sequel_persistence_spec.rb +275 -2
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- metadata +35 -2
data/lib/aasm/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class Add<%= column_name.camelize %>To<%= table_name.camelize %> < ActiveRecord::Migration
|
1
|
+
class Add<%= column_name.camelize %>To<%= table_name.camelize %> < ActiveRecord::Migration[<%= ActiveRecord::VERSION::STRING.to_f %>]
|
2
2
|
def change
|
3
3
|
add_column :<%= table_name %>, :<%= column_name %>, :string
|
4
4
|
end
|
data/lib/motion-aasm.rb
CHANGED
@@ -7,7 +7,7 @@ class ComplexActiveRecordExample < ActiveRecord::Base
|
|
7
7
|
state :three
|
8
8
|
|
9
9
|
event :increment do
|
10
|
-
transitions :from => :one, :to => :two
|
10
|
+
transitions :from => :one, :to => :two, guard: :allowed?
|
11
11
|
transitions :from => :two, :to => :three
|
12
12
|
end
|
13
13
|
event :reset do
|
@@ -15,6 +15,10 @@ class ComplexActiveRecordExample < ActiveRecord::Base
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def allowed?
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
18
22
|
aasm :right, :column => 'right' do
|
19
23
|
state :alpha, :initial => true
|
20
24
|
state :beta
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class GuardianWithoutFromSpecified
|
2
|
+
include AASM
|
3
|
+
|
4
|
+
aasm do
|
5
|
+
state :alpha, :initial => true
|
6
|
+
state :beta
|
7
|
+
state :gamma
|
8
|
+
|
9
|
+
event :use_guards_where_the_first_fails do
|
10
|
+
transitions :to => :beta, :guard => :fail
|
11
|
+
transitions :to => :gamma, :guard => :succeed
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def fail; false; end
|
17
|
+
def succeed; true; end
|
18
|
+
end
|
@@ -25,4 +25,18 @@ class NamespacedMultipleExample
|
|
25
25
|
transitions :from => :approved, :to => :unapproved
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
# Test namespace event methods with suffix (ie may_sell_car?, sell_car!)
|
30
|
+
aasm(:car, namespace: :car) do
|
31
|
+
state :unsold, :initial => true
|
32
|
+
state :sold
|
33
|
+
|
34
|
+
event :sell do
|
35
|
+
transitions :from => :unsold, :to => :sold
|
36
|
+
end
|
37
|
+
|
38
|
+
event :return do
|
39
|
+
transitions :from => :sold, :to => :unsold
|
40
|
+
end
|
41
|
+
end
|
28
42
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class RedisComplexExample
|
2
|
+
include Redis::Objects
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
value :left
|
6
|
+
value :right
|
7
|
+
|
8
|
+
def id
|
9
|
+
1
|
10
|
+
end
|
11
|
+
|
12
|
+
aasm :left, :column => 'left' do
|
13
|
+
state :one, :initial => true
|
14
|
+
state :two
|
15
|
+
state :three
|
16
|
+
|
17
|
+
event :increment do
|
18
|
+
transitions :from => :one, :to => :two
|
19
|
+
transitions :from => :two, :to => :three
|
20
|
+
end
|
21
|
+
event :reset do
|
22
|
+
transitions :from => :three, :to => :one
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
aasm :right, :column => 'right' do
|
27
|
+
state :alpha, :initial => true
|
28
|
+
state :beta
|
29
|
+
state :gamma
|
30
|
+
|
31
|
+
event :level_up do
|
32
|
+
transitions :from => :alpha, :to => :beta
|
33
|
+
transitions :from => :beta, :to => :gamma
|
34
|
+
end
|
35
|
+
event :level_down do
|
36
|
+
transitions :from => :gamma, :to => :beta
|
37
|
+
transitions :from => :beta, :to => :alpha
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RedisMultiple
|
2
|
+
include Redis::Objects
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
value :status
|
6
|
+
|
7
|
+
def id
|
8
|
+
1
|
9
|
+
end
|
10
|
+
|
11
|
+
aasm :left, :column => :status
|
12
|
+
aasm :left do
|
13
|
+
state :alpha, :initial => true
|
14
|
+
state :beta
|
15
|
+
state :gamma
|
16
|
+
event :release do
|
17
|
+
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RedisSimple
|
2
|
+
include Redis::Objects
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
value :status
|
6
|
+
|
7
|
+
def id
|
8
|
+
1
|
9
|
+
end
|
10
|
+
|
11
|
+
aasm :column => :status
|
12
|
+
aasm do
|
13
|
+
state :alpha, :initial => true
|
14
|
+
state :beta
|
15
|
+
state :gamma
|
16
|
+
event :release do
|
17
|
+
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
db = Sequel.connect(SEQUEL_DB)
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
2
|
|
3
3
|
# if you want to see the statements while running the spec enable the following line
|
4
4
|
# db.loggers << Logger.new($stderr)
|
@@ -8,8 +8,8 @@ db.create_table(:complex_sequel_examples) do
|
|
8
8
|
String :right
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
module Sequel
|
12
|
+
class ComplexExample < Sequel::Model(:complex_sequel_examples)
|
13
13
|
|
14
14
|
include AASM
|
15
15
|
|
@@ -43,3 +43,4 @@ class ComplexSequelExample < Sequel::Model(db)
|
|
43
43
|
end
|
44
44
|
|
45
45
|
end
|
46
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
[:invalid_persistors, :multiple_invalid_persistors].each do |table_name|
|
4
|
+
db.create_table(table_name) do
|
5
|
+
primary_key :id
|
6
|
+
String "name"
|
7
|
+
String "status"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Sequel
|
12
|
+
class InvalidPersistor < Sequel::Model(:invalid_persistors)
|
13
|
+
plugin :validation_helpers
|
14
|
+
|
15
|
+
include AASM
|
16
|
+
aasm :column => :status, :skip_validation_on_save => true do
|
17
|
+
state :sleeping, :initial => true
|
18
|
+
state :running
|
19
|
+
event :run do
|
20
|
+
transitions :to => :running, :from => :sleeping
|
21
|
+
end
|
22
|
+
event :sleep do
|
23
|
+
transitions :to => :sleeping, :from => :running
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate
|
28
|
+
super
|
29
|
+
validates_presence :name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class MultipleInvalidPersistor < Sequel::Model(:multiple_invalid_persistors)
|
34
|
+
plugin :validation_helpers
|
35
|
+
|
36
|
+
include AASM
|
37
|
+
aasm :left, :column => :status, :skip_validation_on_save => true do
|
38
|
+
state :sleeping, :initial => true
|
39
|
+
state :running
|
40
|
+
event :run do
|
41
|
+
transitions :to => :running, :from => :sleeping
|
42
|
+
end
|
43
|
+
event :sleep do
|
44
|
+
transitions :to => :sleeping, :from => :running
|
45
|
+
end
|
46
|
+
end
|
47
|
+
def validate
|
48
|
+
super
|
49
|
+
validates_presence :name
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
db = Sequel.connect(SEQUEL_DB)
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
2
|
|
3
3
|
# if you want to see the statements while running the spec enable the following line
|
4
4
|
# db.loggers << Logger.new($stderr)
|
@@ -6,20 +6,20 @@ db.create_table(:multiples) do
|
|
6
6
|
primary_key :id
|
7
7
|
String :status
|
8
8
|
end
|
9
|
+
module Sequel
|
10
|
+
class Multiple < Sequel::Model(:multiples)
|
11
|
+
include AASM
|
9
12
|
|
10
|
-
|
11
|
-
set_dataset(:multiples)
|
12
|
-
include AASM
|
13
|
+
attr_accessor :default
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
15
|
+
aasm :left, :column => :status
|
16
|
+
aasm :left do
|
17
|
+
state :alpha, :initial => true
|
18
|
+
state :beta
|
19
|
+
state :gamma
|
20
|
+
event :release do
|
21
|
+
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
22
|
+
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
db = Sequel.connect(SEQUEL_DB)
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
2
|
|
3
3
|
# if you want to see the statements while running the spec enable the following line
|
4
4
|
# db.loggers << Logger.new($stderr)
|
@@ -7,19 +7,20 @@ db.create_table(:simples) do
|
|
7
7
|
String :status
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
module Sequel
|
11
|
+
class Simple < Sequel::Model(:simples)
|
12
|
+
include AASM
|
13
13
|
|
14
|
-
|
14
|
+
attr_accessor :default
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
[:silent_persistors, :multiple_silent_persistors].each do |t|
|
4
|
+
db.create_table(t) do
|
5
|
+
primary_key :id
|
6
|
+
String "name"
|
7
|
+
String "status"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Sequel
|
12
|
+
class SilentPersistor < Sequel::Model(:silent_persistors)
|
13
|
+
plugin :validation_helpers
|
14
|
+
|
15
|
+
include AASM
|
16
|
+
aasm :column => :status, :whiny_persistence => false do
|
17
|
+
state :sleeping, :initial => true
|
18
|
+
state :running
|
19
|
+
event :run do
|
20
|
+
transitions :to => :running, :from => :sleeping
|
21
|
+
end
|
22
|
+
event :sleep do
|
23
|
+
transitions :to => :sleeping, :from => :running
|
24
|
+
end
|
25
|
+
end
|
26
|
+
def validate
|
27
|
+
validates_presence :name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class MultipleSilentPersistor< Sequel::Model(:multiple_silent_persistors)
|
32
|
+
plugin :validation_helpers
|
33
|
+
|
34
|
+
include AASM
|
35
|
+
aasm :left, :column => :status, :whiny_persistence => false do
|
36
|
+
state :sleeping, :initial => true
|
37
|
+
state :running
|
38
|
+
event :run do
|
39
|
+
transitions :to => :running, :from => :sleeping
|
40
|
+
end
|
41
|
+
event :sleep do
|
42
|
+
transitions :to => :sleeping, :from => :running
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate
|
47
|
+
validates_presence :name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
2
|
+
|
3
|
+
[:transactors, :no_lock_transactors, :lock_transactors, :lock_no_wait_transactors, :multiple_transactors].each do |table_name|
|
4
|
+
db.create_table(table_name) do
|
5
|
+
primary_key :id
|
6
|
+
String "name"
|
7
|
+
String "status"
|
8
|
+
Fixnum "worker_id"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Sequel
|
13
|
+
class Transactor < Sequel::Model(:transactors)
|
14
|
+
|
15
|
+
many_to_one :worker, class: 'Sequel::Worker'
|
16
|
+
|
17
|
+
include AASM
|
18
|
+
aasm :column => :status do
|
19
|
+
state :sleeping, :initial => true
|
20
|
+
state :running, :before_enter => :start_worker, :after_enter => :fail
|
21
|
+
|
22
|
+
event :run do
|
23
|
+
transitions :to => :running, :from => :sleeping
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def start_worker
|
30
|
+
worker.update(status: 'running')
|
31
|
+
end
|
32
|
+
|
33
|
+
def fail
|
34
|
+
raise StandardError.new('failed on purpose')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
class NoLockTransactor < Sequel::Model(:no_lock_transactors)
|
40
|
+
|
41
|
+
many_to_one :worker, class: 'Sequel::Worker'
|
42
|
+
|
43
|
+
include AASM
|
44
|
+
|
45
|
+
aasm :column => :status do
|
46
|
+
state :sleeping, :initial => true
|
47
|
+
state :running
|
48
|
+
|
49
|
+
event :run do
|
50
|
+
transitions :to => :running, :from => :sleeping
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class LockTransactor < Sequel::Model(:lock_transactors)
|
56
|
+
|
57
|
+
many_to_one :worker, class: 'Sequel::Worker'
|
58
|
+
|
59
|
+
include AASM
|
60
|
+
|
61
|
+
aasm :column => :status, requires_lock: true do
|
62
|
+
state :sleeping, :initial => true
|
63
|
+
state :running
|
64
|
+
|
65
|
+
event :run do
|
66
|
+
transitions :to => :running, :from => :sleeping
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class LockNoWaitTransactor < Sequel::Model(:lock_no_wait_transactors)
|
72
|
+
|
73
|
+
many_to_one :worker, class: 'Sequel::Worker'
|
74
|
+
|
75
|
+
include AASM
|
76
|
+
|
77
|
+
aasm :column => :status, requires_lock: 'FOR UPDATE NOWAIT' do
|
78
|
+
state :sleeping, :initial => true
|
79
|
+
state :running
|
80
|
+
|
81
|
+
event :run do
|
82
|
+
transitions :to => :running, :from => :sleeping
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class MultipleTransactor < Sequel::Model(:multiple_transactors)
|
88
|
+
|
89
|
+
many_to_one :worker, class: 'Sequel::Worker'
|
90
|
+
|
91
|
+
include AASM
|
92
|
+
aasm :left, :column => :status do
|
93
|
+
state :sleeping, :initial => true
|
94
|
+
state :running, :before_enter => :start_worker, :after_enter => :fail
|
95
|
+
|
96
|
+
event :run do
|
97
|
+
transitions :to => :running, :from => :sleeping
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def start_worker
|
104
|
+
worker.update(:status, 'running')
|
105
|
+
end
|
106
|
+
|
107
|
+
def fail
|
108
|
+
raise StandardError.new('failed on purpose')
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|