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
data/lib/state_machines/state.rb
CHANGED
@@ -2,7 +2,7 @@ module StateMachines
|
|
2
2
|
# A state defines a value that an attribute can be in after being transitioned
|
3
3
|
# 0 or more times. States can represent a value of any type in Ruby, though
|
4
4
|
# the most common (and default) type is String.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# In addition to defining the machine's value, a state can also define a
|
7
7
|
# behavioral context for an object when that object is in the state. See
|
8
8
|
# StateMachines::Machine#state for more information about how state-driven
|
@@ -10,7 +10,7 @@ module StateMachines
|
|
10
10
|
class State
|
11
11
|
|
12
12
|
# The state machine for which this state is defined
|
13
|
-
|
13
|
+
attr_reader :machine
|
14
14
|
|
15
15
|
# The unique identifier for the state used in event and callback definitions
|
16
16
|
attr_reader :name
|
@@ -38,7 +38,7 @@ module StateMachines
|
|
38
38
|
attr_accessor :matcher
|
39
39
|
|
40
40
|
# Creates a new state within the context of the given machine.
|
41
|
-
#
|
41
|
+
#
|
42
42
|
# Configuration options:
|
43
43
|
# * <tt>:initial</tt> - Whether this state is the beginning state for the
|
44
44
|
# machine. Default is false.
|
@@ -57,7 +57,7 @@ module StateMachines
|
|
57
57
|
@name = name
|
58
58
|
@qualified_name = name && machine.namespace ? :"#{machine.namespace}_#{name}" : name
|
59
59
|
@human_name = options[:human_name] || (@name ? @name.to_s.tr('_', ' ') : 'nil')
|
60
|
-
@value = options.include?(:value) ? options[:value] : name
|
60
|
+
@value = options.include?(:value) ? options[:value] : name&.to_s
|
61
61
|
@cache = options[:cache]
|
62
62
|
@matcher = options[:if]
|
63
63
|
@initial = options[:initial] == true
|
@@ -68,8 +68,8 @@ module StateMachines
|
|
68
68
|
|
69
69
|
# Output a warning if another machine has a conflicting qualified name
|
70
70
|
# for a different attribute
|
71
|
-
if conflict = conflicting_machines.detect { |
|
72
|
-
|
71
|
+
if (conflict = conflicting_machines.detect { |_other_name, other_machine| other_machine.attribute != machine.attribute })
|
72
|
+
_name, other_machine = conflict
|
73
73
|
warn "State #{qualified_name.inspect} for #{machine.name.inspect} is already defined in #{other_machine.name.inspect}"
|
74
74
|
elsif conflicting_machines.empty?
|
75
75
|
# Only bother adding predicates when another machine for the same
|
@@ -86,6 +86,11 @@ module StateMachines
|
|
86
86
|
@context = StateContext.new(self)
|
87
87
|
end
|
88
88
|
|
89
|
+
def machine=(machine)
|
90
|
+
@machine = machine
|
91
|
+
@context = StateContext.new(self)
|
92
|
+
end
|
93
|
+
|
89
94
|
# Determines whether there are any states that can be transitioned to from
|
90
95
|
# this state. If there are none, then this state is considered *final*.
|
91
96
|
# Any objects in a final state will remain so forever given the current
|
@@ -94,7 +99,7 @@ module StateMachines
|
|
94
99
|
!machine.events.any? do |event|
|
95
100
|
event.branches.any? do |branch|
|
96
101
|
branch.state_requirements.any? do |requirement|
|
97
|
-
requirement[:from].matches?(name) && !requirement[:to].matches?(name, :
|
102
|
+
requirement[:from].matches?(name) && !requirement[:to].matches?(name, from: name)
|
98
103
|
end
|
99
104
|
end
|
100
105
|
end
|
@@ -107,15 +112,15 @@ module StateMachines
|
|
107
112
|
end
|
108
113
|
|
109
114
|
# Generates a human-readable description of this state's name / value:
|
110
|
-
#
|
115
|
+
#
|
111
116
|
# For example,
|
112
|
-
#
|
117
|
+
#
|
113
118
|
# State.new(machine, :parked).description # => "parked"
|
114
119
|
# State.new(machine, :parked, :value => :parked).description # => "parked"
|
115
120
|
# State.new(machine, :parked, :value => nil).description # => "parked (nil)"
|
116
121
|
# State.new(machine, :parked, :value => 1).description # => "parked (1)"
|
117
122
|
# State.new(machine, :parked, :value => lambda {Time.now}).description # => "parked (*)
|
118
|
-
#
|
123
|
+
#
|
119
124
|
# Configuration options:
|
120
125
|
# * <tt>:human_name</tt> - Whether to use this state's human name in the
|
121
126
|
# description or just the internal name
|
@@ -129,9 +134,9 @@ module StateMachines
|
|
129
134
|
# The value that represents this state. This will optionally evaluate the
|
130
135
|
# original block if it's a lambda block. Otherwise, the static value is
|
131
136
|
# returned.
|
132
|
-
#
|
137
|
+
#
|
133
138
|
# For example,
|
134
|
-
#
|
139
|
+
#
|
135
140
|
# State.new(machine, :parked, :value => 1).value # => 1
|
136
141
|
# State.new(machine, :parked, :value => lambda {Time.now}).value # => Tue Jan 01 00:00:00 UTC 2008
|
137
142
|
# State.new(machine, :parked, :value => lambda {Time.now}).value(false) # => <Proc:0xb6ea7ca0@...>
|
@@ -152,14 +157,14 @@ module StateMachines
|
|
152
157
|
# Determines whether this state matches the given value. If no matcher is
|
153
158
|
# configured, then this will check whether the values are equivalent.
|
154
159
|
# Otherwise, the matcher will determine the result.
|
155
|
-
#
|
160
|
+
#
|
156
161
|
# For example,
|
157
|
-
#
|
162
|
+
#
|
158
163
|
# # Without a matcher
|
159
164
|
# state = State.new(machine, :parked, :value => 1)
|
160
165
|
# state.matches?(1) # => true
|
161
166
|
# state.matches?(2) # => false
|
162
|
-
#
|
167
|
+
#
|
163
168
|
# # With a matcher
|
164
169
|
# state = State.new(machine, :parked, :value => lambda {Time.now}, :if => lambda {|value| !value.nil?})
|
165
170
|
# state.matches?(nil) # => false
|
@@ -170,7 +175,7 @@ module StateMachines
|
|
170
175
|
|
171
176
|
# Defines a context for the state which will be enabled on instances of
|
172
177
|
# the owner class when the machine is in this state.
|
173
|
-
#
|
178
|
+
#
|
174
179
|
# This can be called multiple times. Each time a new context is created,
|
175
180
|
# a new module will be included in the owner class.
|
176
181
|
def context(&block)
|
@@ -184,7 +189,7 @@ module StateMachines
|
|
184
189
|
new_methods = context_methods.to_a.select { |(name, method)| old_methods[name] != method }
|
185
190
|
|
186
191
|
# Alias new methods so that the only execute when the object is in this state
|
187
|
-
new_methods.each do |(method_name,
|
192
|
+
new_methods.each do |(method_name, _method)|
|
188
193
|
context_name = context_name_for(method_name)
|
189
194
|
context.class_eval <<-end_eval, __FILE__, __LINE__ + 1
|
190
195
|
alias_method :"#{context_name}", :#{method_name}
|
@@ -208,12 +213,12 @@ module StateMachines
|
|
208
213
|
|
209
214
|
# Calls a method defined in this state's context on the given object. All
|
210
215
|
# arguments and any block will be passed into the method defined.
|
211
|
-
#
|
216
|
+
#
|
212
217
|
# If the method has never been defined for this state, then a NoMethodError
|
213
218
|
# will be raised.
|
214
219
|
def call(object, method, *args, &block)
|
215
220
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
216
|
-
options = {:
|
221
|
+
options = {method_name: method}.merge(options)
|
217
222
|
state = machine.states.match!(object)
|
218
223
|
|
219
224
|
if state == self && object.respond_to?(method)
|
@@ -239,9 +244,9 @@ module StateMachines
|
|
239
244
|
end
|
240
245
|
|
241
246
|
# Generates a nicely formatted description of this state's contents.
|
242
|
-
#
|
247
|
+
#
|
243
248
|
# For example,
|
244
|
-
#
|
249
|
+
#
|
245
250
|
# state = StateMachines::State.new(machine, :parked, :value => 1, :initial => true)
|
246
251
|
# state # => #<StateMachines::State name=:parked value=1 initial=true context=[]>
|
247
252
|
def inspect
|
@@ -249,7 +254,8 @@ module StateMachines
|
|
249
254
|
"#<#{self.class} #{attributes.map { |attr, value| "#{attr}=#{value.inspect}" } * ' '}>"
|
250
255
|
end
|
251
256
|
|
252
|
-
|
257
|
+
private
|
258
|
+
|
253
259
|
# Should the value be cached after it's evaluated for the first time?
|
254
260
|
def cache_value?
|
255
261
|
@cache
|
@@ -2,25 +2,25 @@ module StateMachines
|
|
2
2
|
# Represents a collection of states in a state machine
|
3
3
|
class StateCollection < NodeCollection
|
4
4
|
def initialize(machine) #:nodoc:
|
5
|
-
super(machine, :
|
5
|
+
super(machine, index: [:name, :qualified_name, :value])
|
6
6
|
end
|
7
7
|
|
8
8
|
# Determines whether the given object is in a specific state. If the
|
9
9
|
# object's current value doesn't match the state, then this will return
|
10
10
|
# false, otherwise true. If the given state is unknown, then an IndexError
|
11
11
|
# will be raised.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# == Examples
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# class Vehicle
|
16
16
|
# state_machine :initial => :parked do
|
17
17
|
# other_states :idling
|
18
18
|
# end
|
19
19
|
# end
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# states = Vehicle.state_machine.states
|
22
22
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
|
23
|
-
#
|
23
|
+
#
|
24
24
|
# states.matches?(vehicle, :parked) # => true
|
25
25
|
# states.matches?(vehicle, :idling) # => false
|
26
26
|
# states.matches?(vehicle, :invalid) # => IndexError: :invalid is an invalid key for :name index
|
@@ -31,23 +31,23 @@ module StateMachines
|
|
31
31
|
# Determines the current state of the given object as configured by this
|
32
32
|
# state machine. This will attempt to find a known state that matches
|
33
33
|
# the value of the attribute on the object.
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# == Examples
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# class Vehicle
|
38
38
|
# state_machine :initial => :parked do
|
39
39
|
# other_states :idling
|
40
40
|
# end
|
41
41
|
# end
|
42
|
-
#
|
42
|
+
#
|
43
43
|
# states = Vehicle.state_machine.states
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
|
46
46
|
# states.match(vehicle) # => #<StateMachines::State name=:parked value="parked" initial=true>
|
47
|
-
#
|
47
|
+
#
|
48
48
|
# vehicle.state = 'idling'
|
49
49
|
# states.match(vehicle) # => #<StateMachines::State name=:idling value="idling" initial=true>
|
50
|
-
#
|
50
|
+
#
|
51
51
|
# vehicle.state = 'invalid'
|
52
52
|
# states.match(vehicle) # => nil
|
53
53
|
def match(object)
|
@@ -58,20 +58,20 @@ module StateMachines
|
|
58
58
|
# Determines the current state of the given object as configured by this
|
59
59
|
# state machine. If no state is found, then an ArgumentError will be
|
60
60
|
# raised.
|
61
|
-
#
|
61
|
+
#
|
62
62
|
# == Examples
|
63
|
-
#
|
63
|
+
#
|
64
64
|
# class Vehicle
|
65
65
|
# state_machine :initial => :parked do
|
66
66
|
# other_states :idling
|
67
67
|
# end
|
68
68
|
# end
|
69
|
-
#
|
69
|
+
#
|
70
70
|
# states = Vehicle.state_machine.states
|
71
|
-
#
|
71
|
+
#
|
72
72
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
|
73
73
|
# states.match!(vehicle) # => #<StateMachines::State name=:parked value="parked" initial=true>
|
74
|
-
#
|
74
|
+
#
|
75
75
|
# vehicle.state = 'invalid'
|
76
76
|
# states.match!(vehicle) # => ArgumentError: "invalid" is not a known state value
|
77
77
|
def match!(object)
|
@@ -80,20 +80,20 @@ module StateMachines
|
|
80
80
|
|
81
81
|
# Gets the order in which states should be displayed based on where they
|
82
82
|
# were first referenced. This will order states in the following priority:
|
83
|
-
#
|
83
|
+
#
|
84
84
|
# 1. Initial state
|
85
85
|
# 2. Event transitions (:from, :except_from, :to, :except_to options)
|
86
86
|
# 3. States with behaviors
|
87
87
|
# 4. States referenced via +state+ or +other_states+
|
88
88
|
# 5. States referenced in callbacks
|
89
|
-
#
|
89
|
+
#
|
90
90
|
# This order will determine how the GraphViz visualizations are rendered.
|
91
91
|
def by_priority
|
92
92
|
order = select { |state| state.initial }.map { |state| state.name }
|
93
93
|
|
94
94
|
machine.events.each { |event| order += event.known_states }
|
95
95
|
order += select { |state| state.context_methods.any? }.map { |state| state.name }
|
96
|
-
order += keys(:name) - machine.callbacks.values.flatten.
|
96
|
+
order += keys(:name) - machine.callbacks.values.flatten.flat_map(&:known_states)
|
97
97
|
order += keys(:name)
|
98
98
|
|
99
99
|
order.uniq!
|
@@ -101,7 +101,8 @@ module StateMachines
|
|
101
101
|
order
|
102
102
|
end
|
103
103
|
|
104
|
-
|
104
|
+
private
|
105
|
+
|
105
106
|
# Gets the value for the given attribute on the node
|
106
107
|
def value(node, attribute)
|
107
108
|
attribute == :value ? node.value(false) : super
|
@@ -1,100 +1,98 @@
|
|
1
1
|
module StateMachines
|
2
|
-
|
3
|
-
|
4
2
|
# Represents a module which will get evaluated within the context of a state.
|
5
|
-
#
|
3
|
+
#
|
6
4
|
# Class-level methods are proxied to the owner class, injecting a custom
|
7
5
|
# <tt>:if</tt> condition along with method. This assumes that the method has
|
8
6
|
# support for a set of configuration options, including <tt>:if</tt>. This
|
9
7
|
# condition will check that the object's state matches this context's state.
|
10
|
-
#
|
8
|
+
#
|
11
9
|
# Instance-level methods are used to define state-driven behavior on the
|
12
10
|
# state's owner class.
|
13
|
-
#
|
11
|
+
#
|
14
12
|
# == Examples
|
15
|
-
#
|
13
|
+
#
|
16
14
|
# class Vehicle
|
17
15
|
# class << self
|
18
16
|
# attr_accessor :validations
|
19
|
-
#
|
17
|
+
#
|
20
18
|
# def validate(options, &block)
|
21
19
|
# validations << options
|
22
20
|
# end
|
23
21
|
# end
|
24
|
-
#
|
22
|
+
#
|
25
23
|
# self.validations = []
|
26
24
|
# attr_accessor :state, :simulate
|
27
|
-
#
|
25
|
+
#
|
28
26
|
# def moving?
|
29
27
|
# self.class.validations.all? {|validation| validation[:if].call(self)}
|
30
28
|
# end
|
31
29
|
# end
|
32
|
-
#
|
30
|
+
#
|
33
31
|
# In the above class, a simple set of validation behaviors have been defined.
|
34
32
|
# Each validation consists of a configuration like so:
|
35
|
-
#
|
33
|
+
#
|
36
34
|
# Vehicle.validate :unless => :simulate
|
37
35
|
# Vehicle.validate :if => lambda {|vehicle| ...}
|
38
|
-
#
|
36
|
+
#
|
39
37
|
# In order to scope validations to a particular state context, the class-level
|
40
38
|
# +validate+ method can be invoked like so:
|
41
|
-
#
|
39
|
+
#
|
42
40
|
# machine = StateMachines::Machine.new(Vehicle)
|
43
41
|
# context = StateMachines::StateContext.new(machine.state(:first_gear))
|
44
42
|
# context.validate(:unless => :simulate)
|
45
|
-
#
|
43
|
+
#
|
46
44
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7ce491c @simulate=nil, @state=nil>
|
47
45
|
# vehicle.moving? # => false
|
48
|
-
#
|
46
|
+
#
|
49
47
|
# vehicle.state = 'first_gear'
|
50
48
|
# vehicle.moving? # => true
|
51
|
-
#
|
49
|
+
#
|
52
50
|
# vehicle.simulate = true
|
53
51
|
# vehicle.moving? # => false
|
54
52
|
class StateContext < Module
|
55
53
|
|
56
54
|
include EvalHelpers
|
57
|
-
|
55
|
+
|
58
56
|
# The state machine for which this context's state is defined
|
59
57
|
attr_reader :machine
|
60
|
-
|
58
|
+
|
61
59
|
# The state that must be present in an object for this context to be active
|
62
60
|
attr_reader :state
|
63
|
-
|
61
|
+
|
64
62
|
# Creates a new context for the given state
|
65
63
|
def initialize(state)
|
66
64
|
@state = state
|
67
65
|
@machine = state.machine
|
68
|
-
|
66
|
+
|
69
67
|
state_name = state.name
|
70
68
|
machine_name = machine.name
|
71
|
-
@condition = lambda {|object| object.class.state_machine(machine_name).states.matches?(object, state_name)}
|
69
|
+
@condition = lambda { |object| object.class.state_machine(machine_name).states.matches?(object, state_name) }
|
72
70
|
end
|
73
|
-
|
71
|
+
|
74
72
|
# Creates a new transition that determines what to change the current state
|
75
73
|
# to when an event fires from this state.
|
76
|
-
#
|
74
|
+
#
|
77
75
|
# Since this transition is being defined within a state context, you do
|
78
76
|
# *not* need to specify the <tt>:from</tt> option for the transition. For
|
79
77
|
# example:
|
80
|
-
#
|
78
|
+
#
|
81
79
|
# state_machine do
|
82
80
|
# state :parked do
|
83
81
|
# transition :to => :idling, :on => [:ignite, :shift_up] # Transitions to :idling
|
84
82
|
# transition :from => [:idling, :parked], :on => :park, :unless => :seatbelt_on? # Transitions to :parked if seatbelt is off
|
85
83
|
# end
|
86
84
|
# end
|
87
|
-
#
|
85
|
+
#
|
88
86
|
# See StateMachines::Machine#transition for a description of the possible
|
89
87
|
# configurations for defining transitions.
|
90
88
|
def transition(options)
|
91
89
|
options.assert_valid_keys(:from, :to, :on, :if, :unless)
|
92
90
|
raise ArgumentError, 'Must specify :on event' unless options[:on]
|
93
91
|
raise ArgumentError, 'Must specify either :to or :from state' unless !options[:to] ^ !options[:from]
|
94
|
-
|
95
|
-
machine.transition(options.merge(options[:to] ? {:
|
92
|
+
|
93
|
+
machine.transition(options.merge(options[:to] ? {from: state.name} : {to: state.name}))
|
96
94
|
end
|
97
|
-
|
95
|
+
|
98
96
|
# Hooks in condition-merging to methods that don't exist in this module
|
99
97
|
def method_missing(*args, &block)
|
100
98
|
# Get the configuration
|
@@ -103,28 +101,28 @@ module StateMachines
|
|
103
101
|
else
|
104
102
|
args << options = {}
|
105
103
|
end
|
106
|
-
|
104
|
+
|
107
105
|
# Get any existing condition that may need to be merged
|
108
106
|
if_condition = options.delete(:if)
|
109
107
|
unless_condition = options.delete(:unless)
|
110
|
-
|
108
|
+
|
111
109
|
# Provide scope access to configuration in case the block is evaluated
|
112
110
|
# within the object instance
|
113
111
|
proxy = self
|
114
112
|
proxy_condition = @condition
|
115
|
-
|
113
|
+
|
116
114
|
# Replace the configuration condition with the one configured for this
|
117
115
|
# proxy, merging together any existing conditions
|
118
116
|
options[:if] = lambda do |*condition_args|
|
119
117
|
# Block may be executed within the context of the actual object, so
|
120
118
|
# it'll either be the first argument or the executing context
|
121
119
|
object = condition_args.first || self
|
122
|
-
|
120
|
+
|
123
121
|
proxy.evaluate_method(object, proxy_condition) &&
|
124
|
-
Array(if_condition).all? {|condition| proxy.evaluate_method(object, condition)} &&
|
125
|
-
!Array(unless_condition).any? {|condition| proxy.evaluate_method(object, condition)}
|
122
|
+
Array(if_condition).all? { |condition| proxy.evaluate_method(object, condition) } &&
|
123
|
+
!Array(unless_condition).any? { |condition| proxy.evaluate_method(object, condition) }
|
126
124
|
end
|
127
|
-
|
125
|
+
|
128
126
|
# Evaluate the method on the owner class with the condition proxied
|
129
127
|
# through
|
130
128
|
machine.owner_class.send(*args, &block)
|