state_machines 0.4.0 → 0.6.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 (454) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +1 -1
  3. data/README.md +18 -13
  4. data/lib/state_machines/branch.rb +81 -79
  5. data/lib/state_machines/callback.rb +22 -21
  6. data/lib/state_machines/eval_helpers.rb +15 -15
  7. data/lib/state_machines/event.rb +31 -28
  8. data/lib/state_machines/event_collection.rb +26 -25
  9. data/lib/state_machines/extensions.rb +2 -2
  10. data/lib/state_machines/helper_module.rb +1 -1
  11. data/lib/state_machines/integrations/base.rb +2 -5
  12. data/lib/state_machines/integrations.rb +9 -13
  13. data/lib/state_machines/machine.rb +386 -379
  14. data/lib/state_machines/machine_collection.rb +11 -10
  15. data/lib/state_machines/macro_methods.rb +100 -100
  16. data/lib/state_machines/matcher.rb +23 -23
  17. data/lib/state_machines/matcher_helpers.rb +11 -11
  18. data/lib/state_machines/node_collection.rb +15 -13
  19. data/lib/state_machines/path.rb +56 -55
  20. data/lib/state_machines/path_collection.rb +38 -38
  21. data/lib/state_machines/state.rb +28 -22
  22. data/lib/state_machines/state_collection.rb +21 -20
  23. data/lib/state_machines/state_context.rb +33 -35
  24. data/lib/state_machines/transition.rb +180 -178
  25. data/lib/state_machines/transition_collection.rb +170 -168
  26. data/lib/state_machines/version.rb +1 -1
  27. metadata +5 -852
  28. data/.gitignore +0 -21
  29. data/.rspec +0 -3
  30. data/.travis.yml +0 -14
  31. data/Changelog.md +0 -16
  32. data/Contributors.md +0 -39
  33. data/Gemfile +0 -8
  34. data/Rakefile +0 -12
  35. data/Testing.md +0 -0
  36. data/state_machines.gemspec +0 -23
  37. data/test/files/integrations/event_on_failure_integration.rb +0 -10
  38. data/test/files/integrations/vehicle.rb +0 -7
  39. data/test/files/models/auto_shop.rb +0 -31
  40. data/test/files/models/car.rb +0 -21
  41. data/test/files/models/model_base.rb +0 -6
  42. data/test/files/models/motorcycle.rb +0 -11
  43. data/test/files/models/traffic_light.rb +0 -47
  44. data/test/files/models/vehicle.rb +0 -127
  45. data/test/files/node.rb +0 -5
  46. data/test/files/switch.rb +0 -15
  47. data/test/functional/auto_shop_available_test.rb +0 -20
  48. data/test/functional/auto_shop_busy_test.rb +0 -25
  49. data/test/functional/car_backing_up_test.rb +0 -45
  50. data/test/functional/car_test.rb +0 -49
  51. data/test/functional/motorcycle_test.rb +0 -46
  52. data/test/functional/traffic_light_caution_test.rb +0 -17
  53. data/test/functional/traffic_light_proceed_test.rb +0 -17
  54. data/test/functional/traffic_light_stop_test.rb +0 -26
  55. data/test/functional/vehicle_first_gear_test.rb +0 -42
  56. data/test/functional/vehicle_idling_test.rb +0 -59
  57. data/test/functional/vehicle_locked_test.rb +0 -29
  58. data/test/functional/vehicle_parked_test.rb +0 -53
  59. data/test/functional/vehicle_repaired_test.rb +0 -20
  60. data/test/functional/vehicle_second_gear_test.rb +0 -42
  61. data/test/functional/vehicle_stalled_test.rb +0 -65
  62. data/test/functional/vehicle_test.rb +0 -20
  63. data/test/functional/vehicle_third_gear_test.rb +0 -42
  64. data/test/functional/vehicle_unsaved_test.rb +0 -181
  65. data/test/functional/vehicle_with_event_attributes_test.rb +0 -30
  66. data/test/functional/vehicle_with_parallel_events_test.rb +0 -36
  67. data/test/test_helper.rb +0 -15
  68. data/test/unit/assertions/assert_exclusive_keys_test.rb +0 -22
  69. data/test/unit/assertions/assert_valid_key_test.rb +0 -12
  70. data/test/unit/branch/branch_test.rb +0 -28
  71. data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +0 -27
  72. data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +0 -8
  73. data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +0 -8
  74. data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +0 -8
  75. data/test/unit/branch/branch_with_different_requirements_test.rb +0 -41
  76. data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +0 -8
  77. data/test/unit/branch/branch_with_except_from_requirement_test.rb +0 -36
  78. data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +0 -8
  79. data/test/unit/branch/branch_with_except_on_requirement_test.rb +0 -36
  80. data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +0 -8
  81. data/test/unit/branch/branch_with_except_to_requirement_test.rb +0 -36
  82. data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +0 -20
  83. data/test/unit/branch/branch_with_from_requirement_test.rb +0 -45
  84. data/test/unit/branch/branch_with_if_conditional_test.rb +0 -27
  85. data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +0 -23
  86. data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +0 -20
  87. data/test/unit/branch/branch_with_implicit_requirement_test.rb +0 -20
  88. data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +0 -16
  89. data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +0 -20
  90. data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +0 -16
  91. data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +0 -20
  92. data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +0 -16
  93. data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +0 -20
  94. data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +0 -53
  95. data/test/unit/branch/branch_with_multiple_on_requirements_test.rb +0 -20
  96. data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +0 -20
  97. data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +0 -20
  98. data/test/unit/branch/branch_with_nil_requirements_test.rb +0 -28
  99. data/test/unit/branch/branch_with_no_requirements_test.rb +0 -36
  100. data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +0 -16
  101. data/test/unit/branch/branch_with_on_requirement_test.rb +0 -45
  102. data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +0 -20
  103. data/test/unit/branch/branch_with_to_requirement_test.rb +0 -45
  104. data/test/unit/branch/branch_with_unless_conditional_test.rb +0 -27
  105. data/test/unit/branch/branch_without_guards_test.rb +0 -27
  106. data/test/unit/callback/callback_by_default_test.rb +0 -25
  107. data/test/unit/callback/callback_test.rb +0 -53
  108. data/test/unit/callback/callback_with_application_bound_object_test.rb +0 -23
  109. data/test/unit/callback/callback_with_application_terminator_test.rb +0 -24
  110. data/test/unit/callback/callback_with_arguments_test.rb +0 -14
  111. data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +0 -25
  112. data/test/unit/callback/callback_with_around_type_and_block_test.rb +0 -44
  113. data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +0 -23
  114. data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +0 -93
  115. data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +0 -17
  116. data/test/unit/callback/callback_with_block_test.rb +0 -20
  117. data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +0 -28
  118. data/test/unit/callback/callback_with_bound_method_test.rb +0 -35
  119. data/test/unit/callback/callback_with_do_method_test.rb +0 -18
  120. data/test/unit/callback/callback_with_explicit_requirements_test.rb +0 -32
  121. data/test/unit/callback/callback_with_if_condition_test.rb +0 -17
  122. data/test/unit/callback/callback_with_implicit_requirements_test.rb +0 -32
  123. data/test/unit/callback/callback_with_method_argument_test.rb +0 -18
  124. data/test/unit/callback/callback_with_mixed_methods_test.rb +0 -31
  125. data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +0 -21
  126. data/test/unit/callback/callback_with_multiple_do_methods_test.rb +0 -29
  127. data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +0 -29
  128. data/test/unit/callback/callback_with_terminator_test.rb +0 -22
  129. data/test/unit/callback/callback_with_unbound_method_test.rb +0 -14
  130. data/test/unit/callback/callback_with_unless_condition_test.rb +0 -17
  131. data/test/unit/callback/callback_without_arguments_test.rb +0 -14
  132. data/test/unit/callback/callback_without_terminator_test.rb +0 -12
  133. data/test/unit/error/error_by_default_test.rb +0 -21
  134. data/test/unit/error/error_with_message_test.rb +0 -23
  135. data/test/unit/eval_helper/eval_helpers_base_test.rb +0 -8
  136. data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +0 -14
  137. data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +0 -14
  138. data/test/unit/eval_helper/eval_helpers_proc_test.rb +0 -13
  139. data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +0 -13
  140. data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +0 -13
  141. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +0 -18
  142. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +0 -14
  143. data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +0 -19
  144. data/test/unit/eval_helper/eval_helpers_string_test.rb +0 -25
  145. data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +0 -12
  146. data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +0 -20
  147. data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +0 -17
  148. data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +0 -17
  149. data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +0 -18
  150. data/test/unit/eval_helper/eval_helpers_symbol_test.rb +0 -16
  151. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +0 -16
  152. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +0 -16
  153. data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +0 -16
  154. data/test/unit/eval_helper/eval_helpers_test.rb +0 -13
  155. data/test/unit/event/event_after_being_copied_test.rb +0 -17
  156. data/test/unit/event/event_by_default_test.rb +0 -60
  157. data/test/unit/event/event_context_test.rb +0 -16
  158. data/test/unit/event/event_on_failure_test.rb +0 -44
  159. data/test/unit/event/event_test.rb +0 -34
  160. data/test/unit/event/event_transitions_test.rb +0 -62
  161. data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +0 -79
  162. data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +0 -58
  163. data/test/unit/event/event_with_conflicting_machine_test.rb +0 -48
  164. data/test/unit/event/event_with_dynamic_human_name_test.rb +0 -26
  165. data/test/unit/event/event_with_human_name_test.rb +0 -13
  166. data/test/unit/event/event_with_invalid_current_state_test.rb +0 -30
  167. data/test/unit/event/event_with_machine_action_test.rb +0 -33
  168. data/test/unit/event/event_with_marshalling_test.rb +0 -47
  169. data/test/unit/event/event_with_matching_disabled_transitions_test.rb +0 -115
  170. data/test/unit/event/event_with_matching_enabled_transitions_test.rb +0 -75
  171. data/test/unit/event/event_with_multiple_transitions_test.rb +0 -61
  172. data/test/unit/event/event_with_namespace_test.rb +0 -34
  173. data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +0 -60
  174. data/test/unit/event/event_with_transition_with_loopback_state_test.rb +0 -36
  175. data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +0 -36
  176. data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +0 -51
  177. data/test/unit/event/event_with_transition_without_to_state_test.rb +0 -36
  178. data/test/unit/event/event_with_transitions_test.rb +0 -32
  179. data/test/unit/event/event_without_matching_transitions_test.rb +0 -41
  180. data/test/unit/event/event_without_transitions_test.rb +0 -28
  181. data/test/unit/event/invalid_event_test.rb +0 -20
  182. data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +0 -62
  183. data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +0 -36
  184. data/test/unit/event_collection/event_collection_by_default_test.rb +0 -26
  185. data/test/unit/event_collection/event_collection_test.rb +0 -39
  186. data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +0 -31
  187. data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +0 -76
  188. data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +0 -27
  189. data/test/unit/event_collection/event_collection_with_validations_test.rb +0 -74
  190. data/test/unit/event_collection/event_collection_without_machine_action_test.rb +0 -18
  191. data/test/unit/event_collection/event_string_collection_test.rb +0 -31
  192. data/test/unit/helper_module_test.rb +0 -17
  193. data/test/unit/integrations/integration_finder_test.rb +0 -16
  194. data/test/unit/integrations/integration_matcher_test.rb +0 -27
  195. data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +0 -18
  196. data/test/unit/invalid_transition/invalid_transition_test.rb +0 -47
  197. data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +0 -45
  198. data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +0 -32
  199. data/test/unit/machine/machine_after_being_copied_test.rb +0 -62
  200. data/test/unit/machine/machine_after_changing_initial_state.rb +0 -28
  201. data/test/unit/machine/machine_after_changing_owner_class_test.rb +0 -31
  202. data/test/unit/machine/machine_by_default_test.rb +0 -160
  203. data/test/unit/machine/machine_finder_custom_options_test.rb +0 -17
  204. data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +0 -85
  205. data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +0 -23
  206. data/test/unit/machine/machine_finder_without_existing_machine_test.rb +0 -25
  207. data/test/unit/machine/machine_persistence_test.rb +0 -52
  208. data/test/unit/machine/machine_state_initialization_test.rb +0 -56
  209. data/test/unit/machine/machine_test.rb +0 -30
  210. data/test/unit/machine/machine_with_action_already_overridden_test.rb +0 -23
  211. data/test/unit/machine/machine_with_action_defined_in_class_test.rb +0 -37
  212. data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +0 -46
  213. data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +0 -43
  214. data/test/unit/machine/machine_with_action_undefined_test.rb +0 -33
  215. data/test/unit/machine/machine_with_cached_state_test.rb +0 -20
  216. data/test/unit/machine/machine_with_class_helpers_test.rb +0 -179
  217. data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +0 -244
  218. data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +0 -175
  219. data/test/unit/machine/machine_with_custom_action_test.rb +0 -11
  220. data/test/unit/machine/machine_with_custom_attribute_test.rb +0 -103
  221. data/test/unit/machine/machine_with_custom_initialize_test.rb +0 -24
  222. data/test/unit/machine/machine_with_custom_integration_test.rb +0 -72
  223. data/test/unit/machine/machine_with_custom_invalidation_test.rb +0 -39
  224. data/test/unit/machine/machine_with_custom_name_test.rb +0 -57
  225. data/test/unit/machine/machine_with_custom_plural_test.rb +0 -52
  226. data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +0 -65
  227. data/test/unit/machine/machine_with_event_matchers_test.rb +0 -41
  228. data/test/unit/machine/machine_with_events_test.rb +0 -52
  229. data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +0 -18
  230. data/test/unit/machine/machine_with_events_with_transitions_test.rb +0 -37
  231. data/test/unit/machine/machine_with_existing_event_test.rb +0 -17
  232. data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +0 -20
  233. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +0 -71
  234. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +0 -31
  235. data/test/unit/machine/machine_with_existing_state_test.rb +0 -27
  236. data/test/unit/machine/machine_with_failure_callbacks_test.rb +0 -48
  237. data/test/unit/machine/machine_with_helpers_test.rb +0 -14
  238. data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +0 -25
  239. data/test/unit/machine/machine_with_initialize_and_super_test.rb +0 -17
  240. data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +0 -31
  241. data/test/unit/machine/machine_with_initialize_without_super_test.rb +0 -17
  242. data/test/unit/machine/machine_with_instance_helpers_test.rb +0 -179
  243. data/test/unit/machine/machine_with_integration_test.rb +0 -72
  244. data/test/unit/machine/machine_with_multiple_events_test.rb +0 -32
  245. data/test/unit/machine/machine_with_namespace_test.rb +0 -48
  246. data/test/unit/machine/machine_with_nil_action_test.rb +0 -27
  247. data/test/unit/machine/machine_with_other_states.rb +0 -22
  248. data/test/unit/machine/machine_with_owner_subclass_test.rb +0 -18
  249. data/test/unit/machine/machine_with_paths_test.rb +0 -25
  250. data/test/unit/machine/machine_with_private_action_test.rb +0 -43
  251. data/test/unit/machine/machine_with_state_matchers_test.rb +0 -41
  252. data/test/unit/machine/machine_with_state_with_matchers_test.rb +0 -19
  253. data/test/unit/machine/machine_with_states_test.rb +0 -55
  254. data/test/unit/machine/machine_with_states_with_behaviors_test.rb +0 -23
  255. data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +0 -18
  256. data/test/unit/machine/machine_with_states_with_custom_values_test.rb +0 -21
  257. data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +0 -19
  258. data/test/unit/machine/machine_with_static_initial_state_test.rb +0 -49
  259. data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +0 -36
  260. data/test/unit/machine/machine_with_transition_callbacks_test.rb +0 -144
  261. data/test/unit/machine/machine_with_transitions_test.rb +0 -87
  262. data/test/unit/machine/machine_without_initialization_test.rb +0 -31
  263. data/test/unit/machine/machine_without_initialize_test.rb +0 -14
  264. data/test/unit/machine/machine_without_integration_test.rb +0 -31
  265. data/test/unit/machine_collection/machine_collection_by_default_test.rb +0 -11
  266. data/test/unit/machine_collection/machine_collection_fire_attributes_with_validations_test.rb +0 -72
  267. data/test/unit/machine_collection/machine_collection_fire_test.rb +0 -80
  268. data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +0 -54
  269. data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +0 -76
  270. data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +0 -111
  271. data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +0 -25
  272. data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +0 -20
  273. data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +0 -26
  274. data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +0 -25
  275. data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +0 -25
  276. data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +0 -31
  277. data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +0 -26
  278. data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +0 -25
  279. data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +0 -27
  280. data/test/unit/matcher/all_matcher_test.rb +0 -29
  281. data/test/unit/matcher/blacklist_matcher_test.rb +0 -30
  282. data/test/unit/matcher/loopback_matcher_test.rb +0 -27
  283. data/test/unit/matcher/matcher_by_default_test.rb +0 -15
  284. data/test/unit/matcher/matcher_with_multiple_values_test.rb +0 -15
  285. data/test/unit/matcher/matcher_with_value_test.rb +0 -15
  286. data/test/unit/matcher/whitelist_matcher_test.rb +0 -30
  287. data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +0 -14
  288. data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +0 -14
  289. data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +0 -13
  290. data/test/unit/node_collection/node_collection_after_being_copied_test.rb +0 -46
  291. data/test/unit/node_collection/node_collection_after_update_test.rb +0 -36
  292. data/test/unit/node_collection/node_collection_by_default_test.rb +0 -22
  293. data/test/unit/node_collection/node_collection_test.rb +0 -23
  294. data/test/unit/node_collection/node_collection_with_indices_test.rb +0 -42
  295. data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +0 -25
  296. data/test/unit/node_collection/node_collection_with_nodes_test.rb +0 -46
  297. data/test/unit/node_collection/node_collection_with_numeric_index_test.rb +0 -24
  298. data/test/unit/node_collection/node_collection_with_postdefined_contexts_test.rb +0 -22
  299. data/test/unit/node_collection/node_collection_with_predefined_contexts_test.rb +0 -23
  300. data/test/unit/node_collection/node_collection_with_string_index_test.rb +0 -20
  301. data/test/unit/node_collection/node_collection_with_symbol_index_test.rb +0 -20
  302. data/test/unit/node_collection/node_collection_without_indices_test.rb +0 -30
  303. data/test/unit/path/path_by_default_test.rb +0 -54
  304. data/test/unit/path/path_test.rb +0 -14
  305. data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +0 -40
  306. data/test/unit/path/path_with_available_transitions_test.rb +0 -54
  307. data/test/unit/path/path_with_deep_target_reached_test.rb +0 -50
  308. data/test/unit/path/path_with_deep_target_test.rb +0 -40
  309. data/test/unit/path/path_with_duplicates_test.rb +0 -32
  310. data/test/unit/path/path_with_encountered_transitions_test.rb +0 -34
  311. data/test/unit/path/path_with_guarded_transitions_test.rb +0 -42
  312. data/test/unit/path/path_with_reached_target_test.rb +0 -35
  313. data/test/unit/path/path_with_transitions_test.rb +0 -54
  314. data/test/unit/path/path_with_unreached_target_test.rb +0 -31
  315. data/test/unit/path/path_without_transitions_test.rb +0 -24
  316. data/test/unit/path_collection/path_collection_by_default_test.rb +0 -46
  317. data/test/unit/path_collection/path_collection_test.rb +0 -24
  318. data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +0 -43
  319. data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +0 -31
  320. data/test/unit/path_collection/path_collection_with_from_state_test.rb +0 -27
  321. data/test/unit/path_collection/path_collection_with_paths_test.rb +0 -47
  322. data/test/unit/path_collection/path_collection_with_to_state_test.rb +0 -29
  323. data/test/unit/path_collection/path_with_guarded_paths_test.rb +0 -25
  324. data/test/unit/state/state_after_being_copied_test.rb +0 -19
  325. data/test/unit/state/state_by_default_test.rb +0 -41
  326. data/test/unit/state/state_final_test.rb +0 -28
  327. data/test/unit/state/state_initial_test.rb +0 -13
  328. data/test/unit/state/state_not_final_test.rb +0 -32
  329. data/test/unit/state/state_not_initial_test.rb +0 -13
  330. data/test/unit/state/state_test.rb +0 -44
  331. data/test/unit/state/state_with_cached_lambda_value_test.rb +0 -29
  332. data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +0 -38
  333. data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +0 -29
  334. data/test/unit/state/state_with_conflicting_machine_name_test.rb +0 -20
  335. data/test/unit/state/state_with_conflicting_machine_test.rb +0 -37
  336. data/test/unit/state/state_with_context_test.rb +0 -60
  337. data/test/unit/state/state_with_dynamic_human_name_test.rb +0 -25
  338. data/test/unit/state/state_with_existing_context_method_test.rb +0 -24
  339. data/test/unit/state/state_with_human_name_test.rb +0 -13
  340. data/test/unit/state/state_with_integer_value_test.rb +0 -32
  341. data/test/unit/state/state_with_invalid_method_call_test.rb +0 -21
  342. data/test/unit/state/state_with_lambda_value_test.rb +0 -37
  343. data/test/unit/state/state_with_matcher_test.rb +0 -18
  344. data/test/unit/state/state_with_multiple_contexts_test.rb +0 -57
  345. data/test/unit/state/state_with_name_test.rb +0 -43
  346. data/test/unit/state/state_with_namespace_test.rb +0 -22
  347. data/test/unit/state/state_with_nil_value_test.rb +0 -35
  348. data/test/unit/state/state_with_redefined_context_method_test.rb +0 -45
  349. data/test/unit/state/state_with_symbolic_value_test.rb +0 -32
  350. data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +0 -40
  351. data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +0 -33
  352. data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +0 -41
  353. data/test/unit/state/state_without_cached_lambda_value_test.rb +0 -25
  354. data/test/unit/state/state_without_name_test.rb +0 -39
  355. data/test/unit/state_collection/state_collection_by_default_test.rb +0 -21
  356. data/test/unit/state_collection/state_collection_string_test.rb +0 -35
  357. data/test/unit/state_collection/state_collection_test.rb +0 -74
  358. data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +0 -29
  359. data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +0 -39
  360. data/test/unit/state_collection/state_collection_with_initial_state_test.rb +0 -40
  361. data/test/unit/state_collection/state_collection_with_namespace_test.rb +0 -21
  362. data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +0 -40
  363. data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +0 -29
  364. data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +0 -40
  365. data/test/unit/state_context/state_context_proxy_test.rb +0 -26
  366. data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +0 -42
  367. data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +0 -64
  368. data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +0 -32
  369. data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +0 -32
  370. data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +0 -64
  371. data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +0 -31
  372. data/test/unit/state_context/state_context_test.rb +0 -28
  373. data/test/unit/state_context/state_context_transition_test.rb +0 -104
  374. data/test/unit/state_context/state_context_with_matching_transition_test.rb +0 -27
  375. data/test/unit/state_machine/state_machine_by_default_test.rb +0 -12
  376. data/test/unit/state_machine/state_machine_test.rb +0 -20
  377. data/test/unit/transition/transition_after_being_performed_test.rb +0 -48
  378. data/test/unit/transition/transition_after_being_persisted_test.rb +0 -46
  379. data/test/unit/transition/transition_after_being_rolled_back_test.rb +0 -35
  380. data/test/unit/transition/transition_equality_test.rb +0 -52
  381. data/test/unit/transition/transition_loopback_test.rb +0 -18
  382. data/test/unit/transition/transition_test.rb +0 -96
  383. data/test/unit/transition/transition_transient_test.rb +0 -20
  384. data/test/unit/transition/transition_with_action_test.rb +0 -27
  385. data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +0 -127
  386. data/test/unit/transition/transition_with_after_callbacks_test.rb +0 -93
  387. data/test/unit/transition/transition_with_around_callbacks_test.rb +0 -141
  388. data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +0 -30
  389. data/test/unit/transition/transition_with_before_callbacks_test.rb +0 -104
  390. data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +0 -28
  391. data/test/unit/transition/transition_with_different_states_test.rb +0 -18
  392. data/test/unit/transition/transition_with_dynamic_to_value_test.rb +0 -19
  393. data/test/unit/transition/transition_with_failure_callbacks_test.rb +0 -84
  394. data/test/unit/transition/transition_with_invalid_nodes_test.rb +0 -29
  395. data/test/unit/transition/transition_with_mixed_callbacks_test.rb +0 -105
  396. data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +0 -40
  397. data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +0 -114
  398. data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +0 -40
  399. data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +0 -40
  400. data/test/unit/transition/transition_with_namespace_test.rb +0 -47
  401. data/test/unit/transition/transition_with_perform_arguments_test.rb +0 -35
  402. data/test/unit/transition/transition_with_transactions_test.rb +0 -42
  403. data/test/unit/transition/transition_without_callbacks_test.rb +0 -33
  404. data/test/unit/transition/transition_without_reading_state_test.rb +0 -22
  405. data/test/unit/transition/transition_without_running_action_test.rb +0 -47
  406. data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +0 -23
  407. data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +0 -64
  408. data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +0 -44
  409. data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +0 -44
  410. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +0 -32
  411. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +0 -33
  412. data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +0 -32
  413. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +0 -32
  414. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +0 -33
  415. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +0 -33
  416. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +0 -32
  417. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +0 -33
  418. data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +0 -68
  419. data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +0 -41
  420. data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +0 -44
  421. data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +0 -42
  422. data/test/unit/transition_collection/transition_collection_by_default_test.rb +0 -23
  423. data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +0 -23
  424. data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +0 -12
  425. data/test/unit/transition_collection/transition_collection_invalid_test.rb +0 -21
  426. data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +0 -69
  427. data/test/unit/transition_collection/transition_collection_test.rb +0 -26
  428. data/test/unit/transition_collection/transition_collection_valid_test.rb +0 -57
  429. data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +0 -66
  430. data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +0 -60
  431. data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +0 -17
  432. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +0 -17
  433. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +0 -37
  434. data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +0 -34
  435. data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +0 -29
  436. data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +0 -17
  437. data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +0 -79
  438. data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +0 -45
  439. data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +0 -48
  440. data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +0 -42
  441. data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +0 -51
  442. data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -47
  443. data/test/unit/transition_collection/transition_collection_with_block_test.rb +0 -46
  444. data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +0 -135
  445. data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +0 -189
  446. data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +0 -48
  447. data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +0 -41
  448. data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +0 -41
  449. data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +0 -34
  450. data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +0 -69
  451. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +0 -53
  452. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +0 -34
  453. data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +0 -65
  454. data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2f3852a59e959d4add7fbde2dc0252eee9ac51a7
