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.
Files changed (114) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.travis.yml +48 -18
  5. data/Appraisals +50 -26
  6. data/CHANGELOG.md +75 -3
  7. data/Dockerfile +44 -0
  8. data/Gemfile +2 -3
  9. data/README.md +216 -110
  10. data/aasm.gemspec +2 -0
  11. data/docker-compose.yml +40 -0
  12. data/gemfiles/norails.gemfile +10 -0
  13. data/gemfiles/rails_4.2.gemfile +9 -8
  14. data/gemfiles/rails_4.2_mongoid_5.gemfile +6 -5
  15. data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
  16. data/gemfiles/rails_5.0.gemfile +6 -6
  17. data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
  18. data/gemfiles/rails_5.1.gemfile +14 -0
  19. data/gemfiles/rails_5.2.gemfile +14 -0
  20. data/lib/aasm.rb +5 -2
  21. data/lib/aasm/aasm.rb +30 -27
  22. data/lib/aasm/base.rb +25 -7
  23. data/lib/aasm/core/event.rb +14 -24
  24. data/lib/aasm/core/invoker.rb +129 -0
  25. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  26. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  27. data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
  28. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  29. data/lib/aasm/core/state.rb +10 -9
  30. data/lib/aasm/core/transition.rb +7 -68
  31. data/lib/aasm/errors.rb +4 -3
  32. data/lib/aasm/instance_base.rb +16 -4
  33. data/lib/aasm/persistence.rb +3 -0
  34. data/lib/aasm/persistence/active_record_persistence.rb +25 -5
  35. data/lib/aasm/persistence/base.rb +1 -1
  36. data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
  37. data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
  38. data/lib/aasm/persistence/mongoid_persistence.rb +1 -1
  39. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  40. data/lib/aasm/persistence/orm.rb +23 -19
  41. data/lib/aasm/persistence/plain_persistence.rb +2 -1
  42. data/lib/aasm/persistence/redis_persistence.rb +1 -1
  43. data/lib/aasm/persistence/sequel_persistence.rb +0 -1
  44. data/lib/aasm/rspec/allow_event.rb +5 -1
  45. data/lib/aasm/rspec/allow_transition_to.rb +5 -1
  46. data/lib/aasm/rspec/transition_from.rb +5 -1
  47. data/lib/aasm/version.rb +1 -1
  48. data/lib/generators/aasm/orm_helpers.rb +6 -0
  49. data/lib/generators/active_record/aasm_generator.rb +3 -1
  50. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  51. data/lib/motion-aasm.rb +1 -0
  52. data/spec/database.rb +16 -1
  53. data/spec/en.yml +0 -3
  54. data/spec/generators/active_record_generator_spec.rb +6 -0
  55. data/spec/generators/no_brainer_generator_spec.rb +29 -0
  56. data/spec/{en_deprecated_style.yml → localizer_test_model_deprecated_style.yml} +0 -4
  57. data/spec/localizer_test_model_new_style.yml +5 -0
  58. data/spec/models/active_record/active_record_callback.rb +93 -0
  59. data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
  60. data/spec/models/active_record/localizer_test_model.rb +3 -3
  61. data/spec/models/active_record/person.rb +23 -0
  62. data/spec/models/active_record/simple_new_dsl.rb +15 -0
  63. data/spec/models/active_record/work.rb +3 -0
  64. data/spec/models/callbacks/with_state_arg.rb +5 -1
  65. data/spec/models/callbacks/with_state_arg_multiple.rb +4 -1
  66. data/spec/models/default_state.rb +1 -1
  67. data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
  68. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
  69. data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
  70. data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
  71. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
  72. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
  73. data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
  74. data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
  75. data/spec/models/simple_example.rb +8 -0
  76. data/spec/models/simple_example_with_guard_args.rb +17 -0
  77. data/spec/spec_helper.rb +15 -0
  78. data/spec/spec_helpers/active_record.rb +2 -1
  79. data/spec/spec_helpers/dynamoid.rb +7 -5
  80. data/spec/spec_helpers/mongoid.rb +20 -1
  81. data/spec/spec_helpers/nobrainer.rb +15 -0
  82. data/spec/spec_helpers/redis.rb +5 -2
  83. data/spec/spec_helpers/sequel.rb +1 -1
  84. data/spec/unit/abstract_class_spec.rb +27 -0
  85. data/spec/unit/api_spec.rb +4 -0
  86. data/spec/unit/callback_multiple_spec.rb +7 -3
  87. data/spec/unit/callbacks_spec.rb +32 -2
  88. data/spec/unit/complex_example_spec.rb +0 -1
  89. data/spec/unit/event_spec.rb +13 -0
  90. data/spec/unit/exception_spec.rb +1 -1
  91. data/spec/unit/inspection_multiple_spec.rb +9 -5
  92. data/spec/unit/inspection_spec.rb +7 -3
  93. data/spec/unit/invoker_spec.rb +189 -0
  94. data/spec/unit/invokers/base_invoker_spec.rb +72 -0
  95. data/spec/unit/invokers/class_invoker_spec.rb +95 -0
  96. data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
  97. data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
  98. data/spec/unit/localizer_spec.rb +9 -10
  99. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +4 -4
  100. data/spec/unit/persistence/active_record_persistence_spec.rb +109 -4
  101. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -4
  102. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -4
  103. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
  104. data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
  105. data/spec/unit/rspec_matcher_spec.rb +9 -0
  106. data/spec/unit/simple_example_spec.rb +15 -0
  107. data/spec/unit/state_spec.rb +23 -7
  108. data/spec/unit/transition_spec.rb +1 -1
  109. data/test/minitest_helper.rb +2 -2
  110. data/test/unit/minitest_matcher_test.rb +1 -1
  111. metadata +106 -12
  112. data/callbacks.txt +0 -51
  113. data/gemfiles/rails_3.2.gemfile +0 -13
  114. data/gemfiles/rails_4.0.gemfile +0 -15
@@ -1,9 +1,5 @@
1
1
  en:
2
2
  activerecord:
3
- events:
4
- localizer_test_model:
5
- close: "Let's close it!"
6
-
7
3
  attributes:
8
4
  localizer_test_model:
9
5
  aasm_state:
@@ -0,0 +1,5 @@
1
+ en:
2
+ activerecord:
3
+ attributes:
4
+ localizer_test_model:
5
+ aasm_state/opened: "It's open now!"
@@ -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/en.yml'
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.clear
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
@@ -0,0 +1,3 @@
1
+ class Work < ActiveRecord::Base
2
+ include AASM
3
+ 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
@@ -2,7 +2,7 @@ class DefaultState
2
2
  attr_accessor :transient_store, :persisted_store
3
3
  include AASM
4
4
  aasm do
5
- state :alpha, :initial => true
5
+ state :alpha, :initial => true, display: 'ALPHA'
6
6
  state :beta
7
7
  state :gamma
8
8
  event :release do
@@ -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