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
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module StateMachines
2
4
  # Represents a collection of state machines for a class
3
5
  class MachineCollection < Hash
4
6
  # Initializes the state of each machine in the given object. This can allow
5
7
  # states to be initialized in two groups: static and dynamic. For example:
6
- #
8
+ #
7
9
  # machines.initialize_states(object) do
8
10
  # # After static state initialization, before dynamic state initialization
9
11
  # end
10
- #
12
+ #
11
13
  # If no block is provided, then all states will still be initialized.
12
- #
14
+ #
13
15
  # Valid configuration options:
14
16
  # * <tt>:static</tt> - Whether to initialize static states. Unless set to
15
17
  # false, the state will be initialized regardless of its current value.
@@ -21,19 +23,19 @@ module StateMachines
21
23
  # writing to the object. Default is to write directly to the object.
22
24
  def initialize_states(object, options = {}, attributes = {})
23
25
  options.assert_valid_keys( :static, :dynamic, :to)
24
- options = {:static => true, :dynamic => true}.merge(options)
26
+ options = {static: true, dynamic: true}.merge(options)
25
27
 
26
28
  result = yield if block_given?
27
29
 
28
30
  each_value do |machine|
29
31
  unless machine.dynamic_initial_state?
30
32
  force = options[:static] == :force || !attributes.keys.map(&:to_sym).include?(machine.attribute)
31
- machine.initialize_state(object, force: force, :to => options[:to])
33
+ machine.initialize_state(object, force: force, to: options[:to])
32
34
  end
33
35
  end if options[:static]
34
36
 
35
37
  each_value do |machine|
36
- machine.initialize_state(object, :force => options[:dynamic] == :force, :to => options[:to]) if machine.dynamic_initial_state?
38
+ machine.initialize_state(object, force: options[:dynamic] == :force, to: options[:to]) if machine.dynamic_initial_state?
37
39
  end if options[:dynamic]
38
40
 
39
41
  result
@@ -48,12 +50,12 @@ module StateMachines
48
50
  transitions = events.collect do |event_name|
49
51
  # Find the actual event being run
50
52
  event = nil
51
- detect {|name, machine| event = machine.events[event_name, :qualified_name]}
53
+ detect { |name, machine| event = machine.events[event_name, :qualified_name] }
52
54
 
53
55
  raise(InvalidEvent.new(object, event_name)) unless event
54
56
 
55
57
  # Get the transition that will be performed for the event
56
- unless transition = event.transition_for(object)
58
+ unless (transition = event.transition_for(object))
57
59
  event.on_failure(object)
58
60
  end
59
61
  transition
@@ -71,7 +73,7 @@ module StateMachines
71
73
  # Builds the collection of transitions for all event attributes defined on
72
74
  # the given object. This will only include events whose machine actions
73
75
  # match the one specified.
74
- #
76
+ #
75
77
  # These should only be fired as a result of the action being run.
76
78
  def transitions(object, action, options = {})
77
79
  transitions = map do |name, machine|
@@ -81,13 +83,14 @@ module StateMachines
81
83
  AttributeTransitionCollection.new(transitions.compact, {use_transactions: resolve_use_transactions}.merge(options))
82
84
  end
83
85
 
84
- protected
86
+ protected
85
87
 
86
88
  def resolve_use_transactions
87
89
  use_transactions = nil
88
90
  each_value do |machine|
89
91
  # Determine use_transactions setting for this set of transitions. If from multiple state_machines, the settings must match.
90
92
  raise 'Encountered mismatched use_transactions configurations for multiple state_machines' if !use_transactions.nil? && use_transactions != machine.use_transactions
93
+
91
94
  use_transactions = machine.use_transactions
92
95
  end
93
96
  use_transactions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # A state machine is a model of behavior composed of states, events, and
2
4
  # transitions. This helper adds support for defining this type of
3
5
  # functionality on any Ruby class.
@@ -5,7 +7,7 @@ module StateMachines
5
7
  module MacroMethods
