aasm 5.2.0 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -14
  3. data/lib/aasm/base.rb +14 -1
  4. data/lib/aasm/core/event.rb +5 -4
  5. data/lib/aasm/core/invokers/class_invoker.rb +1 -1
  6. data/lib/aasm/core/invokers/literal_invoker.rb +3 -1
  7. data/lib/aasm/errors.rb +1 -0
  8. data/lib/aasm/instance_base.rb +14 -3
  9. data/lib/aasm/version.rb +1 -1
  10. data/lib/generators/aasm/orm_helpers.rb +1 -1
  11. data/lib/generators/active_record/templates/migration.rb +1 -1
  12. metadata +4 -406
  13. data/.document +0 -6
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
  15. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  16. data/.gitignore +0 -20
  17. data/.travis.yml +0 -82
  18. data/API +0 -34
  19. data/Appraisals +0 -67
  20. data/CHANGELOG.md +0 -453
  21. data/CODE_OF_CONDUCT.md +0 -13
  22. data/CONTRIBUTING.md +0 -24
  23. data/Dockerfile +0 -44
  24. data/Gemfile +0 -6
  25. data/Gemfile.lock_old +0 -151
  26. data/HOWTO +0 -12
  27. data/PLANNED_CHANGES.md +0 -11
  28. data/README_FROM_VERSION_3_TO_4.md +0 -240
  29. data/Rakefile +0 -31
  30. data/TESTING.md +0 -25
  31. data/aasm.gemspec +0 -37
  32. data/docker-compose.yml +0 -40
  33. data/gemfiles/norails.gemfile +0 -10
  34. data/gemfiles/rails_4.2.gemfile +0 -17
  35. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -12
  36. data/gemfiles/rails_4.2_nobrainer.gemfile +0 -9
  37. data/gemfiles/rails_5.0.gemfile +0 -14
  38. data/gemfiles/rails_5.0_nobrainer.gemfile +0 -9
  39. data/gemfiles/rails_5.1.gemfile +0 -14
  40. data/gemfiles/rails_5.2.gemfile +0 -14
  41. data/spec/database.rb +0 -57
  42. data/spec/database.yml +0 -3
  43. data/spec/en.yml +0 -9
  44. data/spec/generators/active_record_generator_spec.rb +0 -53
  45. data/spec/generators/mongoid_generator_spec.rb +0 -31
  46. data/spec/generators/no_brainer_generator_spec.rb +0 -29
  47. data/spec/localizer_test_model_deprecated_style.yml +0 -13
  48. data/spec/localizer_test_model_new_style.yml +0 -11
  49. data/spec/models/active_record/active_record_callback.rb +0 -93
  50. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  51. data/spec/models/active_record/complex_active_record_example.rb +0 -37
  52. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  53. data/spec/models/active_record/false_state.rb +0 -35
  54. data/spec/models/active_record/gate.rb +0 -39
  55. data/spec/models/active_record/instance_level_skip_validation_example.rb +0 -19
  56. data/spec/models/active_record/invalid_persistor.rb +0 -29
  57. data/spec/models/active_record/localizer_test_model.rb +0 -42
  58. data/spec/models/active_record/namespaced.rb +0 -16
  59. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  60. data/spec/models/active_record/no_scope.rb +0 -21
  61. data/spec/models/active_record/persisted_state.rb +0 -12
  62. data/spec/models/active_record/person.rb +0 -23
  63. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  64. data/spec/models/active_record/reader.rb +0 -7
  65. data/spec/models/active_record/readme_job.rb +0 -21
  66. data/spec/models/active_record/silent_persistor.rb +0 -29
  67. data/spec/models/active_record/simple_new_dsl.rb +0 -32
  68. data/spec/models/active_record/thief.rb +0 -29
  69. data/spec/models/active_record/timestamp_example.rb +0 -16
  70. data/spec/models/active_record/transactor.rb +0 -124
  71. data/spec/models/active_record/transient.rb +0 -6
  72. data/spec/models/active_record/validator.rb +0 -118
  73. data/spec/models/active_record/with_enum.rb +0 -39
  74. data/spec/models/active_record/with_enum_without_column.rb +0 -38
  75. data/spec/models/active_record/with_false_enum.rb +0 -31
  76. data/spec/models/active_record/with_true_enum.rb +0 -39
  77. data/spec/models/active_record/work.rb +0 -3
  78. data/spec/models/active_record/worker.rb +0 -2
  79. data/spec/models/active_record/writer.rb +0 -6
  80. data/spec/models/basic_two_state_machines_example.rb +0 -25
  81. data/spec/models/callbacks/basic.rb +0 -98
  82. data/spec/models/callbacks/basic_multiple.rb +0 -75
  83. data/spec/models/callbacks/guard_within_block.rb +0 -67
  84. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  85. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
  86. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  87. data/spec/models/callbacks/private_method.rb +0 -44
  88. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  89. data/spec/models/callbacks/with_args.rb +0 -62
  90. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  91. data/spec/models/callbacks/with_state_arg.rb +0 -34
  92. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -29
  93. data/spec/models/complex_example.rb +0 -222
  94. data/spec/models/conversation.rb +0 -93
  95. data/spec/models/default_state.rb +0 -12
  96. data/spec/models/double_definer.rb +0 -21
  97. data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
  98. data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
  99. data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
  100. data/spec/models/foo.rb +0 -106
  101. data/spec/models/foo_callback_multiple.rb +0 -45
  102. data/spec/models/guard_arguments_check.rb +0 -17
  103. data/spec/models/guard_with_params.rb +0 -24
  104. data/spec/models/guard_with_params_multiple.rb +0 -18
  105. data/spec/models/guardian.rb +0 -58
  106. data/spec/models/guardian_multiple.rb +0 -48
  107. data/spec/models/guardian_without_from_specified.rb +0 -18
  108. data/spec/models/initial_state_proc.rb +0 -31
  109. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  110. data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
  111. data/spec/models/mongoid/mongoid_relationships.rb +0 -26
  112. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  113. data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
  114. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  115. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  116. data/spec/models/mongoid/timestamp_example_mongoid.rb +0 -20
  117. data/spec/models/mongoid/validator_mongoid.rb +0 -100
  118. data/spec/models/multi_transitioner.rb +0 -34
  119. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
  120. data/spec/models/namespaced_multiple_example.rb +0 -42
  121. data/spec/models/no_initial_state.rb +0 -25
  122. data/spec/models/nobrainer/complex_no_brainer_example.rb +0 -36
  123. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +0 -39
  124. data/spec/models/nobrainer/no_scope_no_brainer.rb +0 -21
  125. data/spec/models/nobrainer/nobrainer_relationships.rb +0 -25
  126. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +0 -39
  127. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +0 -25
  128. data/spec/models/nobrainer/simple_no_brainer.rb +0 -23
  129. data/spec/models/nobrainer/validator_no_brainer.rb +0 -98
  130. data/spec/models/not_auto_loaded/process.rb +0 -21
  131. data/spec/models/parametrised_event.rb +0 -42
  132. data/spec/models/parametrised_event_multiple.rb +0 -29
  133. data/spec/models/process_with_new_dsl.rb +0 -31
  134. data/spec/models/provided_state.rb +0 -24
  135. data/spec/models/redis/complex_redis_example.rb +0 -40
  136. data/spec/models/redis/redis_multiple.rb +0 -20
  137. data/spec/models/redis/redis_simple.rb +0 -20
  138. data/spec/models/sequel/complex_sequel_example.rb +0 -46
  139. data/spec/models/sequel/invalid_persistor.rb +0 -52
  140. data/spec/models/sequel/sequel_multiple.rb +0 -25
  141. data/spec/models/sequel/sequel_simple.rb +0 -26
  142. data/spec/models/sequel/silent_persistor.rb +0 -50
  143. data/spec/models/sequel/transactor.rb +0 -112
  144. data/spec/models/sequel/validator.rb +0 -93
  145. data/spec/models/sequel/worker.rb +0 -12
  146. data/spec/models/silencer.rb +0 -27
  147. data/spec/models/simple_custom_example.rb +0 -53
  148. data/spec/models/simple_example.rb +0 -23
  149. data/spec/models/simple_example_with_guard_args.rb +0 -17
  150. data/spec/models/simple_multiple_example.rb +0 -42
  151. data/spec/models/state_machine_with_failed_event.rb +0 -20
  152. data/spec/models/states_on_one_line_example.rb +0 -8
  153. data/spec/models/sub_class.rb +0 -41
  154. data/spec/models/sub_class_with_more_states.rb +0 -18
  155. data/spec/models/sub_classing.rb +0 -3
  156. data/spec/models/super_class.rb +0 -46
  157. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  158. data/spec/models/timestamps_example.rb +0 -19
  159. data/spec/models/timestamps_with_named_machine_example.rb +0 -13
  160. data/spec/models/valid_state_name.rb +0 -23
  161. data/spec/spec_helper.rb +0 -41
  162. data/spec/spec_helpers/active_record.rb +0 -8
  163. data/spec/spec_helpers/dynamoid.rb +0 -35
  164. data/spec/spec_helpers/mongoid.rb +0 -26
  165. data/spec/spec_helpers/nobrainer.rb +0 -15
  166. data/spec/spec_helpers/redis.rb +0 -18
  167. data/spec/spec_helpers/remove_warnings.rb +0 -1
  168. data/spec/spec_helpers/sequel.rb +0 -7
  169. data/spec/unit/abstract_class_spec.rb +0 -27
  170. data/spec/unit/api_spec.rb +0 -104
  171. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  172. data/spec/unit/callback_multiple_spec.rb +0 -304
  173. data/spec/unit/callbacks_spec.rb +0 -521
  174. data/spec/unit/complex_example_spec.rb +0 -93
  175. data/spec/unit/complex_multiple_example_spec.rb +0 -115
  176. data/spec/unit/edge_cases_spec.rb +0 -16
  177. data/spec/unit/event_multiple_spec.rb +0 -73
  178. data/spec/unit/event_naming_spec.rb +0 -16
  179. data/spec/unit/event_spec.rb +0 -394
  180. data/spec/unit/exception_spec.rb +0 -11
  181. data/spec/unit/guard_arguments_check_spec.rb +0 -9
  182. data/spec/unit/guard_multiple_spec.rb +0 -60
  183. data/spec/unit/guard_spec.rb +0 -89
  184. data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
  185. data/spec/unit/guard_with_params_spec.rb +0 -14
  186. data/spec/unit/guard_without_from_specified_spec.rb +0 -10
  187. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  188. data/spec/unit/initial_state_spec.rb +0 -12
  189. data/spec/unit/inspection_multiple_spec.rb +0 -205
  190. data/spec/unit/inspection_spec.rb +0 -153
  191. data/spec/unit/invoker_spec.rb +0 -189
  192. data/spec/unit/invokers/base_invoker_spec.rb +0 -72
  193. data/spec/unit/invokers/class_invoker_spec.rb +0 -95
  194. data/spec/unit/invokers/literal_invoker_spec.rb +0 -86
  195. data/spec/unit/invokers/proc_invoker_spec.rb +0 -86
  196. data/spec/unit/localizer_spec.rb +0 -109
  197. data/spec/unit/memory_leak_spec.rb +0 -38
  198. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
  199. data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
  200. data/spec/unit/new_dsl_spec.rb +0 -12
  201. data/spec/unit/override_warning_spec.rb +0 -94
  202. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -635
  203. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -852
  204. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
  205. data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
  206. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -200
  207. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -177
  208. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +0 -198
  209. data/spec/unit/persistence/no_brainer_persistence_spec.rb +0 -158
  210. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
  211. data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
  212. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
  213. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
  214. data/spec/unit/readme_spec.rb +0 -41
  215. data/spec/unit/reloading_spec.rb +0 -15
  216. data/spec/unit/rspec_matcher_spec.rb +0 -88
  217. data/spec/unit/simple_custom_example_spec.rb +0 -39
  218. data/spec/unit/simple_example_spec.rb +0 -57
  219. data/spec/unit/simple_multiple_example_spec.rb +0 -91
  220. data/spec/unit/state_spec.rb +0 -105
  221. data/spec/unit/states_on_one_line_example_spec.rb +0 -16
  222. data/spec/unit/subclassing_multiple_spec.rb +0 -74
  223. data/spec/unit/subclassing_spec.rb +0 -46
  224. data/spec/unit/timestamps_spec.rb +0 -32
  225. data/spec/unit/transition_spec.rb +0 -436
  226. data/test/minitest_helper.rb +0 -57
  227. data/test/unit/minitest_matcher_test.rb +0 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e3ec7032fd9c8368ddfb4bed4e931edc5f9d96c02a69f89f7ee26913f7d8698
