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