6
8
  # Creates a new state machine with the given name. The default name, if not
7
9
  # specified, is <tt>:state</tt>.
8
- #
10
+ #
9
11
  # Configuration options:
10
12
  # * <tt>:attribute</tt> - The name of the attribute to store the state value
11
13
  # in. By default, this is the same as the name of the machine.
@@ -26,7 +28,7 @@ module StateMachines
26
28
  # library-specific behavior to the machine. Built-in integrations
27
29
  # include :active_model, :active_record, :data_mapper, :mongo_mapper, and
28
30
  # :sequel. By default, this is determined automatically.
29
- #
31
+ #
30
32
  # Configuration options relevant to ORM integrations:
31
33
  # * <tt>:plural</tt> - The pluralized version of the name. By default, this
32
34
  # will attempt to call +pluralize+ on the name. If this method is not
@@ -39,20 +41,20 @@ module StateMachines
39
41
  # * <tt>:use_transactions</tt> - Whether transactions should be used when
40
42
  # firing events. Default is true unless otherwise specified by the
41
43
  # configured integration.
42
- #
44
+ #
43
45
  # This also expects a block which will be used to actually configure the
44
46
  # states, events and transitions for the state machine. *Note* that this
45
47
  # block will be executed within the context of the state machine. As a
46
48
  # result, you will not be able to access any class methods unless you refer
47
49
  # to them directly (i.e. specifying the class name).
48
- #
50
+ #
49
51
  # For examples on the types of state machine configurations and blocks, see
50
52
  # the section below.
51
- #
53
+ #
52
54
  # == Examples
53
- #
55
+ #
54
56
  # With the default name/attribute and no configuration:
55
- #
57
+ #
56
58
  # class Vehicle
57
59
  # state_machine do
58
60
  # event :park do
@@ -60,37 +62,37 @@ module StateMachines
60
62
  # end
61
63
  # end
62
64
  # end
63
- #
65
+ #
64
66
  # The above example will define a state machine named "state" that will
65
67
  # store the value in the +state+ attribute. Every vehicle will start
66
68
  # without an initial state.
67
- #
69
+ #
68
70
  # With a custom name / attribute:
69
- #
71
+ #
70
72
  # class Vehicle
71
73
  # state_machine :status, :attribute => :status_value do
72
74
  # ...
73
75
  # end
74
76
  # end
75
- #
77
+ #
76
78
  # With a static initial state:
77
- #
79
+ #
78
80
  # class Vehicle
79
81
  # state_machine :status, :initial => :parked do
80
82
  # ...
81
83
  # end
82
84
  # end
83
- #
85
+ #
84
86
  # With a dynamic initial state:
85
- #
87
+ #
86
88
  # class Vehicle
87
89
  # state_machine :status, :initial => lambda {|vehicle| vehicle.speed == 0 ? :parked : :idling} do
88
90
  # ...
89
91
  # end
90
92
  # end
91
- #
93
+ #
92
94
  # == Class Methods
93
- #
95
+ #
94
96
  # The following class methods will be automatically generated by the
95
97
  # state machine based on the *name* of the machine. Any existing methods
96
98
  # will not be overwritten.
@@ -100,28 +102,28 @@ module StateMachines
100
102
  # * <tt>human_state_event_name(event)</tt> - Gets the humanized value for
101
103
  # the given event. This may be generated by internationalization
102
104
  # libraries if supported by the integration.
103
- #
105
+ #
104
106
  # For example,
105
- #
107
+ #
106
108
  # class Vehicle
107
109
  # state_machine :state, :initial => :parked do
108
110
  # event :ignite do
109
111
  # transition :parked => :idling
110
112
  # end
111
- #
113
+ #
112
114
  # event :shift_up do
113
115
  # transition :idling => :first_gear
114
116
  # end
115
117
  # end
116
118
  # end
117
- #
119
+ #
118
120
  # Vehicle.human_state_name(:parked) # => "parked"