4
- data.tar.gz: ddb4ef39501440da1869426eda3b4359e37eeef67b464c9e0d660e9f353510f6
3
+ metadata.gz: a088e1285940890f3c1a87b6cf0534e80702a96d2fb6eb42b43ff0cf50e6c57d
4
+ data.tar.gz: b96c64d2458639d217540b8787b1f718d80cd8e64b2661825435a795d5796a93
5
5
  SHA512:
6
- metadata.gz: c294de071cad6569f855af1455c9d0281622ca5c9a3df0466baacaca569d8974718eb46d4c06e674f54629a77e2634d69829ee2910612ba146b4aaf786891544
7
- data.tar.gz: a7b0c176cec262ad9d89538fe43e6df484f4d79328f85e853dcc9fe6b6ce9a9629f802e7de14659e5c91135a3a4df09a6066011983b1936eff06b17657c24cc5
6
+ metadata.gz: 85a0532a6257477070680b2864c27191f618a61091fe9ba0c2c0672e99aa53c4b61968e4987607c4e5747bb42686cff6667966c90cf4592e87ad0324175e711c
7
+ data.tar.gz: 1abfc89101b1cdf7440a82446b6c600d65fe6f2bfc83575a85dc2ef0edb04968cc509c9ff88ec2ce68f4aa8b72283f75301a0fcfefffa16fc0347cb31f11c492
data/README.md CHANGED
@@ -221,18 +221,18 @@ You can pass parameters to events:
221
221
  job.run(:defragmentation)
