aasm 5.0.8

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 (262) hide show
  1. checksums.yaml +7 -0
  2. data/.document +6 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.gitignore +20 -0
  6. data/.travis.yml +100 -0
  7. data/API +34 -0
  8. data/Appraisals +71 -0
  9. data/CHANGELOG.md +431 -0
  10. data/CODE_OF_CONDUCT.md +13 -0
  11. data/CONTRIBUTING.md +24 -0
  12. data/Dockerfile +44 -0
  13. data/Gemfile +6 -0
  14. data/Gemfile.lock_old +151 -0
  15. data/HOWTO +12 -0
  16. data/LICENSE +20 -0
  17. data/PLANNED_CHANGES.md +11 -0
  18. data/README.md +1439 -0
  19. data/README_FROM_VERSION_3_TO_4.md +240 -0
  20. data/Rakefile +31 -0
  21. data/TESTING.md +25 -0
  22. data/aasm.gemspec +37 -0
  23. data/callbacks.txt +51 -0
  24. data/docker-compose.yml +40 -0
  25. data/gemfiles/norails.gemfile +10 -0
  26. data/gemfiles/rails_3.2.gemfile +14 -0
  27. data/gemfiles/rails_4.2.gemfile +16 -0
  28. data/gemfiles/rails_4.2_mongoid_5.gemfile +11 -0
  29. data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
  30. data/gemfiles/rails_5.0.gemfile +13 -0
  31. data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
  32. data/gemfiles/rails_5.1.gemfile +13 -0
  33. data/gemfiles/rails_5.2.gemfile +13 -0
  34. data/lib/aasm.rb +23 -0
  35. data/lib/aasm/aasm.rb +208 -0
  36. data/lib/aasm/base.rb +271 -0
  37. data/lib/aasm/configuration.rb +45 -0
  38. data/lib/aasm/core/event.rb +172 -0
  39. data/lib/aasm/core/invoker.rb +129 -0
  40. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  41. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  42. data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
  43. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  44. data/lib/aasm/core/state.rb +90 -0
  45. data/lib/aasm/core/transition.rb +83 -0
  46. data/lib/aasm/dsl_helper.rb +30 -0
  47. data/lib/aasm/errors.rb +21 -0
  48. data/lib/aasm/instance_base.rb +133 -0
  49. data/lib/aasm/localizer.rb +54 -0
  50. data/lib/aasm/minitest.rb +5 -0
  51. data/lib/aasm/minitest/allow_event.rb +13 -0
  52. data/lib/aasm/minitest/allow_transition_to.rb +13 -0
  53. data/lib/aasm/minitest/have_state.rb +13 -0
  54. data/lib/aasm/minitest/transition_from.rb +21 -0
  55. data/lib/aasm/minitest_spec.rb +15 -0
  56. data/lib/aasm/persistence.rb +54 -0
  57. data/lib/aasm/persistence/active_record_persistence.rb +165 -0
  58. data/lib/aasm/persistence/base.rb +78 -0
  59. data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
  60. data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
  61. data/lib/aasm/persistence/mongoid_persistence.rb +126 -0
  62. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  63. data/lib/aasm/persistence/orm.rb +150 -0
  64. data/lib/aasm/persistence/plain_persistence.rb +26 -0
  65. data/lib/aasm/persistence/redis_persistence.rb +112 -0
  66. data/lib/aasm/persistence/sequel_persistence.rb +83 -0
  67. data/lib/aasm/rspec.rb +5 -0
  68. data/lib/aasm/rspec/allow_event.rb +26 -0
  69. data/lib/aasm/rspec/allow_transition_to.rb +26 -0
  70. data/lib/aasm/rspec/have_state.rb +22 -0
  71. data/lib/aasm/rspec/transition_from.rb +36 -0
  72. data/lib/aasm/state_machine.rb +53 -0
  73. data/lib/aasm/state_machine_store.rb +76 -0
  74. data/lib/aasm/version.rb +3 -0
  75. data/lib/generators/aasm/aasm_generator.rb +16 -0
  76. data/lib/generators/aasm/orm_helpers.rb +41 -0
  77. data/lib/generators/active_record/aasm_generator.rb +40 -0
  78. data/lib/generators/active_record/templates/migration.rb +8 -0
  79. data/lib/generators/active_record/templates/migration_existing.rb +5 -0
  80. data/lib/generators/mongoid/aasm_generator.rb +28 -0
  81. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  82. data/lib/motion-aasm.rb +37 -0
  83. data/spec/database.rb +59 -0
  84. data/spec/database.yml +3 -0
  85. data/spec/en.yml +12 -0
  86. data/spec/en_deprecated_style.yml +10 -0
  87. data/spec/generators/active_record_generator_spec.rb +53 -0
  88. data/spec/generators/mongoid_generator_spec.rb +31 -0
  89. data/spec/generators/no_brainer_generator_spec.rb +29 -0
  90. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
  91. data/spec/models/active_record/complex_active_record_example.rb +37 -0
  92. data/spec/models/active_record/derivate_new_dsl.rb +7 -0
  93. data/spec/models/active_record/false_state.rb +35 -0
  94. data/spec/models/active_record/gate.rb +39 -0
  95. data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
  96. data/spec/models/active_record/invalid_persistor.rb +29 -0
  97. data/spec/models/active_record/localizer_test_model.rb +34 -0
  98. data/spec/models/active_record/no_direct_assignment.rb +21 -0
  99. data/spec/models/active_record/no_scope.rb +21 -0
  100. data/spec/models/active_record/persisted_state.rb +12 -0
  101. data/spec/models/active_record/person.rb +23 -0
  102. data/spec/models/active_record/provided_and_persisted_state.rb +24 -0
  103. data/spec/models/active_record/reader.rb +7 -0
  104. data/spec/models/active_record/readme_job.rb +21 -0
  105. data/spec/models/active_record/silent_persistor.rb +29 -0
  106. data/spec/models/active_record/simple_new_dsl.rb +32 -0
  107. data/spec/models/active_record/thief.rb +29 -0
  108. data/spec/models/active_record/transactor.rb +124 -0
  109. data/spec/models/active_record/transient.rb +6 -0
  110. data/spec/models/active_record/validator.rb +118 -0
  111. data/spec/models/active_record/with_enum.rb +39 -0
  112. data/spec/models/active_record/with_enum_without_column.rb +38 -0
  113. data/spec/models/active_record/with_false_enum.rb +31 -0
  114. data/spec/models/active_record/with_true_enum.rb +39 -0
  115. data/spec/models/active_record/work.rb +3 -0
  116. data/spec/models/active_record/worker.rb +2 -0
  117. data/spec/models/active_record/writer.rb +6 -0
  118. data/spec/models/basic_two_state_machines_example.rb +25 -0
  119. data/spec/models/callbacks/basic.rb +98 -0
  120. data/spec/models/callbacks/basic_multiple.rb +75 -0
  121. data/spec/models/callbacks/guard_within_block.rb +67 -0
  122. data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
  123. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +66 -0
  124. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
  125. data/spec/models/callbacks/private_method.rb +44 -0
  126. data/spec/models/callbacks/private_method_multiple.rb +44 -0
  127. data/spec/models/callbacks/with_args.rb +62 -0
  128. data/spec/models/callbacks/with_args_multiple.rb +61 -0
  129. data/spec/models/callbacks/with_state_arg.rb +34 -0
  130. data/spec/models/callbacks/with_state_arg_multiple.rb +29 -0
  131. data/spec/models/complex_example.rb +222 -0
  132. data/spec/models/conversation.rb +93 -0
  133. data/spec/models/default_state.rb +12 -0
  134. data/spec/models/double_definer.rb +21 -0
  135. data/spec/models/dynamoid/complex_dynamoid_example.rb +37 -0
  136. data/spec/models/dynamoid/dynamoid_multiple.rb +18 -0
  137. data/spec/models/dynamoid/dynamoid_simple.rb +18 -0
  138. data/spec/models/foo.rb +106 -0
  139. data/spec/models/foo_callback_multiple.rb +45 -0
  140. data/spec/models/guard_arguments_check.rb +17 -0
  141. data/spec/models/guard_with_params.rb +24 -0
  142. data/spec/models/guard_with_params_multiple.rb +18 -0
  143. data/spec/models/guardian.rb +58 -0
  144. data/spec/models/guardian_multiple.rb +48 -0
  145. data/spec/models/guardian_without_from_specified.rb +18 -0
  146. data/spec/models/initial_state_proc.rb +31 -0
  147. data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
  148. data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
  149. data/spec/models/mongoid/mongoid_relationships.rb +26 -0
  150. data/spec/models/mongoid/no_scope_mongoid.rb +21 -0
  151. data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
  152. data/spec/models/mongoid/simple_mongoid.rb +23 -0
  153. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +25 -0
  154. data/spec/models/mongoid/validator_mongoid.rb +100 -0
  155. data/spec/models/multi_transitioner.rb +34 -0
  156. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
  157. data/spec/models/namespaced_multiple_example.rb +42 -0
  158. data/spec/models/no_initial_state.rb +25 -0
  159. data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
  160. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
  161. data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
  162. data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
  163. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
  164. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
  165. data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
  166. data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
  167. data/spec/models/not_auto_loaded/process.rb +21 -0
  168. data/spec/models/parametrised_event.rb +42 -0
  169. data/spec/models/parametrised_event_multiple.rb +29 -0
  170. data/spec/models/process_with_new_dsl.rb +31 -0
  171. data/spec/models/provided_state.rb +24 -0
  172. data/spec/models/redis/complex_redis_example.rb +40 -0
  173. data/spec/models/redis/redis_multiple.rb +20 -0
  174. data/spec/models/redis/redis_simple.rb +20 -0
  175. data/spec/models/sequel/complex_sequel_example.rb +46 -0
  176. data/spec/models/sequel/invalid_persistor.rb +52 -0
  177. data/spec/models/sequel/sequel_multiple.rb +25 -0
  178. data/spec/models/sequel/sequel_simple.rb +26 -0
  179. data/spec/models/sequel/silent_persistor.rb +50 -0
  180. data/spec/models/sequel/transactor.rb +112 -0
  181. data/spec/models/sequel/validator.rb +93 -0
  182. data/spec/models/sequel/worker.rb +12 -0
  183. data/spec/models/silencer.rb +27 -0
  184. data/spec/models/simple_custom_example.rb +53 -0
  185. data/spec/models/simple_example.rb +23 -0
  186. data/spec/models/simple_example_with_guard_args.rb +17 -0
  187. data/spec/models/simple_multiple_example.rb +42 -0
  188. data/spec/models/state_machine_with_failed_event.rb +20 -0
  189. data/spec/models/states_on_one_line_example.rb +8 -0
  190. data/spec/models/sub_class.rb +41 -0
  191. data/spec/models/sub_class_with_more_states.rb +18 -0
  192. data/spec/models/sub_classing.rb +3 -0
  193. data/spec/models/super_class.rb +46 -0
  194. data/spec/models/this_name_better_not_be_in_use.rb +11 -0
  195. data/spec/models/valid_state_name.rb +23 -0
  196. data/spec/spec_helper.rb +36 -0
  197. data/spec/spec_helpers/active_record.rb +8 -0
  198. data/spec/spec_helpers/dynamoid.rb +35 -0
  199. data/spec/spec_helpers/mongoid.rb +26 -0
  200. data/spec/spec_helpers/nobrainer.rb +15 -0
  201. data/spec/spec_helpers/redis.rb +18 -0
  202. data/spec/spec_helpers/remove_warnings.rb +1 -0
  203. data/spec/spec_helpers/sequel.rb +7 -0
  204. data/spec/unit/abstract_class_spec.rb +27 -0
  205. data/spec/unit/api_spec.rb +100 -0
  206. data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
  207. data/spec/unit/callback_multiple_spec.rb +304 -0
  208. data/spec/unit/callbacks_spec.rb +521 -0
  209. data/spec/unit/complex_example_spec.rb +93 -0
  210. data/spec/unit/complex_multiple_example_spec.rb +115 -0
  211. data/spec/unit/edge_cases_spec.rb +16 -0
  212. data/spec/unit/event_multiple_spec.rb +73 -0
  213. data/spec/unit/event_naming_spec.rb +16 -0
  214. data/spec/unit/event_spec.rb +394 -0
  215. data/spec/unit/exception_spec.rb +11 -0
  216. data/spec/unit/guard_arguments_check_spec.rb +9 -0
  217. data/spec/unit/guard_multiple_spec.rb +60 -0
  218. data/spec/unit/guard_spec.rb +89 -0
  219. data/spec/unit/guard_with_params_multiple_spec.rb +10 -0
  220. data/spec/unit/guard_with_params_spec.rb +14 -0
  221. data/spec/unit/guard_without_from_specified_spec.rb +10 -0
  222. data/spec/unit/initial_state_multiple_spec.rb +15 -0
  223. data/spec/unit/initial_state_spec.rb +12 -0
  224. data/spec/unit/inspection_multiple_spec.rb +201 -0
  225. data/spec/unit/inspection_spec.rb +149 -0
  226. data/spec/unit/invoker_spec.rb +189 -0
  227. data/spec/unit/invokers/base_invoker_spec.rb +72 -0
  228. data/spec/unit/invokers/class_invoker_spec.rb +95 -0
  229. data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
  230. data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
  231. data/spec/unit/localizer_spec.rb +78 -0
  232. data/spec/unit/memory_leak_spec.rb +38 -0
  233. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
  234. data/spec/unit/namespaced_multiple_example_spec.rb +75 -0
  235. data/spec/unit/new_dsl_spec.rb +12 -0
  236. data/spec/unit/override_warning_spec.rb +94 -0
  237. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +618 -0
  238. data/spec/unit/persistence/active_record_persistence_spec.rb +773 -0
  239. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +135 -0
  240. data/spec/unit/persistence/dynamoid_persistence_spec.rb +84 -0
  241. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +200 -0
  242. data/spec/unit/persistence/mongoid_persistence_spec.rb +165 -0
  243. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
  244. data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
  245. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
  246. data/spec/unit/persistence/redis_persistence_spec.rb +53 -0
  247. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +148 -0
  248. data/spec/unit/persistence/sequel_persistence_spec.rb +368 -0
  249. data/spec/unit/readme_spec.rb +41 -0
  250. data/spec/unit/reloading_spec.rb +15 -0
  251. data/spec/unit/rspec_matcher_spec.rb +88 -0
  252. data/spec/unit/simple_custom_example_spec.rb +39 -0
  253. data/spec/unit/simple_example_spec.rb +57 -0
  254. data/spec/unit/simple_multiple_example_spec.rb +91 -0
  255. data/spec/unit/state_spec.rb +89 -0
  256. data/spec/unit/states_on_one_line_example_spec.rb +16 -0
  257. data/spec/unit/subclassing_multiple_spec.rb +74 -0
  258. data/spec/unit/subclassing_spec.rb +46 -0
  259. data/spec/unit/transition_spec.rb +436 -0
  260. data/test/minitest_helper.rb +57 -0
  261. data/test/unit/minitest_matcher_test.rb +80 -0
  262. metadata +609 -0