119
121
  # Vehicle.human_state_name(:first_gear) # => "first gear"
120
122
  # Vehicle.human_state_event_name(:park) # => "park"
121
123
  # Vehicle.human_state_event_name(:shift_up) # => "shift up"
122
- #
124
+ #
123
125
  # == Instance Methods
124
- #
126
+ #
125
127
  # The following instance methods will be automatically generated by the
126
128
  # state machine based on the *name* of the machine. Any existing methods
127
129
  # will not be overwritten.
@@ -142,7 +144,7 @@ module StateMachines
142
144
  # * <tt>fire_state_event(name, *args)</tt> - Fires an arbitrary event with
143
145
  # the given argument list. This is essentially the same as calling the
144
146
  # actual event method itself.
145
- #
147
+ #
146
148
  # The <tt>state_events</tt>, <tt>state_transitions</tt>, and <tt>state_paths</tt>
147
149
  # helpers all take an optional set of requirements for determining what's
148
150
  # available for the current object. These requirements include:
@@ -154,146 +156,146 @@ module StateMachines
154
156
  # specified, then this will match any event.
155
157
  # * <tt>:guard</tt> - Whether to guard transitions with the if/unless
156
158
  # conditionals defined for each one. Default is true.
157
- #
159
+ #
158
160
  # For example,
159
- #
161
+ #
160
162
  # class Vehicle
161
163
  # state_machine :state, :initial => :parked do
162
164
  # event :ignite do
163
165
  # transition :parked => :idling
164
166
  # end
165
- #
167
+ #
166
168
  # event :park do
167
169
  # transition :idling => :parked
168
170
  # end
169
171
  # end
170
172
  # end
171
- #
173
+ #
172
174
  # vehicle = Vehicle.new
173
175
  # vehicle.state # => "parked"
174
176
  # vehicle.state_name # => :parked
175
177
  # vehicle.human_state_name # => "parked"
176
178
  # vehicle.state?(:parked) # => true
177
- #
179
+ #
178
180
  # # Changing state
179
181
  # vehicle.state = 'idling'
180
182
  # vehicle.state # => "idling"
181
183
  # vehicle.state_name # => :idling
182
184
  # vehicle.state?(:parked) # => false
183
- #
185
+ #
184
186
  # # Getting current event / transition availability
185
187
  # vehicle.state_events # => [:park]
186
188
  # vehicle.park # => true
187
189
  # vehicle.state_events # => [:ignite]
188
190
  # vehicle.state_events(:from => :idling) # => [:park]
189
191
  # vehicle.state_events(:to => :parked) # => []
190
- #
192
+ #
191
193
  # vehicle.state_transitions # => [#<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
192
194
  # vehicle.ignite # => true
193
195
  # vehicle.state_transitions # => [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>]
194
- #
196
+ #
195
197
  # vehicle.state_transitions(:on => :ignite) # => []
196
- #
198
+ #
197
199
  # # Getting current path availability
198
200
  # vehicle.state_paths # => [
199
201
  # # [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>,
200
202
  # # #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
201
203
  # # ]
202
- # vehicle.state_paths(:guard => false) # =>
204
+ # vehicle.state_paths(:guard => false) # =>
203
205
  # # [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>,
204
206
  # # #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
205
207
  # # ]
206
- #
208
+ #
207
209
  # # Fire arbitrary events
208
210
  # vehicle.fire_state_event(:park) # => true
209
- #
211
+ #
210
212
  # == Attribute initialization
211
- #
213
+ #
212
214
  # For most classes, the initial values for state machine attributes are
213
215
  # automatically assigned when a new object is created. However, this
214
216
  # behavior will *not* work if the class defines an +initialize+ method
215
217
  # without properly calling +super+.
216
- #
218
+ #
217
219
  # For example,
218
- #
220
+ #
219
221
  # class Vehicle
220
222
  # state_machine :state, :initial => :parked do
221
223
  # ...
222
224
  # end
223
225
  # end