222
222
  ```
223
223
 
224
- All guards and after callbacks will receive these parameters. In this case `set_process` would be called with
224
+ All guards and after callbacks will receive these parameters. In this case `set_process` would be called with
225
225
  `:defragmentation` argument.
226
226
 
227
- If the first argument to the event is a state (e.g. `:running` or `:finished`), the first argument is consumed and
228
- the state machine will attempt to transition to that state. Add comma separated parameter for gaurds and callbacks
227
+ If the first argument to the event is a state (e.g. `:running` or `:finished`), the first argument is consumed and
228
+ the state machine will attempt to transition to that state. Add comma separated parameter for guards and callbacks
229
229
 
230
230
  ```ruby
231
231
  job = Job.new
232
232
  job.run(:running, :defragmentation)
233
233
  ```
234
- In this case `set_process` won't be called, job will transition to running state and callback will receive
235
- :defragmentation as parameter
234
+ In this case `set_process` won't be called, job will transition to running state and callback will receive
235
+ `:defragmentation` as parameter
236
236
 
237
237
  #### Error Handling
238
238
  In case of an error during the event processing the error is rescued and passed to `:error`
@@ -321,7 +321,7 @@ and then
321
321
  Let's assume you want to allow particular transitions only if a defined condition is
322
322
  given. For this you can set up a guard per transition, which will run before actually
323
323
  running the transition. If the guard returns `false` the transition will be
324
- denied (raising `AASM::InvalidTransition` or returning `false` itself):
324
+ denied (raising `AASM::InvalidTransition`):
325
325
 
326
326
  ```ruby