4
- data.tar.gz: 41ee2c50b0bbcc40691cfe6ff13fed6ab5d14ce7
2
+ SHA256:
3
+ metadata.gz: 1d22dcf0b70eca7cbf9a6894d592609874cfdef01474b70a2226018c0e8966b7
4
+ data.tar.gz: 9a9bed680181f45bc613649bf4f3b90a4ea1e198e8fb19f734d264c7652e5051
5
5
  SHA512:
6
- metadata.gz: fa703fb24e2453a0fe96c386b83ab52a633698a8dd7b5d9de9afd48e3d9ee81c058e963d2a7546fe009266e50d22ecd9adfb9575fdb81ebe55dbe9ad166795ac
7
- data.tar.gz: 5f74b1a302c64c4a0d6046decb74bb7e5e167f11bb3675795c6f53d46a2f235c7a91c31f9cd03b1e63c4246330b958937dd113413a2e8c96e6ce1e29f9759292
6
+ metadata.gz: d1446488cbb427e407611d2cba2e571401931a4a20f9f8655e14ebf896990468d24a94a02ba708627db8beb3a3821ac481b220551f0d0c02e366ba3d78112da4
7
+ data.tar.gz: 4949561813ac58b6442611d37083091b6c4532f41227f3f9f0999bbecc18c18aacc458f9aa6d6570b5855b6a30a24394d421e6b6012dfa4ebed638a642da82f3
data/LICENSE.txt CHANGED
@@ -1,5 +1,5 @@
1
1
  Copyright (c) 2006-2012 Aaron Pfeifer