224
- #
226
+ #
225
227
  # vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
226
228
  # vehicle.state # => "parked"
227
- #
229
+ #
228
230
  # In the above example, no +initialize+ method is defined. As a result,
229
231
  # the default behavior of initializing the state machine attributes is used.
230
- #
232
+ #
231
233
  # In the following example, a custom +initialize+ method is defined:
232
- #
234
+ #
233
235
  # class Vehicle
234
236
  # state_machine :state, :initial => :parked do
235
237
  # ...
236
238
  # end
237
- #
239
+ #
238
240
  # def initialize
239
241
  # end
240
242
  # end
241
- #
243
+ #
242
244
  # vehicle = Vehicle.new # => #<Vehicle:0xb7c77678>
243
245
  # vehicle.state # => nil
244
- #
246
+ #
245
247
  # Since the +initialize+ method is defined, the state machine attributes
246
248
  # never get initialized. In order to ensure that all initialization hooks
247
249
  # are called, the custom method *must* call +super+ without any arguments
248
250
  # like so:
249
- #
251
+ #
250
252
  # class Vehicle
251
253
  # state_machine :state, :initial => :parked do
252
254
  # ...
253
255
  # end
254
- #
256
+ #
255
257
  # def initialize(attributes = {})
256
258
  # ...
257
259
  # super()
258
260
  # end
259
261
  # end
260
- #
262
+ #
261
263
  # vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
262
264
  # vehicle.state # => "parked"
263
- #
265
+ #
264
266
  # Because of the way the inclusion of modules works in Ruby, calling
265
267
  # <tt>super()</tt> will not only call the superclass's +initialize+, but
266
268
  # also +initialize+ on all included modules. This allows the original state
267
269
  # machine hook to get called properly.
268
- #
270
+ #
269
271
  # If you want to avoid calling the superclass's constructor, but still want
270
272
  # to initialize the state machine attributes:
271
- #
273
+ #
272
274
  # class Vehicle
273
275
  # state_machine :state, :initial => :parked do
274
276
  # ...
275
277
  # end
276
- #
278
+ #
277
279
  # def initialize(attributes = {})
278
280
  # ...
279
281
  # initialize_state_machines
280
282
  # end
281
283
  # end
282
- #
284
+ #
283
285
  # vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
284
286
  # vehicle.state # => "parked"
285
- #
287
+ #
286
288
  # You may also need to call the +initialize_state_machines+ helper manually
287
289
  # in cases where you want to change how static / dynamic initial states get
288
290
  # set. For example, the following example forces the initialization of
289
291
  # static states regardless of their current value:
290
- #
292
+ #
291
293
  # class Vehicle
292
294
  # state_machine :state, :initial => :parked do
293
295
  # state nil, :idling
294
296
  # ...
295
297
  # end
296
- #
298
+ #
297
299
  # def initialize(attributes = {})
298
300
  # @state = 'idling'
299
301
  # initialize_state_machines(:static => :force) do
@@ -301,28 +303,28 @@ module StateMachines
301
303
  # end
302
304
  # end
303
305
  # end
304
- #
306
+ #
305
307
  # vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
306
308
  # vehicle.state # => "parked"
307
- #
309
+ #
308
310
  # The above example is also noteworthy because it demonstrates how to avoid
309
311
  # initialization issues when +nil+ is a valid state. Without passing in
310
312
  # <tt>:static => :force</tt>, state_machine would never have initialized
311
313
  # the state because +nil+ (the default attribute value) would have been
312
314
  # interpreted as a valid current state. As a result, state_machine would
313
315
  # have simply skipped initialization.
314
- #
316
+ #
315
317
  # == States
316
- #
318
+ #
317
319
  # All of the valid states for the machine are automatically tracked based
318
320
  # on the events, transitions, and callbacks defined for the machine. If
319
321
  # there are additional states that are never referenced, these should be
320
322
  # explicitly added using the StateMachines::Machine#state or
