state_machines 0.4.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 +18 -13
- 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 +2 -2
- data/lib/state_machines/helper_module.rb +1 -1
- data/lib/state_machines/integrations/base.rb +2 -5
- data/lib/state_machines/integrations.rb +9 -13
- data/lib/state_machines/machine.rb +386 -379
- 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 +38 -38
- data/lib/state_machines/state.rb +28 -22
- data/lib/state_machines/state_collection.rb +21 -20
- 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 +5 -852
- data/.gitignore +0 -21
- data/.rspec +0 -3
- data/.travis.yml +0 -14
- data/Changelog.md +0 -16
- data/Contributors.md +0 -39
- data/Gemfile +0 -8
- data/Rakefile +0 -12
- data/Testing.md +0 -0
- data/state_machines.gemspec +0 -23
- 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/model_base.rb +0 -6
- data/test/files/models/motorcycle.rb +0 -11
- 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/motorcycle_test.rb +0 -46
- 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_on_requirements_test.rb +0 -20
- 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 -27
- 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_attributes_with_validations_test.rb +0 -72
- 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 -51
- data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -47
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1d22dcf0b70eca7cbf9a6894d592609874cfdef01474b70a2226018c0e8966b7
|
4
|
+
data.tar.gz: 9a9bed680181f45bc613649bf4f3b90a4ea1e198e8fb19f734d264c7652e5051
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1446488cbb427e407611d2cba2e571401931a4a20f9f8655e14ebf896990468d24a94a02ba708627db8beb3a3821ac481b220551f0d0c02e366ba3d78112da4
|
7
|
+
data.tar.gz: 4949561813ac58b6442611d37083091b6c4532f41227f3f9f0999bbecc18c18aacc458f9aa6d6570b5855b6a30a24394d421e6b6012dfa4ebed638a642da82f3
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
2
|
-
[![Code Climate](https://codeclimate.com/github/state-machines/state_machines.
|
1
|
+
![Build Status](https://github.com/state-machines/state_machines/actions/workflows/ruby.yml/badge.svg)
|
2
|
+
[![Code Climate](https://codeclimate.com/github/state-machines/state_machines.svg)](https://codeclimate.com/github/state-machines/state_machines)
|
3
3
|
# State Machines
|
4
4
|
|
5
5
|
State Machines adds support for creating state machines for attributes on any Ruby class.
|
6
6
|
|
7
|
+
*Please note that multiple integrations are available for [Active Model](https://github.com/state-machines/state_machines-activemodel), [Active Record](https://github.com/state-machines/state_machines-activerecord), [Mongoid](https://github.com/state-machines/state_machines-mongoid) and more in the [State Machines organisation](https://github.com/state-machines).* If you want to save state in your database, **you need one of these additional integrations**.
|
8
|
+
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
Add this line to your application's Gemfile:
|
@@ -40,10 +42,10 @@ class Vehicle
|
|
40
42
|
attr_accessor :seatbelt_on, :time_used, :auto_shop_busy
|
41
43
|
|
42
44
|
state_machine :state, initial: :parked do
|
43
|
-
before_transition parked:
|
44
|
-
|
45
|
+
before_transition parked: any - :parked, do: :put_on_seatbelt
|
46
|
+
|
45
47
|
after_transition on: :crash, do: :tow
|
46
|
-
after_transition on: :repair,
|
48
|
+
after_transition on: :repair, do: :fix
|
47
49
|
after_transition any => :parked do |vehicle, transition|
|
48
50
|
vehicle.seatbelt_on = false
|
49
51
|
end
|
@@ -83,7 +85,7 @@ class Vehicle
|
|
83
85
|
event :repair do
|
84
86
|
# The first transition that matches the state and passes its conditions
|
85
87
|
# will be used
|
86
|
-
transition stalled: parked, unless: :auto_shop_busy
|
88
|
+
transition stalled: :parked, unless: :auto_shop_busy
|
87
89
|
transition stalled: same
|
88
90
|
end
|
89
91
|
|
@@ -217,7 +219,7 @@ vehicle.fire_events(:shift_down, :enable_alarm) # => true
|
|
217
219
|
vehicle.state_name # => :first_gear
|
218
220
|
vehicle.alarm_state_name # => :active
|
219
221
|
|
220
|
-
vehicle.fire_events!(:ignite, :enable_alarm) # => StateMachines:
|
222
|
+
vehicle.fire_events!(:ignite, :enable_alarm) # => StateMachines:InvalidParallelTransition: Cannot run events in parallel: ignite, enable_alarm
|
221
223
|
|
222
224
|
# Human-friendly names can be accessed for states/events
|
223
225
|
Vehicle.human_state_name(:first_gear) # => "first gear"
|
@@ -235,6 +237,10 @@ vehicle.state_paths # => [[#<StateMachines
|
|
235
237
|
vehicle.state_paths.to_states # => [:parked, :idling, :first_gear, :stalled, :second_gear, :third_gear]
|
236
238
|
vehicle.state_paths.events # => [:park, :ignite, :shift_up, :idle, :crash, :repair, :shift_down]
|
237
239
|
|
240
|
+
# Possible states can be analyzed for a class
|
241
|
+
Vehicle.state_machine.states.to_a # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
|
242
|
+
Vehicle.state_machines[:state].states.to_a # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
|
243
|
+
|
238
244
|
# Find all paths that start and end on certain states
|
239
245
|
vehicle.state_paths(:from => :parked, :to => :first_gear) # => [[
|
240
246
|
# #<StateMachines:Transition attribute=:state event=:ignite from="parked" ...>,
|
@@ -400,8 +406,8 @@ For example, transitions and callbacks can be defined like so:
|
|
400
406
|
class Vehicle
|
401
407
|
state_machine initial: :parked do
|
402
408
|
before_transition from: :parked, except_to: :parked, do: :put_on_seatbelt
|
403
|
-
after_transition to: :parked do |transition|
|
404
|
-
|
409
|
+
after_transition to: :parked do |vehicle, transition|
|
410
|
+
vehicle.seatbelt = 'off'
|
405
411
|
end
|
406
412
|
|
407
413
|
event :ignite do
|
@@ -425,7 +431,7 @@ class Vehicle
|
|
425
431
|
...
|
426
432
|
|
427
433
|
state :parked do
|
428
|
-
transition to
|
434
|
+
transition to: :idling, :on => [:ignite, :shift_up], if: :seatbelt_on?
|
429
435
|
|
430
436
|
def speed
|
431
437
|
0
|
@@ -463,7 +469,6 @@ class Vehicle
|
|
463
469
|
transition parked: :idling, :on => [:ignite, :shift_up]
|
464
470
|
transition first_gear: :second_gear, second_gear: :third_gear, on: :shift_up
|
465
471
|
transition [:idling, :first_gear] => :parked, on: :park
|
466
|
-
transition [:idling, :first_gear] => :parked, on: :park
|
467
472
|
transition all - [:parked, :stalled]: :stalled, unless: :auto_shop_busy?
|
468
473
|
end
|
469
474
|
end
|
@@ -561,7 +566,7 @@ end
|
|
561
566
|
vehicle = Vehicle.new # => #<Vehicle:0xb708412c @state="parked" ...>
|
562
567
|
vehicle.state # => "parked"
|
563
568
|
vehicle.machine.ignite # => true
|
564
|
-
vehicle.machine.state # => "idling
|
569
|
+
vehicle.machine.state # => "idling"
|
565
570
|
vehicle.state # => "idling"
|
566
571
|
vehicle.machine.state_transitions # => [#<StateMachines:Transition ...>]
|
567
572
|
vehicle.machine.definition.states.keys # => :first_gear, :second_gear, :parked, :idling
|
@@ -575,7 +580,7 @@ transitions.
|
|
575
580
|
|
576
581
|
Ruby versions officially supported and tested:
|
577
582
|
|
578
|
-
* Ruby (MRI) 2.
|
583
|
+
* Ruby (MRI) 2.6.0+
|
579
584
|
* JRuby
|
580
585
|
* Rubinius
|
581
586
|
|
@@ -6,68 +6,68 @@ module StateMachines
|
|
6
6
|
class Branch
|
7
7
|
|
8
8
|
include EvalHelpers
|
9
|
-
|
9
|
+
|
10
10
|
# The condition that must be met on an object
|
11
11
|
attr_reader :if_condition
|
12
|
-
|
12
|
+
|
13
13
|
# The condition that must *not* be met on an object
|
14
14
|
attr_reader :unless_condition
|
15
|
-
|
15
|
+
|
16
16
|
# The requirement for verifying the event being matched
|
17
17
|
attr_reader :event_requirement
|
18
|
-
|
18
|
+
|
19
19
|
# One or more requirements for verifying the states being matched. All
|
20
20
|
# requirements contain a mapping of {:from => matcher, :to => matcher}.
|
21
21
|
attr_reader :state_requirements
|
22
|
-
|
22
|
+
|
23
23
|
# A list of all of the states known to this branch. This will pull states
|
24
24
|
# from the following options (in the same order):
|
25
25
|
# * +from+ / +except_from+
|
26
26
|
# * +to+ / +except_to+
|
27
27
|
attr_reader :known_states
|
28
|
-
|
28
|
+
|
29
29
|
# Creates a new branch
|
30
30
|
def initialize(options = {}) #:nodoc:
|
31
31
|
# Build conditionals
|
32
32
|
@if_condition = options.delete(:if)
|
33
33
|
@unless_condition = options.delete(:unless)
|
34
|
-
|
34
|
+
|
35
35
|
# Build event requirement
|
36
36
|
@event_requirement = build_matcher(options, :on, :except_on)
|
37
|
-
|
37
|
+
|
38
38
|
if (options.keys - [:from, :to, :on, :except_from, :except_to, :except_on]).empty?
|
39
39
|
# Explicit from/to requirements specified
|
40
|
-
@state_requirements = [{:
|
40
|
+
@state_requirements = [{from: build_matcher(options, :from, :except_from), to: build_matcher(options, :to, :except_to)}]
|
41
41
|
else
|
42
42
|
# Separate out the event requirement
|
43
43
|
options.delete(:on)
|
44
44
|
options.delete(:except_on)
|
45
|
-
|
45
|
+
|
46
46
|
# Implicit from/to requirements specified
|
47
47
|
@state_requirements = options.collect do |from, to|
|
48
48
|
from = WhitelistMatcher.new(from) unless from.is_a?(Matcher)
|
49
49
|
to = WhitelistMatcher.new(to) unless to.is_a?(Matcher)
|
50
|
-
{:
|
50
|
+
{from: from, to: to}
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
# Track known states. The order that requirements are iterated is based
|
55
55
|
# on the priority in which tracked states should be added.
|
56
56
|
@known_states = []
|
57
57
|
@state_requirements.each do |state_requirement|
|
58
|
-
[:from, :to].each {|option| @known_states |= state_requirement[option].values}
|
58
|
+
[:from, :to].each { |option| @known_states |= state_requirement[option].values }
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# Determines whether the given object / query matches the requirements
|
63
63
|
# configured for this branch. In addition to matching the event, from state,
|
64
64
|
# and to state, this will also check whether the configured :if/:unless
|
65
65
|
# conditions pass on the given object.
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# == Examples
|
68
|
-
#
|
68
|
+
#
|
69
69
|
# branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
|
70
|
-
#
|
70
|
+
#
|
71
71
|
# # Successful
|
72
72
|
# branch.matches?(object, :on => :ignite) # => true
|
73
73
|
# branch.matches?(object, :from => nil) # => true
|
@@ -75,7 +75,7 @@ module StateMachines
|
|
75
75
|
# branch.matches?(object, :to => :idling) # => true
|
76
76
|
# branch.matches?(object, :from => :parked, :to => :idling) # => true
|
77
77
|
# branch.matches?(object, :on => :ignite, :from => :parked, :to => :idling) # => true
|
78
|
-
#
|
78
|
+
#
|
79
79
|
# # Unsuccessful
|
80
80
|
# branch.matches?(object, :on => :park) # => false
|
81
81
|
# branch.matches?(object, :from => :idling) # => false
|
@@ -85,16 +85,16 @@ module StateMachines
|
|
85
85
|
def matches?(object, query = {})
|
86
86
|
!match(object, query).nil?
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
# Attempts to match the given object / query against the set of requirements
|
90
90
|
# configured for this branch. In addition to matching the event, from state,
|
91
91
|
# and to state, this will also check whether the configured :if/:unless
|
92
92
|
# conditions pass on the given object.
|
93
|
-
#
|
93
|
+
#
|
94
94
|
# If a match is found, then the event/state requirements that the query
|
95
95
|
# passed successfully will be returned. Otherwise, nil is returned if there
|
96
96
|
# was no match.
|
97
|
-
#
|
97
|
+
#
|
98
98
|
# Query options:
|
99
99
|
# * <tt>:from</tt> - One or more states being transitioned from. If none
|
100
100
|
# are specified, then this will always match.
|
@@ -104,16 +104,16 @@ module StateMachines
|
|
104
104
|
# are specified, then this will always match.
|
105
105
|
# * <tt>:guard</tt> - Whether to guard matches with the if/unless
|
106
106
|
# conditionals defined for this branch. Default is true.
|
107
|
-
#
|
107
|
+
#
|
108
108
|
# == Examples
|
109
|
-
#
|
109
|
+
#
|
110
110
|
# branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
|
111
|
-
#
|
111
|
+
#
|
112
112
|
# branch.match(object, :on => :ignite) # => {:to => ..., :from => ..., :on => ...}
|
113
113
|
# branch.match(object, :on => :park) # => nil
|
114
114
|
def match(object, query = {})
|
115
115
|
query.assert_valid_keys(:from, :to, :on, :guard)
|
116
|
-
|
116
|
+
|
117
117
|
if (match = match_query(query)) && matches_conditions?(object, query)
|
118
118
|
match
|
119
119
|
end
|
@@ -122,62 +122,64 @@ module StateMachines
|
|
122
122
|
def draw(graph, event, valid_states)
|
123
123
|
fail NotImplementedError
|
124
124
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
# Verifies that all configured requirements (event and state) match the
|
146
|
-
# given query. If a match is found, then a hash containing the
|
147
|
-
# event/state requirements that passed will be returned; otherwise, nil.
|
148
|
-
def match_query(query)
|
149
|
-
query ||= {}
|
150
|
-
|
151
|
-
if match_event(query) && (state_requirement = match_states(query))
|
152
|
-
state_requirement.merge(:on => event_requirement)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
# Verifies that the event requirement matches the given query
|
157
|
-
def match_event(query)
|
158
|
-
matches_requirement?(query, :on, event_requirement)
|
159
|
-
end
|
160
|
-
|
161
|
-
# Verifies that the state requirements match the given query. If a
|
162
|
-
# matching requirement is found, then it is returned.
|
163
|
-
def match_states(query)
|
164
|
-
state_requirements.detect do |state_requirement|
|
165
|
-
[:from, :to].all? {|option| matches_requirement?(query, option, state_requirement[option])}
|
166
|
-
end
|
125
|
+
|
126
|
+
protected
|
127
|
+
|
128
|
+
# Builds a matcher strategy to use for the given options. If neither a
|
129
|
+
# whitelist nor a blacklist option is specified, then an AllMatcher is
|
130
|
+
# built.
|
131
|
+
def build_matcher(options, whitelist_option, blacklist_option)
|
132
|
+
options.assert_exclusive_keys(whitelist_option, blacklist_option)
|
133
|
+
|
134
|
+
if options.include?(whitelist_option)
|
135
|
+
value = options[whitelist_option]
|
136
|
+
value.is_a?(Matcher) ? value : WhitelistMatcher.new(options[whitelist_option])
|
137
|
+
elsif options.include?(blacklist_option)
|
138
|
+
value = options[blacklist_option]
|
139
|
+
raise ArgumentError, ":#{blacklist_option} option cannot use matchers; use :#{whitelist_option} instead" if value.is_a?(Matcher)
|
140
|
+
|
141
|
+
BlacklistMatcher.new(value)
|
142
|
+
else
|
143
|
+
AllMatcher.instance
|
167
144
|
end
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
145
|
+
end
|
146
|
+
|
147
|
+
# Verifies that all configured requirements (event and state) match the
|
148
|
+
# given query. If a match is found, then a hash containing the
|
149
|
+
# event/state requirements that passed will be returned; otherwise, nil.
|
150
|
+
def match_query(query)
|
151
|
+
query ||= {}
|
152
|
+
|
153
|
+
if match_event(query) && (state_requirement = match_states(query))
|
154
|
+
state_requirement.merge(on: event_requirement)
|
173
155
|
end
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
156
|
+
end
|
157
|
+
|
158
|
+
# Verifies that the event requirement matches the given query
|
159
|
+
def match_event(query)
|
160
|
+
matches_requirement?(query, :on, event_requirement)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Verifies that the state requirements match the given query. If a
|
164
|
+
# matching requirement is found, then it is returned.
|
165
|
+
def match_states(query)
|
166
|
+
state_requirements.detect do |state_requirement|
|
167
|
+
[:from, :to].all? { |option| matches_requirement?(query, option, state_requirement[option]) }
|
181
168
|
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Verifies that an option in the given query matches the values required
|
172
|
+
# for that option
|
173
|
+
def matches_requirement?(query, option, requirement)
|
174
|
+
!query.include?(option) || requirement.matches?(query[option], query)
|
175
|
+
end
|
176
|
+
|
177
|
+
# Verifies that the conditionals for this branch evaluate to true for the
|
178
|
+
# given object
|
179
|
+
def matches_conditions?(object, query)
|
180
|
+
query[:guard] == false ||
|
181
|
+
Array(if_condition).all? { |condition| evaluate_method(object, condition) } &&
|
182
|
+
!Array(unless_condition).any? { |condition| evaluate_method(object, condition) }
|
183
|
+
end
|
182
184
|
end
|
183
185
|
end
|
@@ -16,38 +16,38 @@ module StateMachines
|
|
16
16
|
# the callback. This can be configured on an application-wide basis by
|
17
17
|
# setting this configuration to +true+ or +false+. The default value
|
18
18
|
# is +false+.
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# *Note* that the DataMapper and Sequel integrations automatically
|
21
21
|
# configure this value on a per-callback basis, so it does not have to
|
22
22
|
# be enabled application-wide.
|
23
|
-
#
|
23
|
+
#
|
24
24
|
# == Examples
|
25
|
-
#
|
25
|
+
#
|
26
26
|
# When not bound to the object:
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# class Vehicle
|
29
29
|
# state_machine do
|
30
30
|
# before_transition do |vehicle|
|
31
31
|
# vehicle.set_alarm
|
32
32
|
# end
|
33
33
|
# end
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# def set_alarm
|
36
36
|
# ...
|
37
37
|
# end
|
38
38
|
# end
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# When bound to the object:
|
41
|
-
#
|
41
|
+
#
|
42
42
|
# StateMachines::Callback.bind_to_object = true
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# class Vehicle
|
45
45
|
# state_machine do
|
46
46
|
# before_transition do
|
47
47
|
# self.set_alarm
|
48
48
|
# end
|
49
49
|
# end
|
50
|
-
#
|
50
|
+
#
|
51
51
|
# def set_alarm
|
52
52
|
# ...
|
53
53
|
# end
|
@@ -57,7 +57,7 @@ module StateMachines
|
|
57
57
|
# The application-wide terminator to use for callbacks when not
|
58
58
|
# explicitly defined. Terminators determine whether to cancel a
|
59
59
|
# callback chain based on the return value of the callback.
|
60
|
-
#
|
60
|
+
#
|
61
61
|
# See StateMachines::Callback#terminator for more information.
|
62
62
|
attr_accessor :terminator
|
63
63
|
end
|
@@ -75,11 +75,11 @@ module StateMachines
|
|
75
75
|
# chain never cancels based on the return value (i.e. there is no implicit
|
76
76
|
# terminator). Certain integrations, such as ActiveRecord and Sequel,
|
77
77
|
# change this default value.
|
78
|
-
#
|
78
|
+
#
|
79
79
|
# == Examples
|
80
|
-
#
|
80
|
+
#
|
81
81
|
# Canceling the callback chain without a terminator:
|
82
|
-
#
|
82
|
+
#
|
83
83
|
# class Vehicle
|
84
84
|
# state_machine do
|
85
85
|
# before_transition do |vehicle|
|
@@ -87,9 +87,9 @@ module StateMachines
|
|
87
87
|
# end
|
88
88
|
# end
|
89
89
|
# end
|
90
|
-
#
|
90
|
+
#
|
91
91
|
# Canceling the callback chain with a terminator value of +false+:
|
92
|
-
#
|
92
|
+
#
|
93
93
|
# class Vehicle
|
94
94
|
# state_machine do
|
95
95
|
# before_transition do |vehicle|
|
@@ -102,13 +102,13 @@ module StateMachines
|
|
102
102
|
# The branch that determines whether or not this callback can be invoked
|
103
103
|
# based on the context of the transition. The event, from state, and
|
104
104
|
# to state must all match in order for the branch to pass.
|
105
|
-
#
|
105
|
+
#
|
106
106
|
# See StateMachines::Branch for more information.
|
107
107
|
attr_reader :branch
|
108
108
|
|
109
109
|
# Creates a new callback that can get called based on the configured
|
110
110
|
# options.
|
111
|
-
#
|
111
|
+
#
|
112
112
|
# In addition to the possible configuration options for branches, the
|
113
113
|
# following options can be configured:
|
114
114
|
# * <tt>:bind_to_object</tt> - Whether to bind the callback to the object involved.
|
@@ -117,7 +117,7 @@ module StateMachines
|
|
117
117
|
# * <tt>:terminator</tt> - A block/proc that determines what callback
|
118
118
|
# results should cause the callback chain to halt (if not using the
|
119
119
|
# default <tt>throw :halt</tt> technique).
|
120
|
-
#
|
120
|
+
#
|
121
121
|
# More information about how those options affect the behavior of the
|
122
122
|
# callback can be found in their attribute definitions.
|
123
123
|
def initialize(type, *args, &block)
|
@@ -130,7 +130,7 @@ module StateMachines
|
|
130
130
|
@methods << block if block_given?
|
131
131
|
raise ArgumentError, 'Method(s) for callback must be specified' unless @methods.any?
|
132
132
|
|
133
|
-
options = {:
|
133
|
+
options = {bind_to_object: self.class.bind_to_object, terminator: self.class.terminator}.merge(options)
|
134
134
|
|
135
135
|
# Proxy lambda blocks so that they're bound to the object
|
136
136
|
bind_to_object = options.delete(:bind_to_object)
|
@@ -151,7 +151,7 @@ module StateMachines
|
|
151
151
|
# Runs the callback as long as the transition context matches the branch
|
152
152
|
# requirements configured for this callback. If a block is provided, it
|
153
153
|
# will be called when the last method has run.
|
154
|
-
#
|
154
|
+
#
|
155
155
|
# If a terminator has been configured and it matches the result from the
|
156
156
|
# evaluated method, then the callback chain should be halted.
|
157
157
|
def call(object, context = {}, *args, &block)
|
@@ -163,7 +163,8 @@ module StateMachines
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
|
166
|
+
private
|
167
|
+
|
167
168
|
# Runs all of the methods configured for this callback.
|
168
169
|
#
|
169
170
|
# When running +around+ callbacks, this will evaluate each method and
|
@@ -7,46 +7,46 @@ module StateMachines
|
|
7
7
|
# * Symbol
|
8
8
|
# * Method / Proc
|
9
9
|
# * String
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# == Examples
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# Below are examples of the various ways that a method can be evaluated
|
14
14
|
# on an object:
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# class Person
|
17
17
|
# def initialize(name)
|
18
18
|
# @name = name
|
19
19
|
# end
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# def name
|
22
22
|
# @name
|
23
23
|
# end
|
24
24
|
# end
|
25
|
-
#
|
25
|
+
#
|
26
26
|
# class PersonCallback
|
27
27
|
# def self.run(person)
|
28
28
|
# person.name
|
29
29
|
# end
|
30
30
|
# end
|
31
|
-
#
|
31
|
+
#
|
32
32
|
# person = Person.new('John Smith')
|
33
|
-
#
|
33
|
+
#
|
34
34
|
# evaluate_method(person, :name) # => "John Smith"
|
35
35
|
# evaluate_method(person, PersonCallback.method(:run)) # => "John Smith"
|
36
36
|
# evaluate_method(person, Proc.new {|person| person.name}) # => "John Smith"
|
37
37
|
# evaluate_method(person, lambda {|person| person.name}) # => "John Smith"
|
38
38
|
# evaluate_method(person, '@name') # => "John Smith"
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# == Additional arguments
|
41
|
-
#
|
41
|
+
#
|
42
42
|
# Additional arguments can be passed to the methods being evaluated. If
|
43
43
|
# the method defines additional arguments other than the object context,
|
44
44
|
# then all arguments are required.
|
45
|
-
#
|
45
|
+
#
|
46
46
|
# For example,
|
47
|
-
#
|
47
|
+
#
|
48
48
|
# person = Person.new('John Smith')
|
49
|
-
#
|
49
|
+
#
|
50
50
|
# evaluate_method(person, lambda {|person| person.name}, 21) # => "John Smith"
|
51
51
|
# evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21) # => "John Smith is 21"
|
52
52
|
# evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21, 'male') # => ArgumentError: wrong number of arguments (3 for 2)
|
@@ -59,7 +59,7 @@ module StateMachines
|
|
59
59
|
when Proc, Method
|
60
60
|
args.unshift(object)
|
61
61
|
arity = method.arity
|
62
|
-
|
62
|
+
|
63
63
|
# Procs don't support blocks in < Ruby 1.9, so it's tacked on as an
|
64
64
|
# argument for consistency across versions of Ruby
|
65
65
|
if block_given? && Proc === method && arity != 0
|
@@ -75,10 +75,10 @@ module StateMachines
|
|
75
75
|
# These method types are only called with 0, 1, or n arguments
|
76
76
|
args = args[0, arity] if [0, 1].include?(arity)
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
method.is_a?(Proc) ? method.call(*args) : method.call(*args, &block)
|
80
80
|
when String
|
81
|
-
eval(method, object.instance_eval {binding}, &block)
|
81
|
+
eval(method, object.instance_eval { binding }, &block)
|
82
82
|
else
|
83
83
|
raise ArgumentError, 'Methods must be a symbol denoting the method to call, a block to be invoked, or a string to be evaluated'
|
84
84
|
end
|