aasm 4.11.1 → 5.2.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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.travis.yml +56 -23
- data/Appraisals +67 -0
- data/CHANGELOG.md +112 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +44 -0
- data/Gemfile +3 -21
- data/Gemfile.lock_old +151 -0
- data/LICENSE +1 -1
- data/README.md +540 -139
- data/Rakefile +6 -1
- data/TESTING.md +25 -0
- data/aasm.gemspec +5 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_4.2.gemfile +13 -11
- data/gemfiles/rails_4.2_mongoid_5.gemfile +8 -11
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +11 -18
- data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +14 -0
- data/gemfiles/rails_5.2.gemfile +14 -0
- data/lib/aasm/aasm.rb +40 -29
- data/lib/aasm/base.rb +61 -11
- data/lib/aasm/configuration.rb +10 -0
- data/lib/aasm/core/event.rb +45 -37
- data/lib/aasm/core/invoker.rb +129 -0
- data/lib/aasm/core/invokers/base_invoker.rb +75 -0
- data/lib/aasm/core/invokers/class_invoker.rb +52 -0
- data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
- data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
- data/lib/aasm/core/state.rb +22 -13
- data/lib/aasm/core/transition.rb +17 -69
- data/lib/aasm/dsl_helper.rb +24 -22
- data/lib/aasm/errors.rb +4 -6
- data/lib/aasm/instance_base.rb +22 -4
- data/lib/aasm/localizer.rb +13 -3
- 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.rb +5 -0
- data/lib/aasm/minitest_spec.rb +15 -0
- data/lib/aasm/persistence/active_record_persistence.rb +49 -105
- data/lib/aasm/persistence/base.rb +20 -5
- data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
- data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
- data/lib/aasm/persistence/mongoid_persistence.rb +26 -32
- data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
- data/lib/aasm/persistence/orm.rb +154 -0
- data/lib/aasm/persistence/plain_persistence.rb +2 -1
- data/lib/aasm/persistence/redis_persistence.rb +16 -11
- data/lib/aasm/persistence/sequel_persistence.rb +36 -64
- data/lib/aasm/persistence.rb +3 -3
- data/lib/aasm/rspec/allow_event.rb +5 -1
- data/lib/aasm/rspec/allow_transition_to.rb +5 -1
- data/lib/aasm/rspec/transition_from.rb +5 -1
- data/lib/aasm/state_machine.rb +4 -2
- data/lib/aasm/state_machine_store.rb +5 -2
- data/lib/aasm/version.rb +1 -1
- data/lib/aasm.rb +5 -2
- data/lib/generators/aasm/orm_helpers.rb +6 -0
- data/lib/generators/active_record/aasm_generator.rb +3 -1
- data/lib/generators/active_record/templates/migration.rb +1 -1
- data/lib/generators/active_record/templates/migration_existing.rb +1 -1
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +3 -1
- data/spec/database.rb +20 -7
- data/spec/en.yml +0 -3
- data/spec/generators/active_record_generator_spec.rb +49 -40
- data/spec/generators/mongoid_generator_spec.rb +4 -6
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/{en_deprecated_style.yml → localizer_test_model_deprecated_style.yml} +6 -3
- data/spec/localizer_test_model_new_style.yml +11 -0
- data/spec/models/active_record/active_record_callback.rb +93 -0
- data/spec/models/active_record/complex_active_record_example.rb +5 -1
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/{invalid_persistor.rb → active_record/invalid_persistor.rb} +0 -2
- data/spec/models/active_record/localizer_test_model.rb +11 -3
- data/spec/models/active_record/namespaced.rb +16 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/{silent_persistor.rb → active_record/silent_persistor.rb} +0 -2
- data/spec/models/active_record/simple_new_dsl.rb +15 -0
- data/spec/models/active_record/timestamp_example.rb +16 -0
- data/spec/models/{transactor.rb → active_record/transactor.rb} +25 -2
- data/spec/models/{validator.rb → active_record/validator.rb} +0 -2
- data/spec/models/active_record/work.rb +3 -0
- data/spec/models/{worker.rb → active_record/worker.rb} +0 -0
- data/spec/models/callbacks/basic.rb +5 -2
- data/spec/models/callbacks/with_state_arg.rb +5 -1
- data/spec/models/callbacks/with_state_arg_multiple.rb +4 -1
- data/spec/models/default_state.rb +1 -1
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/models/guard_with_params.rb +1 -1
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/timestamp_example_mongoid.rb +20 -0
- data/spec/models/mongoid/validator_mongoid.rb +100 -0
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
- data/spec/models/namespaced_multiple_example.rb +14 -0
- data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
- data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
- data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
- data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
- data/spec/models/{mongo_mapper/simple_mongo_mapper.rb → nobrainer/simple_no_brainer.rb} +8 -8
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/parametrised_event.rb +7 -0
- data/spec/models/{mongo_mapper/complex_mongo_mapper_example.rb → redis/complex_redis_example.rb} +8 -5
- 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/models/simple_example.rb +8 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/models/simple_multiple_example.rb +12 -0
- data/spec/models/sub_class.rb +34 -0
- data/spec/models/timestamps_example.rb +19 -0
- data/spec/models/timestamps_with_named_machine_example.rb +13 -0
- data/spec/spec_helper.rb +15 -33
- data/spec/spec_helpers/active_record.rb +8 -0
- data/spec/spec_helpers/dynamoid.rb +35 -0
- data/spec/spec_helpers/mongoid.rb +26 -0
- data/spec/spec_helpers/nobrainer.rb +15 -0
- data/spec/spec_helpers/redis.rb +18 -0
- data/spec/spec_helpers/remove_warnings.rb +1 -0
- data/spec/spec_helpers/sequel.rb +7 -0
- data/spec/unit/abstract_class_spec.rb +27 -0
- data/spec/unit/api_spec.rb +79 -72
- data/spec/unit/callback_multiple_spec.rb +7 -3
- data/spec/unit/callbacks_spec.rb +37 -2
- data/spec/unit/complex_example_spec.rb +12 -3
- data/spec/unit/complex_multiple_example_spec.rb +20 -4
- data/spec/unit/event_multiple_spec.rb +1 -1
- data/spec/unit/event_spec.rb +29 -4
- data/spec/unit/exception_spec.rb +1 -1
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- data/spec/unit/guard_spec.rb +17 -0
- data/spec/unit/guard_with_params_spec.rb +4 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/inspection_multiple_spec.rb +9 -5
- data/spec/unit/inspection_spec.rb +7 -3
- data/spec/unit/invoker_spec.rb +189 -0
- data/spec/unit/invokers/base_invoker_spec.rb +72 -0
- data/spec/unit/invokers/class_invoker_spec.rb +95 -0
- data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
- data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
- data/spec/unit/localizer_spec.rb +85 -52
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +22 -0
- data/spec/unit/override_warning_spec.rb +8 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +468 -447
- data/spec/unit/persistence/active_record_persistence_spec.rb +639 -486
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +4 -9
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +4 -9
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +83 -13
- data/spec/unit/persistence/mongoid_persistence_spec.rb +97 -13
- data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
- data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
- data/spec/unit/persistence/redis_persistence_spec.rb +8 -32
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +6 -11
- data/spec/unit/persistence/sequel_persistence_spec.rb +278 -10
- data/spec/unit/rspec_matcher_spec.rb +9 -0
- data/spec/unit/simple_example_spec.rb +15 -0
- data/spec/unit/simple_multiple_example_spec.rb +28 -0
- data/spec/unit/state_spec.rb +23 -7
- data/spec/unit/subclassing_multiple_spec.rb +37 -2
- data/spec/unit/subclassing_spec.rb +17 -2
- data/spec/unit/timestamps_spec.rb +32 -0
- data/spec/unit/transition_spec.rb +1 -1
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- metadata +213 -37
- data/callbacks.txt +0 -51
- data/gemfiles/rails_3.2_stable.gemfile +0 -15
- data/gemfiles/rails_4.0.gemfile +0 -16
- data/gemfiles/rails_4.0_mongo_mapper.gemfile +0 -16
- data/gemfiles/rails_4.2_mongo_mapper.gemfile +0 -17
- data/lib/aasm/persistence/mongo_mapper_persistence.rb +0 -163
- data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +0 -21
- data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +0 -25
- data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +0 -149
- data/spec/unit/persistence/mongo_mapper_persistence_spec.rb +0 -96
|
@@ -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
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
db = Sequel::DATABASES.first || Sequel.connect(SEQUEL_DB)
|
|
2
|
+
|
|
3
|
+
db.create_table(:validators) do
|
|
4
|
+
primary_key :id
|
|
5
|
+
String "name"
|
|
6
|
+
String "status"
|
|
7
|
+
Fixnum "worker_id"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module Sequel
|
|
11
|
+
class Validator < Sequel::Model(:validators)
|
|
12
|
+
plugin :validation_helpers
|
|
13
|
+
|
|
14
|
+
attr_accessor :after_all_transactions_performed,
|
|
15
|
+
:after_transaction_performed_on_fail,
|
|
16
|
+
:after_transaction_performed_on_run,
|
|
17
|
+
:before_all_transactions_performed,
|
|
18
|
+
:before_transaction_performed_on_fail,
|
|
19
|
+
:before_transaction_performed_on_run,
|
|
20
|
+
:invalid
|
|
21
|
+
|
|
22
|
+
def validate
|
|
23
|
+
super
|
|
24
|
+
errors.add(:validator, "invalid") if invalid
|
|
25
|
+
validates_presence :name
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
include AASM
|
|
29
|
+
|
|
30
|
+
aasm :column => :status, :whiny_persistence => true do
|
|
31
|
+
before_all_transactions :before_all_transactions
|
|
32
|
+
after_all_transactions :after_all_transactions
|
|
33
|
+
|
|
34
|
+
state :sleeping, :initial => true
|
|
35
|
+
state :running
|
|
36
|
+
state :failed, :after_enter => :fail
|
|
37
|
+
|
|
38
|
+
event :run, :after_commit => :change_name! do
|
|
39
|
+
after_transaction do
|
|
40
|
+
@after_transaction_performed_on_run = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
before_transaction do
|
|
44
|
+
@before_transaction_performed_on_run = true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
transitions :to => :running, :from => :sleeping
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
event :sleep do
|
|
51
|
+
after_commit do |name|
|
|
52
|
+
change_name_on_sleep name
|
|
53
|
+
end
|
|
54
|
+
transitions :to => :sleeping, :from => :running
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
event :fail do
|
|
58
|
+
after_transaction do
|
|
59
|
+
@after_transaction_performed_on_fail = true
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
before_transaction do
|
|
63
|
+
@before_transaction_performed_on_fail = true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
transitions :to => :failed, :from => [:sleeping, :running]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def change_name!
|
|
71
|
+
self.name = "name changed"
|
|
72
|
+
save(raise_on_failure: true)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def change_name_on_sleep name
|
|
76
|
+
self.name = name
|
|
77
|
+
save(raise_on_failure: true)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def fail
|
|
81
|
+
raise StandardError.new('failed on purpose')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def after_all_transactions
|
|
85
|
+
@after_all_transactions_performed = true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def before_all_transactions
|
|
89
|
+
@before_all_transactions_performed = true
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
@@ -3,13 +3,21 @@ class SimpleExample
|
|
|
3
3
|
aasm do
|
|
4
4
|
state :initialised, :initial => true
|
|
5
5
|
state :filled_out
|
|
6
|
+
state :denied
|
|
6
7
|
state :authorised
|
|
7
8
|
|
|
8
9
|
event :fill_out do
|
|
9
10
|
transitions :from => :initialised, :to => :filled_out
|
|
10
11
|
end
|
|
12
|
+
|
|
13
|
+
event :deny do
|
|
14
|
+
transitions from: :initialised, to: :denied
|
|
15
|
+
end
|
|
16
|
+
|
|
11
17
|
event :authorise do
|
|
12
18
|
transitions :from => :filled_out, :to => :authorised
|
|
13
19
|
end
|
|
20
|
+
|
|
14
21
|
end
|
|
22
|
+
|
|
15
23
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class SimpleExampleWithGuardArgs
|
|
2
|
+
include AASM
|
|
3
|
+
aasm do
|
|
4
|
+
state :initialised, :initial => true
|
|
5
|
+
state :filled_out_with_args
|
|
6
|
+
|
|
7
|
+
event :fill_out_with_args do
|
|
8
|
+
transitions :guard => [:arg_is_valid?],
|
|
9
|
+
:from => :initialised,
|
|
10
|
+
:to => :filled_out_with_args
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def arg_is_valid?(arg)
|
|
15
|
+
return arg
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -27,4 +27,16 @@ class SimpleMultipleExample
|
|
|
27
27
|
transitions :from => :processing, :to => :sleeping
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
aasm(:question) do
|
|
32
|
+
state :answered, :initial => true
|
|
33
|
+
state :asked
|
|
34
|
+
|
|
35
|
+
event :ask, :binding_event => :start do
|
|
36
|
+
transitions :from => :answered, :to => :asked
|
|
37
|
+
end
|
|
38
|
+
event :answer, :binding_event => :stop do
|
|
39
|
+
transitions :from => :asked, :to => :answered
|
|
40
|
+
end
|
|
41
|
+
end
|
|
30
42
|
end
|
data/spec/models/sub_class.rb
CHANGED
|
@@ -1,7 +1,41 @@
|
|
|
1
1
|
require_relative 'super_class'
|
|
2
2
|
|
|
3
3
|
class SubClass < SuperClass
|
|
4
|
+
# Add an after callback that is not defined in the parent
|
|
5
|
+
aasm.state_machine.events[:foo].options[:after] = [:after_foo_event]
|
|
6
|
+
|
|
7
|
+
# Add global callback that is not defined in the parent
|
|
8
|
+
aasm.state_machine.global_callbacks[:after_all_transitions] = :after_all_event
|
|
9
|
+
|
|
10
|
+
attr_accessor :called_after
|
|
11
|
+
|
|
12
|
+
def after_foo_event
|
|
13
|
+
self.called_after = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def after_all_event; end
|
|
4
17
|
end
|
|
5
18
|
|
|
6
19
|
class SubClassMultiple < SuperClassMultiple
|
|
20
|
+
# Add after callbacks that are not defined in the parent
|
|
21
|
+
aasm(:left).state_machine.events[:foo].options[:after] = [:left_after_foo_event]
|
|
22
|
+
aasm(:right).state_machine.events[:close].options[:after] = [:right_after_close_event]
|
|
23
|
+
|
|
24
|
+
# Add global callback that is not defined in the parent
|
|
25
|
+
aasm(:left).state_machine.global_callbacks[:after_all_transitions] = :left_after_all_event
|
|
26
|
+
aasm(:right).state_machine.global_callbacks[:after_all_transitions] = :right_after_all_event
|
|
27
|
+
|
|
28
|
+
attr_accessor :left_called_after, :right_called_after
|
|
29
|
+
|
|
30
|
+
def left_after_foo_event
|
|
31
|
+
self.left_called_after = true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def right_after_close_event
|
|
35
|
+
self.right_called_after = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def left_after_all_event; end
|
|
39
|
+
|
|
40
|
+
def right_after_all_event; end
|
|
7
41
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class TimestampsExample
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
attr_accessor :opened_at
|
|
5
|
+
attr_reader :closed_at
|
|
6
|
+
|
|
7
|
+
aasm timestamps: true do
|
|
8
|
+
state :opened
|
|
9
|
+
state :closed
|
|
10
|
+
|
|
11
|
+
event :open do
|
|
12
|
+
transitions to: :opened
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
event :close do
|
|
16
|
+
transitions to: :closed
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
+
require 'simplecov'
|
|
2
|
+
SimpleCov.start do
|
|
3
|
+
add_filter '/spec/'
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
if ENV['CI'] == 'true'
|
|
7
|
+
require 'codecov'
|
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
|
9
|
+
end
|
|
10
|
+
|
|
1
11
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
|
2
12
|
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
|
3
13
|
require 'aasm'
|
|
4
14
|
require 'rspec'
|
|
5
15
|
require 'aasm/rspec'
|
|
16
|
+
require 'i18n'
|
|
6
17
|
require 'pry'
|
|
7
18
|
|
|
8
19
|
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
|
@@ -19,41 +30,12 @@ def load_schema
|
|
|
19
30
|
require File.dirname(__FILE__) + "/database.rb"
|
|
20
31
|
end
|
|
21
32
|
|
|
22
|
-
# Dynamoid initialization
|
|
23
|
-
begin
|
|
24
|
-
require 'dynamoid'
|
|
25
|
-
require 'aws-sdk-resources'
|
|
26
|
-
|
|
27
|
-
ENV['ACCESS_KEY'] ||= 'abcd'
|
|
28
|
-
ENV['SECRET_KEY'] ||= '1234'
|
|
29
|
-
|
|
30
|
-
Aws.config.update({
|
|
31
|
-
region: 'us-west-2',
|
|
32
|
-
credentials: Aws::Credentials.new(ENV['ACCESS_KEY'], ENV['SECRET_KEY'])
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
Dynamoid.configure do |config|
|
|
36
|
-
config.namespace = "dynamoid_tests"
|
|
37
|
-
config.endpoint = 'http://127.0.0.1:30180'
|
|
38
|
-
config.warn_on_scan = false
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
Dynamoid.logger.level = Logger::FATAL
|
|
42
|
-
|
|
43
|
-
RSpec.configure do |c|
|
|
44
|
-
c.before(:each) do
|
|
45
|
-
Dynamoid.adapter.list_tables.each do |table|
|
|
46
|
-
Dynamoid.adapter.delete_table(table) if table =~ /^#{Dynamoid::Config.namespace}/
|
|
47
|
-
end
|
|
48
|
-
Dynamoid.adapter.tables.clear
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
rescue LoadError
|
|
52
|
-
# Without Dynamoid settings
|
|
53
|
-
end
|
|
54
|
-
|
|
55
33
|
# custom spec helpers
|
|
56
34
|
Dir[File.dirname(__FILE__) + "/spec_helpers/**/*.rb"].sort.each { |f| require File.expand_path(f) }
|
|
57
35
|
|
|
58
36
|
# example model classes
|
|
59
37
|
Dir[File.dirname(__FILE__) + "/models/*.rb"].sort.each { |f| require File.expand_path(f) }
|
|
38
|
+
|
|
39
|
+
I18n.load_path << 'spec/en.yml'
|
|
40
|
+
I18n.enforce_available_locales = false
|
|
41
|
+
I18n.default_locale = :en
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
begin
|
|
3
|
+
require 'active_record'
|
|
4
|
+
|
|
5
|
+
puts "active_record #{ActiveRecord::VERSION::STRING} gem found, running ActiveRecord specs \e[32m#{'✔'}\e[0m"
|
|
6
|
+
rescue LoadError
|
|
7
|
+
puts "active_record gem not found, not running ActiveRecord specs \e[31m#{'✖'}\e[0m"
|
|
8
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'dynamoid'
|
|
5
|
+
require 'aws-sdk-resources'
|
|
6
|
+
puts "dynamoid #{Dynamoid::VERSION} gem found, running Dynamoid specs \e[32m#{'✔'}\e[0m"
|
|
7
|
+
|
|
8
|
+
ENV['ACCESS_KEY'] ||= 'abcd'
|
|
9
|
+
ENV['SECRET_KEY'] ||= '1234'
|
|
10
|
+
|
|
11
|
+
Aws.config.update(
|
|
12
|
+
region: 'us-west-2',
|
|
13
|
+
credentials: Aws::Credentials.new(ENV['ACCESS_KEY'], ENV['SECRET_KEY'])
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
Dynamoid.configure do |config|
|
|
17
|
+
config.namespace = 'dynamoid_tests'
|
|
18
|
+
config.endpoint = "http://#{ENV['DYNAMODB_HOST'] || '127.0.0.1'}:" \
|
|
19
|
+
"#{ENV['DYNAMODB_PORT'] || 30180}"
|
|
20
|
+
config.warn_on_scan = false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Dynamoid.logger.level = Logger::FATAL
|
|
24
|
+
|
|
25
|
+
RSpec.configure do |c|
|
|
26
|
+
c.before(:each) do
|
|
27
|
+
Dynamoid.adapter.list_tables.each do |table|
|
|
28
|
+
Dynamoid.adapter.delete_table(table) if table =~ /^#{Dynamoid::Config.namespace}/
|
|
29
|
+
end
|
|
30
|
+
Dynamoid.adapter.tables.clear
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
rescue LoadError
|
|
34
|
+
puts "dynamoid gem not found, not running Dynamoid specs \e[31m#{'✖'}\e[0m"
|
|
35
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'mongoid'
|
|
5
|
+
puts "mongoid #{Mongoid::VERSION} gem found, running mongoid specs \e[32m#{'✔'}\e[0m"
|
|
6
|
+
|
|
7
|
+
if Mongoid::VERSION.to_f <= 5
|
|
8
|
+
Mongoid::Config.sessions = {
|
|
9
|
+
default: {
|
|
10
|
+
database: "mongoid_#{Process.pid}",
|
|
11
|
+
hosts: ["#{ENV['MONGODB_HOST'] || 'localhost'}:" \
|
|
12
|
+
"#{ENV['MONGODB_PORT'] || 27017}"]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else
|
|
16
|
+
Mongoid::Config.send(:clients=, {
|
|
17
|
+
default: {
|
|
18
|
+
database: "mongoid_#{Process.pid}",
|
|
19
|
+
hosts: ["#{ENV['MONGODB_HOST'] || 'localhost'}:" \
|
|
20
|
+
"#{ENV['MONGODB_PORT'] || 27017}"]
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
end
|
|
24
|
+
rescue LoadError
|
|
25
|
+
puts "mongoid gem not found, not running mongoid specs \e[31m#{'✖'}\e[0m"
|
|
26
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'nobrainer'
|
|
5
|
+
|
|
6
|
+
NoBrainer.configure do |config|
|
|
7
|
+
config.app_name = :aasm
|
|
8
|
+
config.environment = :test
|
|
9
|
+
config.warn_on_active_record = false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
puts "nobrainer #{Gem.loaded_specs['nobrainer'].version} gem found, running nobrainer specs \e[32m#{'✔'}\e[0m"
|
|
13
|
+
rescue LoadError
|
|
14
|
+
puts "nobrainer gem not found, not running nobrainer specs \e[31m#{'✖'}\e[0m"
|
|
15
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'redis-objects'
|
|
5
|
+
require 'redis/objects/version'
|
|
6
|
+
puts "redis-objects #{Redis::Objects::VERSION} gem found, running Redis specs \e[32m#{'✔'}\e[0m"
|
|
7
|
+
|
|
8
|
+
Redis.current = Redis.new(host: (ENV['REDIS_HOST'] || '127.0.0.1'),
|
|
9
|
+
port: (ENV['REDIS_PORT'] || 6379))
|
|
10
|
+
|
|
11
|
+
RSpec.configure do |c|
|
|
12
|
+
c.before(:each) do
|
|
13
|
+
Redis.current.keys('redis_*').each { |k| Redis.current.del k }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
rescue LoadError
|
|
17
|
+
puts "redis-objects gem not found, not running Redis specs \e[31m#{'✖'}\e[0m"
|
|
18
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AASM::Configuration.hide_warnings = true
|