aasm 4.12.3 → 5.1.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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.travis.yml +48 -18
- data/Appraisals +50 -26
- data/CHANGELOG.md +75 -3
- data/Dockerfile +44 -0
- data/Gemfile +2 -3
- data/README.md +216 -110
- data/aasm.gemspec +2 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_4.2.gemfile +9 -8
- data/gemfiles/rails_4.2_mongoid_5.gemfile +6 -5
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +6 -6
- 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.rb +5 -2
- data/lib/aasm/aasm.rb +30 -27
- data/lib/aasm/base.rb +25 -7
- data/lib/aasm/core/event.rb +14 -24
- 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 +10 -9
- data/lib/aasm/core/transition.rb +7 -68
- data/lib/aasm/errors.rb +4 -3
- data/lib/aasm/instance_base.rb +16 -4
- data/lib/aasm/persistence.rb +3 -0
- data/lib/aasm/persistence/active_record_persistence.rb +25 -5
- data/lib/aasm/persistence/base.rb +1 -1
- 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 +1 -1
- data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
- data/lib/aasm/persistence/orm.rb +23 -19
- data/lib/aasm/persistence/plain_persistence.rb +2 -1
- data/lib/aasm/persistence/redis_persistence.rb +1 -1
- data/lib/aasm/persistence/sequel_persistence.rb +0 -1
- 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/version.rb +1 -1
- data/lib/generators/aasm/orm_helpers.rb +6 -0
- data/lib/generators/active_record/aasm_generator.rb +3 -1
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +1 -0
- data/spec/database.rb +16 -1
- data/spec/en.yml +0 -3
- data/spec/generators/active_record_generator_spec.rb +6 -0
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/{en_deprecated_style.yml → localizer_test_model_deprecated_style.yml} +0 -4
- data/spec/localizer_test_model_new_style.yml +5 -0
- data/spec/models/active_record/active_record_callback.rb +93 -0
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/active_record/localizer_test_model.rb +3 -3
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/active_record/simple_new_dsl.rb +15 -0
- data/spec/models/active_record/work.rb +3 -0
- 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/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/nobrainer/simple_no_brainer.rb +23 -0
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/simple_example.rb +8 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/spec_helpers/active_record.rb +2 -1
- data/spec/spec_helpers/dynamoid.rb +7 -5
- data/spec/spec_helpers/mongoid.rb +20 -1
- data/spec/spec_helpers/nobrainer.rb +15 -0
- data/spec/spec_helpers/redis.rb +5 -2
- data/spec/spec_helpers/sequel.rb +1 -1
- data/spec/unit/abstract_class_spec.rb +27 -0
- data/spec/unit/api_spec.rb +4 -0
- data/spec/unit/callback_multiple_spec.rb +7 -3
- data/spec/unit/callbacks_spec.rb +32 -2
- data/spec/unit/complex_example_spec.rb +0 -1
- data/spec/unit/event_spec.rb +13 -0
- data/spec/unit/exception_spec.rb +1 -1
- 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 +9 -10
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +4 -4
- data/spec/unit/persistence/active_record_persistence_spec.rb +109 -4
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -4
- data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -4
- 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/rspec_matcher_spec.rb +9 -0
- data/spec/unit/simple_example_spec.rb +15 -0
- data/spec/unit/state_spec.rb +23 -7
- data/spec/unit/transition_spec.rb +1 -1
- data/test/minitest_helper.rb +2 -2
- data/test/unit/minitest_matcher_test.rb +1 -1
- metadata +106 -12
- data/callbacks.txt +0 -51
- data/gemfiles/rails_3.2.gemfile +0 -13
- data/gemfiles/rails_4.0.gemfile +0 -15
@@ -0,0 +1,93 @@
|
|
1
|
+
class ActiveRecordCallback < ActiveRecord::Base
|
2
|
+
include AASM
|
3
|
+
|
4
|
+
def reset_data
|
5
|
+
@data = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
@data.join(' ')
|
10
|
+
end
|
11
|
+
|
12
|
+
aasm column: :status do
|
13
|
+
before_all_events :before_all_events
|
14
|
+
after_all_events :after_all_events
|
15
|
+
ensure_on_all_events :ensure_on_all_events
|
16
|
+
after_all_transitions :after_all_transitions
|
17
|
+
|
18
|
+
state :open, :initial => true,
|
19
|
+
:before_enter => :before_enter_open,
|
20
|
+
:enter => :enter_open,
|
21
|
+
:after_enter => :after_enter_open,
|
22
|
+
:before_exit => :before_exit_open,
|
23
|
+
:exit => :exit_open,
|
24
|
+
:after_exit => :after_exit_open
|
25
|
+
|
26
|
+
state :closed,
|
27
|
+
:before_enter => :before_enter_closed,
|
28
|
+
:enter => :enter_closed,
|
29
|
+
:after_enter => :after_enter_closed,
|
30
|
+
:before_exit => :before_exit_closed,
|
31
|
+
:exit => :exit_closed,
|
32
|
+
:after_exit => :after_exit_closed
|
33
|
+
|
34
|
+
event :close,
|
35
|
+
:before => :before_event,
|
36
|
+
:after => :after_event,
|
37
|
+
:guard => :event_guard,
|
38
|
+
:before_success => :event_before_success,
|
39
|
+
:after_commit => :event_after_commit,
|
40
|
+
:ensure => :ensure_event do
|
41
|
+
transitions :to => :closed, :from => [:open],
|
42
|
+
:guard => :transition_guard,
|
43
|
+
:after => :after_transition,
|
44
|
+
:success => :success_transition
|
45
|
+
end
|
46
|
+
|
47
|
+
event :open, :before => :before_event, :after => :after_event do
|
48
|
+
transitions :to => :open, :from => :closed
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def log(text)
|
53
|
+
@data ||= []
|
54
|
+
@data << text
|
55
|
+
#puts text
|
56
|
+
end
|
57
|
+
|
58
|
+
def aasm_write_state(*args); log('aasm_write_state'); true; end
|
59
|
+
def before_enter_open; log('before_enter_open'); end
|
60
|
+
def enter_open; log('enter_open'); end
|
61
|
+
def before_exit_open; log('before_exit_open'); end
|
62
|
+
def after_enter_open; log('after_enter_open'); end
|
63
|
+
def exit_open; log('exit_open'); end
|
64
|
+
def after_exit_open; log('after_exit_open'); end
|
65
|
+
|
66
|
+
def before_enter_closed; log('before_enter_closed'); end
|
67
|
+
def enter_closed; log('enter_closed'); end
|
68
|
+
def before_exit_closed; log('before_exit_closed'); end
|
69
|
+
def exit_closed; log('exit_closed'); end
|
70
|
+
def after_enter_closed; log('after_enter_closed'); end
|
71
|
+
def after_exit_closed; log('after_exit_closed'); end
|
72
|
+
|
73
|
+
def event_guard; log('event_guard'); !@fail_event_guard; end
|
74
|
+
def transition_guard; log('transition_guard'); !@fail_transition_guard; end
|
75
|
+
|
76
|
+
def event_before_success; log('event_before_success'); end
|
77
|
+
|
78
|
+
def after_transition; log('after_transition'); end
|
79
|
+
def after_all_transitions; log('after_all_transitions'); end
|
80
|
+
|
81
|
+
def before_all_events; log('before_all_events') end
|
82
|
+
def before_event; log('before_event'); end
|
83
|
+
def after_event; log('after_event'); end
|
84
|
+
def after_all_events; log('after_all_events'); end
|
85
|
+
|
86
|
+
def after_transition; log('after_transition'); end
|
87
|
+
def success_transition; log('transition_success'); end
|
88
|
+
|
89
|
+
def ensure_event; log('ensure'); end
|
90
|
+
def ensure_on_all_events; log('ensure'); end
|
91
|
+
|
92
|
+
def event_after_commit; log('after_commit'); end
|
93
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class InstanceLevelSkipValidationExample < ActiveRecord::Base
|
2
|
+
include AASM
|
3
|
+
|
4
|
+
aasm :state do
|
5
|
+
state :new, :initial => true
|
6
|
+
state :draft
|
7
|
+
state :complete
|
8
|
+
|
9
|
+
event :set_draft do
|
10
|
+
transitions from: :new, to: :draft
|
11
|
+
end
|
12
|
+
|
13
|
+
event :complete do
|
14
|
+
transitions from: %i[draft new], to: :complete
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
validates :some_string, presence: true
|
19
|
+
end
|
@@ -11,13 +11,13 @@ end
|
|
11
11
|
|
12
12
|
describe 'localized state names' do
|
13
13
|
before(:all) do
|
14
|
-
I18n.load_path << 'spec/
|
15
|
-
I18n.default_locale = :en
|
14
|
+
I18n.load_path << 'spec/localizer_test_model_new_style.yml'
|
16
15
|
I18n.reload!
|
17
16
|
end
|
18
17
|
|
19
18
|
after(:all) do
|
20
|
-
I18n.load_path.
|
19
|
+
I18n.load_path.delete('spec/localizer_test_model_new_style.yml')
|
20
|
+
I18n.backend.load_translations
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should localize' do
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Base < ActiveRecord::Base
|
2
|
+
include AASM
|
3
|
+
|
4
|
+
aasm column: 'status' do
|
5
|
+
state :inactive, initial: true
|
6
|
+
state :active
|
7
|
+
|
8
|
+
event :activate do
|
9
|
+
transitions from: :inactive, to: :active
|
10
|
+
end
|
11
|
+
|
12
|
+
event :deactivate do
|
13
|
+
transitions from: :active, to: :inactive
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
self.abstract_class = true
|
18
|
+
self.table_name = 'users'
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
class Person < Base
|
23
|
+
end
|
@@ -15,3 +15,18 @@ class MultipleSimpleNewDsl < ActiveRecord::Base
|
|
15
15
|
state :new
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
class AbstractClassDsl < ActiveRecord::Base
|
20
|
+
include AASM
|
21
|
+
|
22
|
+
self.abstract_class = true
|
23
|
+
|
24
|
+
aasm :column => :status
|
25
|
+
aasm do
|
26
|
+
state :unknown_scope, :another_unknown_scope
|
27
|
+
state :new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class ImplementedAbstractClassDsl < AbstractClassDsl
|
32
|
+
end
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
8
8
|
state :closed
|
9
9
|
state :out_to_lunch
|
10
10
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method3 do
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method, :success => :success_method
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2, :success => :success_method2
|
14
14
|
end
|
@@ -16,6 +16,8 @@ module Callbacks
|
|
16
16
|
|
17
17
|
def before_method(arg); end
|
18
18
|
|
19
|
+
def before_success_method(arg); end
|
20
|
+
|
19
21
|
def after_method(arg); end
|
20
22
|
|
21
23
|
def transition_method(arg); end
|
@@ -26,5 +28,7 @@ module Callbacks
|
|
26
28
|
|
27
29
|
def success_method2(arg); end
|
28
30
|
|
31
|
+
def success_method3(arg); end
|
32
|
+
|
29
33
|
end
|
30
34
|
end
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
8
8
|
state :closed
|
9
9
|
state :out_to_lunch
|
10
10
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method do
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2
|
14
14
|
end
|
@@ -16,11 +16,14 @@ module Callbacks
|
|
16
16
|
|
17
17
|
def before_method(arg); end
|
18
18
|
|
19
|
+
def before_success_method(arg); end
|
20
|
+
|
19
21
|
def after_method(arg); end
|
20
22
|
|
21
23
|
def transition_method(arg); end
|
22
24
|
|
23
25
|
def transition_method2(arg); end
|
24
26
|
|
27
|
+
def success_method(arg); end
|
25
28
|
end
|
26
29
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class ComplexNoBrainerExample
|
2
|
+
include NoBrainer::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
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class InvalidPersistorNoBrainer
|
2
|
+
include NoBrainer::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :name
|
6
|
+
field :status
|
7
|
+
|
8
|
+
aasm :left, column: :status, skip_validation_on_save: true do
|
9
|
+
state :sleeping, initial: true
|
10
|
+
state :running
|
11
|
+
event :run do
|
12
|
+
transitions to: :running, from: :sleeping
|
13
|
+
end
|
14
|
+
event :sleep do
|
15
|
+
transitions to: :sleeping, from: :running
|
16
|
+
end
|
17
|
+
end
|
18
|
+
validates_presence_of :name
|
19
|
+
end
|
20
|
+
|
21
|
+
class MultipleInvalidPersistorNoBrainer
|
22
|
+
include NoBrainer::Document
|
23
|
+
include AASM
|
24
|
+
|
25
|
+
field :name
|
26
|
+
field :status
|
27
|
+
|
28
|
+
aasm :left, column: :status, skip_validation_on_save: true do
|
29
|
+
state :sleeping, initial: true
|
30
|
+
state :running
|
31
|
+
event :run do
|
32
|
+
transitions to: :running, from: :sleeping
|
33
|
+
end
|
34
|
+
event :sleep do
|
35
|
+
transitions to: :sleeping, from: :running
|
36
|
+
end
|
37
|
+
end
|
38
|
+
validates_presence_of :name
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class NoScopeNoBrainer
|
2
|
+
include NoBrainer::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :status, type: String
|
6
|
+
|
7
|
+
aasm create_scopes: false, column: :status do
|
8
|
+
state :ignored_scope
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class NoScopeNoBrainerMultiple
|
13
|
+
include NoBrainer::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
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Parent
|
2
|
+
include NoBrainer::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :status, type: String
|
6
|
+
has_many :childs
|
7
|
+
|
8
|
+
aasm column: :status do
|
9
|
+
state :unknown_scope
|
10
|
+
state :new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Child
|
15
|
+
include NoBrainer::Document
|
16
|
+
include AASM
|
17
|
+
|
18
|
+
field :status, type: String
|
19
|
+
belongs_to :parent
|
20
|
+
|
21
|
+
aasm column: :status do
|
22
|
+
state :unknown_scope
|
23
|
+
state :new
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class SilentPersistorNoBrainer
|
2
|
+
include NoBrainer::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :name
|
6
|
+
field :status
|
7
|
+
|
8
|
+
aasm :left, column: :status, whiny_persistence: false do
|
9
|
+
state :sleeping, initial: true
|
10
|
+
state :running
|
11
|
+
event :run do
|
12
|
+
transitions to: :running, from: :sleeping
|
13
|
+
end
|
14
|
+
event :sleep do
|
15
|
+
transitions to: :sleeping, from: :running
|
16
|
+
end
|
17
|
+
end
|
18
|
+
validates_presence_of :name
|
19
|
+
end
|
20
|
+
|
21
|
+
class MultipleSilentPersistorNoBrainer
|
22
|
+
include NoBrainer::Document
|
23
|
+
include AASM
|
24
|
+
|
25
|
+
field :name
|
26
|
+
field :status
|
27
|
+
|
28
|
+
aasm :left, column: :status, whiny_persistence: false do
|
29
|
+
state :sleeping, initial: true
|
30
|
+
state :running
|
31
|
+
event :run do
|
32
|
+
transitions to: :running, from: :sleeping
|
33
|
+
end
|
34
|
+
event :sleep do
|
35
|
+
transitions to: :sleeping, from: :running
|
36
|
+
end
|
37
|
+
end
|
38
|
+
validates_presence_of :name
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class SimpleNewDslNoBrainer
|
2
|
+
include NoBrainer::Document
|
3
|
+
include AASM
|
4
|
+
|
5
|
+
field :status, type: String
|
6
|
+
|
7
|
+
aasm column: :status
|
8
|
+
aasm do
|
9
|
+
state :unknown_scope, initial: true
|
10
|
+
state :new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class SimpleNewDslNoBrainerMultiple
|
15
|
+
include NoBrainer::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
|