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