2
- Copyright (c) 2014-2015 Abdelkader Boudih
2
+ Copyright (c) 2014-2023 Abdelkader Boudih
3
3
 
4
4
  MIT License
5
5
 
data/README.md CHANGED
@@ -1,9 +1,11 @@
1
- [![Build Status](https://travis-ci.org/state-machines/state_machines.svg?branch=master)](https://travis-ci.org/state-machines/state_machines)
2
- [![Code Climate](https://codeclimate.com/github/state-machines/state_machines.png)](https://codeclimate.com/github/state-machines/state_machines)
1
+ ![Build Status](https://github.com/state-machines/state_machines/actions/workflows/ruby.yml/badge.svg)
2
+ [![Code Climate](https://codeclimate.com/github/state-machines/state_machines.svg)](https://codeclimate.com/github/state-machines/state_machines)
3
3
  # State Machines
4
4
 
5
5
  State Machines adds support for creating state machines for attributes on any Ruby class.
6
6
 
7
+ *Please note that multiple integrations are available for [Active Model](https://github.com/state-machines/state_machines-activemodel), [Active Record](https://github.com/state-machines/state_machines-activerecord), [Mongoid](https://github.com/state-machines/state_machines-mongoid) and more in the [State Machines organisation](https://github.com/state-machines).* If you want to save state in your database, **you need one of these additional integrations**.
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
@@ -40,10 +42,10 @@ class Vehicle
40
42
  attr_accessor :seatbelt_on, :time_used, :auto_shop_busy
41
43
 
42
44
  state_machine :state, initial: :parked do
43
- before_transition parked: :any - :parked, do: :put_on_seatbelt
44
-
45
+ before_transition parked: any - :parked, do: :put_on_seatbelt
46
+
45
47
  after_transition on: :crash, do: :tow
46
- after_transition on: :repair, :do: :fix
48
+ after_transition on: :repair, do: :fix
47
49
  after_transition any => :parked do |vehicle, transition|
48
50
  vehicle.seatbelt_on = false
49
51
  end
@@ -83,7 +85,7 @@ class Vehicle
83
85
  event :repair do
84
86
  # The first transition that matches the state and passes its conditions
85
87
  # will be used
86
- transition stalled: parked, unless: :auto_shop_busy
88
+ transition stalled: :parked, unless: :auto_shop_busy
87
89
  transition stalled: same
88
90
  end
89
91
 
@@ -217,7 +219,7 @@ vehicle.fire_events(:shift_down, :enable_alarm) # => true
217
219
  vehicle.state_name # => :first_gear
218
220
  vehicle.alarm_state_name # => :active
219
221
 
220
- vehicle.fire_events!(:ignite, :enable_alarm) # => StateMachines:InvalidTransition: Cannot run events in parallel: ignite, enable_alarm
222
+ vehicle.fire_events!(:ignite, :enable_alarm) # => StateMachines:InvalidParallelTransition: Cannot run events in parallel: ignite, enable_alarm
221
223
 
222
224
  # Human-friendly names can be accessed for states/events
223
225
  Vehicle.human_state_name(:first_gear) # => "first gear"
@@ -235,6 +237,10 @@ vehicle.state_paths # => [[#<StateMachines
235
237
  vehicle.state_paths.to_states # => [:parked, :idling, :first_gear, :stalled, :second_gear, :third_gear]
236
238
  vehicle.state_paths.events # => [:park, :ignite, :shift_up, :idle, :crash, :repair, :shift_down]
237
239
 
240
+ # Possible states can be analyzed for a class
241
+ Vehicle.state_machine.states.to_a # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
242
+ Vehicle.state_machines[:state].states.to_a # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
243
+
238
244
  # Find all paths that start and end on certain states
239
245
  vehicle.state_paths(:from => :parked, :to => :first_gear) # => [[
240
246
  # #<StateMachines:Transition attribute=:state event=:ignite from="parked" ...>,
@@ -400,8 +406,8 @@ For example, transitions and callbacks can be defined like so:
400
406
  class Vehicle
401
407
  state_machine initial: :parked do
402
408
  before_transition from: :parked, except_to: :parked, do: :put_on_seatbelt
403
- after_transition to: :parked do |transition|
404
- self.seatbelt = 'off' # self is the record
409
+ after_transition to: :parked do |vehicle, transition|
410
+ vehicle.seatbelt = 'off'
405
411
  end
406
412
 
407
413
  event :ignite do
@@ -425,7 +431,7 @@ class Vehicle
425
431
  ...
426
432
 
427
433
  state :parked do
428
- transition to::idling, :on => [:ignite, :shift_up], if: :seatbelt_on?
434
+ transition to: :idling, :on => [:ignite, :shift_up], if: :seatbelt_on?
429
435
 
430
436
  def speed
431
437
  0
@@ -463,7 +469,6 @@ class Vehicle
463
469
  transition parked: :idling, :on => [:ignite, :shift_up]
464
470
  transition first_gear: :second_gear, second_gear: :third_gear, on: :shift_up
465
471
  transition [:idling, :first_gear] => :parked, on: :park
466
- transition [:idling, :first_gear] => :parked, on: :park
467
472
  transition all - [:parked, :stalled]: :stalled, unless: :auto_shop_busy?
468
473
  end
469
474
  end
@@ -561,7 +566,7 @@ end
561
566
  vehicle = Vehicle.new # => #<Vehicle:0xb708412c @state="parked" ...>
562
567
  vehicle.state # => "parked"
563
568
  vehicle.machine.ignite # => true
564
- vehicle.machine.state # => "idling
569
+ vehicle.machine.state # => "idling"
565
570
  vehicle.state # => "idling"
566
571
  vehicle.machine.state_transitions # => [#<StateMachines:Transition ...>]
567
572
  vehicle.machine.definition.states.keys # => :first_gear, :second_gear, :parked, :idling
@@ -575,7 +580,7 @@ transitions.
575
580
 
576
581
  Ruby versions officially supported and tested:
577
582
 
578
- * Ruby (MRI) 2.0.0+
583
+ * Ruby (MRI) 2.6.0+
579
584
  * JRuby
580
585
  * Rubinius
581
586
 
@@ -6,68 +6,68 @@ module StateMachines
6
6
  class Branch
7
7
 
8
8
  include EvalHelpers
9
-
9
+
10
10
  # The condition that must be met on an object
11
11
  attr_reader :if_condition
12
-
12
+
13
13
  # The condition that must *not* be met on an object
14
14
  attr_reader :unless_condition
15
-
15
+
16
16
  # The requirement for verifying the event being matched
17
17
  attr_reader :event_requirement
18
-
18
+
19
19
  # One or more requirements for verifying the states being matched. All
20
20
  # requirements contain a mapping of {:from => matcher, :to => matcher}.
21
21
  attr_reader :state_requirements
22
-
22
+
23
23
  # A list of all of the states known to this branch. This will pull states
24
24
  # from the following options (in the same order):
25
25
  # * +from+ / +except_from+
26
26
  # * +to+ / +except_to+
27
27
  attr_reader :known_states
28
-
28
+
29
29
  # Creates a new branch
30
30
  def initialize(options = {}) #:nodoc:
31
31
  # Build conditionals
32
32
  @if_condition = options.delete(:if)
33
33
  @unless_condition = options.delete(:unless)
34
-
34
+
35
35
  # Build event requirement
36
36
  @event_requirement = build_matcher(options, :on, :except_on)
37
-
37
+
38
38
  if (options.keys - [:from, :to, :on, :except_from, :except_to, :except_on]).empty?
39
39
  # Explicit from/to requirements specified
40
- @state_requirements = [{:from => build_matcher(options, :from, :except_from), :to => build_matcher(options, :to, :except_to)}]
40
+ @state_requirements = [{from: build_matcher(options, :from, :except_from), to: build_matcher(options, :to, :except_to)}]
41
41
  else
42
42
  # Separate out the event requirement
43
43
  options.delete(:on)
44
44
  options.delete(:except_on)
45
-
45
+
46
46
  # Implicit from/to requirements specified
47
47
  @state_requirements = options.collect do |from, to|
48
48
  from = WhitelistMatcher.new(from) unless from.is_a?(Matcher)
49
49
  to = WhitelistMatcher.new(to) unless to.is_a?(Matcher)
50
- {:from => from, :to => to}
50
+ {from: from, to: to}
51
51
  end
52
52
  end
53
-
53
+
54
54
  # Track known states. The order that requirements are iterated is based
55
55
  # on the priority in which tracked states should be added.
56
56
  @known_states = []
57
57
  @state_requirements.each do |state_requirement|
58
- [:from, :to].each {|option| @known_states |= state_requirement[option].values}
58
+ [:from, :to].each { |option| @known_states |= state_requirement[option].values }
59
59
  end
60
60
  end
61
-
61
+
62
62
  # Determines whether the given object / query matches the requirements
63
63
  # configured for this branch. In addition to matching the event, from state,
64
64
  # and to state, this will also check whether the configured :if/:unless
65
65
  # conditions pass on the given object.
66
- #
66
+ #
67
67
  # == Examples
68
- #
68
+ #
69
69
  # branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
70
- #
70
+ #
71
71
  # # Successful
72
72
  # branch.matches?(object, :on => :ignite) # => true
73
73
  # branch.matches?(object, :from => nil) # => true
@@ -75,7 +75,7 @@ module StateMachines
75
75
  # branch.matches?(object, :to => :idling) # => true
76
76
  # branch.matches?(object, :from => :parked, :to => :idling) # => true
77
77
  # branch.matches?(object, :on => :ignite, :from => :parked, :to => :idling) # => true
78
- #
78
+ #
79
79
  # # Unsuccessful
80
80
  # branch.matches?(object, :on => :park) # => false
81
81
  # branch.matches?(object, :from => :idling) # => false
@@ -85,16 +85,16 @@ module StateMachines
85
85
  def matches?(object, query = {})
86
86
  !match(object, query).nil?
87
87
  end
88
-
88
+
89
89
  # Attempts to match the given object / query against the set of requirements
90
90
  # configured for this branch. In addition to matching the event, from state,
91
91
  # and to state, this will also check whether the configured :if/:unless
92
92
  # conditions pass on the given object.
93
- #
93
+ #
94
94
  # If a match is found, then the event/state requirements that the query
95
95
  # passed successfully will be returned. Otherwise, nil is returned if there
96
96
  # was no match.
97
- #
97
+ #
98
98
  # Query options:
99
99
  # * <tt>:from</tt> - One or more states being transitioned from. If none
100
100
  # are specified, then this will always match.
@@ -104,16 +104,16 @@ module StateMachines
104
104
  # are specified, then this will always match.
105
105
  # * <tt>:guard</tt> - Whether to guard matches with the if/unless
106
106
  # conditionals defined for this branch. Default is true.
107
- #
107
+ #
108
108
  # == Examples
109
- #
109
+ #
110
110
  # branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
111
- #
111
+ #
112
112
  # branch.match(object, :on => :ignite) # => {:to => ..., :from => ..., :on => ...}
113
113
  # branch.match(object, :on => :park) # => nil
114
114
  def match(object, query = {})
115
115
  query.assert_valid_keys(:from, :to, :on, :guard)
116
-
116
+
117
117
  if (match = match_query(query)) && matches_conditions?(object, query)
118
118
  match
119
119
  end
@@ -122,62 +122,64 @@ module StateMachines
122
122
  def draw(graph, event, valid_states)
123
123
  fail NotImplementedError
124
124
  end
125
-
126
- protected
127
- # Builds a matcher strategy to use for the given options. If neither a
128
- # whitelist nor a blacklist option is specified, then an AllMatcher is
129
- # built.
130
- def build_matcher(options, whitelist_option, blacklist_option)
131
- options.assert_exclusive_keys(whitelist_option, blacklist_option)
132
-
133
- if options.include?(whitelist_option)
134
- value = options[whitelist_option]
135
- value.is_a?(Matcher) ? value : WhitelistMatcher.new(options[whitelist_option])
136
- elsif options.include?(blacklist_option)
137
- value = options[blacklist_option]
138
- raise ArgumentError, ":#{blacklist_option} option cannot use matchers; use :#{whitelist_option} instead" if value.is_a?(Matcher)
139
- BlacklistMatcher.new(value)
140
- else
141
- AllMatcher.instance
142
- end
143
- end
144
-
145
- # Verifies that all configured requirements (event and state) match the
146
- # given query. If a match is found, then a hash containing the
147
- # event/state requirements that passed will be returned; otherwise, nil.
148
- def match_query(query)
149
- query ||= {}
150
-
151
- if match_event(query) && (state_requirement = match_states(query))
152
- state_requirement.merge(:on => event_requirement)
153
- end
154
- end
155
-
156
- # Verifies that the event requirement matches the given query
157
- def match_event(query)
158
- matches_requirement?(query, :on, event_requirement)
159
- end
160
-
161
- # Verifies that the state requirements match the given query. If a
162
- # matching requirement is found, then it is returned.
163
- def match_states(query)
164
- state_requirements.detect do |state_requirement|
165
- [:from, :to].all? {|option| matches_requirement?(query, option, state_requirement[option])}
166
- end
125
+
126
+ protected
127
+
128
+ # Builds a matcher strategy to use for the given options. If neither a
129
+ # whitelist nor a blacklist option is specified, then an AllMatcher is
130
+ # built.
131
+ def build_matcher(options, whitelist_option, blacklist_option)
132
+ options.assert_exclusive_keys(whitelist_option, blacklist_option)
133
+
134
+ if options.include?(whitelist_option)
135
+ value = options[whitelist_option]
136
+ value.is_a?(Matcher) ? value : WhitelistMatcher.new(options[whitelist_option])
137
+ elsif options.include?(blacklist_option)
138
+ value = options[blacklist_option]
139
+ raise ArgumentError, ":#{blacklist_option} option cannot use matchers; use :#{whitelist_option} instead" if value.is_a?(Matcher)
140
+
141
+ BlacklistMatcher.new(value)
142
+ else
143
+ AllMatcher.instance
167
144
  end
168
-
169
- # Verifies that an option in the given query matches the values required
170
- # for that option
171
- def matches_requirement?(query, option, requirement)
172
- !query.include?(option) || requirement.matches?(query[option], query)
145
+ end
146
+
147
+ # Verifies that all configured requirements (event and state) match the
148
+ # given query. If a match is found, then a hash containing the
149
+ # event/state requirements that passed will be returned; otherwise, nil.
150
+ def match_query(query)
151
+ query ||= {}
152
+
153
+ if match_event(query) && (state_requirement = match_states(query))
154
+ state_requirement.merge(on: event_requirement)
173
155
  end
174
-
175
- # Verifies that the conditionals for this branch evaluate to true for the
176
- # given object
177
- def matches_conditions?(object, query)
178
- query[:guard] == false ||
179
- Array(if_condition).all? {|condition| evaluate_method(object, condition)} &&
180
- !Array(unless_condition).any? {|condition| evaluate_method(object, condition)}
156
+ end
157
+
158
+ # Verifies that the event requirement matches the given query
159
+ def match_event(query)
160
+ matches_requirement?(query, :on, event_requirement)
161
+ end
162
+
163
+ # Verifies that the state requirements match the given query. If a
164
+ # matching requirement is found, then it is returned.
165
+ def match_states(query)
166
+ state_requirements.detect do |state_requirement|
167
+ [:from, :to].all? { |option| matches_requirement?(query, option, state_requirement[option]) }
181
168
  end
169
+ end
170
+
171
+ # Verifies that an option in the given query matches the values required
172
+ # for that option
173
+ def matches_requirement?(query, option, requirement)
174
+ !query.include?(option) || requirement.matches?(query[option], query)
175
+ end
176
+
177
+ # Verifies that the conditionals for this branch evaluate to true for the
178
+ # given object
179
+ def matches_conditions?(object, query)
180
+ query[:guard] == false ||
181
+ Array(if_condition).all? { |condition| evaluate_method(object, condition) } &&
182
+ !Array(unless_condition).any? { |condition| evaluate_method(object, condition) }
183
+ end
182
184
  end
183
185
  end
@@ -16,38 +16,38 @@ module StateMachines
16
16
  # the callback. This can be configured on an application-wide basis by
17
17
  # setting this configuration to +true+ or +false+. The default value
18
18
  # is +false+.
19
- #
19
+ #
20
20
  # *Note* that the DataMapper and Sequel integrations automatically
21
21
  # configure this value on a per-callback basis, so it does not have to
22
22
  # be enabled application-wide.
23
- #
23
+ #
24
24
  # == Examples
25
- #
25
+ #
26
26
  # When not bound to the object:
27
- #
27
+ #
28
28
  # class Vehicle
29
29
  # state_machine do
30
30
  # before_transition do |vehicle|
31
31
  # vehicle.set_alarm
32
32
  # end
33
33
  # end
34
- #
34
+ #
35
35
  # def set_alarm
36
36
  # ...
37
37
  # end
38
38
  # end
39
- #
39
+ #
40
40
  # When bound to the object:
41
- #
41
+ #
42
42
  # StateMachines::Callback.bind_to_object = true
43
- #
43
+ #
44
44
  # class Vehicle
45
45
  # state_machine do
46
46
  # before_transition do
47
47
  # self.set_alarm
48
48
  # end
49
49
  # end
50
- #
50
+ #
51
51
  # def set_alarm
52
52
  # ...
53
53
  # end
@@ -57,7 +57,7 @@ module StateMachines
57
57
  # The application-wide terminator to use for callbacks when not
58
58
  # explicitly defined. Terminators determine whether to cancel a
59
59
  # callback chain based on the return value of the callback.
60
- #
60
+ #
61
61
  # See StateMachines::Callback#terminator for more information.
62
62
  attr_accessor :terminator
63
63
  end
@@ -75,11 +75,11 @@ module StateMachines
75
75
  # chain never cancels based on the return value (i.e. there is no implicit
76
76
  # terminator). Certain integrations, such as ActiveRecord and Sequel,
77
77
  # change this default value.
78
- #
78
+ #
79
79
  # == Examples
80
- #
80
+ #
81
81
  # Canceling the callback chain without a terminator:
82
- #
82
+ #
83
83
  # class Vehicle
84
84
  # state_machine do
85
85
  # before_transition do |vehicle|
@@ -87,9 +87,9 @@ module StateMachines
87
87
  # end
88
88
  # end
89
89
  # end
90
- #
90
+ #
91
91
  # Canceling the callback chain with a terminator value of +false+:
92
- #
92
+ #
93
93
  # class Vehicle
94
94
  # state_machine do
95
95
  # before_transition do |vehicle|
@@ -102,13 +102,13 @@ module StateMachines
102
102
  # The branch that determines whether or not this callback can be invoked
103
103
  # based on the context of the transition. The event, from state, and
104
104
  # to state must all match in order for the branch to pass.
105
- #
105
+ #
106
106
  # See StateMachines::Branch for more information.
107
107
  attr_reader :branch
108
108
 
109
109
  # Creates a new callback that can get called based on the configured
110
110
  # options.
111
- #
111
+ #
112
112
  # In addition to the possible configuration options for branches, the
113
113
  # following options can be configured:
114
114
  # * <tt>:bind_to_object</tt> - Whether to bind the callback to the object involved.
@@ -117,7 +117,7 @@ module StateMachines
117
117
  # * <tt>:terminator</tt> - A block/proc that determines what callback
118
118
  # results should cause the callback chain to halt (if not using the
119
119
  # default <tt>throw :halt</tt> technique).
120
- #
120
+ #
121
121
  # More information about how those options affect the behavior of the
122
122
  # callback can be found in their attribute definitions.
123
123
  def initialize(type, *args, &block)
@@ -130,7 +130,7 @@ module StateMachines
130
130
  @methods << block if block_given?
131
131
  raise ArgumentError, 'Method(s) for callback must be specified' unless @methods.any?
132
132
 
133
- options = {:bind_to_object => self.class.bind_to_object, :terminator => self.class.terminator}.merge(options)
133
+ options = {bind_to_object: self.class.bind_to_object, terminator: self.class.terminator}.merge(options)
134
134
 
135
135
  # Proxy lambda blocks so that they're bound to the object
136
136
  bind_to_object = options.delete(:bind_to_object)
@@ -151,7 +151,7 @@ module StateMachines
151
151
  # Runs the callback as long as the transition context matches the branch
152
152
  # requirements configured for this callback. If a block is provided, it
153
153
  # will be called when the last method has run.
154
- #
154
+ #
155
155
  # If a terminator has been configured and it matches the result from the
156
156
  # evaluated method, then the callback chain should be halted.
157
157
  def call(object, context = {}, *args, &block)
@@ -163,7 +163,8 @@ module StateMachines
163
163
  end
164
164
  end
165
165
 
166
- private
166
+ private
167
+
167
168
  # Runs all of the methods configured for this callback.
168
169
  #
169
170
  # When running +around+ callbacks, this will evaluate each method and
@@ -7,46 +7,46 @@ module StateMachines
7
7
  # * Symbol
8
8
  # * Method / Proc
9
9
  # * String
10
- #
10
+ #
11
11
  # == Examples
12
- #
12
+ #
13
13
  # Below are examples of the various ways that a method can be evaluated
14
14
  # on an object:
15
- #
15
+ #
16
16
  # class Person
17
17
  # def initialize(name)
18
18
  # @name = name
19
19
  # end
20
- #
20
+ #
21
21
  # def name
22
22
  # @name
23
23
  # end
24
24
  # end
25
- #
25
+ #
26
26
  # class PersonCallback
27
27
  # def self.run(person)
28
28
  # person.name
29
29
  # end
30
30
  # end
31
- #
31
+ #
32
32
  # person = Person.new('John Smith')
33
- #
33
+ #
34
34
  # evaluate_method(person, :name) # => "John Smith"
35
35
  # evaluate_method(person, PersonCallback.method(:run)) # => "John Smith"
36
36
  # evaluate_method(person, Proc.new {|person| person.name}) # => "John Smith"
37
37
  # evaluate_method(person, lambda {|person| person.name}) # => "John Smith"
38
38
  # evaluate_method(person, '@name') # => "John Smith"
39
- #
39
+ #
40
40
  # == Additional arguments
41
- #
41
+ #
42
42
  # Additional arguments can be passed to the methods being evaluated. If
43
43
  # the method defines additional arguments other than the object context,
44
44
  # then all arguments are required.
45
- #
45
+ #
46
46
  # For example,
47
- #
47
+ #
48
48
  # person = Person.new('John Smith')
49
- #
49
+ #
50
50
  # evaluate_method(person, lambda {|person| person.name}, 21) # => "John Smith"
51
51
  # evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21) # => "John Smith is 21"
52
52
  # evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21, 'male') # => ArgumentError: wrong number of arguments (3 for 2)
@@ -59,7 +59,7 @@ module StateMachines
59
59
  when Proc, Method
60
60
  args.unshift(object)
61
61
  arity = method.arity
62
-
62
+
63
63
  # Procs don't support blocks in < Ruby 1.9, so it's tacked on as an
64
64
  # argument for consistency across versions of Ruby
65
65
  if block_given? && Proc === method && arity != 0
@@ -75,10 +75,10 @@ module StateMachines
75
75
  # These method types are only called with 0, 1, or n arguments
76
76
  args = args[0, arity] if [0, 1].include?(arity)
77
77
  end
78
-
78
+
79
79
  method.is_a?(Proc) ? method.call(*args) : method.call(*args, &block)
80
80
  when String
81
- eval(method, object.instance_eval {binding}, &block)
81
+ eval(method, object.instance_eval { binding }, &block)
82
82
  else
83
83
  raise ArgumentError, 'Methods must be a symbol denoting the method to call, a block to be invoked, or a string to be evaluated'
84
84
  end