aasm 2.1.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.
Files changed (275) 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 +82 -0
  7. data/API +34 -0
  8. data/Appraisals +67 -0
  9. data/CHANGELOG.md +453 -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/{MIT-LICENSE → LICENSE} +1 -1
  17. data/PLANNED_CHANGES.md +11 -0
  18. data/README.md +1524 -0
  19. data/README_FROM_VERSION_3_TO_4.md +240 -0
  20. data/Rakefile +20 -84
  21. data/TESTING.md +25 -0
  22. data/aasm.gemspec +37 -0
  23. data/docker-compose.yml +40 -0
  24. data/gemfiles/norails.gemfile +10 -0
  25. data/gemfiles/rails_4.2.gemfile +17 -0
  26. data/gemfiles/rails_4.2_mongoid_5.gemfile +12 -0
  27. data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
  28. data/gemfiles/rails_5.0.gemfile +14 -0
  29. data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
  30. data/gemfiles/rails_5.1.gemfile +14 -0
  31. data/gemfiles/rails_5.2.gemfile +14 -0
  32. data/lib/aasm/aasm.rb +160 -137
  33. data/lib/aasm/base.rb +290 -0
  34. data/lib/aasm/configuration.rb +48 -0
  35. data/lib/aasm/core/event.rb +177 -0
  36. data/lib/aasm/core/invoker.rb +129 -0
  37. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  38. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  39. data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
  40. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  41. data/lib/aasm/core/state.rb +91 -0
  42. data/lib/aasm/core/transition.rb +83 -0
  43. data/lib/aasm/dsl_helper.rb +32 -0
  44. data/lib/aasm/errors.rb +21 -0
  45. data/lib/aasm/instance_base.rb +133 -0
  46. data/lib/aasm/localizer.rb +64 -0
  47. data/lib/aasm/minitest/allow_event.rb +13 -0
  48. data/lib/aasm/minitest/allow_transition_to.rb +13 -0
  49. data/lib/aasm/minitest/have_state.rb +13 -0
  50. data/lib/aasm/minitest/transition_from.rb +21 -0
  51. data/lib/aasm/minitest.rb +5 -0
  52. data/lib/aasm/minitest_spec.rb +15 -0
  53. data/lib/aasm/persistence/active_record_persistence.rb +108 -173
  54. data/lib/aasm/persistence/base.rb +89 -0
  55. data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
  56. data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
  57. data/lib/aasm/persistence/mongoid_persistence.rb +126 -0
  58. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  59. data/lib/aasm/persistence/orm.rb +154 -0
  60. data/lib/aasm/persistence/plain_persistence.rb +26 -0
  61. data/lib/aasm/persistence/redis_persistence.rb +112 -0
  62. data/lib/aasm/persistence/sequel_persistence.rb +83 -0
  63. data/lib/aasm/persistence.rb +48 -10
  64. data/lib/aasm/rspec/allow_event.rb +26 -0
  65. data/lib/aasm/rspec/allow_transition_to.rb +26 -0
  66. data/lib/aasm/rspec/have_state.rb +22 -0
  67. data/lib/aasm/rspec/transition_from.rb +36 -0
  68. data/lib/aasm/rspec.rb +5 -0
  69. data/lib/aasm/state_machine.rb +40 -22
  70. data/lib/aasm/state_machine_store.rb +76 -0
  71. data/lib/aasm/version.rb +3 -0
  72. data/lib/aasm.rb +21 -1
  73. data/lib/generators/aasm/aasm_generator.rb +16 -0
  74. data/lib/generators/aasm/orm_helpers.rb +41 -0
  75. data/lib/generators/active_record/aasm_generator.rb +40 -0
  76. data/lib/generators/active_record/templates/migration.rb +8 -0
  77. data/lib/generators/active_record/templates/migration_existing.rb +5 -0
  78. data/lib/generators/mongoid/aasm_generator.rb +28 -0
  79. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  80. data/lib/motion-aasm.rb +37 -0
  81. data/spec/database.rb +57 -0
  82. data/spec/database.yml +3 -0
  83. data/spec/en.yml +9 -0
  84. data/spec/generators/active_record_generator_spec.rb +53 -0
  85. data/spec/generators/mongoid_generator_spec.rb +31 -0
  86. data/spec/generators/no_brainer_generator_spec.rb +29 -0
  87. data/spec/localizer_test_model_deprecated_style.yml +13 -0
  88. data/spec/localizer_test_model_new_style.yml +11 -0
  89. data/spec/models/active_record/active_record_callback.rb +93 -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 +42 -0
  98. data/spec/models/active_record/namespaced.rb +16 -0
  99. data/spec/models/active_record/no_direct_assignment.rb +21 -0
  100. data/spec/models/active_record/no_scope.rb +21 -0
  101. data/spec/models/active_record/persisted_state.rb +12 -0
  102. data/spec/models/active_record/person.rb +23 -0
  103. data/spec/models/active_record/provided_and_persisted_state.rb +24 -0
  104. data/spec/models/active_record/reader.rb +7 -0
  105. data/spec/models/active_record/readme_job.rb +21 -0
  106. data/spec/models/active_record/silent_persistor.rb +29 -0
  107. data/spec/models/active_record/simple_new_dsl.rb +32 -0
  108. data/spec/models/active_record/thief.rb +29 -0
  109. data/spec/models/active_record/timestamp_example.rb +16 -0
  110. data/spec/models/active_record/transactor.rb +124 -0
  111. data/spec/models/active_record/transient.rb +6 -0
  112. data/spec/models/active_record/validator.rb +118 -0
  113. data/spec/models/active_record/with_enum.rb +39 -0
  114. data/spec/models/active_record/with_enum_without_column.rb +38 -0
  115. data/spec/models/active_record/with_false_enum.rb +31 -0
  116. data/spec/models/active_record/with_true_enum.rb +39 -0
  117. data/spec/models/active_record/work.rb +3 -0
  118. data/spec/models/active_record/worker.rb +2 -0
  119. data/spec/models/active_record/writer.rb +6 -0
  120. data/spec/models/basic_two_state_machines_example.rb +25 -0
  121. data/spec/models/callbacks/basic.rb +98 -0
  122. data/spec/models/callbacks/basic_multiple.rb +75 -0
  123. data/spec/models/callbacks/guard_within_block.rb +67 -0
  124. data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
  125. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +66 -0
  126. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
  127. data/spec/models/callbacks/private_method.rb +44 -0
  128. data/spec/models/callbacks/private_method_multiple.rb +44 -0
  129. data/spec/models/callbacks/with_args.rb +62 -0
  130. data/spec/models/callbacks/with_args_multiple.rb +61 -0
  131. data/spec/models/callbacks/with_state_arg.rb +34 -0
  132. data/spec/models/callbacks/with_state_arg_multiple.rb +29 -0
  133. data/spec/models/complex_example.rb +222 -0
  134. data/spec/models/conversation.rb +93 -0
  135. data/spec/models/default_state.rb +12 -0
  136. data/spec/models/double_definer.rb +21 -0
  137. data/spec/models/dynamoid/complex_dynamoid_example.rb +37 -0
  138. data/spec/models/dynamoid/dynamoid_multiple.rb +18 -0
  139. data/spec/models/dynamoid/dynamoid_simple.rb +18 -0
  140. data/spec/models/foo.rb +106 -0
  141. data/spec/models/foo_callback_multiple.rb +45 -0
  142. data/spec/models/guard_arguments_check.rb +17 -0
  143. data/spec/models/guard_with_params.rb +24 -0
  144. data/spec/models/guard_with_params_multiple.rb +18 -0
  145. data/spec/models/guardian.rb +58 -0
  146. data/spec/models/guardian_multiple.rb +48 -0
  147. data/spec/models/guardian_without_from_specified.rb +18 -0
  148. data/spec/models/initial_state_proc.rb +31 -0
  149. data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
  150. data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
  151. data/spec/models/mongoid/mongoid_relationships.rb +26 -0
  152. data/spec/models/mongoid/no_scope_mongoid.rb +21 -0
  153. data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
  154. data/spec/models/mongoid/simple_mongoid.rb +23 -0
  155. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +25 -0
  156. data/spec/models/mongoid/timestamp_example_mongoid.rb +20 -0
  157. data/spec/models/mongoid/validator_mongoid.rb +100 -0
  158. data/spec/models/multi_transitioner.rb +34 -0
  159. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
  160. data/spec/models/namespaced_multiple_example.rb +42 -0
  161. data/spec/models/no_initial_state.rb +25 -0
  162. data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
  163. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
  164. data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
  165. data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
  166. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
  167. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
  168. data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
  169. data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
  170. data/spec/models/not_auto_loaded/process.rb +21 -0
  171. data/spec/models/parametrised_event.rb +42 -0
  172. data/spec/models/parametrised_event_multiple.rb +29 -0
  173. data/spec/models/process_with_new_dsl.rb +31 -0
  174. data/spec/models/provided_state.rb +24 -0
  175. data/spec/models/redis/complex_redis_example.rb +40 -0
  176. data/spec/models/redis/redis_multiple.rb +20 -0
  177. data/spec/models/redis/redis_simple.rb +20 -0
  178. data/spec/models/sequel/complex_sequel_example.rb +46 -0
  179. data/spec/models/sequel/invalid_persistor.rb +52 -0
  180. data/spec/models/sequel/sequel_multiple.rb +25 -0
  181. data/spec/models/sequel/sequel_simple.rb +26 -0
  182. data/spec/models/sequel/silent_persistor.rb +50 -0
  183. data/spec/models/sequel/transactor.rb +112 -0
  184. data/spec/models/sequel/validator.rb +93 -0
  185. data/spec/models/sequel/worker.rb +12 -0
  186. data/spec/models/silencer.rb +27 -0
  187. data/spec/models/simple_custom_example.rb +53 -0
  188. data/spec/models/simple_example.rb +23 -0
  189. data/spec/models/simple_example_with_guard_args.rb +17 -0
  190. data/spec/models/simple_multiple_example.rb +42 -0
  191. data/spec/models/state_machine_with_failed_event.rb +20 -0
  192. data/spec/models/states_on_one_line_example.rb +8 -0
  193. data/spec/models/sub_class.rb +41 -0
  194. data/spec/models/sub_class_with_more_states.rb +18 -0
  195. data/spec/models/sub_classing.rb +3 -0
  196. data/spec/models/super_class.rb +46 -0
  197. data/spec/models/this_name_better_not_be_in_use.rb +11 -0
  198. data/spec/models/timestamps_example.rb +19 -0
  199. data/spec/models/timestamps_with_named_machine_example.rb +13 -0
  200. data/spec/models/valid_state_name.rb +23 -0
  201. data/spec/spec_helper.rb +41 -0
  202. data/spec/spec_helpers/active_record.rb +8 -0
  203. data/spec/spec_helpers/dynamoid.rb +35 -0
  204. data/spec/spec_helpers/mongoid.rb +26 -0
  205. data/spec/spec_helpers/nobrainer.rb +15 -0
  206. data/spec/spec_helpers/redis.rb +18 -0
  207. data/spec/spec_helpers/remove_warnings.rb +1 -0
  208. data/spec/spec_helpers/sequel.rb +7 -0
  209. data/spec/unit/abstract_class_spec.rb +27 -0
  210. data/spec/unit/api_spec.rb +104 -0
  211. data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
  212. data/spec/unit/callback_multiple_spec.rb +304 -0
  213. data/spec/unit/callbacks_spec.rb +521 -0
  214. data/spec/unit/complex_example_spec.rb +93 -0
  215. data/spec/unit/complex_multiple_example_spec.rb +115 -0
  216. data/spec/unit/edge_cases_spec.rb +16 -0
  217. data/spec/unit/event_multiple_spec.rb +73 -0
  218. data/spec/unit/event_naming_spec.rb +16 -0
  219. data/spec/unit/event_spec.rb +394 -0
  220. data/spec/unit/exception_spec.rb +11 -0
  221. data/spec/unit/guard_arguments_check_spec.rb +9 -0
  222. data/spec/unit/guard_multiple_spec.rb +60 -0
  223. data/spec/unit/guard_spec.rb +89 -0
  224. data/spec/unit/guard_with_params_multiple_spec.rb +10 -0
  225. data/spec/unit/guard_with_params_spec.rb +14 -0
  226. data/spec/unit/guard_without_from_specified_spec.rb +10 -0
  227. data/spec/unit/initial_state_multiple_spec.rb +15 -0
  228. data/spec/unit/initial_state_spec.rb +12 -0
  229. data/spec/unit/inspection_multiple_spec.rb +205 -0
  230. data/spec/unit/inspection_spec.rb +153 -0
  231. data/spec/unit/invoker_spec.rb +189 -0
  232. data/spec/unit/invokers/base_invoker_spec.rb +72 -0
  233. data/spec/unit/invokers/class_invoker_spec.rb +95 -0
  234. data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
  235. data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
  236. data/spec/unit/localizer_spec.rb +109 -0
  237. data/spec/unit/memory_leak_spec.rb +38 -0
  238. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
  239. data/spec/unit/namespaced_multiple_example_spec.rb +75 -0
  240. data/spec/unit/new_dsl_spec.rb +12 -0
  241. data/spec/unit/override_warning_spec.rb +94 -0
  242. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +635 -0
  243. data/spec/unit/persistence/active_record_persistence_spec.rb +852 -0
  244. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +135 -0
  245. data/spec/unit/persistence/dynamoid_persistence_spec.rb +84 -0
  246. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +200 -0
  247. data/spec/unit/persistence/mongoid_persistence_spec.rb +177 -0
  248. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
  249. data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
  250. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
  251. data/spec/unit/persistence/redis_persistence_spec.rb +53 -0
  252. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +148 -0
  253. data/spec/unit/persistence/sequel_persistence_spec.rb +368 -0
  254. data/spec/unit/readme_spec.rb +41 -0
  255. data/spec/unit/reloading_spec.rb +15 -0
  256. data/spec/unit/rspec_matcher_spec.rb +88 -0
  257. data/spec/unit/simple_custom_example_spec.rb +39 -0
  258. data/spec/unit/simple_example_spec.rb +57 -0
  259. data/spec/unit/simple_multiple_example_spec.rb +91 -0
  260. data/spec/unit/state_spec.rb +105 -0
  261. data/spec/unit/states_on_one_line_example_spec.rb +16 -0
  262. data/spec/unit/subclassing_multiple_spec.rb +74 -0
  263. data/spec/unit/subclassing_spec.rb +46 -0
  264. data/spec/unit/timestamps_spec.rb +32 -0
  265. data/spec/unit/transition_spec.rb +436 -0
  266. data/test/minitest_helper.rb +57 -0
  267. data/test/unit/minitest_matcher_test.rb +80 -0
  268. metadata +607 -60
  269. data/CHANGELOG +0 -33
  270. data/README.rdoc +0 -122
  271. data/TODO +0 -9
  272. data/doc/jamis.rb +0 -591
  273. data/lib/aasm/event.rb +0 -76
  274. data/lib/aasm/state.rb +0 -35
  275. data/lib/aasm/state_transition.rb +0 -36