327
327
  class Cleaner
@@ -364,7 +364,7 @@ job.clean # => raises AASM::InvalidTransition
364
364
  job.may_clean_if_needed? # => true
365
365
  job.clean_if_needed! # idle
366
366
 
367
- job.clean_if_dirty(:clean) # => false
367
+ job.clean_if_dirty(:clean) # => raises AASM::InvalidTransition
368
368
  job.clean_if_dirty(:dirty) # => true
369
369
  ```
370
370
 
@@ -400,7 +400,7 @@ If you prefer a more Ruby-like guard syntax, you can use `if` and `unless` as we
400
400
  end
401
401
  ```
402
402
 
403
- You can invoke a Class instead a method since this Class responds to `call`
403
+ You can invoke a Class instead of a method if the Class responds to `call`
404
404
 
405
405
  ```ruby
406
406
  event :sleep do
@@ -758,7 +758,7 @@ job.aasm.fire!(:run) # saved
758
758
 
759
759
  Saving includes running all validations on the `Job` class. If
760
760
  `whiny_persistence` flag is set to `true`, exception is raised in case of
761
- failure. If `whiny_persistence` flag is set to false, methods with a bang return
761
+ failure. If `whiny_persistence` flag is set to `false`, methods with a bang return
762
762
  `true` if the state transition is successful or `false` if an error occurs.
763
763
 
764
764
  If you want make sure the state gets saved without running validations (and
@@ -786,7 +786,7 @@ class Job < ActiveRecord::Base
786
786
  end
787
787
  ```
788
788
 