321
323
  # StateMachines::Machine#other_states helpers.
322
- #
324
+ #
323
325
  # When a new state is defined, a predicate method for that state is
324
326
  # generated on the class. For example,
325
- #
327
+ #
326
328
  # class Vehicle
327
329
  # state_machine :initial => :parked do
328
330
  # event :ignite do
@@ -330,37 +332,37 @@ module StateMachines
330
332
  # end
331
333
  # end
332
334
  # end
333
- #
335
+ #
334
336
  # ...will generate the following instance methods (assuming they're not
335
337
  # already defined in the class):
336
338
  # * <tt>parked?</tt>
337
339
  # * <tt>idling?</tt>
338
- #
340
+ #
339
341
  # Each predicate method will return true if it matches the object's
340
342
  # current state. Otherwise, it will return false.
341
- #
343
+ #
342
344
  # == Attribute access
343
- #
345
+ #
344
346
  # The actual value for a state is stored in the attribute configured for the
345
347
  # state machine. In most cases, this is the same as the name of the state
346
348
  # machine. For example:
347
- #
349
+ #
348
350
  # class Vehicle
349
351
  # attr_accessor :state
350
- #
352
+ #
351
353
  # state_machine :state, :initial => :parked do
352
354
  # ...
353
355
  # state :parked, :value => 0
354
356
  # start :idling, :value => 1
355
357
  # end
356
358
  # end
357
- #
359
+ #
358
360
  # vehicle = Vehicle.new # => #<Vehicle:0xb712da60 @state=0>
359
361
  # vehicle.state # => 0
360
362
  # vehicle.parked? # => true
361
363
  # vehicle.state = 1
362
364
  # vehicle.idling? # => true
363
- #
365
+ #
364
366
  # The most important thing to note from the example above is what it means
365
367
  # to read from and write to the state machine's attribute. In particular,
366
368
  # state_machine treats the attribute (+state+ in this case) like a basic
@@ -378,97 +380,97 @@ module StateMachines
378
380
  # different ways an attribute can get written, state_machine just makes
379
381
  # sure that the configured value for a state is always used when writing
380
382
  # to the attribute.
381
- #
383
+ #
382
384
  # If you were interested in accessing the name of a state (instead of its
383
385
  # actual value through the attribute), you could do the following:
384
- #
386
+ #
385
387
  # vehicle.state_name # => :idling
386
- #
388
+ #
387
389
  # == Events and Transitions
388
- #
390
+ #
389
391
  # Events defined on the machine are the interface to transitioning states
390
392
  # for an object. Events can be fired either directly (through the method
391
393
  # generated for the event) or indirectly (through attributes defined on
392
394
  # the machine).
393
- #
395
+ #
394
396
  # For example,
395
- #
397
+ #
396
398
  # class Vehicle
397
399
  # include DataMapper::Resource
398
400
  # property :id, Serial
399
- #
401
+ #
400
402
  # state_machine :initial => :parked do
401
403
  # event :ignite do
402
404
  # transition :parked => :idling
403
405
  # end
404
406
  # end
405
- #
407
+ #
406
408
  # state_machine :alarm_state, :initial => :active do
407
409
  # event :disable do
408
410
  # transition all => :off
409
411
  # end
410
412
  # end
411
413
  # end
412
- #
414
+ #
413
415
  # # Fire +ignite+ event directly
414
416
  # vehicle = Vehicle.create # => #<Vehicle id=1 state="parked" alarm_state="active">
415
417
  # vehicle.ignite # => true
416
418
  # vehicle.state # => "idling"
417
419
  # vehicle.alarm_state # => "active"
418
- #
420
+ #
419
421
  # # Fire +disable+ event automatically
420
422
  # vehicle.alarm_state_event = 'disable'
421
423
  # vehicle.save # => true
422
424
  # vehicle.alarm_state # => "off"
423
- #
425
+ #
424
426
  # In the above example, the +state+ attribute is transitioned using the
425
427
  # +ignite+ action that's generated from the state machine. On the other
