state_machines 0.4.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 +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
|
-
[
|
2
|
+
[](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
|