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.
- checksums.yaml +5 -5
- data/LICENSE.txt +1 -1
- data/README.md +34 -15
- data/lib/state_machines/assertions.rb +2 -0
- data/lib/state_machines/branch.rb +85 -81
- data/lib/state_machines/callback.rb +24 -21
- data/lib/state_machines/core.rb +2 -0
- data/lib/state_machines/core_ext/class/state_machine.rb +2 -0
- data/lib/state_machines/core_ext.rb +2 -0
- data/lib/state_machines/error.rb +2 -0
- data/lib/state_machines/eval_helpers.rb +51 -22
- data/lib/state_machines/event.rb +35 -30
- data/lib/state_machines/event_collection.rb +28 -25
- data/lib/state_machines/extensions.rb +3 -1
- data/lib/state_machines/helper_module.rb +3 -1
- data/lib/state_machines/integrations/base.rb +2 -0
- data/lib/state_machines/integrations.rb +10 -8
- data/lib/state_machines/machine/class_methods.rb +79 -0
- data/lib/state_machines/machine.rb +381 -425
- data/lib/state_machines/machine_collection.rb +13 -10
- data/lib/state_machines/macro_methods.rb +102 -100
- data/lib/state_machines/matcher.rb +26 -23
- data/lib/state_machines/matcher_helpers.rb +13 -11
- data/lib/state_machines/node_collection.rb +17 -13
- data/lib/state_machines/path.rb +58 -55
- data/lib/state_machines/path_collection.rb +37 -35
- data/lib/state_machines/state.rb +50 -38
- data/lib/state_machines/state_collection.rb +22 -19
- data/lib/state_machines/state_context.rb +35 -35
- data/lib/state_machines/stdio_renderer.rb +74 -0
- data/lib/state_machines/transition.rb +182 -178
- data/lib/state_machines/transition_collection.rb +172 -168
- data/lib/state_machines/version.rb +3 -1
- data/lib/state_machines.rb +4 -1
- metadata +10 -439
- data/.gitignore +0 -21
- data/.rspec +0 -3
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -16
- data/Changelog.md +0 -22
- data/Contributors.md +0 -39
- data/Gemfile +0 -8
- data/Rakefile +0 -12
- data/Testing.md +0 -0
- data/state_machines.gemspec +0 -22
- data/test/files/integrations/event_on_failure_integration.rb +0 -10
- data/test/files/integrations/vehicle.rb +0 -7
- data/test/files/models/auto_shop.rb +0 -31
- data/test/files/models/car.rb +0 -21
- data/test/files/models/driver.rb +0 -13
- data/test/files/models/model_base.rb +0 -6
- data/test/files/models/motorcycle.rb +0 -16
- data/test/files/models/traffic_light.rb +0 -47
- data/test/files/models/vehicle.rb +0 -127
- data/test/files/node.rb +0 -5
- data/test/files/switch.rb +0 -15
- data/test/functional/auto_shop_available_test.rb +0 -20
- data/test/functional/auto_shop_busy_test.rb +0 -25
- data/test/functional/car_backing_up_test.rb +0 -45
- data/test/functional/car_test.rb +0 -49
- data/test/functional/driver_default_nonstandard_test.rb +0 -13
- data/test/functional/motorcycle_test.rb +0 -52
- data/test/functional/traffic_light_caution_test.rb +0 -17
- data/test/functional/traffic_light_proceed_test.rb +0 -17
- data/test/functional/traffic_light_stop_test.rb +0 -26
- data/test/functional/vehicle_first_gear_test.rb +0 -42
- data/test/functional/vehicle_idling_test.rb +0 -59
- data/test/functional/vehicle_locked_test.rb +0 -29
- data/test/functional/vehicle_parked_test.rb +0 -53
- data/test/functional/vehicle_repaired_test.rb +0 -20
- data/test/functional/vehicle_second_gear_test.rb +0 -42
- data/test/functional/vehicle_stalled_test.rb +0 -65
- data/test/functional/vehicle_test.rb +0 -20
- data/test/functional/vehicle_third_gear_test.rb +0 -42
- data/test/functional/vehicle_unsaved_test.rb +0 -181
- data/test/functional/vehicle_with_event_attributes_test.rb +0 -30
- data/test/functional/vehicle_with_parallel_events_test.rb +0 -36
- data/test/test_helper.rb +0 -15
- data/test/unit/assertions/assert_exclusive_keys_test.rb +0 -22
- data/test/unit/assertions/assert_valid_key_test.rb +0 -12
- data/test/unit/branch/branch_test.rb +0 -28
- data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +0 -27
- data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_different_requirements_test.rb +0 -41
- data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_from_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_on_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_to_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_from_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_if_conditional_test.rb +0 -27
- data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +0 -23
- data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +0 -20
- data/test/unit/branch/branch_with_implicit_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +0 -53
- data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +0 -20
- data/test/unit/branch/branch_with_nil_requirements_test.rb +0 -28
- data/test/unit/branch/branch_with_no_requirements_test.rb +0 -36
- data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +0 -16
- data/test/unit/branch/branch_with_on_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_to_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_unless_conditional_test.rb +0 -27
- data/test/unit/branch/branch_without_guards_test.rb +0 -27
- data/test/unit/callback/callback_by_default_test.rb +0 -25
- data/test/unit/callback/callback_test.rb +0 -53
- data/test/unit/callback/callback_with_application_bound_object_test.rb +0 -23
- data/test/unit/callback/callback_with_application_terminator_test.rb +0 -24
- data/test/unit/callback/callback_with_arguments_test.rb +0 -14
- data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +0 -25
- data/test/unit/callback/callback_with_around_type_and_block_test.rb +0 -44
- data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +0 -23
- data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +0 -93
- data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +0 -17
- data/test/unit/callback/callback_with_block_test.rb +0 -20
- data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +0 -28
- data/test/unit/callback/callback_with_bound_method_test.rb +0 -35
- data/test/unit/callback/callback_with_do_method_test.rb +0 -18
- data/test/unit/callback/callback_with_explicit_requirements_test.rb +0 -32
- data/test/unit/callback/callback_with_if_condition_test.rb +0 -17
- data/test/unit/callback/callback_with_implicit_requirements_test.rb +0 -32
- data/test/unit/callback/callback_with_method_argument_test.rb +0 -18
- data/test/unit/callback/callback_with_mixed_methods_test.rb +0 -31
- data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +0 -21
- data/test/unit/callback/callback_with_multiple_do_methods_test.rb +0 -29
- data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +0 -29
- data/test/unit/callback/callback_with_terminator_test.rb +0 -22
- data/test/unit/callback/callback_with_unbound_method_test.rb +0 -14
- data/test/unit/callback/callback_with_unless_condition_test.rb +0 -17
- data/test/unit/callback/callback_without_arguments_test.rb +0 -14
- data/test/unit/callback/callback_without_terminator_test.rb +0 -12
- data/test/unit/error/error_by_default_test.rb +0 -21
- data/test/unit/error/error_with_message_test.rb +0 -23
- data/test/unit/eval_helper/eval_helpers_base_test.rb +0 -8
- data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +0 -18
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +0 -19
- data/test/unit/eval_helper/eval_helpers_string_test.rb +0 -25
- data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +0 -12
- data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +0 -20
- data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +0 -17
- data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +0 -17
- data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +0 -18
- data/test/unit/eval_helper/eval_helpers_symbol_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_test.rb +0 -13
- data/test/unit/event/event_after_being_copied_test.rb +0 -17
- data/test/unit/event/event_by_default_test.rb +0 -60
- data/test/unit/event/event_context_test.rb +0 -16
- data/test/unit/event/event_on_failure_test.rb +0 -44
- data/test/unit/event/event_test.rb +0 -34
- data/test/unit/event/event_transitions_test.rb +0 -62
- data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +0 -79
- data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +0 -58
- data/test/unit/event/event_with_conflicting_machine_test.rb +0 -48
- data/test/unit/event/event_with_dynamic_human_name_test.rb +0 -26
- data/test/unit/event/event_with_human_name_test.rb +0 -13
- data/test/unit/event/event_with_invalid_current_state_test.rb +0 -30
- data/test/unit/event/event_with_machine_action_test.rb +0 -33
- data/test/unit/event/event_with_marshalling_test.rb +0 -47
- data/test/unit/event/event_with_matching_disabled_transitions_test.rb +0 -115
- data/test/unit/event/event_with_matching_enabled_transitions_test.rb +0 -75
- data/test/unit/event/event_with_multiple_transitions_test.rb +0 -61
- data/test/unit/event/event_with_namespace_test.rb +0 -34
- data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +0 -60
- data/test/unit/event/event_with_transition_with_loopback_state_test.rb +0 -36
- data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +0 -36
- data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +0 -51
- data/test/unit/event/event_with_transition_without_to_state_test.rb +0 -36
- data/test/unit/event/event_with_transitions_test.rb +0 -32
- data/test/unit/event/event_without_matching_transitions_test.rb +0 -41
- data/test/unit/event/event_without_transitions_test.rb +0 -28
- data/test/unit/event/invalid_event_test.rb +0 -20
- data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +0 -62
- data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +0 -36
- data/test/unit/event_collection/event_collection_by_default_test.rb +0 -26
- data/test/unit/event_collection/event_collection_test.rb +0 -39
- data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +0 -31
- data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +0 -76
- data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +0 -27
- data/test/unit/event_collection/event_collection_with_validations_test.rb +0 -74
- data/test/unit/event_collection/event_collection_without_machine_action_test.rb +0 -18
- data/test/unit/event_collection/event_string_collection_test.rb +0 -31
- data/test/unit/helper_module_test.rb +0 -17
- data/test/unit/integrations/integration_finder_test.rb +0 -16
- data/test/unit/integrations/integration_matcher_test.rb +0 -29
- data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +0 -18
- data/test/unit/invalid_transition/invalid_transition_test.rb +0 -47
- data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +0 -45
- data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +0 -32
- data/test/unit/machine/machine_after_being_copied_test.rb +0 -62
- data/test/unit/machine/machine_after_changing_initial_state.rb +0 -28
- data/test/unit/machine/machine_after_changing_owner_class_test.rb +0 -31
- data/test/unit/machine/machine_by_default_test.rb +0 -160
- data/test/unit/machine/machine_finder_custom_options_test.rb +0 -17
- data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +0 -85
- data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +0 -23
- data/test/unit/machine/machine_finder_without_existing_machine_test.rb +0 -25
- data/test/unit/machine/machine_persistence_test.rb +0 -52
- data/test/unit/machine/machine_state_initialization_test.rb +0 -56
- data/test/unit/machine/machine_test.rb +0 -30
- data/test/unit/machine/machine_with_action_already_overridden_test.rb +0 -23
- data/test/unit/machine/machine_with_action_defined_in_class_test.rb +0 -37
- data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +0 -46
- data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +0 -43
- data/test/unit/machine/machine_with_action_undefined_test.rb +0 -33
- data/test/unit/machine/machine_with_cached_state_test.rb +0 -20
- data/test/unit/machine/machine_with_class_helpers_test.rb +0 -179
- data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +0 -244
- data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +0 -175
- data/test/unit/machine/machine_with_custom_action_test.rb +0 -11
- data/test/unit/machine/machine_with_custom_attribute_test.rb +0 -103
- data/test/unit/machine/machine_with_custom_initialize_test.rb +0 -24
- data/test/unit/machine/machine_with_custom_integration_test.rb +0 -72
- data/test/unit/machine/machine_with_custom_invalidation_test.rb +0 -39
- data/test/unit/machine/machine_with_custom_name_test.rb +0 -57
- data/test/unit/machine/machine_with_custom_plural_test.rb +0 -52
- data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +0 -65
- data/test/unit/machine/machine_with_event_matchers_test.rb +0 -41
- data/test/unit/machine/machine_with_events_test.rb +0 -52
- data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +0 -18
- data/test/unit/machine/machine_with_events_with_transitions_test.rb +0 -37
- data/test/unit/machine/machine_with_existing_event_test.rb +0 -17
- data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +0 -20
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +0 -71
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +0 -31
- data/test/unit/machine/machine_with_existing_state_test.rb +0 -27
- data/test/unit/machine/machine_with_failure_callbacks_test.rb +0 -48
- data/test/unit/machine/machine_with_helpers_test.rb +0 -14
- data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +0 -25
- data/test/unit/machine/machine_with_initialize_and_super_test.rb +0 -17
- data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +0 -31
- data/test/unit/machine/machine_with_initialize_without_super_test.rb +0 -17
- data/test/unit/machine/machine_with_instance_helpers_test.rb +0 -179
- data/test/unit/machine/machine_with_integration_test.rb +0 -72
- data/test/unit/machine/machine_with_multiple_events_test.rb +0 -32
- data/test/unit/machine/machine_with_namespace_test.rb +0 -48
- data/test/unit/machine/machine_with_nil_action_test.rb +0 -27
- data/test/unit/machine/machine_with_other_states.rb +0 -22
- data/test/unit/machine/machine_with_owner_subclass_test.rb +0 -18
- data/test/unit/machine/machine_with_paths_test.rb +0 -25
- data/test/unit/machine/machine_with_private_action_test.rb +0 -43
- data/test/unit/machine/machine_with_state_matchers_test.rb +0 -41
- data/test/unit/machine/machine_with_state_with_matchers_test.rb +0 -19
- data/test/unit/machine/machine_with_states_test.rb +0 -55
- data/test/unit/machine/machine_with_states_with_behaviors_test.rb +0 -23
- data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +0 -18
- data/test/unit/machine/machine_with_states_with_custom_values_test.rb +0 -21
- data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +0 -19
- data/test/unit/machine/machine_with_static_initial_state_test.rb +0 -49
- data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +0 -36
- data/test/unit/machine/machine_with_transition_callbacks_test.rb +0 -144
- data/test/unit/machine/machine_with_transitions_test.rb +0 -87
- data/test/unit/machine/machine_without_initialization_test.rb +0 -31
- data/test/unit/machine/machine_without_initialize_test.rb +0 -14
- data/test/unit/machine/machine_without_integration_test.rb +0 -31
- data/test/unit/machine_collection/machine_collection_by_default_test.rb +0 -11
- data/test/unit/machine_collection/machine_collection_fire_test.rb +0 -80
- data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +0 -54
- data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +0 -76
- data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +0 -111
- data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +0 -20
- data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +0 -26
- data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +0 -31
- data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +0 -26
- data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +0 -27
- data/test/unit/matcher/all_matcher_test.rb +0 -29
- data/test/unit/matcher/blacklist_matcher_test.rb +0 -30
- data/test/unit/matcher/loopback_matcher_test.rb +0 -27
- data/test/unit/matcher/matcher_by_default_test.rb +0 -15
- data/test/unit/matcher/matcher_with_multiple_values_test.rb +0 -15
- data/test/unit/matcher/matcher_with_value_test.rb +0 -15
- data/test/unit/matcher/whitelist_matcher_test.rb +0 -30
- data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +0 -14
- data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +0 -14
- data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +0 -13
- data/test/unit/node_collection/node_collection_after_being_copied_test.rb +0 -46
- data/test/unit/node_collection/node_collection_after_update_test.rb +0 -36
- data/test/unit/node_collection/node_collection_by_default_test.rb +0 -22
- data/test/unit/node_collection/node_collection_test.rb +0 -23
- data/test/unit/node_collection/node_collection_with_indices_test.rb +0 -42
- data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +0 -25
- data/test/unit/node_collection/node_collection_with_nodes_test.rb +0 -46
- data/test/unit/node_collection/node_collection_with_numeric_index_test.rb +0 -24
- data/test/unit/node_collection/node_collection_with_postdefined_contexts_test.rb +0 -22
- data/test/unit/node_collection/node_collection_with_predefined_contexts_test.rb +0 -23
- data/test/unit/node_collection/node_collection_with_string_index_test.rb +0 -20
- data/test/unit/node_collection/node_collection_with_symbol_index_test.rb +0 -20
- data/test/unit/node_collection/node_collection_without_indices_test.rb +0 -30
- data/test/unit/path/path_by_default_test.rb +0 -54
- data/test/unit/path/path_test.rb +0 -14
- data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +0 -40
- data/test/unit/path/path_with_available_transitions_test.rb +0 -54
- data/test/unit/path/path_with_deep_target_reached_test.rb +0 -50
- data/test/unit/path/path_with_deep_target_test.rb +0 -40
- data/test/unit/path/path_with_duplicates_test.rb +0 -32
- data/test/unit/path/path_with_encountered_transitions_test.rb +0 -34
- data/test/unit/path/path_with_guarded_transitions_test.rb +0 -42
- data/test/unit/path/path_with_reached_target_test.rb +0 -35
- data/test/unit/path/path_with_transitions_test.rb +0 -54
- data/test/unit/path/path_with_unreached_target_test.rb +0 -31
- data/test/unit/path/path_without_transitions_test.rb +0 -24
- data/test/unit/path_collection/path_collection_by_default_test.rb +0 -46
- data/test/unit/path_collection/path_collection_test.rb +0 -24
- data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +0 -43
- data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +0 -31
- data/test/unit/path_collection/path_collection_with_from_state_test.rb +0 -27
- data/test/unit/path_collection/path_collection_with_paths_test.rb +0 -47
- data/test/unit/path_collection/path_collection_with_to_state_test.rb +0 -29
- data/test/unit/path_collection/path_with_guarded_paths_test.rb +0 -25
- data/test/unit/state/state_after_being_copied_test.rb +0 -19
- data/test/unit/state/state_by_default_test.rb +0 -41
- data/test/unit/state/state_final_test.rb +0 -28
- data/test/unit/state/state_initial_test.rb +0 -13
- data/test/unit/state/state_not_final_test.rb +0 -32
- data/test/unit/state/state_not_initial_test.rb +0 -13
- data/test/unit/state/state_test.rb +0 -44
- data/test/unit/state/state_with_cached_lambda_value_test.rb +0 -29
- data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +0 -38
- data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +0 -29
- data/test/unit/state/state_with_conflicting_machine_name_test.rb +0 -20
- data/test/unit/state/state_with_conflicting_machine_test.rb +0 -37
- data/test/unit/state/state_with_context_test.rb +0 -60
- data/test/unit/state/state_with_dynamic_human_name_test.rb +0 -25
- data/test/unit/state/state_with_existing_context_method_test.rb +0 -24
- data/test/unit/state/state_with_human_name_test.rb +0 -13
- data/test/unit/state/state_with_integer_value_test.rb +0 -32
- data/test/unit/state/state_with_invalid_method_call_test.rb +0 -21
- data/test/unit/state/state_with_lambda_value_test.rb +0 -37
- data/test/unit/state/state_with_matcher_test.rb +0 -18
- data/test/unit/state/state_with_multiple_contexts_test.rb +0 -57
- data/test/unit/state/state_with_name_test.rb +0 -43
- data/test/unit/state/state_with_namespace_test.rb +0 -22
- data/test/unit/state/state_with_nil_value_test.rb +0 -35
- data/test/unit/state/state_with_redefined_context_method_test.rb +0 -45
- data/test/unit/state/state_with_symbolic_value_test.rb +0 -32
- data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +0 -40
- data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +0 -33
- data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +0 -41
- data/test/unit/state/state_without_cached_lambda_value_test.rb +0 -25
- data/test/unit/state/state_without_name_test.rb +0 -39
- data/test/unit/state_collection/state_collection_by_default_test.rb +0 -21
- data/test/unit/state_collection/state_collection_string_test.rb +0 -35
- data/test/unit/state_collection/state_collection_test.rb +0 -74
- data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +0 -29
- data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +0 -39
- data/test/unit/state_collection/state_collection_with_initial_state_test.rb +0 -40
- data/test/unit/state_collection/state_collection_with_namespace_test.rb +0 -21
- data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +0 -40
- data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +0 -29
- data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +0 -40
- data/test/unit/state_context/state_context_proxy_test.rb +0 -26
- data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +0 -42
- data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +0 -64
- data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +0 -32
- data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +0 -32
- data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +0 -64
- data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +0 -31
- data/test/unit/state_context/state_context_test.rb +0 -28
- data/test/unit/state_context/state_context_transition_test.rb +0 -104
- data/test/unit/state_context/state_context_with_matching_transition_test.rb +0 -27
- data/test/unit/state_machine/state_machine_by_default_test.rb +0 -12
- data/test/unit/state_machine/state_machine_test.rb +0 -20
- data/test/unit/transition/transition_after_being_performed_test.rb +0 -48
- data/test/unit/transition/transition_after_being_persisted_test.rb +0 -46
- data/test/unit/transition/transition_after_being_rolled_back_test.rb +0 -35
- data/test/unit/transition/transition_equality_test.rb +0 -52
- data/test/unit/transition/transition_loopback_test.rb +0 -18
- data/test/unit/transition/transition_test.rb +0 -96
- data/test/unit/transition/transition_transient_test.rb +0 -20
- data/test/unit/transition/transition_with_action_test.rb +0 -27
- data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +0 -127
- data/test/unit/transition/transition_with_after_callbacks_test.rb +0 -93
- data/test/unit/transition/transition_with_around_callbacks_test.rb +0 -141
- data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +0 -30
- data/test/unit/transition/transition_with_before_callbacks_test.rb +0 -104
- data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +0 -28
- data/test/unit/transition/transition_with_different_states_test.rb +0 -18
- data/test/unit/transition/transition_with_dynamic_to_value_test.rb +0 -19
- data/test/unit/transition/transition_with_failure_callbacks_test.rb +0 -84
- data/test/unit/transition/transition_with_invalid_nodes_test.rb +0 -29
- data/test/unit/transition/transition_with_mixed_callbacks_test.rb +0 -105
- data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +0 -114
- data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_namespace_test.rb +0 -47
- data/test/unit/transition/transition_with_perform_arguments_test.rb +0 -35
- data/test/unit/transition/transition_with_transactions_test.rb +0 -42
- data/test/unit/transition/transition_without_callbacks_test.rb +0 -33
- data/test/unit/transition/transition_without_reading_state_test.rb +0 -22
- data/test/unit/transition/transition_without_running_action_test.rb +0 -47
- data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +0 -23
- data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +0 -64
- data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +0 -68
- data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +0 -41
- data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +0 -42
- data/test/unit/transition_collection/transition_collection_by_default_test.rb +0 -23
- data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +0 -23
- data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +0 -12
- data/test/unit/transition_collection/transition_collection_invalid_test.rb +0 -21
- data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +0 -69
- data/test/unit/transition_collection/transition_collection_test.rb +0 -26
- data/test/unit/transition_collection/transition_collection_valid_test.rb +0 -57
- data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +0 -66
- data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +0 -60
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +0 -37
- data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +0 -29
- data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +0 -79
- data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +0 -45
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +0 -48
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +0 -42
- data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +0 -47
- data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -51
- data/test/unit/transition_collection/transition_collection_with_block_test.rb +0 -46
- data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +0 -135
- data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +0 -189
- data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +0 -48
- data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +0 -41
- data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +0 -41
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +0 -69
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +0 -53
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +0 -65
- data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +0 -29
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module StateMachines
|
2
4
|
# A transition represents a state change for a specific attribute.
|
3
|
-
#
|
5
|
+
#
|
4
6
|
# Transitions consist of:
|
5
7
|
# * An event
|
6
8
|
# * A starting state
|
@@ -8,32 +10,32 @@ module StateMachines
|
|
8
10
|
class Transition
|
9
11
|
# The object being transitioned
|
10
12
|
attr_reader :object
|
11
|
-
|
13
|
+
|
12
14
|
# The state machine for which this transition is defined
|
13
15
|
attr_reader :machine
|
14
|
-
|
16
|
+
|
15
17
|
# The original state value *before* the transition
|
16
18
|
attr_reader :from
|
17
|
-
|
19
|
+
|
18
20
|
# The new state value *after* the transition
|
19
21
|
attr_reader :to
|
20
|
-
|
22
|
+
|
21
23
|
# The arguments passed in to the event that triggered the transition
|
22
24
|
# (does not include the +run_action+ boolean argument if specified)
|
23
25
|
attr_accessor :args
|
24
|
-
|
26
|
+
|
25
27
|
# The result of invoking the action associated with the machine
|
26
28
|
attr_reader :result
|
27
|
-
|
29
|
+
|
28
30
|
# Whether the transition is only existing temporarily for the object
|
29
31
|
attr_writer :transient
|
30
|
-
|
32
|
+
|
31
33
|
# Determines whether the current ruby implementation supports pausing and
|
32
34
|
# resuming transitions
|
33
35
|
def self.pause_supported?
|
34
36
|
%w(ruby maglev).include?(RUBY_ENGINE)
|
35
37
|
end
|
36
|
-
|
38
|
+
|
37
39
|
# Creates a new, specific transition
|
38
40
|
def initialize(object, machine, event, from_name, to_name, read_state = true) #:nodoc:
|
39
41
|
@object = object
|
@@ -41,114 +43,114 @@ module StateMachines
|
|
41
43
|
@args = []
|
42
44
|
@transient = false
|
43
45
|
@resume_block = nil
|
44
|
-
|
46
|
+
|
45
47
|
@event = machine.events.fetch(event)
|
46
48
|
@from_state = machine.states.fetch(from_name)
|
47
49
|
@from = read_state ? machine.read(object, :state) : @from_state.value
|
48
50
|
@to_state = machine.states.fetch(to_name)
|
49
51
|
@to = @to_state.value
|
50
|
-
|
52
|
+
|
51
53
|
reset
|
52
54
|
end
|
53
|
-
|
55
|
+
|
54
56
|
# The attribute which this transition's machine is defined for
|
55
57
|
def attribute
|
56
58
|
machine.attribute
|
57
59
|
end
|
58
|
-
|
60
|
+
|
59
61
|
# The action that will be run when this transition is performed
|
60
62
|
def action
|
61
63
|
machine.action
|
62
64
|
end
|
63
|
-
|
65
|
+
|
64
66
|
# The event that triggered the transition
|
65
67
|
def event
|
66
68
|
@event.name
|
67
69
|
end
|
68
|
-
|
70
|
+
|
69
71
|
# The fully-qualified name of the event that triggered the transition
|
70
72
|
def qualified_event
|
71
73
|
@event.qualified_name
|
72
74
|
end
|
73
|
-
|
75
|
+
|
74
76
|
# The human-readable name of the event that triggered the transition
|
75
77
|
def human_event
|
76
78
|
@event.human_name(@object.class)
|
77
79
|
end
|
78
|
-
|
80
|
+
|
79
81
|
# The state name *before* the transition
|
80
82
|
def from_name
|
81
83
|
@from_state.name
|
82
84
|
end
|
83
|
-
|
85
|
+
|
84
86
|
# The fully-qualified state name *before* the transition
|
85
87
|
def qualified_from_name
|
86
88
|
@from_state.qualified_name
|
87
89
|
end
|
88
|
-
|
90
|
+
|
89
91
|
# The human-readable state name *before* the transition
|
90
92
|
def human_from_name
|
91
93
|
@from_state.human_name(@object.class)
|
92
94
|
end
|
93
|
-
|
95
|
+
|
94
96
|
# The new state name *after* the transition
|
95
97
|
def to_name
|
96
98
|
@to_state.name
|
97
99
|
end
|
98
|
-
|
100
|
+
|
99
101
|
# The new fully-qualified state name *after* the transition
|
100
102
|
def qualified_to_name
|
101
103
|
@to_state.qualified_name
|
102
104
|
end
|
103
|
-
|
105
|
+
|
104
106
|
# The new human-readable state name *after* the transition
|
105
107
|
def human_to_name
|
106
108
|
@to_state.human_name(@object.class)
|
107
109
|
end
|
108
|
-
|
110
|
+
|
109
111
|
# Does this transition represent a loopback (i.e. the from and to state
|
110
112
|
# are the same)
|
111
|
-
#
|
113
|
+
#
|
112
114
|
# == Example
|
113
|
-
#
|
115
|
+
#
|
114
116
|
# machine = StateMachine.new(Vehicle)
|
115
117
|
# StateMachines::Transition.new(Vehicle.new, machine, :park, :parked, :parked).loopback? # => true
|
116
118
|
# StateMachines::Transition.new(Vehicle.new, machine, :park, :idling, :parked).loopback? # => false
|
117
119
|
def loopback?
|
118
120
|
from_name == to_name
|
119
121
|
end
|
120
|
-
|
122
|
+
|
121
123
|
# Is this transition existing for a short period only? If this is set, it
|
122
124
|
# indicates that the transition (or the event backing it) should not be
|
123
125
|
# written to the object if it fails.
|
124
126
|
def transient?
|
125
127
|
@transient
|
126
128
|
end
|
127
|
-
|
129
|
+
|
128
130
|
# A hash of all the core attributes defined for this transition with their
|
129
131
|
# names as keys and values of the attributes as values.
|
130
|
-
#
|
132
|
+
#
|
131
133
|
# == Example
|
132
|
-
#
|
134
|
+
#
|
133
135
|
# machine = StateMachine.new(Vehicle)
|
134
136
|
# transition = StateMachines::Transition.new(Vehicle.new, machine, :ignite, :parked, :idling)
|
135
137
|
# transition.attributes # => {:object => #<Vehicle:0xb7d60ea4>, :attribute => :state, :event => :ignite, :from => 'parked', :to => 'idling'}
|
136
138
|
def attributes
|
137
|
-
@attributes ||= {:
|
139
|
+
@attributes ||= {object: object, attribute: attribute, event: event, from: from, to: to}
|
138
140
|
end
|
139
|
-
|
141
|
+
|
140
142
|
# Runs the actual transition and any before/after callbacks associated
|
141
143
|
# with the transition. The action associated with the transition/machine
|
142
144
|
# can be skipped by passing in +false+.
|
143
|
-
#
|
145
|
+
#
|
144
146
|
# == Examples
|
145
|
-
#
|
147
|
+
#
|
146
148
|
# class Vehicle
|
147
149
|
# state_machine :action => :save do
|
148
150
|
# ...
|
149
151
|
# end
|
150
152
|
# end
|
151
|
-
#
|
153
|
+
#
|
152
154
|
# vehicle = Vehicle.new
|
153
155
|
# transition = StateMachines::Transition.new(vehicle, machine, :ignite, :parked, :idling)
|
154
156
|
# transition.perform # => Runs the +save+ action after setting the state attribute
|
@@ -158,11 +160,11 @@ module StateMachines
|
|
158
160
|
def perform(*args)
|
159
161
|
run_action = [true, false].include?(args.last) ? args.pop : true
|
160
162
|
self.args = args
|
161
|
-
|
163
|
+
|
162
164
|
# Run the transition
|
163
165
|
!!TransitionCollection.new([self], {use_transactions: machine.use_transactions, actions: run_action}).perform
|
164
166
|
end
|
165
|
-
|
167
|
+
|
166
168
|
# Runs a block within a transaction for the object being transitioned.
|
167
169
|
# By default, transactions are a no-op unless otherwise defined by the
|
168
170
|
# machine's integration.
|
@@ -171,38 +173,38 @@ module StateMachines
|
|
171
173
|
yield
|
172
174
|
end
|
173
175
|
end
|
174
|
-
|
176
|
+
|
175
177
|
# Runs the before / after callbacks for this transition. If a block is
|
176
178
|
# provided, then it will be executed between the before and after callbacks.
|
177
|
-
#
|
179
|
+
#
|
178
180
|
# Configuration options:
|
179
181
|
# * +before+ - Whether to run before callbacks.
|
180
182
|
# * +after+ - Whether to run after callbacks. If false, then any around
|
181
183
|
# callbacks will be paused until called again with +after+ enabled.
|
182
184
|
# Default is true.
|
183
|
-
#
|
185
|
+
#
|
184
186
|
# This will return true if all before callbacks gets executed. After
|
185
187
|
# callbacks will not have an effect on the result.
|
186
188
|
def run_callbacks(options = {}, &block)
|
187
|
-
options = {:
|
189
|
+
options = {before: true, after: true}.merge(options)
|
188
190
|
@success = false
|
189
|
-
|
191
|
+
|
190
192
|
halted = pausable { before(options[:after], &block) } if options[:before]
|
191
|
-
|
193
|
+
|
192
194
|
# After callbacks are only run if:
|
193
195
|
# * An around callback didn't halt after yielding
|
194
196
|
# * They're enabled or the run didn't succeed
|
195
197
|
after if !(@before_run && halted) && (options[:after] || !@success)
|
196
|
-
|
198
|
+
|
197
199
|
@before_run
|
198
200
|
end
|
199
|
-
|
201
|
+
|
200
202
|
# Transitions the current value of the state to that specified by the
|
201
203
|
# transition. Once the state is persisted, it cannot be persisted again
|
202
204
|
# until this transition is reset.
|
203
|
-
#
|
205
|
+
#
|
204
206
|
# == Example
|
205
|
-
#
|
207
|
+
#
|
206
208
|
# class Vehicle
|
207
209
|
# state_machine do
|
208
210
|
# event :ignite do
|
@@ -210,11 +212,11 @@ module StateMachines
|
|
210
212
|
# end
|
211
213
|
# end
|
212
214
|
# end
|
213
|
-
#
|
215
|
+
#
|
214
216
|
# vehicle = Vehicle.new
|
215
217
|
# transition = StateMachines::Transition.new(vehicle, Vehicle.state_machine, :ignite, :parked, :idling)
|
216
218
|
# transition.persist
|
217
|
-
#
|
219
|
+
#
|
218
220
|
# vehicle.state # => 'idling'
|
219
221
|
def persist
|
220
222
|
unless @persisted
|
@@ -222,12 +224,12 @@ module StateMachines
|
|
222
224
|
@persisted = true
|
223
225
|
end
|
224
226
|
end
|
225
|
-
|
227
|
+
|
226
228
|
# Rolls back changes made to the object's state via this transition. This
|
227
229
|
# will revert the state back to the +from+ value.
|
228
|
-
#
|
230
|
+
#
|
229
231
|
# == Example
|
230
|
-
#
|
232
|
+
#
|
231
233
|
# class Vehicle
|
232
234
|
# state_machine :initial => :parked do
|
233
235
|
# event :ignite do
|
@@ -235,15 +237,15 @@ module StateMachines
|
|
235
237
|
# end
|
236
238
|
# end
|
237
239
|
# end
|
238
|
-
#
|
240
|
+
#
|
239
241
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7b7f568 @state="parked">
|
240
242
|
# transition = StateMachines::Transition.new(vehicle, Vehicle.state_machine, :ignite, :parked, :idling)
|
241
|
-
#
|
243
|
+
#
|
242
244
|
# # Persist the new state
|
243
245
|
# vehicle.state # => "parked"
|
244
246
|
# transition.persist
|
245
247
|
# vehicle.state # => "idling"
|
246
|
-
#
|
248
|
+
#
|
247
249
|
# # Roll back to the original state
|
248
250
|
# transition.rollback
|
249
251
|
# vehicle.state # => "parked"
|
@@ -251,14 +253,14 @@ module StateMachines
|
|
251
253
|
reset
|
252
254
|
machine.write(object, :state, from)
|
253
255
|
end
|
254
|
-
|
256
|
+
|
255
257
|
# Resets any tracking of which callbacks have already been run and whether
|
256
258
|
# the state has already been persisted
|
257
259
|
def reset
|
258
260
|
@before_run = @persisted = @after_run = false
|
259
261
|
@paused_block = nil
|
260
262
|
end
|
261
|
-
|
263
|
+
|
262
264
|
# Determines equality of transitions by testing whether the object, states,
|
263
265
|
# and event involved in the transition are equal
|
264
266
|
def ==(other)
|
@@ -269,146 +271,148 @@ module StateMachines
|
|
269
271
|
other.to_name == to_name &&
|
270
272
|
other.event == event
|
271
273
|
end
|
272
|
-
|
274
|
+
|
273
275
|
# Generates a nicely formatted description of this transitions's contents.
|
274
|
-
#
|
276
|
+
#
|
275
277
|
# For example,
|
276
|
-
#
|
278
|
+
#
|
277
279
|
# transition = StateMachines::Transition.new(object, machine, :ignite, :parked, :idling)
|
278
280
|
# transition # => #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>
|
279
281
|
def inspect
|
280
|
-
"#<#{self.class} #{%w(attribute event from from_name to to_name).map {|attr| "#{attr}=#{send(attr).inspect}"} * ' '}>"
|
282
|
+
"#<#{self.class} #{%w(attribute event from from_name to to_name).map { |attr| "#{attr}=#{send(attr).inspect}" } * ' '}>"
|
281
283
|
end
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
if @resume_block
|
298
|
-
@resume_block.call(halted, error)
|
299
|
-
else
|
300
|
-
halted
|
301
|
-
end
|
284
|
+
|
285
|
+
private
|
286
|
+
|
287
|
+
# Runs a block that may get paused. If the block doesn't pause, then
|
288
|
+
# execution will continue as normal. If the block gets paused, then it
|
289
|
+
# will take care of switching the execution context when it's resumed.
|
290
|
+
#
|
291
|
+
# This will return true if the given block halts for a reason other than
|
292
|
+
# getting paused.
|
293
|
+
def pausable
|
294
|
+
begin
|
295
|
+
halted = !catch(:halt) { yield; true }
|
296
|
+
rescue => error
|
297
|
+
raise unless @resume_block
|
302
298
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
299
|
+
|
300
|
+
if @resume_block
|
301
|
+
@resume_block.call(halted, error)
|
302
|
+
else
|
303
|
+
halted
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
# Pauses the current callback execution. This should only occur within
|
308
|
+
# around callbacks when the remainder of the callback will be executed at
|
309
|
+
# a later point in time.
|
310
|
+
def pause
|
311
|
+
raise ArgumentError, 'around_transition callbacks cannot be called in multiple execution contexts in java implementations of Ruby. Use before/after_transitions instead.' unless self.class.pause_supported?
|
312
|
+
|
313
|
+
unless @resume_block
|
314
|
+
require 'continuation' unless defined?(callcc)
|
315
|
+
callcc do |block|
|
316
|
+
@paused_block = block
|
317
|
+
throw :halt, true
|
316
318
|
end
|
317
319
|
end
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
@resume_block = @paused_block = nil
|
329
|
-
|
330
|
-
raise error if error
|
331
|
-
!halted
|
332
|
-
else
|
333
|
-
true
|
320
|
+
end
|
321
|
+
|
322
|
+
# Resumes the execution of a previously paused callback execution. Once
|
323
|
+
# the paused callbacks complete, the current execution will continue.
|
324
|
+
def resume
|
325
|
+
if @paused_block
|
326
|
+
halted, error = callcc do |block|
|
327
|
+
@resume_block = block
|
328
|
+
@paused_block.call
|
334
329
|
end
|
330
|
+
|
331
|
+
@resume_block = @paused_block = nil
|
332
|
+
|
333
|
+
raise error if error
|
334
|
+
|
335
|
+
!halted
|
336
|
+
else
|
337
|
+
true
|
335
338
|
end
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
339
|
+
end
|
340
|
+
|
341
|
+
# Runs the machine's +before+ callbacks for this transition. Only
|
342
|
+
# callbacks that are configured to match the event, from state, and to
|
343
|
+
# state will be invoked.
|
344
|
+
#
|
345
|
+
# Once the callbacks are run, they cannot be run again until this transition
|
346
|
+
# is reset.
|
347
|
+
def before(complete = true, index = 0, &block)
|
348
|
+
unless @before_run
|
349
|
+
while callback = machine.callbacks[:before][index]
|
350
|
+
index += 1
|
351
|
+
|
352
|
+
if callback.type == :around
|
353
|
+
# Around callback: need to handle recursively. Execution only gets
|
354
|
+
# paused if:
|
355
|
+
# * The block fails and the callback doesn't run on failures OR
|
356
|
+
# * The block succeeds, but after callbacks are disabled (in which
|
357
|
+
# case a continuation is stored for later execution)
|
358
|
+
return if catch(:cancel) do
|
359
|
+
callback.call(object, context, self) do
|
360
|
+
before(complete, index, &block)
|
361
|
+
|
362
|
+
pause if @success && !complete
|
363
|
+
throw :cancel, true unless @success
|
361
364
|
end
|
362
|
-
else
|
363
|
-
# Normal before callback
|
364
|
-
callback.call(object, context, self)
|
365
365
|
end
|
366
|
+
else
|
367
|
+
# Normal before callback
|
368
|
+
callback.call(object, context, self)
|
366
369
|
end
|
367
|
-
|
368
|
-
@before_run = true
|
369
370
|
end
|
370
|
-
|
371
|
-
|
372
|
-
@result, @success = action[:result], action[:success]
|
371
|
+
|
372
|
+
@before_run = true
|
373
373
|
end
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
374
|
+
|
375
|
+
action = {success: true}.merge(block_given? ? yield : {})
|
376
|
+
@result, @success = action[:result], action[:success]
|
377
|
+
end
|
378
|
+
|
379
|
+
# Runs the machine's +after+ callbacks for this transition. Only
|
380
|
+
# callbacks that are configured to match the event, from state, and to
|
381
|
+
# state will be invoked.
|
382
|
+
#
|
383
|
+
# Once the callbacks are run, they cannot be run again until this transition
|
384
|
+
# is reset.
|
385
|
+
#
|
386
|
+
# == Halting
|
387
|
+
#
|
388
|
+
# If any callback throws a <tt>:halt</tt> exception, it will be caught
|
389
|
+
# and the callback chain will be automatically stopped. However, this
|
390
|
+
# exception will not bubble up to the caller since +after+ callbacks
|
391
|
+
# should never halt the execution of a +perform+.
|
392
|
+
def after
|
393
|
+
unless @after_run
|
394
|
+
# First resume previously paused callbacks
|
395
|
+
if resume
|
396
|
+
catch(:halt) do
|
397
|
+
type = @success ? :after : :failure
|
398
|
+
machine.callbacks[type].each { |callback| callback.call(object, context, self) }
|
396
399
|
end
|
397
|
-
|
398
|
-
@after_run = true
|
399
400
|
end
|
401
|
+
|
402
|
+
@after_run = true
|
400
403
|
end
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
404
|
+
end
|
405
|
+
|
406
|
+
# Gets a hash of the context defining this unique transition (including
|
407
|
+
# event, from state, and to state).
|
408
|
+
#
|
409
|
+
# == Example
|
410
|
+
#
|
411
|
+
# machine = StateMachine.new(Vehicle)
|
412
|
+
# transition = StateMachines::Transition.new(Vehicle.new, machine, :ignite, :parked, :idling)
|
413
|
+
# transition.context # => {:on => :ignite, :from => :parked, :to => :idling}
|
414
|
+
def context
|
415
|
+
@context ||= {on: event, from: from_name, to: to_name}
|
416
|
+
end
|
413
417
|
end
|
414
418
|
end
|