state_machines 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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