state_machines 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/LICENSE.txt +1 -1
- data/README.md +7 -4
- data/lib/state_machines/branch.rb +81 -79
- data/lib/state_machines/callback.rb +22 -21
- data/lib/state_machines/eval_helpers.rb +15 -15
- data/lib/state_machines/event.rb +31 -28
- data/lib/state_machines/event_collection.rb +26 -25
- data/lib/state_machines/extensions.rb +1 -1
- data/lib/state_machines/helper_module.rb +1 -1
- data/lib/state_machines/integrations.rb +8 -8
- data/lib/state_machines/machine.rb +372 -369
- data/lib/state_machines/machine_collection.rb +11 -10
- data/lib/state_machines/macro_methods.rb +100 -100
- data/lib/state_machines/matcher.rb +23 -23
- data/lib/state_machines/matcher_helpers.rb +11 -11
- data/lib/state_machines/node_collection.rb +15 -13
- data/lib/state_machines/path.rb +56 -55
- data/lib/state_machines/path_collection.rb +35 -35
- data/lib/state_machines/state.rb +7 -6
- data/lib/state_machines/state_collection.rb +20 -19
- data/lib/state_machines/state_context.rb +33 -35
- data/lib/state_machines/transition.rb +180 -178
- data/lib/state_machines/transition_collection.rb +170 -168
- data/lib/state_machines/version.rb +1 -1
- metadata +4 -434
- 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,6 @@
|
|
1
1
|
module StateMachines
|
2
2
|
# A transition represents a state change for a specific attribute.
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# Transitions consist of:
|
5
5
|
# * An event
|
6
6
|
# * A starting state
|
@@ -8,32 +8,32 @@ module StateMachines
|
|
8
8
|
class Transition
|
9
9
|
# The object being transitioned
|
10
10
|
attr_reader :object
|
11
|
-
|
11
|
+
|
12
12
|
# The state machine for which this transition is defined
|
13
13
|
attr_reader :machine
|
14
|
-
|
14
|
+
|
15
15
|
# The original state value *before* the transition
|
16
16
|
attr_reader :from
|
17
|
-
|
17
|
+
|
18
18
|
# The new state value *after* the transition
|
19
19
|
attr_reader :to
|
20
|
-
|
20
|
+
|
21
21
|
# The arguments passed in to the event that triggered the transition
|
22
22
|
# (does not include the +run_action+ boolean argument if specified)
|
23
23
|
attr_accessor :args
|
24
|
-
|
24
|
+
|
25
25
|
# The result of invoking the action associated with the machine
|
26
26
|
attr_reader :result
|
27
|
-
|
27
|
+
|
28
28
|
# Whether the transition is only existing temporarily for the object
|
29
29
|
attr_writer :transient
|
30
|
-
|
30
|
+
|
31
31
|
# Determines whether the current ruby implementation supports pausing and
|
32
32
|
# resuming transitions
|
33
33
|
def self.pause_supported?
|
34
34
|
%w(ruby maglev).include?(RUBY_ENGINE)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
# Creates a new, specific transition
|
38
38
|
def initialize(object, machine, event, from_name, to_name, read_state = true) #:nodoc:
|
39
39
|
@object = object
|
@@ -41,114 +41,114 @@ module StateMachines
|
|
41
41
|
@args = []
|
42
42
|
@transient = false
|
43
43
|
@resume_block = nil
|
44
|
-
|
44
|
+
|
45
45
|
@event = machine.events.fetch(event)
|
46
46
|
@from_state = machine.states.fetch(from_name)
|
47
47
|
@from = read_state ? machine.read(object, :state) : @from_state.value
|
48
48
|
@to_state = machine.states.fetch(to_name)
|
49
49
|
@to = @to_state.value
|
50
|
-
|
50
|
+
|
51
51
|
reset
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
# The attribute which this transition's machine is defined for
|
55
55
|
def attribute
|
56
56
|
machine.attribute
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
# The action that will be run when this transition is performed
|
60
60
|
def action
|
61
61
|
machine.action
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
# The event that triggered the transition
|
65
65
|
def event
|
66
66
|
@event.name
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
# The fully-qualified name of the event that triggered the transition
|
70
70
|
def qualified_event
|
71
71
|
@event.qualified_name
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
# The human-readable name of the event that triggered the transition
|
75
75
|
def human_event
|
76
76
|
@event.human_name(@object.class)
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
# The state name *before* the transition
|
80
80
|
def from_name
|
81
81
|
@from_state.name
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
# The fully-qualified state name *before* the transition
|
85
85
|
def qualified_from_name
|
86
86
|
@from_state.qualified_name
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
# The human-readable state name *before* the transition
|
90
90
|
def human_from_name
|
91
91
|
@from_state.human_name(@object.class)
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
# The new state name *after* the transition
|
95
95
|
def to_name
|
96
96
|
@to_state.name
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
# The new fully-qualified state name *after* the transition
|
100
100
|
def qualified_to_name
|
101
101
|
@to_state.qualified_name
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
# The new human-readable state name *after* the transition
|
105
105
|
def human_to_name
|
106
106
|
@to_state.human_name(@object.class)
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
# Does this transition represent a loopback (i.e. the from and to state
|
110
110
|
# are the same)
|
111
|
-
#
|
111
|
+
#
|
112
112
|
# == Example
|
113
|
-
#
|
113
|
+
#
|
114
114
|
# machine = StateMachine.new(Vehicle)
|
115
115
|
# StateMachines::Transition.new(Vehicle.new, machine, :park, :parked, :parked).loopback? # => true
|
116
116
|
# StateMachines::Transition.new(Vehicle.new, machine, :park, :idling, :parked).loopback? # => false
|
117
117
|
def loopback?
|
118
118
|
from_name == to_name
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# Is this transition existing for a short period only? If this is set, it
|
122
122
|
# indicates that the transition (or the event backing it) should not be
|
123
123
|
# written to the object if it fails.
|
124
124
|
def transient?
|
125
125
|
@transient
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# A hash of all the core attributes defined for this transition with their
|
129
129
|
# names as keys and values of the attributes as values.
|
130
|
-
#
|
130
|
+
#
|
131
131
|
# == Example
|
132
|
-
#
|
132
|
+
#
|
133
133
|
# machine = StateMachine.new(Vehicle)
|
134
134
|
# transition = StateMachines::Transition.new(Vehicle.new, machine, :ignite, :parked, :idling)
|
135
135
|
# transition.attributes # => {:object => #<Vehicle:0xb7d60ea4>, :attribute => :state, :event => :ignite, :from => 'parked', :to => 'idling'}
|
136
136
|
def attributes
|
137
|
-
@attributes ||= {:
|
137
|
+
@attributes ||= {object: object, attribute: attribute, event: event, from: from, to: to}
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
# Runs the actual transition and any before/after callbacks associated
|
141
141
|
# with the transition. The action associated with the transition/machine
|
142
142
|
# can be skipped by passing in +false+.
|
143
|
-
#
|
143
|
+
#
|
144
144
|
# == Examples
|
145
|
-
#
|
145
|
+
#
|
146
146
|
# class Vehicle
|
147
147
|
# state_machine :action => :save do
|
148
148
|
# ...
|
149
149
|
# end
|
150
150
|
# end
|
151
|
-
#
|
151
|
+
#
|
152
152
|
# vehicle = Vehicle.new
|
153
153
|
# transition = StateMachines::Transition.new(vehicle, machine, :ignite, :parked, :idling)
|
154
154
|
# transition.perform # => Runs the +save+ action after setting the state attribute
|
@@ -158,11 +158,11 @@ module StateMachines
|
|
158
158
|
def perform(*args)
|
159
159
|
run_action = [true, false].include?(args.last) ? args.pop : true
|
160
160
|
self.args = args
|
161
|
-
|
161
|
+
|
162
162
|
# Run the transition
|
163
163
|
!!TransitionCollection.new([self], {use_transactions: machine.use_transactions, actions: run_action}).perform
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
# Runs a block within a transaction for the object being transitioned.
|
167
167
|
# By default, transactions are a no-op unless otherwise defined by the
|
168
168
|
# machine's integration.
|
@@ -171,38 +171,38 @@ module StateMachines
|
|
171
171
|
yield
|
172
172
|
end
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
# Runs the before / after callbacks for this transition. If a block is
|
176
176
|
# provided, then it will be executed between the before and after callbacks.
|
177
|
-
#
|
177
|
+
#
|
178
178
|
# Configuration options:
|
179
179
|
# * +before+ - Whether to run before callbacks.
|
180
180
|
# * +after+ - Whether to run after callbacks. If false, then any around
|
181
181
|
# callbacks will be paused until called again with +after+ enabled.
|
182
182
|
# Default is true.
|
183
|
-
#
|
183
|
+
#
|
184
184
|
# This will return true if all before callbacks gets executed. After
|
185
185
|
# callbacks will not have an effect on the result.
|
186
186
|
def run_callbacks(options = {}, &block)
|
187
|
-
options = {:
|
187
|
+
options = {before: true, after: true}.merge(options)
|
188
188
|
@success = false
|
189
|
-
|
189
|
+
|
190
190
|
halted = pausable { before(options[:after], &block) } if options[:before]
|
191
|
-
|
191
|
+
|
192
192
|
# After callbacks are only run if:
|
193
193
|
# * An around callback didn't halt after yielding
|
194
194
|
# * They're enabled or the run didn't succeed
|
195
195
|
after if !(@before_run && halted) && (options[:after] || !@success)
|
196
|
-
|
196
|
+
|
197
197
|
@before_run
|
198
198
|
end
|
199
|
-
|
199
|
+
|
200
200
|
# Transitions the current value of the state to that specified by the
|
201
201
|
# transition. Once the state is persisted, it cannot be persisted again
|
202
202
|
# until this transition is reset.
|
203
|
-
#
|
203
|
+
#
|
204
204
|
# == Example
|
205
|
-
#
|
205
|
+
#
|
206
206
|
# class Vehicle
|
207
207
|
# state_machine do
|
208
208
|
# event :ignite do
|
@@ -210,11 +210,11 @@ module StateMachines
|
|
210
210
|
# end
|
211
211
|
# end
|
212
212
|
# end
|
213
|
-
#
|
213
|
+
#
|
214
214
|
# vehicle = Vehicle.new
|
215
215
|
# transition = StateMachines::Transition.new(vehicle, Vehicle.state_machine, :ignite, :parked, :idling)
|
216
216
|
# transition.persist
|
217
|
-
#
|
217
|
+
#
|
218
218
|
# vehicle.state # => 'idling'
|
219
219
|
def persist
|
220
220
|
unless @persisted
|
@@ -222,12 +222,12 @@ module StateMachines
|
|
222
222
|
@persisted = true
|
223
223
|
end
|
224
224
|
end
|
225
|
-
|
225
|
+
|
226
226
|
# Rolls back changes made to the object's state via this transition. This
|
227
227
|
# will revert the state back to the +from+ value.
|
228
|
-
#
|
228
|
+
#
|
229
229
|
# == Example
|
230
|
-
#
|
230
|
+
#
|
231
231
|
# class Vehicle
|
232
232
|
# state_machine :initial => :parked do
|
233
233
|
# event :ignite do
|
@@ -235,15 +235,15 @@ module StateMachines
|
|
235
235
|
# end
|
236
236
|
# end
|
237
237
|
# end
|
238
|
-
#
|
238
|
+
#
|
239
239
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7b7f568 @state="parked">
|
240
240
|
# transition = StateMachines::Transition.new(vehicle, Vehicle.state_machine, :ignite, :parked, :idling)
|
241
|
-
#
|
241
|
+
#
|
242
242
|
# # Persist the new state
|
243
243
|
# vehicle.state # => "parked"
|
244
244
|
# transition.persist
|
245
245
|
# vehicle.state # => "idling"
|
246
|
-
#
|
246
|
+
#
|
247
247
|
# # Roll back to the original state
|
248
248
|
# transition.rollback
|
249
249
|
# vehicle.state # => "parked"
|
@@ -251,14 +251,14 @@ module StateMachines
|
|
251
251
|
reset
|
252
252
|
machine.write(object, :state, from)
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
# Resets any tracking of which callbacks have already been run and whether
|
256
256
|
# the state has already been persisted
|
257
257
|
def reset
|
258
258
|
@before_run = @persisted = @after_run = false
|
259
259
|
@paused_block = nil
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
# Determines equality of transitions by testing whether the object, states,
|
263
263
|
# and event involved in the transition are equal
|
264
264
|
def ==(other)
|
@@ -269,146 +269,148 @@ module StateMachines
|
|
269
269
|
other.to_name == to_name &&
|
270
270
|
other.event == event
|
271
271
|
end
|
272
|
-
|
272
|
+
|
273
273
|
# Generates a nicely formatted description of this transitions's contents.
|
274
|
-
#
|
274
|
+
#
|
275
275
|
# For example,
|
276
|
-
#
|
276
|
+
#
|
277
277
|
# transition = StateMachines::Transition.new(object, machine, :ignite, :parked, :idling)
|
278
278
|
# transition # => #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>
|
279
279
|
def inspect
|
280
|
-
"#<#{self.class} #{%w(attribute event from from_name to to_name).map {|attr| "#{attr}=#{send(attr).inspect}"} * ' '}>"
|
280
|
+
"#<#{self.class} #{%w(attribute event from from_name to to_name).map { |attr| "#{attr}=#{send(attr).inspect}" } * ' '}>"
|
281
281
|
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
|
282
|
+
|
283
|
+
private
|
284
|
+
|
285
|
+
# Runs a block that may get paused. If the block doesn't pause, then
|
286
|
+
# execution will continue as normal. If the block gets paused, then it
|
287
|
+
# will take care of switching the execution context when it's resumed.
|
288
|
+
#
|
289
|
+
# This will return true if the given block halts for a reason other than
|
290
|
+
# getting paused.
|
291
|
+
def pausable
|
292
|
+
begin
|
293
|
+
halted = !catch(:halt) { yield; true }
|
294
|
+
rescue => error
|
295
|
+
raise unless @resume_block
|
302
296
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
297
|
+
|
298
|
+
if @resume_block
|
299
|
+
@resume_block.call(halted, error)
|
300
|
+
else
|
301
|
+
halted
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
# Pauses the current callback execution. This should only occur within
|
306
|
+
# around callbacks when the remainder of the callback will be executed at
|
307
|
+
# a later point in time.
|
308
|
+
def pause
|
309
|
+
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?
|
310
|
+
|
311
|
+
unless @resume_block
|
312
|
+
require 'continuation' unless defined?(callcc)
|
313
|
+
callcc do |block|
|
314
|
+
@paused_block = block
|
315
|
+
throw :halt, true
|
316
316
|
end
|
317
317
|
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
|
318
|
+
end
|
319
|
+
|
320
|
+
# Resumes the execution of a previously paused callback execution. Once
|
321
|
+
# the paused callbacks complete, the current execution will continue.
|
322
|
+
def resume
|
323
|
+
if @paused_block
|
324
|
+
halted, error = callcc do |block|
|
325
|
+
@resume_block = block
|
326
|
+
@paused_block.call
|
334
327
|
end
|
328
|
+
|
329
|
+
@resume_block = @paused_block = nil
|
330
|
+
|
331
|
+
raise error if error
|
332
|
+
|
333
|
+
!halted
|
334
|
+
else
|
335
|
+
true
|
335
336
|
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
|
-
|
337
|
+
end
|
338
|
+
|
339
|
+
# Runs the machine's +before+ callbacks for this transition. Only
|
340
|
+
# callbacks that are configured to match the event, from state, and to
|
341
|
+
# state will be invoked.
|
342
|
+
#
|
343
|
+
# Once the callbacks are run, they cannot be run again until this transition
|
344
|
+
# is reset.
|
345
|
+
def before(complete = true, index = 0, &block)
|
346
|
+
unless @before_run
|
347
|
+
while callback = machine.callbacks[:before][index]
|
348
|
+
index += 1
|
349
|
+
|
350
|
+
if callback.type == :around
|
351
|
+
# Around callback: need to handle recursively. Execution only gets
|
352
|
+
# paused if:
|
353
|
+
# * The block fails and the callback doesn't run on failures OR
|
354
|
+
# * The block succeeds, but after callbacks are disabled (in which
|
355
|
+
# case a continuation is stored for later execution)
|
356
|
+
return if catch(:cancel) do
|
357
|
+
callback.call(object, context, self) do
|
358
|
+
before(complete, index, &block)
|
359
|
+
|
360
|
+
pause if @success && !complete
|
361
|
+
throw :cancel, true unless @success
|
361
362
|
end
|
362
|
-
else
|
363
|
-
# Normal before callback
|
364
|
-
callback.call(object, context, self)
|
365
363
|
end
|
364
|
+
else
|
365
|
+
# Normal before callback
|
366
|
+
callback.call(object, context, self)
|
366
367
|
end
|
367
|
-
|
368
|
-
@before_run = true
|
369
368
|
end
|
370
|
-
|
371
|
-
|
372
|
-
@result, @success = action[:result], action[:success]
|
369
|
+
|
370
|
+
@before_run = true
|
373
371
|
end
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
372
|
+
|
373
|
+
action = {success: true}.merge(block_given? ? yield : {})
|
374
|
+
@result, @success = action[:result], action[:success]
|
375
|
+
end
|
376
|
+
|
377
|
+
# Runs the machine's +after+ callbacks for this transition. Only
|
378
|
+
# callbacks that are configured to match the event, from state, and to
|
379
|
+
# state will be invoked.
|
380
|
+
#
|
381
|
+
# Once the callbacks are run, they cannot be run again until this transition
|
382
|
+
# is reset.
|
383
|
+
#
|
384
|
+
# == Halting
|
385
|
+
#
|
386
|
+
# If any callback throws a <tt>:halt</tt> exception, it will be caught
|
387
|
+
# and the callback chain will be automatically stopped. However, this
|
388
|
+
# exception will not bubble up to the caller since +after+ callbacks
|
389
|
+
# should never halt the execution of a +perform+.
|
390
|
+
def after
|
391
|
+
unless @after_run
|
392
|
+
# First resume previously paused callbacks
|
393
|
+
if resume
|
394
|
+
catch(:halt) do
|
395
|
+
type = @success ? :after : :failure
|
396
|
+
machine.callbacks[type].each { |callback| callback.call(object, context, self) }
|
396
397
|
end
|
397
|
-
|
398
|
-
@after_run = true
|
399
398
|
end
|
399
|
+
|
400
|
+
@after_run = true
|
400
401
|
end
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
402
|
+
end
|
403
|
+
|
404
|
+
# Gets a hash of the context defining this unique transition (including
|
405
|
+
# event, from state, and to state).
|
406
|
+
#
|
407
|
+
# == Example
|
408
|
+
#
|
409
|
+
# machine = StateMachine.new(Vehicle)
|
410
|
+
# transition = StateMachines::Transition.new(Vehicle.new, machine, :ignite, :parked, :idling)
|
411
|
+
# transition.context # => {:on => :ignite, :from => :parked, :to => :idling}
|
412
|
+
def context
|
413
|
+
@context ||= {on: event, from: from_name, to: to_name}
|
414
|
+
end
|
413
415
|
end
|
414
416
|
end
|