@@ -0,0 +1,124 @@
1
+ class Transactor < ActiveRecord::Base
2
+
3
+ belongs_to :worker
4
+
5
+ include AASM
6
+ aasm :column => :status do
7
+ state :sleeping, :initial => true
8
+ state :running, :before_enter => :start_worker, :after_enter => :fail
9
+
10
+ event :run do
11
+ transitions :to => :running, :from => :sleeping
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def start_worker
18
+ worker.update_attribute(:status, 'running')
19
+ end
20
+
21
+ def fail
22
+ raise StandardError.new('failed on purpose')
23
+ end
24
+
25
+ end
26
+
27
+ class NoLockTransactor < ActiveRecord::Base
28
+
29
+ belongs_to :worker
30
+
31
+ include AASM
32
+
33
+ aasm :column => :status do
34
+ state :sleeping, :initial => true
35
+ state :running
36
+
37
+ event :run do
38
+ transitions :to => :running, :from => :sleeping
39
+ end
40
+ end
41
+ end
42
+
43
+ class LockTransactor < ActiveRecord::Base
44
+
45
+ belongs_to :worker
46
+
47
+ include AASM
48
+
49
+ aasm :column => :status, requires_lock: true do
50
+ state :sleeping, :initial => true
51
+ state :running
52
+
53
+ event :run do
54
+ transitions :to => :running, :from => :sleeping
55
+ end
56
+ end
57
+ end
58
+
59
+ class LockNoWaitTransactor < ActiveRecord::Base
60
+
61
+ belongs_to :worker
62
+
63
+ include AASM
64
+
65
+ aasm :column => :status, requires_lock: 'FOR UPDATE NOWAIT' do
66
+ state :sleeping, :initial => true
67
+ state :running
68
+
69
+ event :run do
70
+ transitions :to => :running, :from => :sleeping
71
+ end
72
+ end
73
+ end
74
+
75
+ class NoTransactor < ActiveRecord::Base
76
+
77
+ belongs_to :worker
78
+
79
+ include AASM
80
+ aasm :column => :status, use_transactions: false do
81
+ state :sleeping, :initial => true
82
+ state :running, :before_enter => :start_worker, :after_enter => :fail
83
+
84
+ event :run do
85
+ transitions :to => :running, :from => :sleeping
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def start_worker
92
+ worker.update_attribute(:status, 'running')
93
+ end
94
+
95
+ def fail
96
+ raise StandardError.new('failed on purpose')
97
+ end
98
+ end
99
+
100
+ class MultipleTransactor < ActiveRecord::Base
101
+
102
+ belongs_to :worker
103
+
104
+ include AASM
105
+ aasm :left, :column => :status do
106
+ state :sleeping, :initial => true
107
+ state :running, :before_enter => :start_worker, :after_enter => :fail
108
+
109
+ event :run do
110
+ transitions :to => :running, :from => :sleeping
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ def start_worker
117
+ worker.update_attribute(:status, 'running')
118
+ end
119
+
120
+ def fail
121
+ raise StandardError.new('failed on purpose')
122
+ end
123
+
124
+ end
@@ -0,0 +1,6 @@
1
+ class Transient < ActiveRecord::Base
2
+ def aasm_write_state_without_persistence(state)
3
+ "fum"
4
+ end
5
+ include AASM
6
+ end
@@ -0,0 +1,118 @@
1
+ class Validator < ActiveRecord::Base
2
+ attr_accessor :after_all_transactions_performed,
3
+ :after_transaction_performed_on_fail,
4
+ :after_transaction_performed_on_run,
5
+ :before_all_transactions_performed,
6
+ :before_transaction_performed_on_fail,
7
+ :before_transaction_performed_on_run,
8
+ :invalid
9
+
10
+ validate do |model|
11
+ errors.add(:validator, "invalid") if invalid
12
+ end
13
+
14
+ include AASM
15
+
16
+ aasm :column => :status, :whiny_persistence => true do
17
+ before_all_transactions :before_all_transactions
18
+ after_all_transactions :after_all_transactions
19
+
20
+ state :sleeping, :initial => true
21
+ state :running
22
+ state :failed, :after_enter => :fail
23
+
24
+ event :run, :after_commit => :change_name! do
25
+ after_transaction do
26
+ @after_transaction_performed_on_run = true
27
+ end
28
+
29
+ before_transaction do
30
+ @before_transaction_performed_on_run = true
31
+ end
32
+
33
+ transitions :to => :running, :from => :sleeping
34
+ end
35
+
36
+ event :sleep do
37
+ after_commit do |name|
38
+ change_name_on_sleep name
39
+ end
40
+ transitions :to => :sleeping, :from => :running
41
+ end
42
+
43
+ event :fail do
44
+ after_transaction do
45
+ @after_transaction_performed_on_fail = true
46
+ end
47
+
48
+ before_transaction do
49
+ @before_transaction_performed_on_fail = true
50
+ end
51
+
52
+ transitions :to => :failed, :from => [:sleeping, :running]
53
+ end
54
+ end
55
+
56
+ validates_presence_of :name
57
+
58
+ def change_name!
59
+ self.name = "name changed"
60
+ save!
61
+ end
62
+
63
+ def change_name_on_sleep name
64
+ self.name = name
65
+ save!
66
+ end
67
+
68
+ def fail
69
+ raise StandardError.new('failed on purpose')
70
+ end
71
+
72
+ def after_all_transactions
73
+ @after_all_transactions_performed = true
74
+ end
75
+
76
+ def before_all_transactions
77
+ @before_all_transactions_performed = true
78
+ end
79
+ end
80
+
81
+ class MultipleValidator < ActiveRecord::Base
82
+
83
+ include AASM
84
+ aasm :left, :column => :status, :whiny_persistence => true do
85
+ state :sleeping, :initial => true
86
+ state :running
87
+ state :failed, :after_enter => :fail
88
+
89
+ event :run, :after_commit => :change_name! do
90
+ transitions :to => :running, :from => :sleeping
91
+ end
92
+ event :sleep do
93
+ after_commit do |name|
94
+ change_name_on_sleep name
95
+ end
96
+ transitions :to => :sleeping, :from => :running
97
+ end
98
+ event :fail do
99
+ transitions :to => :failed, :from => [:sleeping, :running]
100
+ end
101
+ end
102
+
103
+ validates_presence_of :name
104
+
105
+ def change_name!
106
+ self.name = "name changed"
107
+ save!
108
+ end
109
+
110
+ def change_name_on_sleep name
111
+ self.name = name
112
+ save!
113
+ end
114
+
115
+ def fail
116
+ raise StandardError.new('failed on purpose')
117
+ end
118
+ end
@@ -0,0 +1,39 @@
1
+ class WithEnum < ActiveRecord::Base
2
+ include AASM
3
+
4
+ # Fake this column for testing purposes
5
+ attr_accessor :aasm_state
6
+
7
+ def self.test
8
+ {}
9
+ end
10
+
11
+ aasm :enum => :test do
12
+ state :opened
13
+ state :closed
14
+
15
+ event :view do
16
+ transitions :to => :read, :from => [:needs_attention]
17
+ end
18
+ end
19
+ end
20
+
21
+ class MultipleWithEnum < ActiveRecord::Base
22
+ include AASM
23
+
24
+ # Fake this column for testing purposes
25
+ attr_accessor :aasm_state
26
+
27
+ def self.test
28
+ {}
29
+ end
30
+
31
+ aasm :left, :enum => :test do
32
+ state :opened
33
+ state :closed
34
+
35
+ event :view do
36
+ transitions :to => :read, :from => [:needs_attention]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,38 @@
1
+ class WithEnumWithoutColumn < ActiveRecord::Base
2
+ include AASM
3
+
4
+ if ActiveRecord::VERSION::MAJOR >= 4 && ActiveRecord::VERSION::MINOR >= 1 # won't work with Rails <= 4.1
5
+ enum status: {
6
+ opened: 0,
7
+ closed: 1
8
+ }
9
+ end
10
+
11
+ aasm :column => :status do
12
+ state :closed, initial: true
13
+ state :opened
14
+
15
+ event :view do
16
+ transitions :to => :opened, :from => :closed
17
+ end
18
+ end
19
+ end
20
+
21
+ class MultipleWithEnumWithoutColumn < ActiveRecord::Base
22
+ include AASM
23
+ if ActiveRecord::VERSION::MAJOR >= 4 && ActiveRecord::VERSION::MINOR >= 1 # won't work with Rails <= 4.1
24
+ enum status: {
25
+ opened: 0,
26
+ closed: 1
27
+ }
28
+ end
29
+
30
+ aasm :left, :column => :status do
31
+ state :closed, initial: true
32
+ state :opened
33
+
34
+ event :view do
35
+ transitions :to => :opened, :from => :closed
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ class WithFalseEnum < ActiveRecord::Base
2
+ include AASM
3
+
4
+ # Fake this column for testing purposes
5
+ attr_accessor :aasm_state
6
+
7
+ aasm :enum => false do
8
+ state :opened
9
+ state :closed
10
+
11
+ event :view do
12
+ transitions :to => :read, :from => [:needs_attention]
13
+ end
14
+ end
15
+ end
16
+
17
+ class MultipleWithFalseEnum < ActiveRecord::Base
18
+ include AASM
19
+
20
+ # Fake this column for testing purposes
21
+ attr_accessor :aasm_state
22
+
23
+ aasm :left, :enum => false do
24
+ state :opened
25
+ state :closed
26
+
27
+ event :view do
28
+ transitions :to => :read, :from => [:needs_attention]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ class WithTrueEnum < ActiveRecord::Base
2
+ include AASM
3
+
4
+ # Fake this column for testing purposes
5
+ attr_accessor :aasm_state
6
+
7
+ def value
8
+ 'value'
9
+ end
10
+
11
+ aasm :enum => true do
12
+ state :opened
13
+ state :closed
14
+
15
+ event :view do
16
+ transitions :to => :read, :from => [:needs_attention]
17
+ end
18
+ end
19
+ end
20
+
21
+ class MultipleWithTrueEnum < ActiveRecord::Base
22
+ include AASM
23
+
24
+ # Fake this column for testing purposes
25
+ attr_accessor :aasm_state
26
+
27
+ def value
28
+ 'value'
29
+ end
30
+
31
+ aasm :left, :enum => true do
32
+ state :opened
33
+ state :closed
34
+
35
+ event :view do
36
+ transitions :to => :read, :from => [:needs_attention]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ class Work < ActiveRecord::Base
2
+ include AASM
3
+ end
@@ -0,0 +1,2 @@
1
+ class Worker < ActiveRecord::Base
2
+ end
@@ -0,0 +1,6 @@
1
+ class Writer < ActiveRecord::Base
2
+ def aasm_write_state(state)
3
+ "fo"
4
+ end
5
+ include AASM
6
+ end
@@ -0,0 +1,25 @@
1
+ class BasicTwoStateMachinesExample
2
+ include AASM
3
+
4
+ aasm :search do
5
+ state :initialised, :initial => true
6
+ state :queried
7
+ state :requested
8
+
9
+ event :query do
10
+ transitions :from => [:initialised, :requested], :to => :queried
11
+ end
12
+ event :request do
13
+ transitions :from => :queried, :to => :requested
14
+ end
15
+ end
16
+
17
+ aasm :sync do
18
+ state :unsynced, :initial => true
19
+ state :synced
20
+
21
+ event :sync do
22
+ transitions :from => :unsynced, :to => :synced
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,98 @@
1
+ module Callbacks
2
+ class Basic
3
+ include AASM
4
+
5
+ def initialize(options={})
6
+ @fail_event_guard = options[:fail_event_guard]
7
+ @fail_transition_guard = options[:fail_transition_guard]
8
+ @log = options[:log]
9
+ reset_data
10
+ end
11
+
12
+ def reset_data
13
+ @data = []
14
+ end
15
+
16
+ def data
17
+ @data.join(' ')
18
+ end
19
+
20
+ aasm do
21
+ before_all_events :before_all_events
22
+ after_all_events :after_all_events
23
+ ensure_on_all_events :ensure_on_all_events
24
+ after_all_transitions :after_all_transitions
25
+
26
+ state :open, :initial => true,
27
+ :before_enter => :before_enter_open,
28
+ :enter => :enter_open,
29
+ :after_enter => :after_enter_open,
30
+ :before_exit => :before_exit_open,
31
+ :exit => :exit_open,
32
+ :after_exit => :after_exit_open
33
+
34
+ state :closed,
35
+ :before_enter => :before_enter_closed,
36
+ :enter => :enter_closed,
37
+ :after_enter => :after_enter_closed,
38
+ :before_exit => :before_exit_closed,
39
+ :exit => :exit_closed,
40
+ :after_exit => :after_exit_closed
41
+
42
+ event :close,
43
+ :before => :before_event,
44
+ :after => :after_event,
45
+ :guard => :event_guard,
46
+ :before_success => :event_before_success,
47
+ :ensure => :ensure_event do
48
+ transitions :to => :closed, :from => [:open],
49
+ :guard => :transition_guard,
50
+ :after => :after_transition,
51
+ :success => :success_transition
52
+ end
53
+
54
+ event :open, :before => :before_event, :after => :after_event do
55
+ transitions :to => :open, :from => :closed
56
+ end
57
+ end
58
+
59
+ def log(text)
60
+ @data << text
61
+ puts text if @log
62
+ end
63
+
64
+ def aasm_write_state(*args); log('aasm_write_state'); true; end
65
+ def before_enter_open; log('before_enter_open'); end
66
+ def enter_open; log('enter_open'); end
67
+ def before_exit_open; log('before_exit_open'); end
68
+ def after_enter_open; log('after_enter_open'); end
69
+ def exit_open; log('exit_open'); end
70
+ def after_exit_open; log('after_exit_open'); end
71
+
72
+ def before_enter_closed; log('before_enter_closed'); end
73
+ def enter_closed; log('enter_closed'); end
74
+ def before_exit_closed; log('before_exit_closed'); end
75
+ def exit_closed; log('exit_closed'); end
76
+ def after_enter_closed; log('after_enter_closed'); end
77
+ def after_exit_closed; log('after_exit_closed'); end
78
+
79
+ def event_guard; log('event_guard'); !@fail_event_guard; end
80
+ def transition_guard; log('transition_guard'); !@fail_transition_guard; end
81
+
82
+ def event_before_success; log('event_before_success'); end
83
+
84
+ def after_transition; log('after_transition'); end
85
+ def after_all_transitions; log('after_all_transitions'); end
86
+
87
+ def before_all_events; log('before_all_events') end
88
+ def before_event; log('before_event'); end
89
+ def after_event; log('after_event'); end
90
+ def after_all_events; log('after_all_events'); end
91
+
92
+ def after_transition; log('after_transition'); end
93
+ def success_transition; log('transition_success'); end
94
+
95
+ def ensure_event; log('ensure'); end
96
+ def ensure_on_all_events; log('ensure'); end
97
+ end
98
+ end