426
428
  # hand, the +alarm_state+ attribute is transitioned using the +alarm_state_event+
427
429
  # attribute that automatically gets fired when the machine's action (+save+)
428
430
  # is invoked.
429
- #
431
+ #
430
432
  # For more information about how to configure an event and its associated
431
433
  # transitions, see StateMachines::Machine#event.
432
- #
434
+ #
433
435
  # == Defining callbacks
434
- #
436
+ #
435
437
  # Within the +state_machine+ block, you can also define callbacks for
436
438
  # transitions. For more information about defining these callbacks,
437
439
  # see StateMachines::Machine#before_transition, StateMachines::Machine#after_transition,
438
440
  # and StateMachines::Machine#around_transition, and StateMachines::Machine#after_failure.
439
- #
441
+ #
440
442
  # == Namespaces
441
- #
443
+ #
442
444
  # When a namespace is configured for a state machine, the name provided
443
445
  # will be used in generating the instance methods for interacting with
444
446
  # states/events in the machine. This is particularly useful when a class
445
447
  # has multiple state machines and it would be difficult to differentiate
446
448
  # between the various states / events.
447
- #
449
+ #
448
450
  # For example,
449
- #
451
+ #
450
452
  # class Vehicle
451
453
  # state_machine :heater_state, :initial => :off, :namespace => 'heater' do
452
454
  # event :turn_on do
453
455
  # transition all => :on
454
456
  # end
455
- #
457
+ #
456
458
  # event :turn_off do
457
459
  # transition all => :off
458
460
  # end
459
461
  # end
460
- #
462
+ #
461
463
  # state_machine :alarm_state, :initial => :active, :namespace => 'alarm' do
462
464
  # event :turn_on do
463
465
  # transition all => :active
464
466
  # end
465
- #
467
+ #
466
468
  # event :turn_off do
467
469
  # transition all => :off
468
470
  # end
469
471
  # end
470
472
  # end
471
- #
473
+ #
472
474
  # The above class defines two state machines: +heater_state+ and +alarm_state+.
473
475
  # For the +heater_state+ machine, the following methods are generated since
474
476
  # it's namespaced by "heater":
@@ -480,7 +482,7 @@ module StateMachines
480
482
  # * ..
481
483
  # * <tt>heater_off?</tt>
482
484
  # * <tt>heater_on?</tt>
483
- #
485
+ #
484
486
  # As shown, each method is unique to the state machine so that the states
485
487
  # and events don't conflict. The same goes for the +alarm_state+ machine:
486
488
  # * <tt>can_turn_on_alarm?</tt>
@@ -491,25 +493,25 @@ module StateMachines
491
493
  # * ..
492
494
  # * <tt>alarm_active?</tt>
493
495
  # * <tt>alarm_off?</tt>
494
- #
496
+ #
495
497
  # == Scopes
496
- #
498
+ #
497
499
  # For integrations that support it, a group of default scope filters will
498
500
  # be automatically created for assisting in finding objects that have the
499
501
  # attribute set to one of a given set of states.
500
- #
502
+ #
501
503
  # For example,
502
- #
504
+ #
503
505
  # Vehicle.with_state(:parked) # => All vehicles where the state is parked
504
506
  # Vehicle.with_states(:parked, :idling) # => All vehicles where the state is either parked or idling
505
- #
507
+ #
506
508
  # Vehicle.without_state(:parked) # => All vehicles where the state is *not* parked
507
509
  # Vehicle.without_states(:parked, :idling) # => All vehicles where the state is *not* parked or idling
508
- #
510
+ #
509
511
  # *Note* that if class methods already exist with those names (i.e.
510
512
  # :with_state, :with_states, :without_state, or :without_states), then a
511
513
  # scope will not be defined for that name.
512
- #
514
+ #
513
515
  # See StateMachines::Machine for more information about using integrations
514
516
  # and the individual integration docs for information about the actual
515
517
  # scopes that are generated.