789
- Also You can skip the validation at instance level with `some_event_name_without_validation!` method.
789
+ Also, you can skip the validation at instance level with `some_event_name_without_validation!` method.
790
790
  With this you have the flexibility of having validation for all your transitions by default and then skip it wherever required.
791
791
  Please note that only state column will be updated as mentioned in the above example.
792
792
 
@@ -1084,7 +1084,7 @@ end
1084
1084
 
1085
1085
  which then leads to `transaction(requires_new: false)`, the Rails default.
1086
1086
 
1087
- Additionally, if you do not want any of your active record actions to be
1087
+ Additionally, if you do not want any of your ActiveRecord actions to be
1088
1088
  wrapped in a transaction, you can specify the `use_transactions` flag. This can
1089
1089
  be useful if you want want to persist things to the database that happen as a
1090
1090
  result of a transaction or callback, even when some error occurs. The
@@ -1104,7 +1104,7 @@ end
1104
1104
 
1105
1105
  ### Pessimistic Locking
1106
1106
 
1107
- AASM supports [Active Record pessimistic locking via `with_lock`](http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html#method-i-with_lock) for database persistence layers.
1107
+ AASM supports [ActiveRecord pessimistic locking via `with_lock`](http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html#method-i-with_lock) for database persistence layers.
1108
1108
 
1109
1109
  | Option | Purpose |
1110
1110
  | ------ | ------- |
@@ -1160,7 +1160,7 @@ end
1160
1160
  Whatever column name is used, make sure to add a migration to provide this column
1161
1161
  (of type `string`).
1162
1162
  Do not add default value for column at the database level. If you add default
1163
- value in database then AASM callbacks on the initial state will not be fired upon
1163
+ value in database then AASM callbacks on the initial state will not be fired upon
1164
1164
  instantiation of the model.
1165
1165
 
1166
1166
  ```ruby
@@ -1461,7 +1461,7 @@ After installing AASM you can run generator:
1461
1461
  ```
1462
1462
  Replace NAME with the Model name, COLUMN_NAME is optional(default is 'aasm_state').
1463
1463
  This will create a model (if one does not exist) and configure it with aasm block.
1464
- For Active record orm a migration file is added to add aasm state column to table.
1464
+ For ActiveRecord orm a migration file is added to add aasm state column to table.
1465
1465
 
1466
1466
  ### Docker
1467
1467
 
@@ -1491,6 +1491,12 @@ Feel free to
1491
1491
  * [Anil Maurya](http://github.com/anilmaurya) (since 2016)
1492
1492
 
1493
1493
 
1494
+
1495
+ ## Stargazers over time
1496
+
1497
+ [![Stargazers over time](https://starchart.cc/aasm/aasm.svg)](https://starchart.cc/aasm/aasm)
1498
+
1499
+
1494
1500
  ## [Contributing](CONTRIBUTING.md)
1495
1501
 
1496
1502
  ## Warranty ##
data/lib/aasm/base.rb CHANGED
@@ -223,7 +223,20 @@ module AASM
223
223
  end
224
224
  end
225
225
 
226
- klass.send(:define_method, method_name, method_definition)
226
+ klass.send(:define_method, method_name, method_definition).tap do |sym|
227
+ apply_ruby2_keyword(klass, sym)
228
+ end
229
+ end
230
+
231
+ def apply_ruby2_keyword(klass, sym)
232
+ if RUBY_VERSION >= '2.7.1'
233
+ if klass.instance_method(sym).parameters.find { |type, _| type.to_s.start_with?('rest') }
234
+ # If there is a place where you are receiving in *args, do ruby2_keywords.
235
+ klass.module_eval do
236
+ ruby2_keywords sym
237
+ end
238
+ end
239
+ end
227
240
  end
228
241
 
229
242
  def namespace?
@@ -10,7 +10,7 @@ module AASM::Core
10
10
  @name = name
11
11
  @state_machine = state_machine
12
12
  @transitions = []
13
- @valid_transitions = {}
13
+ @valid_transitions = Hash.new { |h, k| h[k] = {} }
14
14
  @guards = Array(options[:guard] || options[:guards] || options[:if])
15
15
  @unless = Array(options[:unless]) #TODO: This could use a better name
16
16
  @default_display_name = name.to_s.gsub(/_/, ' ').capitalize
@@ -79,8 +79,9 @@ module AASM::Core
79
79
 
80
80
  def fire_transition_callbacks(obj, *args)
81
81
  from_state = obj.aasm(state_machine.name).current_state
82
- transition = @valid_transitions[from_state]
83
- @valid_transitions[from_state].invoke_success_callbacks(obj, *args) if transition
82
+ transition = @valid_transitions[obj.object_id][from_state]
83
+ transition.invoke_success_callbacks(obj, *args) if transition
84
+ @valid_transitions.delete(obj.object_id)
84
85
  end
85
86
 
86
87
  def ==(event)
@@ -153,7 +154,7 @@ module AASM::Core
153
154
  result = transition
154
155
  else
155
156
  result = to_state || Array(transition.to).first
156
- Array(transition.to).each {|to| @valid_transitions[to] = transition }
157
+ Array(transition.to).each {|to| @valid_transitions[obj.object_id][to] = transition }
157
158
  transition.execute(obj, *args)
158
159
  end
159
160
 
@@ -17,7 +17,7 @@ module AASM
17
17
  end
18
18
 
19
19
  def invoke_subject
20
- @result = retrieve_instance.call
20
+ @result = instance.call
21
21
  end
22
22
 
23
23
  private
@@ -30,7 +30,9 @@ module AASM
30
30
  raise(*record_error) unless record.respond_to?(subject, true)
31
31
  return record.__send__(subject) if subject_arity.zero?
32
32
  return record.__send__(subject, *args) if subject_arity < 0
33
- record.__send__(subject, *args[0..(subject_arity - 1)])
33
+ req_args = args[0..(subject_arity - 1)]
34
+ return record.__send__(subject, **req_args[0]) if req_args[0].is_a?(Hash)
35
+ record.__send__(subject, *req_args)
34
36
  end
35
37
  # rubocop:enable Metrics/AbcSize
36
38
 
data/lib/aasm/errors.rb CHANGED
@@ -17,5 +17,6 @@ module AASM
17
17
  end
18
18
 
19
19
  class UndefinedState < RuntimeError; end
20
+ class UndefinedEvent < UndefinedState; end
20
21
  class NoDirectAssignmentError < RuntimeError; end
21
22
  end
@@ -1,6 +1,5 @@
1
1
  module AASM
2
2
  class InstanceBase
3
-
4
3
  attr_accessor :from_state, :to_state, :current_event
5
4
 
6
5
  def initialize(instance, name=:default) # instance of the class including AASM, name of the state machine
@@ -115,12 +114,15 @@ module AASM
115
114
  end
116
115
 
117
116
  def fire(event_name, *args, &block)
117
+ event_exists?(event_name)
118
+
118
119
  @instance.send(event_name, *args, &block)
119
120
  end
120
121
 
121
122
  def fire!(event_name, *args, &block)
122
- event_name = event_name.to_s.+("!").to_sym
123
- @instance.send(event_name, *args, &block)
123
+ event_exists?(event_name, true)
124
+ bang_event_name = "#{event_name}!".to_sym
125
+ @instance.send(bang_event_name, *args, &block)
124
126
  end
125
127
 
126
128
  def set_current_state_with_persistence(state)
@@ -129,5 +131,14 @@ module AASM
129
131
  save_success
130
132
  end
131
133
 
134
+ private
135
+
136
+ def event_exists?(event_name, bang = false)
137
+ event = @instance.class.aasm(@name).state_machine.events[event_name.to_sym]
138
+ return true if event
139
+
140
+ event_error = bang ? "#{event_name}!" : event_name
141
+ raise AASM::UndefinedEvent, "Event :#{event_error} doesn't exist" if event.nil?
142
+ end
132
143
  end
133
144
  end
data/lib/aasm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "5.2.0"
2
+ VERSION = "5.5.0"
3
3
  end
@@ -29,7 +29,7 @@ RUBY
29
29
  end
30
30
 
31
31
  def model_exists?
32
- File.exists?(File.join(destination_root, model_path))
32
+ File.exist?(File.join(destination_root, model_path))
33
33
  end
34
34
 
35
35
  def model_path
@@ -1,4 +1,4 @@
1
- class AASMCreate<%= table_name.camelize %> < ActiveRecord::Migration[<%= ActiveRecord::VERSION::STRING.to_f %>]
1
+ class AasmCreate<%= table_name.camelize %> < ActiveRecord::Migration[<%= ActiveRecord::VERSION::STRING.to_f %>]
2
2
  def change
3
3
  create_table(:<%= table_name %>) do |t|
4
4
  t.string :<%= column_name %>