@@ -0,0 +1,13 @@
1
+ en:
2
+ activerecord:
3
+ attributes:
4
+ localizer_test_model:
5
+ aasm_state:
6
+ opened: "It's open now!"
7
+
8
+ fr:
9
+ activerecord:
10
+ attributes:
11
+ localizer_test_model:
12
+ aasm_state:
13
+ opened: "C'est ouvert maintenant!"
@@ -0,0 +1,11 @@
1
+ en:
2
+ activerecord:
3
+ attributes:
4
+ localizer_test_model:
5
+ aasm_state/opened: "It's open now!"
6
+
7
+ fr:
8
+ activerecord:
9
+ attributes:
10
+ localizer_test_model:
11
+ aasm_state/opened: "C'est ouvert maintenant!"
@@ -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,25 @@
1
+ class BasicActiveRecordTwoStateMachinesExample < ActiveRecord::Base
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 :synchronise do
22
+ transitions :from => :unsynced, :to => :synced
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ class ComplexActiveRecordExample < ActiveRecord::Base
2
+ include AASM
3
+
4
+ aasm :left, :column => 'left' do
5
+ state :one, :initial => true
6
+ state :two
7
+ state :three
8
+
9
+ event :increment do
10
+ transitions :from => :one, :to => :two, guard: :allowed?
11
+ transitions :from => :two, :to => :three
12
+ end
13
+ event :reset do
14
+ transitions :from => :three, :to => :one
15
+ end
16
+ end
17
+
18
+ def allowed?
19
+ true
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
+
37
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'simple_new_dsl'
2
+
3
+ class DerivateNewDsl < SimpleNewDsl
4
+ end
5
+
6
+ class MultipleDerivateNewDsl < MultipleSimpleNewDsl
7
+ end
@@ -0,0 +1,35 @@
1
+ class FalseState < ActiveRecord::Base
2
+ include AASM
3
+
4
+ def initialize(*args)
5
+ super
6
+ self.aasm_state = false
7
+ end
8
+
9
+ aasm do
10
+ state :opened
11
+ state :closed
12
+
13
+ event :view do
14
+ transitions :to => :read, :from => [:needs_attention]
15
+ end
16
+ end
17
+ end
18
+
19
+ class MultipleFalseState < ActiveRecord::Base
20
+ include AASM
21
+
22
+ def initialize(*args)
23
+ super
24
+ self.aasm_state = false
25
+ end
26
+
27
+ aasm :left do
28
+ state :opened
29
+ state :closed
30
+
31
+ event :view do
32
+ transitions :to => :read, :from => [:needs_attention]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ class Gate < 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 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 MultipleGate < 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, :column => :aasm_state 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,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
@@ -0,0 +1,29 @@
1
+ class InvalidPersistor < ActiveRecord::Base
2
+ include AASM
3
+ aasm :column => :status, :skip_validation_on_save => true do
4
+ state :sleeping, :initial => true
5
+ state :running
6
+ event :run do
7
+ transitions :to => :running, :from => :sleeping
8
+ end
9
+ event :sleep do
10
+ transitions :to => :sleeping, :from => :running
11
+ end
12
+ end
13
+ validates_presence_of :name
14
+ end
15
+
16
+ class MultipleInvalidPersistor < ActiveRecord::Base
17
+ include AASM
18
+ aasm :left, :column => :status, :skip_validation_on_save => true do
19
+ state :sleeping, :initial => true
20
+ state :running
21
+ event :run do
22
+ transitions :to => :running, :from => :sleeping
23
+ end
24
+ event :sleep do
25
+ transitions :to => :sleeping, :from => :running
26
+ end
27
+ end
28
+ validates_presence_of :name
29
+ end
@@ -0,0 +1,42 @@
1
+ class LocalizerTestModel < ActiveRecord::Base
2
+ include AASM
3
+
4
+ aasm do
5
+ state :opened, :initial => true
6
+ state :closed
7
+ event :close
8
+ event :open
9
+ end
10
+ end
11
+
12
+ describe 'localized state names' do
13
+ before(:all) do
14
+ I18n.load_path << 'spec/localizer_test_model_new_style.yml'
15
+ I18n.reload!
16
+ end
17
+
18
+ after(:all) do
19
+ I18n.load_path.delete('spec/localizer_test_model_new_style.yml')
20
+ I18n.backend.load_translations
21
+ end
22
+
23
+ it 'should localize' do
24
+ state = LocalizerTestModel.aasm.states.detect {|s| s == :opened}
25
+ expect(state.localized_name).to eq("It's open now!")
26
+ expect(state.human_name).to eq("It's open now!")
27
+ expect(state.display_name).to eq("It's open now!")
28
+
29
+ I18n.with_locale(:fr) do
30
+ expect(state.localized_name).to eq("C'est ouvert maintenant!")
31
+ expect(state.human_name).to eq("C'est ouvert maintenant!")
32
+ expect(state.display_name).to eq("C'est ouvert maintenant!")
33
+ end
34
+ end
35
+
36
+ it 'should use fallback' do
37
+ state = LocalizerTestModel.aasm.states.detect {|s| s == :closed}
38
+ expect(state.localized_name).to eq('Closed')
39
+ expect(state.human_name).to eq('Closed')
40
+ expect(state.display_name).to eq('Closed')
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ class MultipleNamespaced < ActiveRecord::Base
2
+ include AASM
3
+
4
+ aasm(:status, namespace: :car) do
5
+ state :unsold, initial: true
6
+ state :sold
7
+
8
+ event :sell do
9
+ transitions from: :unsold, to: :sold
10
+ end
11
+
12
+ event :return do
13
+ transitions from: :sold, to: :unsold
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ class NoDirectAssignment < ActiveRecord::Base
2
+ include AASM
3
+ aasm :no_direct_assignment => true do
4
+ state :pending, :initial => true
5
+ state :running
6
+ event :run do
7
+ transitions :from => :pending, :to => :running
8
+ end
9
+ end
10
+ end
11
+
12
+ class MultipleNoDirectAssignment < ActiveRecord::Base
13
+ include AASM
14
+ aasm :left, :column => :aasm_state, :no_direct_assignment => true do
15
+ state :pending, :initial => true
16
+ state :running
17
+ event :run do
18
+ transitions :from => :pending, :to => :running
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ class NoScope < ActiveRecord::Base
2
+ include AASM
3
+ aasm :create_scopes => false do
4
+ state :pending, :initial => true
5
+ state :running
6
+ event :run do
7
+ transitions :from => :pending, :to => :running
8
+ end
9
+ end
10
+ end
11
+
12
+ class MultipleNoScope < ActiveRecord::Base
13
+ include AASM
14
+ aasm :left, :column => :aasm_state, :create_scopes => false do
15
+ state :pending, :initial => true
16
+ state :running
17
+ event :run do
18
+ transitions :from => :pending, :to => :running
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ class PersistedState < ActiveRecord::Base
2
+ attr_accessor :transient_store, :persisted_store
3
+ include AASM
4
+ aasm do
5
+ state :alpha, :initial => true
6
+ state :beta
7
+ state :gamma
8
+ event :release do
9
+ transitions :from => [:alpha, :beta, :gamma], :to => :beta
10
+ end
11
+ end
12
+ end
@@ -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
@@ -0,0 +1,24 @@
1
+ class ProvidedAndPersistedState < ActiveRecord::Base
2
+ attr_accessor :transient_store, :persisted_store
3
+ include AASM
4
+ aasm do
5
+ state :alpha, :initial => true
6
+ state :beta
7
+ state :gamma
8
+ event :release do
9
+ transitions :from => [:alpha, :beta, :gamma], :to => :beta
10
+ end
11
+ end
12
+
13
+ def aasm_read_state(*args)
14
+ :gamma
15
+ end
16
+
17
+ def aasm_write_state(new_state, *args)
18
+ @persisted_store = new_state
19
+ end
20
+
21
+ def aasm_write_state_without_persistence(new_state, *args)
22
+ @transient_store = new_state
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ class Reader < ActiveRecord::Base
2
+ include AASM
3
+
4
+ def aasm_read_state
5
+ "fi"
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ class ReadmeJob < ActiveRecord::Base
2
+ include AASM
3
+
4
+ aasm do
5
+ state :sleeping, :initial => true
6
+ state :running
7
+ state :cleaning
8
+
9
+ event :run do
10
+ transitions :from => :sleeping, :to => :running
11
+ end
12
+
13
+ event :clean do
14
+ transitions :from => :running, :to => :cleaning
15
+ end
16
+
17
+ event :sleep do
18
+ transitions :from => [:running, :cleaning], :to => :sleeping
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ class SilentPersistor < ActiveRecord::Base
2
+ include AASM
3
+ aasm :column => :status, :whiny_persistence => false do
4
+ state :sleeping, :initial => true
5
+ state :running
6
+ event :run do
7
+ transitions :to => :running, :from => :sleeping
8
+ end
9
+ event :sleep do
10
+ transitions :to => :sleeping, :from => :running
11
+ end
12
+ end
13
+ validates_presence_of :name
14
+ end
15
+
16
+ class MultipleSilentPersistor < ActiveRecord::Base
17
+ include AASM
18
+ aasm :left, :column => :status, :whiny_persistence => false do
19
+ state :sleeping, :initial => true
20
+ state :running
21
+ event :run do
22
+ transitions :to => :running, :from => :sleeping
23
+ end
24
+ event :sleep do
25
+ transitions :to => :sleeping, :from => :running
26
+ end
27
+ end
28
+ validates_presence_of :name
29
+ end
@@ -0,0 +1,32 @@
1
+ class SimpleNewDsl < ActiveRecord::Base
2
+ include AASM
3
+ aasm :column => :status
4
+ aasm do
5
+ state :unknown_scope, :another_unknown_scope
6
+ state :new
7
+ end
8
+ end
9
+
10
+ class MultipleSimpleNewDsl < ActiveRecord::Base
11
+ include AASM
12
+ aasm :left, :column => :status
13
+ aasm :left do
14
+ state :unknown_scope, :another_unknown_scope
15
+ state :new
16
+ end
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,29 @@
1
+ class Thief < ActiveRecord::Base
2
+ if ActiveRecord::VERSION::MAJOR >= 3
3
+ self.table_name = 'thieves'
4
+ else
5
+ set_table_name "thieves"
6
+ end
7
+ include AASM
8
+ aasm do
9
+ state :rich
10
+ state :jailed
11
+ initial_state Proc.new {|thief| thief.skilled ? :rich : :jailed }
12
+ end
13
+ attr_accessor :skilled, :aasm_state
14
+ end
15
+
16
+ class MultipleThief < ActiveRecord::Base
17
+ if ActiveRecord::VERSION::MAJOR >= 3
18
+ self.table_name = 'multiple_thieves'
19
+ else
20
+ set_table_name "multiple_thieves"
21
+ end
22
+ include AASM
23
+ aasm :left, :column => :aasm_state do
24
+ state :rich
25
+ state :jailed
26
+ initial_state Proc.new {|thief| thief.skilled ? :rich : :jailed }
27
+ end
28
+ attr_accessor :skilled, :aasm_state
29
+ end
@@ -0,0 +1,16 @@
1
+ class TimestampExample < ActiveRecord::Base
2
+ include AASM
3
+
4
+ aasm column: :aasm_state, timestamps: true do
5
+ state :opened
6
+ state :closed
7
+
8
+ event :open do
9
+ transitions to: :opened
10
+ end
11
+
12
+ event :close do
13
+ transitions to: :closed
14
+ end
15
+ end
16
+ end