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
@@ -5,114 +5,114 @@ module StateMachines
|
|
5
5
|
class Matcher
|
6
6
|
# The list of values against which queries are matched
|
7
7
|
attr_reader :values
|
8
|
-
|
8
|
+
|
9
9
|
# Creates a new matcher for querying against the given set of values
|
10
10
|
def initialize(values = [])
|
11
11
|
@values = values.is_a?(Array) ? values : [values]
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
# Generates a subset of values that exists in both the set of values being
|
15
15
|
# filtered and the values configured for the matcher
|
16
16
|
def filter(values)
|
17
17
|
self.values & values
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
# Matches any given value. Since there is no configuration for this type of
|
22
22
|
# matcher, it must be used as a singleton.
|
23
23
|
class AllMatcher < Matcher
|
24
24
|
include Singleton
|
25
|
-
|
25
|
+
|
26
26
|
# Generates a blacklist matcher based on the given set of values
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# == Examples
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# matcher = StateMachines::AllMatcher.instance - [:parked, :idling]
|
31
31
|
# matcher.matches?(:parked) # => false
|
32
32
|
# matcher.matches?(:first_gear) # => true
|
33
33
|
def -(blacklist)
|
34
34
|
BlacklistMatcher.new(blacklist)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
# Always returns true
|
38
38
|
def matches?(value, context = {})
|
39
39
|
true
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
# Always returns the given set of values
|
43
43
|
def filter(values)
|
44
44
|
values
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
# A human-readable description of this matcher. Always "all".
|
48
48
|
def description
|
49
49
|
'all'
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
# Matches a specific set of values
|
54
54
|
class WhitelistMatcher < Matcher
|
55
55
|
# Checks whether the given value exists within the whitelist configured
|
56
56
|
# for this matcher.
|
57
|
-
#
|
57
|
+
#
|
58
58
|
# == Examples
|
59
|
-
#
|
59
|
+
#
|
60
60
|
# matcher = StateMachines::WhitelistMatcher.new([:parked, :idling])
|
61
61
|
# matcher.matches?(:parked) # => true
|
62
62
|
# matcher.matches?(:first_gear) # => false
|
63
63
|
def matches?(value, context = {})
|
64
64
|
values.include?(value)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# A human-readable description of this matcher
|
68
68
|
def description
|
69
69
|
values.length == 1 ? values.first.inspect : values.inspect
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
# Matches everything but a specific set of values
|
74
74
|
class BlacklistMatcher < Matcher
|
75
75
|
# Checks whether the given value exists outside the blacklist configured
|
76
76
|
# for this matcher.
|
77
|
-
#
|
77
|
+
#
|
78
78
|
# == Examples
|
79
|
-
#
|
79
|
+
#
|
80
80
|
# matcher = StateMachines::BlacklistMatcher.new([:parked, :idling])
|
81
81
|
# matcher.matches?(:parked) # => false
|
82
82
|
# matcher.matches?(:first_gear) # => true
|
83
83
|
def matches?(value, context = {})
|
84
84
|
!values.include?(value)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
# Finds all values that are *not* within the blacklist configured for this
|
88
88
|
# matcher
|
89
89
|
def filter(values)
|
90
90
|
values - self.values
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
# A human-readable description of this matcher
|
94
94
|
def description
|
95
95
|
"all - #{values.length == 1 ? values.first.inspect : values.inspect}"
|
96
96
|
end
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
# Matches a loopback of two values within a context. Since there is no
|
100
100
|
# configuration for this type of matcher, it must be used as a singleton.
|
101
101
|
class LoopbackMatcher < Matcher
|
102
102
|
include Singleton
|
103
|
-
|
103
|
+
|
104
104
|
# Checks whether the given value matches what the value originally was.
|
105
105
|
# This value should be defined in the context.
|
106
|
-
#
|
106
|
+
#
|
107
107
|
# == Examples
|
108
|
-
#
|
108
|
+
#
|
109
109
|
# matcher = StateMachines::LoopbackMatcher.instance
|
110
110
|
# matcher.matches?(:parked, :from => :parked) # => true
|
111
111
|
# matcher.matches?(:parked, :from => :idling) # => false
|
112
112
|
def matches?(value, context)
|
113
113
|
context[:from] == value
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
# A human-readable description of this matcher. Always "same".
|
117
117
|
def description
|
118
118
|
'same'
|
@@ -2,24 +2,24 @@ module StateMachines
|
|
2
2
|
# Provides a set of helper methods for generating matchers
|
3
3
|
module MatcherHelpers
|
4
4
|
# Represents a state that matches all known states in a machine.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# == Examples
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# class Vehicle
|
9
9
|
# state_machine do
|
10
10
|
# before_transition any => :parked, :do => lambda {...}
|
11
11
|
# before_transition all - :parked => all - :idling, :do => lambda {}
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# event :park
|
14
14
|
# transition all => :parked
|
15
15
|
# end
|
16
|
-
#
|
16
|
+
#
|
17
17
|
# event :crash
|
18
18
|
# transition all - :parked => :stalled
|
19
19
|
# end
|
20
20
|
# end
|
21
21
|
# end
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# In the above example, +all+ will match the following states since they
|
24
24
|
# are known:
|
25
25
|
# * +parked+
|
@@ -29,12 +29,12 @@ module StateMachines
|
|
29
29
|
AllMatcher.instance
|
30
30
|
end
|
31
31
|
alias_method :any, :all
|
32
|
-
|
32
|
+
|
33
33
|
# Represents a state that matches the original +from+ state. This is useful
|
34
34
|
# for defining transitions which are loopbacks.
|
35
|
-
#
|
35
|
+
#
|
36
36
|
# == Examples
|
37
|
-
#
|
37
|
+
#
|
38
38
|
# class Vehicle
|
39
39
|
# state_machine do
|
40
40
|
# event :ignite
|
@@ -42,11 +42,11 @@ module StateMachines
|
|
42
42
|
# end
|
43
43
|
# end
|
44
44
|
# end
|
45
|
-
#
|
45
|
+
#
|
46
46
|
# In the above example, +same+ will match whichever the from state is. In
|
47
47
|
# the case of the +ignite+ event, it is essential the same as the following:
|
48
|
-
#
|
49
|
-
# transition :
|
48
|
+
#
|
49
|
+
# transition :idling => :idling, :first_gear => :first_gear
|
50
50
|
def same
|
51
51
|
LoopbackMatcher.instance
|
52
52
|
end
|
@@ -162,37 +162,39 @@ module StateMachines
|
|
162
162
|
self[key, index_name] || fail(IndexError, "#{key.inspect} is an invalid #{index_name}")
|
163
163
|
end
|
164
164
|
|
165
|
-
|
166
|
-
|
167
|
-
|
165
|
+
protected
|
166
|
+
|
167
|
+
# Gets the given index. If the index does not exist, then an ArgumentError
|
168
|
+
# is raised.
|
168
169
|
def index(name)
|
169
170
|
fail ArgumentError, 'No indices configured' unless @indices.any?
|
171
|
+
|
170
172
|
@indices[name] || fail(ArgumentError, "Invalid index: #{name.inspect}")
|
171
173
|
end
|
172
174
|
|
173
|
-
|
175
|
+
# Gets the value for the given attribute on the node
|
174
176
|
def value(node, attribute)
|
175
177
|
node.send(attribute)
|
176
178
|
end
|
177
179
|
|
178
|
-
|
179
|
-
|
180
|
+
# Adds the given key / node combination to an index, including the string
|
181
|
+
# and symbol versions of the index
|
180
182
|
def add_to_index(name, key, node)
|
181
183
|
index(name)[key] = node
|
182
184
|
index(:"#{name}_to_s")[key.to_s] = node
|
183
185
|
index(:"#{name}_to_sym")[:"#{key}"] = node if to_sym?(key)
|
184
186
|
end
|
185
187
|
|
186
|
-
|
187
|
-
|
188
|
+
# Removes the given key from an index, including the string and symbol
|
189
|
+
# versions of the index
|
188
190
|
def remove_from_index(name, key)
|
189
191
|
index(name).delete(key)
|
190
192
|
index(:"#{name}_to_s").delete(key.to_s)
|
191
193
|
index(:"#{name}_to_sym").delete(:"#{key}") if to_sym?(key)
|
192
194
|
end
|
193
195
|
|
194
|
-
|
195
|
-
|
196
|
+
# Updates the node for the given index, including the string and symbol
|
197
|
+
# versions of the index
|
196
198
|
def update_index(name, node)
|
197
199
|
index = self.index(name)
|
198
200
|
old_key = index.key(node)
|
@@ -205,13 +207,13 @@ module StateMachines
|
|
205
207
|
end
|
206
208
|
end
|
207
209
|
|
208
|
-
|
210
|
+
# Determines whether the given value can be converted to a symbol
|
209
211
|
def to_sym?(value)
|
210
212
|
"#{value}" != ''
|
211
213
|
end
|
212
214
|
|
213
|
-
|
214
|
-
|
215
|
+
# Evaluates the given context for a particular node. This will only
|
216
|
+
# evaluate the context if the node matches.
|
215
217
|
def eval_context(context, node)
|
216
218
|
node.context(&context[:block]) if context[:nodes].matches?(node.name)
|
217
219
|
end
|
data/lib/state_machines/path.rb
CHANGED
@@ -4,79 +4,79 @@ module StateMachines
|
|
4
4
|
# branches that can be encountered in the object's state machine.
|
5
5
|
class Path < Array
|
6
6
|
|
7
|
-
|
7
|
+
|
8
8
|
# The object whose state machine is being walked
|
9
9
|
attr_reader :object
|
10
|
-
|
10
|
+
|
11
11
|
# The state machine this path is walking
|
12
12
|
attr_reader :machine
|
13
|
-
|
13
|
+
|
14
14
|
# Creates a new transition path for the given object. Initially this is an
|
15
15
|
# empty path. In order to start walking the path, it must be populated with
|
16
16
|
# an initial transition.
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# Configuration options:
|
19
19
|
# * <tt>:target</tt> - The target state to end the path on
|
20
20
|
# * <tt>:guard</tt> - Whether to guard transitions with the if/unless
|
21
21
|
# conditionals defined for each one
|
22
22
|
def initialize(object, machine, options = {})
|
23
23
|
options.assert_valid_keys(:target, :guard)
|
24
|
-
|
24
|
+
|
25
25
|
@object = object
|
26
26
|
@machine = machine
|
27
27
|
@target = options[:target]
|
28
28
|
@guard = options[:guard]
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def initialize_copy(orig) #:nodoc:
|
32
32
|
super
|
33
33
|
@transitions = nil
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
# The initial state name for this path
|
37
37
|
def from_name
|
38
|
-
first
|
38
|
+
first&.from_name
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
# Lists all of the from states that can be reached through this path.
|
42
|
-
#
|
42
|
+
#
|
43
43
|
# For example,
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# path.to_states # => [:parked, :idling, :first_gear, ...]
|
46
46
|
def from_states
|
47
|
-
map {|transition| transition.from_name}.uniq
|
47
|
+
map { |transition| transition.from_name }.uniq
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
# The end state name for this path. If a target state was specified for
|
51
51
|
# the path, then that will be returned if the path is complete.
|
52
52
|
def to_name
|
53
|
-
last
|
53
|
+
last&.to_name
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# Lists all of the to states that can be reached through this path.
|
57
|
-
#
|
57
|
+
#
|
58
58
|
# For example,
|
59
|
-
#
|
59
|
+
#
|
60
60
|
# path.to_states # => [:parked, :idling, :first_gear, ...]
|
61
61
|
def to_states
|
62
|
-
map {|transition| transition.to_name}.uniq
|
62
|
+
map { |transition| transition.to_name }.uniq
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
# Lists all of the events that can be fired through this path.
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# For example,
|
68
|
-
#
|
68
|
+
#
|
69
69
|
# path.events # => [:park, :ignite, :shift_up, ...]
|
70
70
|
def events
|
71
|
-
map {|transition| transition.event}.uniq
|
71
|
+
map { |transition| transition.event }.uniq
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
# Walks down the next transitions at the end of this path. This will only
|
75
75
|
# walk down paths that are considered valid.
|
76
76
|
def walk
|
77
|
-
transitions.each {|transition| yield dup.push(transition)}
|
77
|
+
transitions.each { |transition| yield dup.push(transition) }
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
# Determines whether or not this path has completed. A path is considered
|
81
81
|
# complete when one of the following conditions is met:
|
82
82
|
# * The last transition in the path ends on the target state
|
@@ -85,36 +85,37 @@ module StateMachines
|
|
85
85
|
def complete?
|
86
86
|
!empty? && (@target ? to_name == @target : transitions.empty?)
|
87
87
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
transitions.include?(transition)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Determines whether it's possible to walk to the given transition from
|
107
|
-
# the current path. A transition can be walked to if:
|
108
|
-
# * It has not been recently walked and
|
109
|
-
# * If a target is specified, it has not been walked to twice yet
|
110
|
-
def can_walk_to?(transition)
|
111
|
-
!recently_walked?(transition) && (!@target || times_walked_to(@target) < 2)
|
112
|
-
end
|
113
|
-
|
114
|
-
# Get the next set of transitions that can be walked to starting from the
|
115
|
-
# end of this path
|
116
|
-
def transitions
|
117
|
-
@transitions ||= empty? ? [] : machine.events.transitions_for(object, :from => to_name, :guard => @guard).select {|transition| can_walk_to?(transition)}
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Calculates the number of times the given state has been walked to
|
92
|
+
def times_walked_to(state)
|
93
|
+
select { |transition| transition.to_name == state }.length
|
94
|
+
end
|
95
|
+
|
96
|
+
# Determines whether the given transition has been recently walked down in
|
97
|
+
# this path. If a target is configured for this path, then this will only
|
98
|
+
# look at transitions walked down since the target was last reached.
|
99
|
+
def recently_walked?(transition)
|
100
|
+
transitions = self
|
101
|
+
if @target && @target != to_name && (target_transition = detect { |t| t.to_name == @target })
|
102
|
+
transitions = transitions[index(target_transition) + 1..-1]
|
118
103
|
end
|
104
|
+
transitions.include?(transition)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Determines whether it's possible to walk to the given transition from
|
108
|
+
# the current path. A transition can be walked to if:
|
109
|
+
# * It has not been recently walked and
|
110
|
+
# * If a target is specified, it has not been walked to twice yet
|
111
|
+
def can_walk_to?(transition)
|
112
|
+
!recently_walked?(transition) && (!@target || times_walked_to(@target) < 2)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Get the next set of transitions that can be walked to starting from the
|
116
|
+
# end of this path
|
117
|
+
def transitions
|
118
|
+
@transitions ||= empty? ? [] : machine.events.transitions_for(object, from: to_name, guard: @guard).select { |transition| can_walk_to?(transition) }
|
119
|
+
end
|
119
120
|
end
|
120
121
|
end
|
@@ -3,21 +3,20 @@ module StateMachines
|
|
3
3
|
# requirements regarding what states to start and end on
|
4
4
|
class PathCollection < Array
|
5
5
|
|
6
|
-
|
7
6
|
# The object whose state machine is being walked
|
8
7
|
attr_reader :object
|
9
|
-
|
8
|
+
|
10
9
|
# The state machine these path are walking
|
11
10
|
attr_reader :machine
|
12
|
-
|
11
|
+
|
13
12
|
# The initial state to start each path from
|
14
13
|
attr_reader :from_name
|
15
|
-
|
14
|
+
|
16
15
|
# The target state for each path
|
17
16
|
attr_reader :to_name
|
18
|
-
|
17
|
+
|
19
18
|
# Creates a new collection of paths with the given requirements.
|
20
|
-
#
|
19
|
+
#
|
21
20
|
# Configuration options:
|
22
21
|
# * <tt>:from</tt> - The initial state to start from
|
23
22
|
# * <tt>:to</tt> - The target end state
|
@@ -25,64 +24,65 @@ module StateMachines
|
|
25
24
|
# * <tt>:guard</tt> - Whether to guard transitions with the if/unless
|
26
25
|
# conditionals defined for each one
|
27
26
|
def initialize(object, machine, options = {})
|
28
|
-
options = {:
|
27
|
+
options = {deep: false, from: machine.states.match!(object).name}.merge(options)
|
29
28
|
options.assert_valid_keys( :from, :to, :deep, :guard)
|
30
|
-
|
29
|
+
|
31
30
|
@object = object
|
32
31
|
@machine = machine
|
33
32
|
@from_name = machine.states.fetch(options[:from]).name
|
34
33
|
@to_name = options[:to] && machine.states.fetch(options[:to]).name
|
35
34
|
@guard = options[:guard]
|
36
35
|
@deep = options[:deep]
|
37
|
-
|
38
|
-
initial_paths.each {|path| walk(path)}
|
36
|
+
|
37
|
+
initial_paths.each { |path| walk(path) }
|
39
38
|
end
|
40
|
-
|
39
|
+
|
41
40
|
# Lists all of the states that can be transitioned from through the paths in
|
42
41
|
# this collection.
|
43
|
-
#
|
42
|
+
#
|
44
43
|
# For example,
|
45
|
-
#
|
44
|
+
#
|
46
45
|
# paths.from_states # => [:parked, :idling, :first_gear, ...]
|
47
46
|
def from_states
|
48
47
|
flat_map(&:from_states).uniq
|
49
48
|
end
|
50
|
-
|
49
|
+
|
51
50
|
# Lists all of the states that can be transitioned to through the paths in
|
52
51
|
# this collection.
|
53
|
-
#
|
52
|
+
#
|
54
53
|
# For example,
|
55
|
-
#
|
54
|
+
#
|
56
55
|
# paths.to_states # => [:idling, :first_gear, :second_gear, ...]
|
57
56
|
def to_states
|
58
57
|
flat_map(&:to_states).uniq
|
59
58
|
end
|
60
|
-
|
59
|
+
|
61
60
|
# Lists all of the events that can be fired through the paths in this
|
62
61
|
# collection.
|
63
|
-
#
|
62
|
+
#
|
64
63
|
# For example,
|
65
|
-
#
|
64
|
+
#
|
66
65
|
# paths.events # => [:park, :ignite, :shift_up, ...]
|
67
66
|
def events
|
68
67
|
flat_map(&:events).uniq
|
69
68
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
# Walks down the given path. Each new path that matches the configured
|
82
|
-
# requirements will be added to this collection.
|
83
|
-
def walk(path)
|
84
|
-
self << path if path.complete?
|
85
|
-
path.walk {|next_path| walk(next_path)} unless to_name && path.complete? && !@deep
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# Gets the initial set of paths to walk
|
73
|
+
def initial_paths
|
74
|
+
machine.events.transitions_for(object, from: from_name, guard: @guard).map do |transition|
|
75
|
+
path = Path.new(object, machine, target: to_name, guard: @guard)
|
76
|
+
path << transition
|
77
|
+
path
|
86
78
|
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Walks down the given path. Each new path that matches the configured
|
82
|
+
# requirements will be added to this collection.
|
83
|
+
def walk(path)
|
84
|
+
self << path if path.complete?
|
85
|
+
path.walk { |next_path| walk(next_path) } unless to_name && path.complete? && !@deep
|
86
|
+
end
|
87
87
|
end
|
88
88
|
end
|
data/lib/state_machines/state.rb
CHANGED
@@ -57,7 +57,7 @@ module StateMachines
|
|
57
57
|
@name = name
|
58
58
|
@qualified_name = name && machine.namespace ? :"#{machine.namespace}_#{name}" : name
|
59
59
|
@human_name = options[:human_name] || (@name ? @name.to_s.tr('_', ' ') : 'nil')
|
60
|
-
@value = options.include?(:value) ? options[:value] : name
|
60
|
+
@value = options.include?(:value) ? options[:value] : name&.to_s
|
61
61
|
@cache = options[:cache]
|
62
62
|
@matcher = options[:if]
|
63
63
|
@initial = options[:initial] == true
|
@@ -68,8 +68,8 @@ module StateMachines
|
|
68
68
|
|
69
69
|
# Output a warning if another machine has a conflicting qualified name
|
70
70
|
# for a different attribute
|
71
|
-
if conflict = conflicting_machines.detect { |
|
72
|
-
|
71
|
+
if (conflict = conflicting_machines.detect { |_other_name, other_machine| other_machine.attribute != machine.attribute })
|
72
|
+
_name, other_machine = conflict
|
73
73
|
warn "State #{qualified_name.inspect} for #{machine.name.inspect} is already defined in #{other_machine.name.inspect}"
|
74
74
|
elsif conflicting_machines.empty?
|
75
75
|
# Only bother adding predicates when another machine for the same
|
@@ -99,7 +99,7 @@ module StateMachines
|
|
99
99
|
!machine.events.any? do |event|
|
100
100
|
event.branches.any? do |branch|
|
101
101
|
branch.state_requirements.any? do |requirement|
|
102
|
-
requirement[:from].matches?(name) && !requirement[:to].matches?(name, :
|
102
|
+
requirement[:from].matches?(name) && !requirement[:to].matches?(name, from: name)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
@@ -218,7 +218,7 @@ module StateMachines
|
|
218
218
|
# will be raised.
|
219
219
|
def call(object, method, *args, &block)
|
220
220
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
221
|
-
options = {:
|
221
|
+
options = {method_name: method}.merge(options)
|
222
222
|
state = machine.states.match!(object)
|
223
223
|
|
224
224
|
if state == self && object.respond_to?(method)
|
@@ -254,7 +254,8 @@ module StateMachines
|
|
254
254
|
"#<#{self.class} #{attributes.map { |attr, value| "#{attr}=#{value.inspect}" } * ' '}>"
|
255
255
|
end
|
256
256
|
|
257
|
-
|
257
|
+
private
|
258
|
+
|
258
259
|
# Should the value be cached after it's evaluated for the first time?
|
259
260
|
def cache_value?
|
260
261
|
@cache
|