state_machines 0.5.0 → 0.10.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 +34 -15
- data/lib/state_machines/assertions.rb +2 -0
- data/lib/state_machines/branch.rb +85 -81
- data/lib/state_machines/callback.rb +24 -21
- data/lib/state_machines/core.rb +2 -0
- data/lib/state_machines/core_ext/class/state_machine.rb +2 -0
- data/lib/state_machines/core_ext.rb +2 -0
- data/lib/state_machines/error.rb +2 -0
- data/lib/state_machines/eval_helpers.rb +51 -22
- data/lib/state_machines/event.rb +35 -30
- data/lib/state_machines/event_collection.rb +28 -25
- data/lib/state_machines/extensions.rb +3 -1
- data/lib/state_machines/helper_module.rb +3 -1
- data/lib/state_machines/integrations/base.rb +2 -0
- data/lib/state_machines/integrations.rb +10 -8
- data/lib/state_machines/machine/class_methods.rb +79 -0
- data/lib/state_machines/machine.rb +381 -425
- data/lib/state_machines/machine_collection.rb +13 -10
- data/lib/state_machines/macro_methods.rb +102 -100
- data/lib/state_machines/matcher.rb +26 -23
- data/lib/state_machines/matcher_helpers.rb +13 -11
- data/lib/state_machines/node_collection.rb +17 -13
- data/lib/state_machines/path.rb +58 -55
- data/lib/state_machines/path_collection.rb +37 -35
- data/lib/state_machines/state.rb +50 -38
- data/lib/state_machines/state_collection.rb +22 -19
- data/lib/state_machines/state_context.rb +35 -35
- data/lib/state_machines/stdio_renderer.rb +74 -0
- data/lib/state_machines/transition.rb +182 -178
- data/lib/state_machines/transition_collection.rb +172 -168
- data/lib/state_machines/version.rb +3 -1
- data/lib/state_machines.rb +4 -1
- metadata +10 -439
- data/.gitignore +0 -21
- data/.rspec +0 -3
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -16
- data/Changelog.md +0 -22
- data/Contributors.md +0 -39
- data/Gemfile +0 -8
- data/Rakefile +0 -12
- data/Testing.md +0 -0
- data/state_machines.gemspec +0 -22
- data/test/files/integrations/event_on_failure_integration.rb +0 -10
- data/test/files/integrations/vehicle.rb +0 -7
- data/test/files/models/auto_shop.rb +0 -31
- data/test/files/models/car.rb +0 -21
- data/test/files/models/driver.rb +0 -13
- data/test/files/models/model_base.rb +0 -6
- data/test/files/models/motorcycle.rb +0 -16
- data/test/files/models/traffic_light.rb +0 -47
- data/test/files/models/vehicle.rb +0 -127
- data/test/files/node.rb +0 -5
- data/test/files/switch.rb +0 -15
- data/test/functional/auto_shop_available_test.rb +0 -20
- data/test/functional/auto_shop_busy_test.rb +0 -25
- data/test/functional/car_backing_up_test.rb +0 -45
- data/test/functional/car_test.rb +0 -49
- data/test/functional/driver_default_nonstandard_test.rb +0 -13
- data/test/functional/motorcycle_test.rb +0 -52
- data/test/functional/traffic_light_caution_test.rb +0 -17
- data/test/functional/traffic_light_proceed_test.rb +0 -17
- data/test/functional/traffic_light_stop_test.rb +0 -26
- data/test/functional/vehicle_first_gear_test.rb +0 -42
- data/test/functional/vehicle_idling_test.rb +0 -59
- data/test/functional/vehicle_locked_test.rb +0 -29
- data/test/functional/vehicle_parked_test.rb +0 -53
- data/test/functional/vehicle_repaired_test.rb +0 -20
- data/test/functional/vehicle_second_gear_test.rb +0 -42
- data/test/functional/vehicle_stalled_test.rb +0 -65
- data/test/functional/vehicle_test.rb +0 -20
- data/test/functional/vehicle_third_gear_test.rb +0 -42
- data/test/functional/vehicle_unsaved_test.rb +0 -181
- data/test/functional/vehicle_with_event_attributes_test.rb +0 -30
- data/test/functional/vehicle_with_parallel_events_test.rb +0 -36
- data/test/test_helper.rb +0 -15
- data/test/unit/assertions/assert_exclusive_keys_test.rb +0 -22
- data/test/unit/assertions/assert_valid_key_test.rb +0 -12
- data/test/unit/branch/branch_test.rb +0 -28
- data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +0 -27
- data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +0 -8
- data/test/unit/branch/branch_with_different_requirements_test.rb +0 -41
- data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_from_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_on_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +0 -8
- data/test/unit/branch/branch_with_except_to_requirement_test.rb +0 -36
- data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_from_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_if_conditional_test.rb +0 -27
- data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +0 -23
- data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +0 -20
- data/test/unit/branch/branch_with_implicit_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +0 -16
- data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +0 -53
- data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +0 -20
- data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +0 -20
- data/test/unit/branch/branch_with_nil_requirements_test.rb +0 -28
- data/test/unit/branch/branch_with_no_requirements_test.rb +0 -36
- data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +0 -16
- data/test/unit/branch/branch_with_on_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +0 -20
- data/test/unit/branch/branch_with_to_requirement_test.rb +0 -45
- data/test/unit/branch/branch_with_unless_conditional_test.rb +0 -27
- data/test/unit/branch/branch_without_guards_test.rb +0 -27
- data/test/unit/callback/callback_by_default_test.rb +0 -25
- data/test/unit/callback/callback_test.rb +0 -53
- data/test/unit/callback/callback_with_application_bound_object_test.rb +0 -23
- data/test/unit/callback/callback_with_application_terminator_test.rb +0 -24
- data/test/unit/callback/callback_with_arguments_test.rb +0 -14
- data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +0 -25
- data/test/unit/callback/callback_with_around_type_and_block_test.rb +0 -44
- data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +0 -23
- data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +0 -93
- data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +0 -17
- data/test/unit/callback/callback_with_block_test.rb +0 -20
- data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +0 -28
- data/test/unit/callback/callback_with_bound_method_test.rb +0 -35
- data/test/unit/callback/callback_with_do_method_test.rb +0 -18
- data/test/unit/callback/callback_with_explicit_requirements_test.rb +0 -32
- data/test/unit/callback/callback_with_if_condition_test.rb +0 -17
- data/test/unit/callback/callback_with_implicit_requirements_test.rb +0 -32
- data/test/unit/callback/callback_with_method_argument_test.rb +0 -18
- data/test/unit/callback/callback_with_mixed_methods_test.rb +0 -31
- data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +0 -21
- data/test/unit/callback/callback_with_multiple_do_methods_test.rb +0 -29
- data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +0 -29
- data/test/unit/callback/callback_with_terminator_test.rb +0 -22
- data/test/unit/callback/callback_with_unbound_method_test.rb +0 -14
- data/test/unit/callback/callback_with_unless_condition_test.rb +0 -17
- data/test/unit/callback/callback_without_arguments_test.rb +0 -14
- data/test/unit/callback/callback_without_terminator_test.rb +0 -12
- data/test/unit/error/error_by_default_test.rb +0 -21
- data/test/unit/error/error_with_message_test.rb +0 -23
- data/test/unit/eval_helper/eval_helpers_base_test.rb +0 -8
- data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +0 -13
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +0 -18
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +0 -14
- data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +0 -19
- data/test/unit/eval_helper/eval_helpers_string_test.rb +0 -25
- data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +0 -12
- data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +0 -20
- data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +0 -17
- data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +0 -17
- data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +0 -18
- data/test/unit/eval_helper/eval_helpers_symbol_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +0 -16
- data/test/unit/eval_helper/eval_helpers_test.rb +0 -13
- data/test/unit/event/event_after_being_copied_test.rb +0 -17
- data/test/unit/event/event_by_default_test.rb +0 -60
- data/test/unit/event/event_context_test.rb +0 -16
- data/test/unit/event/event_on_failure_test.rb +0 -44
- data/test/unit/event/event_test.rb +0 -34
- data/test/unit/event/event_transitions_test.rb +0 -62
- data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +0 -79
- data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +0 -58
- data/test/unit/event/event_with_conflicting_machine_test.rb +0 -48
- data/test/unit/event/event_with_dynamic_human_name_test.rb +0 -26
- data/test/unit/event/event_with_human_name_test.rb +0 -13
- data/test/unit/event/event_with_invalid_current_state_test.rb +0 -30
- data/test/unit/event/event_with_machine_action_test.rb +0 -33
- data/test/unit/event/event_with_marshalling_test.rb +0 -47
- data/test/unit/event/event_with_matching_disabled_transitions_test.rb +0 -115
- data/test/unit/event/event_with_matching_enabled_transitions_test.rb +0 -75
- data/test/unit/event/event_with_multiple_transitions_test.rb +0 -61
- data/test/unit/event/event_with_namespace_test.rb +0 -34
- data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +0 -60
- data/test/unit/event/event_with_transition_with_loopback_state_test.rb +0 -36
- data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +0 -36
- data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +0 -51
- data/test/unit/event/event_with_transition_without_to_state_test.rb +0 -36
- data/test/unit/event/event_with_transitions_test.rb +0 -32
- data/test/unit/event/event_without_matching_transitions_test.rb +0 -41
- data/test/unit/event/event_without_transitions_test.rb +0 -28
- data/test/unit/event/invalid_event_test.rb +0 -20
- data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +0 -62
- data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +0 -36
- data/test/unit/event_collection/event_collection_by_default_test.rb +0 -26
- data/test/unit/event_collection/event_collection_test.rb +0 -39
- data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +0 -31
- data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +0 -76
- data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +0 -27
- data/test/unit/event_collection/event_collection_with_validations_test.rb +0 -74
- data/test/unit/event_collection/event_collection_without_machine_action_test.rb +0 -18
- data/test/unit/event_collection/event_string_collection_test.rb +0 -31
- data/test/unit/helper_module_test.rb +0 -17
- data/test/unit/integrations/integration_finder_test.rb +0 -16
- data/test/unit/integrations/integration_matcher_test.rb +0 -29
- data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +0 -18
- data/test/unit/invalid_transition/invalid_transition_test.rb +0 -47
- data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +0 -45
- data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +0 -32
- data/test/unit/machine/machine_after_being_copied_test.rb +0 -62
- data/test/unit/machine/machine_after_changing_initial_state.rb +0 -28
- data/test/unit/machine/machine_after_changing_owner_class_test.rb +0 -31
- data/test/unit/machine/machine_by_default_test.rb +0 -160
- data/test/unit/machine/machine_finder_custom_options_test.rb +0 -17
- data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +0 -85
- data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +0 -23
- data/test/unit/machine/machine_finder_without_existing_machine_test.rb +0 -25
- data/test/unit/machine/machine_persistence_test.rb +0 -52
- data/test/unit/machine/machine_state_initialization_test.rb +0 -56
- data/test/unit/machine/machine_test.rb +0 -30
- data/test/unit/machine/machine_with_action_already_overridden_test.rb +0 -23
- data/test/unit/machine/machine_with_action_defined_in_class_test.rb +0 -37
- data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +0 -46
- data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +0 -43
- data/test/unit/machine/machine_with_action_undefined_test.rb +0 -33
- data/test/unit/machine/machine_with_cached_state_test.rb +0 -20
- data/test/unit/machine/machine_with_class_helpers_test.rb +0 -179
- data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +0 -244
- data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +0 -175
- data/test/unit/machine/machine_with_custom_action_test.rb +0 -11
- data/test/unit/machine/machine_with_custom_attribute_test.rb +0 -103
- data/test/unit/machine/machine_with_custom_initialize_test.rb +0 -24
- data/test/unit/machine/machine_with_custom_integration_test.rb +0 -72
- data/test/unit/machine/machine_with_custom_invalidation_test.rb +0 -39
- data/test/unit/machine/machine_with_custom_name_test.rb +0 -57
- data/test/unit/machine/machine_with_custom_plural_test.rb +0 -52
- data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +0 -65
- data/test/unit/machine/machine_with_event_matchers_test.rb +0 -41
- data/test/unit/machine/machine_with_events_test.rb +0 -52
- data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +0 -18
- data/test/unit/machine/machine_with_events_with_transitions_test.rb +0 -37
- data/test/unit/machine/machine_with_existing_event_test.rb +0 -17
- data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +0 -20
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +0 -71
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +0 -31
- data/test/unit/machine/machine_with_existing_state_test.rb +0 -27
- data/test/unit/machine/machine_with_failure_callbacks_test.rb +0 -48
- data/test/unit/machine/machine_with_helpers_test.rb +0 -14
- data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +0 -25
- data/test/unit/machine/machine_with_initialize_and_super_test.rb +0 -17
- data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +0 -31
- data/test/unit/machine/machine_with_initialize_without_super_test.rb +0 -17
- data/test/unit/machine/machine_with_instance_helpers_test.rb +0 -179
- data/test/unit/machine/machine_with_integration_test.rb +0 -72
- data/test/unit/machine/machine_with_multiple_events_test.rb +0 -32
- data/test/unit/machine/machine_with_namespace_test.rb +0 -48
- data/test/unit/machine/machine_with_nil_action_test.rb +0 -27
- data/test/unit/machine/machine_with_other_states.rb +0 -22
- data/test/unit/machine/machine_with_owner_subclass_test.rb +0 -18
- data/test/unit/machine/machine_with_paths_test.rb +0 -25
- data/test/unit/machine/machine_with_private_action_test.rb +0 -43
- data/test/unit/machine/machine_with_state_matchers_test.rb +0 -41
- data/test/unit/machine/machine_with_state_with_matchers_test.rb +0 -19
- data/test/unit/machine/machine_with_states_test.rb +0 -55
- data/test/unit/machine/machine_with_states_with_behaviors_test.rb +0 -23
- data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +0 -18
- data/test/unit/machine/machine_with_states_with_custom_values_test.rb +0 -21
- data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +0 -19
- data/test/unit/machine/machine_with_static_initial_state_test.rb +0 -49
- data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +0 -36
- data/test/unit/machine/machine_with_transition_callbacks_test.rb +0 -144
- data/test/unit/machine/machine_with_transitions_test.rb +0 -87
- data/test/unit/machine/machine_without_initialization_test.rb +0 -31
- data/test/unit/machine/machine_without_initialize_test.rb +0 -14
- data/test/unit/machine/machine_without_integration_test.rb +0 -31
- data/test/unit/machine_collection/machine_collection_by_default_test.rb +0 -11
- data/test/unit/machine_collection/machine_collection_fire_test.rb +0 -80
- data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +0 -54
- data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +0 -76
- data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +0 -111
- data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +0 -20
- data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +0 -26
- data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +0 -31
- data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +0 -26
- data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +0 -25
- data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +0 -27
- data/test/unit/matcher/all_matcher_test.rb +0 -29
- data/test/unit/matcher/blacklist_matcher_test.rb +0 -30
- data/test/unit/matcher/loopback_matcher_test.rb +0 -27
- data/test/unit/matcher/matcher_by_default_test.rb +0 -15
- data/test/unit/matcher/matcher_with_multiple_values_test.rb +0 -15
- data/test/unit/matcher/matcher_with_value_test.rb +0 -15
- data/test/unit/matcher/whitelist_matcher_test.rb +0 -30
- data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +0 -14
- data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +0 -14
- data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +0 -13
- data/test/unit/node_collection/node_collection_after_being_copied_test.rb +0 -46
- data/test/unit/node_collection/node_collection_after_update_test.rb +0 -36
- data/test/unit/node_collection/node_collection_by_default_test.rb +0 -22
- data/test/unit/node_collection/node_collection_test.rb +0 -23
- data/test/unit/node_collection/node_collection_with_indices_test.rb +0 -42
- data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +0 -25
- data/test/unit/node_collection/node_collection_with_nodes_test.rb +0 -46
- data/test/unit/node_collection/node_collection_with_numeric_index_test.rb +0 -24
- data/test/unit/node_collection/node_collection_with_postdefined_contexts_test.rb +0 -22
- data/test/unit/node_collection/node_collection_with_predefined_contexts_test.rb +0 -23
- data/test/unit/node_collection/node_collection_with_string_index_test.rb +0 -20
- data/test/unit/node_collection/node_collection_with_symbol_index_test.rb +0 -20
- data/test/unit/node_collection/node_collection_without_indices_test.rb +0 -30
- data/test/unit/path/path_by_default_test.rb +0 -54
- data/test/unit/path/path_test.rb +0 -14
- data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +0 -40
- data/test/unit/path/path_with_available_transitions_test.rb +0 -54
- data/test/unit/path/path_with_deep_target_reached_test.rb +0 -50
- data/test/unit/path/path_with_deep_target_test.rb +0 -40
- data/test/unit/path/path_with_duplicates_test.rb +0 -32
- data/test/unit/path/path_with_encountered_transitions_test.rb +0 -34
- data/test/unit/path/path_with_guarded_transitions_test.rb +0 -42
- data/test/unit/path/path_with_reached_target_test.rb +0 -35
- data/test/unit/path/path_with_transitions_test.rb +0 -54
- data/test/unit/path/path_with_unreached_target_test.rb +0 -31
- data/test/unit/path/path_without_transitions_test.rb +0 -24
- data/test/unit/path_collection/path_collection_by_default_test.rb +0 -46
- data/test/unit/path_collection/path_collection_test.rb +0 -24
- data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +0 -43
- data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +0 -31
- data/test/unit/path_collection/path_collection_with_from_state_test.rb +0 -27
- data/test/unit/path_collection/path_collection_with_paths_test.rb +0 -47
- data/test/unit/path_collection/path_collection_with_to_state_test.rb +0 -29
- data/test/unit/path_collection/path_with_guarded_paths_test.rb +0 -25
- data/test/unit/state/state_after_being_copied_test.rb +0 -19
- data/test/unit/state/state_by_default_test.rb +0 -41
- data/test/unit/state/state_final_test.rb +0 -28
- data/test/unit/state/state_initial_test.rb +0 -13
- data/test/unit/state/state_not_final_test.rb +0 -32
- data/test/unit/state/state_not_initial_test.rb +0 -13
- data/test/unit/state/state_test.rb +0 -44
- data/test/unit/state/state_with_cached_lambda_value_test.rb +0 -29
- data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +0 -38
- data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +0 -29
- data/test/unit/state/state_with_conflicting_machine_name_test.rb +0 -20
- data/test/unit/state/state_with_conflicting_machine_test.rb +0 -37
- data/test/unit/state/state_with_context_test.rb +0 -60
- data/test/unit/state/state_with_dynamic_human_name_test.rb +0 -25
- data/test/unit/state/state_with_existing_context_method_test.rb +0 -24
- data/test/unit/state/state_with_human_name_test.rb +0 -13
- data/test/unit/state/state_with_integer_value_test.rb +0 -32
- data/test/unit/state/state_with_invalid_method_call_test.rb +0 -21
- data/test/unit/state/state_with_lambda_value_test.rb +0 -37
- data/test/unit/state/state_with_matcher_test.rb +0 -18
- data/test/unit/state/state_with_multiple_contexts_test.rb +0 -57
- data/test/unit/state/state_with_name_test.rb +0 -43
- data/test/unit/state/state_with_namespace_test.rb +0 -22
- data/test/unit/state/state_with_nil_value_test.rb +0 -35
- data/test/unit/state/state_with_redefined_context_method_test.rb +0 -45
- data/test/unit/state/state_with_symbolic_value_test.rb +0 -32
- data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +0 -40
- data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +0 -33
- data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +0 -41
- data/test/unit/state/state_without_cached_lambda_value_test.rb +0 -25
- data/test/unit/state/state_without_name_test.rb +0 -39
- data/test/unit/state_collection/state_collection_by_default_test.rb +0 -21
- data/test/unit/state_collection/state_collection_string_test.rb +0 -35
- data/test/unit/state_collection/state_collection_test.rb +0 -74
- data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +0 -29
- data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +0 -39
- data/test/unit/state_collection/state_collection_with_initial_state_test.rb +0 -40
- data/test/unit/state_collection/state_collection_with_namespace_test.rb +0 -21
- data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +0 -40
- data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +0 -29
- data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +0 -40
- data/test/unit/state_context/state_context_proxy_test.rb +0 -26
- data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +0 -42
- data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +0 -64
- data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +0 -32
- data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +0 -32
- data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +0 -64
- data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +0 -31
- data/test/unit/state_context/state_context_test.rb +0 -28
- data/test/unit/state_context/state_context_transition_test.rb +0 -104
- data/test/unit/state_context/state_context_with_matching_transition_test.rb +0 -27
- data/test/unit/state_machine/state_machine_by_default_test.rb +0 -12
- data/test/unit/state_machine/state_machine_test.rb +0 -20
- data/test/unit/transition/transition_after_being_performed_test.rb +0 -48
- data/test/unit/transition/transition_after_being_persisted_test.rb +0 -46
- data/test/unit/transition/transition_after_being_rolled_back_test.rb +0 -35
- data/test/unit/transition/transition_equality_test.rb +0 -52
- data/test/unit/transition/transition_loopback_test.rb +0 -18
- data/test/unit/transition/transition_test.rb +0 -96
- data/test/unit/transition/transition_transient_test.rb +0 -20
- data/test/unit/transition/transition_with_action_test.rb +0 -27
- data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +0 -127
- data/test/unit/transition/transition_with_after_callbacks_test.rb +0 -93
- data/test/unit/transition/transition_with_around_callbacks_test.rb +0 -141
- data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +0 -30
- data/test/unit/transition/transition_with_before_callbacks_test.rb +0 -104
- data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +0 -28
- data/test/unit/transition/transition_with_different_states_test.rb +0 -18
- data/test/unit/transition/transition_with_dynamic_to_value_test.rb +0 -19
- data/test/unit/transition/transition_with_failure_callbacks_test.rb +0 -84
- data/test/unit/transition/transition_with_invalid_nodes_test.rb +0 -29
- data/test/unit/transition/transition_with_mixed_callbacks_test.rb +0 -105
- data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +0 -114
- data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +0 -40
- data/test/unit/transition/transition_with_namespace_test.rb +0 -47
- data/test/unit/transition/transition_with_perform_arguments_test.rb +0 -35
- data/test/unit/transition/transition_with_transactions_test.rb +0 -42
- data/test/unit/transition/transition_without_callbacks_test.rb +0 -33
- data/test/unit/transition/transition_without_reading_state_test.rb +0 -22
- data/test/unit/transition/transition_without_running_action_test.rb +0 -47
- data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +0 -23
- data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +0 -64
- data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +0 -32
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +0 -33
- data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +0 -68
- data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +0 -41
- data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +0 -44
- data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +0 -42
- data/test/unit/transition_collection/transition_collection_by_default_test.rb +0 -23
- data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +0 -23
- data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +0 -12
- data/test/unit/transition_collection/transition_collection_invalid_test.rb +0 -21
- data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +0 -69
- data/test/unit/transition_collection/transition_collection_test.rb +0 -26
- data/test/unit/transition_collection/transition_collection_valid_test.rb +0 -57
- data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +0 -66
- data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +0 -60
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +0 -37
- data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +0 -29
- data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +0 -17
- data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +0 -79
- data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +0 -45
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +0 -48
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +0 -42
- data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +0 -47
- data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -51
- data/test/unit/transition_collection/transition_collection_with_block_test.rb +0 -46
- data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +0 -135
- data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +0 -189
- data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +0 -48
- data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +0 -41
- data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +0 -41
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +0 -69
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +0 -53
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +0 -34
- data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +0 -65
- data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +0 -29
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module StateMachines
|
2
4
|
# Represents a collection of state machines for a class
|
3
5
|
class MachineCollection < Hash
|
4
6
|
# Initializes the state of each machine in the given object. This can allow
|
5
7
|
# states to be initialized in two groups: static and dynamic. For example:
|
6
|
-
#
|
8
|
+
#
|
7
9
|
# machines.initialize_states(object) do
|
8
10
|
# # After static state initialization, before dynamic state initialization
|
9
11
|
# end
|
10
|
-
#
|
12
|
+
#
|
11
13
|
# If no block is provided, then all states will still be initialized.
|
12
|
-
#
|
14
|
+
#
|
13
15
|
# Valid configuration options:
|
14
16
|
# * <tt>:static</tt> - Whether to initialize static states. Unless set to
|
15
17
|
# false, the state will be initialized regardless of its current value.
|
@@ -21,19 +23,19 @@ module StateMachines
|
|
21
23
|
# writing to the object. Default is to write directly to the object.
|
22
24
|
def initialize_states(object, options = {}, attributes = {})
|
23
25
|
options.assert_valid_keys( :static, :dynamic, :to)
|
24
|
-
options = {:
|
26
|
+
options = {static: true, dynamic: true}.merge(options)
|
25
27
|
|
26
28
|
result = yield if block_given?
|
27
29
|
|
28
30
|
each_value do |machine|
|
29
31
|
unless machine.dynamic_initial_state?
|
30
32
|
force = options[:static] == :force || !attributes.keys.map(&:to_sym).include?(machine.attribute)
|
31
|
-
machine.initialize_state(object, force: force, :
|
33
|
+
machine.initialize_state(object, force: force, to: options[:to])
|
32
34
|
end
|
33
35
|
end if options[:static]
|
34
36
|
|
35
37
|
each_value do |machine|
|
36
|
-
machine.initialize_state(object, :
|
38
|
+
machine.initialize_state(object, force: options[:dynamic] == :force, to: options[:to]) if machine.dynamic_initial_state?
|
37
39
|
end if options[:dynamic]
|
38
40
|
|
39
41
|
result
|
@@ -48,12 +50,12 @@ module StateMachines
|
|
48
50
|
transitions = events.collect do |event_name|
|
49
51
|
# Find the actual event being run
|
50
52
|
event = nil
|
51
|
-
detect {|name, machine| event = machine.events[event_name, :qualified_name]}
|
53
|
+
detect { |name, machine| event = machine.events[event_name, :qualified_name] }
|
52
54
|
|
53
55
|
raise(InvalidEvent.new(object, event_name)) unless event
|
54
56
|
|
55
57
|
# Get the transition that will be performed for the event
|
56
|
-
unless transition = event.transition_for(object)
|
58
|
+
unless (transition = event.transition_for(object))
|
57
59
|
event.on_failure(object)
|
58
60
|
end
|
59
61
|
transition
|
@@ -71,7 +73,7 @@ module StateMachines
|
|
71
73
|
# Builds the collection of transitions for all event attributes defined on
|
72
74
|
# the given object. This will only include events whose machine actions
|
73
75
|
# match the one specified.
|
74
|
-
#
|
76
|
+
#
|
75
77
|
# These should only be fired as a result of the action being run.
|
76
78
|
def transitions(object, action, options = {})
|
77
79
|
transitions = map do |name, machine|
|
@@ -81,13 +83,14 @@ module StateMachines
|
|
81
83
|
AttributeTransitionCollection.new(transitions.compact, {use_transactions: resolve_use_transactions}.merge(options))
|
82
84
|
end
|
83
85
|
|
84
|
-
|
86
|
+
protected
|
85
87
|
|
86
88
|
def resolve_use_transactions
|
87
89
|
use_transactions = nil
|
88
90
|
each_value do |machine|
|
89
91
|
# Determine use_transactions setting for this set of transitions. If from multiple state_machines, the settings must match.
|
90
92
|
raise 'Encountered mismatched use_transactions configurations for multiple state_machines' if !use_transactions.nil? && use_transactions != machine.use_transactions
|
93
|
+
|
91
94
|
use_transactions = machine.use_transactions
|
92
95
|
end
|
93
96
|
use_transactions
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# A state machine is a model of behavior composed of states, events, and
|
2
4
|
# transitions. This helper adds support for defining this type of
|
3
5
|
# functionality on any Ruby class.
|
@@ -5,7 +7,7 @@ module StateMachines
|
|
5
7
|
module MacroMethods
|
6
8
|
# Creates a new state machine with the given name. The default name, if not
|
7
9
|
# specified, is <tt>:state</tt>.
|
8
|
-
#
|
10
|
+
#
|
9
11
|
# Configuration options:
|
10
12
|
# * <tt>:attribute</tt> - The name of the attribute to store the state value
|
11
13
|
# in. By default, this is the same as the name of the machine.
|
@@ -26,7 +28,7 @@ module StateMachines
|
|
26
28
|
# library-specific behavior to the machine. Built-in integrations
|
27
29
|
# include :active_model, :active_record, :data_mapper, :mongo_mapper, and
|
28
30
|
# :sequel. By default, this is determined automatically.
|
29
|
-
#
|
31
|
+
#
|
30
32
|
# Configuration options relevant to ORM integrations:
|
31
33
|
# * <tt>:plural</tt> - The pluralized version of the name. By default, this
|
32
34
|
# will attempt to call +pluralize+ on the name. If this method is not
|
@@ -39,20 +41,20 @@ module StateMachines
|
|
39
41
|
# * <tt>:use_transactions</tt> - Whether transactions should be used when
|
40
42
|
# firing events. Default is true unless otherwise specified by the
|
41
43
|
# configured integration.
|
42
|
-
#
|
44
|
+
#
|
43
45
|
# This also expects a block which will be used to actually configure the
|
44
46
|
# states, events and transitions for the state machine. *Note* that this
|
45
47
|
# block will be executed within the context of the state machine. As a
|
46
48
|
# result, you will not be able to access any class methods unless you refer
|
47
49
|
# to them directly (i.e. specifying the class name).
|
48
|
-
#
|
50
|
+
#
|
49
51
|
# For examples on the types of state machine configurations and blocks, see
|
50
52
|
# the section below.
|
51
|
-
#
|
53
|
+
#
|
52
54
|
# == Examples
|
53
|
-
#
|
55
|
+
#
|
54
56
|
# With the default name/attribute and no configuration:
|
55
|
-
#
|
57
|
+
#
|
56
58
|
# class Vehicle
|
57
59
|
# state_machine do
|
58
60
|
# event :park do
|
@@ -60,37 +62,37 @@ module StateMachines
|
|
60
62
|
# end
|
61
63
|
# end
|
62
64
|
# end
|
63
|
-
#
|
65
|
+
#
|
64
66
|
# The above example will define a state machine named "state" that will
|
65
67
|
# store the value in the +state+ attribute. Every vehicle will start
|
66
68
|
# without an initial state.
|
67
|
-
#
|
69
|
+
#
|
68
70
|
# With a custom name / attribute:
|
69
|
-
#
|
71
|
+
#
|
70
72
|
# class Vehicle
|
71
73
|
# state_machine :status, :attribute => :status_value do
|
72
74
|
# ...
|
73
75
|
# end
|
74
76
|
# end
|
75
|
-
#
|
77
|
+
#
|
76
78
|
# With a static initial state:
|
77
|
-
#
|
79
|
+
#
|
78
80
|
# class Vehicle
|
79
81
|
# state_machine :status, :initial => :parked do
|
80
82
|
# ...
|
81
83
|
# end
|
82
84
|
# end
|
83
|
-
#
|
85
|
+
#
|
84
86
|
# With a dynamic initial state:
|
85
|
-
#
|
87
|
+
#
|
86
88
|
# class Vehicle
|
87
89
|
# state_machine :status, :initial => lambda {|vehicle| vehicle.speed == 0 ? :parked : :idling} do
|
88
90
|
# ...
|
89
91
|
# end
|
90
92
|
# end
|
91
|
-
#
|
93
|
+
#
|
92
94
|
# == Class Methods
|
93
|
-
#
|
95
|
+
#
|
94
96
|
# The following class methods will be automatically generated by the
|
95
97
|
# state machine based on the *name* of the machine. Any existing methods
|
96
98
|
# will not be overwritten.
|
@@ -100,28 +102,28 @@ module StateMachines
|
|
100
102
|
# * <tt>human_state_event_name(event)</tt> - Gets the humanized value for
|
101
103
|
# the given event. This may be generated by internationalization
|
102
104
|
# libraries if supported by the integration.
|
103
|
-
#
|
105
|
+
#
|
104
106
|
# For example,
|
105
|
-
#
|
107
|
+
#
|
106
108
|
# class Vehicle
|
107
109
|
# state_machine :state, :initial => :parked do
|
108
110
|
# event :ignite do
|
109
111
|
# transition :parked => :idling
|
110
112
|
# end
|
111
|
-
#
|
113
|
+
#
|
112
114
|
# event :shift_up do
|
113
115
|
# transition :idling => :first_gear
|
114
116
|
# end
|
115
117
|
# end
|
116
118
|
# end
|
117
|
-
#
|
119
|
+
#
|
118
120
|
# Vehicle.human_state_name(:parked) # => "parked"
|
119
121
|
# Vehicle.human_state_name(:first_gear) # => "first gear"
|
120
122
|
# Vehicle.human_state_event_name(:park) # => "park"
|
121
123
|
# Vehicle.human_state_event_name(:shift_up) # => "shift up"
|
122
|
-
#
|
124
|
+
#
|
123
125
|
# == Instance Methods
|
124
|
-
#
|
126
|
+
#
|
125
127
|
# The following instance methods will be automatically generated by the
|
126
128
|
# state machine based on the *name* of the machine. Any existing methods
|
127
129
|
# will not be overwritten.
|
@@ -142,7 +144,7 @@ module StateMachines
|
|
142
144
|
# * <tt>fire_state_event(name, *args)</tt> - Fires an arbitrary event with
|
143
145
|
# the given argument list. This is essentially the same as calling the
|
144
146
|
# actual event method itself.
|
145
|
-
#
|
147
|
+
#
|
146
148
|
# The <tt>state_events</tt>, <tt>state_transitions</tt>, and <tt>state_paths</tt>
|
147
149
|
# helpers all take an optional set of requirements for determining what's
|
148
150
|
# available for the current object. These requirements include:
|
@@ -154,146 +156,146 @@ module StateMachines
|
|
154
156
|
# specified, then this will match any event.
|
155
157
|
# * <tt>:guard</tt> - Whether to guard transitions with the if/unless
|
156
158
|
# conditionals defined for each one. Default is true.
|
157
|
-
#
|
159
|
+
#
|
158
160
|
# For example,
|
159
|
-
#
|
161
|
+
#
|
160
162
|
# class Vehicle
|
161
163
|
# state_machine :state, :initial => :parked do
|
162
164
|
# event :ignite do
|
163
165
|
# transition :parked => :idling
|
164
166
|
# end
|
165
|
-
#
|
167
|
+
#
|
166
168
|
# event :park do
|
167
169
|
# transition :idling => :parked
|
168
170
|
# end
|
169
171
|
# end
|
170
172
|
# end
|
171
|
-
#
|
173
|
+
#
|
172
174
|
# vehicle = Vehicle.new
|
173
175
|
# vehicle.state # => "parked"
|
174
176
|
# vehicle.state_name # => :parked
|
175
177
|
# vehicle.human_state_name # => "parked"
|
176
178
|
# vehicle.state?(:parked) # => true
|
177
|
-
#
|
179
|
+
#
|
178
180
|
# # Changing state
|
179
181
|
# vehicle.state = 'idling'
|
180
182
|
# vehicle.state # => "idling"
|
181
183
|
# vehicle.state_name # => :idling
|
182
184
|
# vehicle.state?(:parked) # => false
|
183
|
-
#
|
185
|
+
#
|
184
186
|
# # Getting current event / transition availability
|
185
187
|
# vehicle.state_events # => [:park]
|
186
188
|
# vehicle.park # => true
|
187
189
|
# vehicle.state_events # => [:ignite]
|
188
190
|
# vehicle.state_events(:from => :idling) # => [:park]
|
189
191
|
# vehicle.state_events(:to => :parked) # => []
|
190
|
-
#
|
192
|
+
#
|
191
193
|
# vehicle.state_transitions # => [#<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
|
192
194
|
# vehicle.ignite # => true
|
193
195
|
# vehicle.state_transitions # => [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>]
|
194
|
-
#
|
196
|
+
#
|
195
197
|
# vehicle.state_transitions(:on => :ignite) # => []
|
196
|
-
#
|
198
|
+
#
|
197
199
|
# # Getting current path availability
|
198
200
|
# vehicle.state_paths # => [
|
199
201
|
# # [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>,
|
200
202
|
# # #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
|
201
203
|
# # ]
|
202
|
-
# vehicle.state_paths(:guard => false) # =>
|
204
|
+
# vehicle.state_paths(:guard => false) # =>
|
203
205
|
# # [#<StateMachines::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>,
|
204
206
|
# # #<StateMachines::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
|
205
207
|
# # ]
|
206
|
-
#
|
208
|
+
#
|
207
209
|
# # Fire arbitrary events
|
208
210
|
# vehicle.fire_state_event(:park) # => true
|
209
|
-
#
|
211
|
+
#
|
210
212
|
# == Attribute initialization
|
211
|
-
#
|
213
|
+
#
|
212
214
|
# For most classes, the initial values for state machine attributes are
|
213
215
|
# automatically assigned when a new object is created. However, this
|
214
216
|
# behavior will *not* work if the class defines an +initialize+ method
|
215
217
|
# without properly calling +super+.
|
216
|
-
#
|
218
|
+
#
|
217
219
|
# For example,
|
218
|
-
#
|
220
|
+
#
|
219
221
|
# class Vehicle
|
220
222
|
# state_machine :state, :initial => :parked do
|
221
223
|
# ...
|
222
224
|
# end
|
223
225
|
# end
|
224
|
-
#
|
226
|
+
#
|
225
227
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
|
226
228
|
# vehicle.state # => "parked"
|
227
|
-
#
|
229
|
+
#
|
228
230
|
# In the above example, no +initialize+ method is defined. As a result,
|
229
231
|
# the default behavior of initializing the state machine attributes is used.
|
230
|
-
#
|
232
|
+
#
|
231
233
|
# In the following example, a custom +initialize+ method is defined:
|
232
|
-
#
|
234
|
+
#
|
233
235
|
# class Vehicle
|
234
236
|
# state_machine :state, :initial => :parked do
|
235
237
|
# ...
|
236
238
|
# end
|
237
|
-
#
|
239
|
+
#
|
238
240
|
# def initialize
|
239
241
|
# end
|
240
242
|
# end
|
241
|
-
#
|
243
|
+
#
|
242
244
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c77678>
|
243
245
|
# vehicle.state # => nil
|
244
|
-
#
|
246
|
+
#
|
245
247
|
# Since the +initialize+ method is defined, the state machine attributes
|
246
248
|
# never get initialized. In order to ensure that all initialization hooks
|
247
249
|
# are called, the custom method *must* call +super+ without any arguments
|
248
250
|
# like so:
|
249
|
-
#
|
251
|
+
#
|
250
252
|
# class Vehicle
|
251
253
|
# state_machine :state, :initial => :parked do
|
252
254
|
# ...
|
253
255
|
# end
|
254
|
-
#
|
256
|
+
#
|
255
257
|
# def initialize(attributes = {})
|
256
258
|
# ...
|
257
259
|
# super()
|
258
260
|
# end
|
259
261
|
# end
|
260
|
-
#
|
262
|
+
#
|
261
263
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
|
262
264
|
# vehicle.state # => "parked"
|
263
|
-
#
|
265
|
+
#
|
264
266
|
# Because of the way the inclusion of modules works in Ruby, calling
|
265
267
|
# <tt>super()</tt> will not only call the superclass's +initialize+, but
|
266
268
|
# also +initialize+ on all included modules. This allows the original state
|
267
269
|
# machine hook to get called properly.
|
268
|
-
#
|
270
|
+
#
|
269
271
|
# If you want to avoid calling the superclass's constructor, but still want
|
270
272
|
# to initialize the state machine attributes:
|
271
|
-
#
|
273
|
+
#
|
272
274
|
# class Vehicle
|
273
275
|
# state_machine :state, :initial => :parked do
|
274
276
|
# ...
|
275
277
|
# end
|
276
|
-
#
|
278
|
+
#
|
277
279
|
# def initialize(attributes = {})
|
278
280
|
# ...
|
279
281
|
# initialize_state_machines
|
280
282
|
# end
|
281
283
|
# end
|
282
|
-
#
|
284
|
+
#
|
283
285
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
|
284
286
|
# vehicle.state # => "parked"
|
285
|
-
#
|
287
|
+
#
|
286
288
|
# You may also need to call the +initialize_state_machines+ helper manually
|
287
289
|
# in cases where you want to change how static / dynamic initial states get
|
288
290
|
# set. For example, the following example forces the initialization of
|
289
291
|
# static states regardless of their current value:
|
290
|
-
#
|
292
|
+
#
|
291
293
|
# class Vehicle
|
292
294
|
# state_machine :state, :initial => :parked do
|
293
295
|
# state nil, :idling
|
294
296
|
# ...
|
295
297
|
# end
|
296
|
-
#
|
298
|
+
#
|
297
299
|
# def initialize(attributes = {})
|
298
300
|
# @state = 'idling'
|
299
301
|
# initialize_state_machines(:static => :force) do
|
@@ -301,28 +303,28 @@ module StateMachines
|
|
301
303
|
# end
|
302
304
|
# end
|
303
305
|
# end
|
304
|
-
#
|
306
|
+
#
|
305
307
|
# vehicle = Vehicle.new # => #<Vehicle:0xb7c8dbf8 @state="parked">
|
306
308
|
# vehicle.state # => "parked"
|
307
|
-
#
|
309
|
+
#
|
308
310
|
# The above example is also noteworthy because it demonstrates how to avoid
|
309
311
|
# initialization issues when +nil+ is a valid state. Without passing in
|
310
312
|
# <tt>:static => :force</tt>, state_machine would never have initialized
|
311
313
|
# the state because +nil+ (the default attribute value) would have been
|
312
314
|
# interpreted as a valid current state. As a result, state_machine would
|
313
315
|
# have simply skipped initialization.
|
314
|
-
#
|
316
|
+
#
|
315
317
|
# == States
|
316
|
-
#
|
318
|
+
#
|
317
319
|
# All of the valid states for the machine are automatically tracked based
|
318
320
|
# on the events, transitions, and callbacks defined for the machine. If
|
319
321
|
# there are additional states that are never referenced, these should be
|
320
322
|
# explicitly added using the StateMachines::Machine#state or
|
321
323
|
# StateMachines::Machine#other_states helpers.
|
322
|
-
#
|
324
|
+
#
|
323
325
|
# When a new state is defined, a predicate method for that state is
|
324
326
|
# generated on the class. For example,
|
325
|
-
#
|
327
|
+
#
|
326
328
|
# class Vehicle
|
327
329
|
# state_machine :initial => :parked do
|
328
330
|
# event :ignite do
|
@@ -330,37 +332,37 @@ module StateMachines
|
|
330
332
|
# end
|
331
333
|
# end
|
332
334
|
# end
|
333
|
-
#
|
335
|
+
#
|
334
336
|
# ...will generate the following instance methods (assuming they're not
|
335
337
|
# already defined in the class):
|
336
338
|
# * <tt>parked?</tt>
|
337
339
|
# * <tt>idling?</tt>
|
338
|
-
#
|
340
|
+
#
|
339
341
|
# Each predicate method will return true if it matches the object's
|
340
342
|
# current state. Otherwise, it will return false.
|
341
|
-
#
|
343
|
+
#
|
342
344
|
# == Attribute access
|
343
|
-
#
|
345
|
+
#
|
344
346
|
# The actual value for a state is stored in the attribute configured for the
|
345
347
|
# state machine. In most cases, this is the same as the name of the state
|
346
348
|
# machine. For example:
|
347
|
-
#
|
349
|
+
#
|
348
350
|
# class Vehicle
|
349
351
|
# attr_accessor :state
|
350
|
-
#
|
352
|
+
#
|
351
353
|
# state_machine :state, :initial => :parked do
|
352
354
|
# ...
|
353
355
|
# state :parked, :value => 0
|
354
356
|
# start :idling, :value => 1
|
355
357
|
# end
|
356
358
|
# end
|
357
|
-
#
|
359
|
+
#
|
358
360
|
# vehicle = Vehicle.new # => #<Vehicle:0xb712da60 @state=0>
|
359
361
|
# vehicle.state # => 0
|
360
362
|
# vehicle.parked? # => true
|
361
363
|
# vehicle.state = 1
|
362
364
|
# vehicle.idling? # => true
|
363
|
-
#
|
365
|
+
#
|
364
366
|
# The most important thing to note from the example above is what it means
|
365
367
|
# to read from and write to the state machine's attribute. In particular,
|
366
368
|
# state_machine treats the attribute (+state+ in this case) like a basic
|
@@ -378,97 +380,97 @@ module StateMachines
|
|
378
380
|
# different ways an attribute can get written, state_machine just makes
|
379
381
|
# sure that the configured value for a state is always used when writing
|
380
382
|
# to the attribute.
|
381
|
-
#
|
383
|
+
#
|
382
384
|
# If you were interested in accessing the name of a state (instead of its
|
383
385
|
# actual value through the attribute), you could do the following:
|
384
|
-
#
|
386
|
+
#
|
385
387
|
# vehicle.state_name # => :idling
|
386
|
-
#
|
388
|
+
#
|
387
389
|
# == Events and Transitions
|
388
|
-
#
|
390
|
+
#
|
389
391
|
# Events defined on the machine are the interface to transitioning states
|
390
392
|
# for an object. Events can be fired either directly (through the method
|
391
393
|
# generated for the event) or indirectly (through attributes defined on
|
392
394
|
# the machine).
|
393
|
-
#
|
395
|
+
#
|
394
396
|
# For example,
|
395
|
-
#
|
397
|
+
#
|
396
398
|
# class Vehicle
|
397
399
|
# include DataMapper::Resource
|
398
400
|
# property :id, Serial
|
399
|
-
#
|
401
|
+
#
|
400
402
|
# state_machine :initial => :parked do
|
401
403
|
# event :ignite do
|
402
404
|
# transition :parked => :idling
|
403
405
|
# end
|
404
406
|
# end
|
405
|
-
#
|
407
|
+
#
|
406
408
|
# state_machine :alarm_state, :initial => :active do
|
407
409
|
# event :disable do
|
408
410
|
# transition all => :off
|
409
411
|
# end
|
410
412
|
# end
|
411
413
|
# end
|
412
|
-
#
|
414
|
+
#
|
413
415
|
# # Fire +ignite+ event directly
|
414
416
|
# vehicle = Vehicle.create # => #<Vehicle id=1 state="parked" alarm_state="active">
|
415
417
|
# vehicle.ignite # => true
|
416
418
|
# vehicle.state # => "idling"
|
417
419
|
# vehicle.alarm_state # => "active"
|
418
|
-
#
|
420
|
+
#
|
419
421
|
# # Fire +disable+ event automatically
|
420
422
|
# vehicle.alarm_state_event = 'disable'
|
421
423
|
# vehicle.save # => true
|
422
424
|
# vehicle.alarm_state # => "off"
|
423
|
-
#
|
425
|
+
#
|
424
426
|
# In the above example, the +state+ attribute is transitioned using the
|
425
427
|
# +ignite+ action that's generated from the state machine. On the other
|
426
428
|
# hand, the +alarm_state+ attribute is transitioned using the +alarm_state_event+
|
427
429
|
# attribute that automatically gets fired when the machine's action (+save+)
|
428
430
|
# is invoked.
|
429
|
-
#
|
431
|
+
#
|
430
432
|
# For more information about how to configure an event and its associated
|
431
433
|
# transitions, see StateMachines::Machine#event.
|
432
|
-
#
|
434
|
+
#
|
433
435
|
# == Defining callbacks
|
434
|
-
#
|
436
|
+
#
|
435
437
|
# Within the +state_machine+ block, you can also define callbacks for
|
436
438
|
# transitions. For more information about defining these callbacks,
|
437
439
|
# see StateMachines::Machine#before_transition, StateMachines::Machine#after_transition,
|
438
440
|
# and StateMachines::Machine#around_transition, and StateMachines::Machine#after_failure.
|
439
|
-
#
|
441
|
+
#
|
440
442
|
# == Namespaces
|
441
|
-
#
|
443
|
+
#
|
442
444
|
# When a namespace is configured for a state machine, the name provided
|
443
445
|
# will be used in generating the instance methods for interacting with
|
444
446
|
# states/events in the machine. This is particularly useful when a class
|
445
447
|
# has multiple state machines and it would be difficult to differentiate
|
446
448
|
# between the various states / events.
|
447
|
-
#
|
449
|
+
#
|
448
450
|
# For example,
|
449
|
-
#
|
451
|
+
#
|
450
452
|
# class Vehicle
|
451
453
|
# state_machine :heater_state, :initial => :off, :namespace => 'heater' do
|
452
454
|
# event :turn_on do
|
453
455
|
# transition all => :on
|
454
456
|
# end
|
455
|
-
#
|
457
|
+
#
|
456
458
|
# event :turn_off do
|
457
459
|
# transition all => :off
|
458
460
|
# end
|
459
461
|
# end
|
460
|
-
#
|
462
|
+
#
|
461
463
|
# state_machine :alarm_state, :initial => :active, :namespace => 'alarm' do
|
462
464
|
# event :turn_on do
|
463
465
|
# transition all => :active
|
464
466
|
# end
|
465
|
-
#
|
467
|
+
#
|
466
468
|
# event :turn_off do
|
467
469
|
# transition all => :off
|
468
470
|
# end
|
469
471
|
# end
|
470
472
|
# end
|
471
|
-
#
|
473
|
+
#
|
472
474
|
# The above class defines two state machines: +heater_state+ and +alarm_state+.
|
473
475
|
# For the +heater_state+ machine, the following methods are generated since
|
474
476
|
# it's namespaced by "heater":
|
@@ -480,7 +482,7 @@ module StateMachines
|
|
480
482
|
# * ..
|
481
483
|
# * <tt>heater_off?</tt>
|
482
484
|
# * <tt>heater_on?</tt>
|
483
|
-
#
|
485
|
+
#
|
484
486
|
# As shown, each method is unique to the state machine so that the states
|
485
487
|
# and events don't conflict. The same goes for the +alarm_state+ machine:
|
486
488
|
# * <tt>can_turn_on_alarm?</tt>
|
@@ -491,25 +493,25 @@ module StateMachines
|
|
491
493
|
# * ..
|
492
494
|
# * <tt>alarm_active?</tt>
|
493
495
|
# * <tt>alarm_off?</tt>
|
494
|
-
#
|
496
|
+
#
|
495
497
|
# == Scopes
|
496
|
-
#
|
498
|
+
#
|
497
499
|
# For integrations that support it, a group of default scope filters will
|
498
500
|
# be automatically created for assisting in finding objects that have the
|
499
501
|
# attribute set to one of a given set of states.
|
500
|
-
#
|
502
|
+
#
|
501
503
|
# For example,
|
502
|
-
#
|
504
|
+
#
|
503
505
|
# Vehicle.with_state(:parked) # => All vehicles where the state is parked
|
504
506
|
# Vehicle.with_states(:parked, :idling) # => All vehicles where the state is either parked or idling
|
505
|
-
#
|
507
|
+
#
|
506
508
|
# Vehicle.without_state(:parked) # => All vehicles where the state is *not* parked
|
507
509
|
# Vehicle.without_states(:parked, :idling) # => All vehicles where the state is *not* parked or idling
|
508
|
-
#
|
510
|
+
#
|
509
511
|
# *Note* that if class methods already exist with those names (i.e.
|
510
512
|
# :with_state, :with_states, :without_state, or :without_states), then a
|
511
513
|
# scope will not be defined for that name.
|
512
|
-
#
|
514
|
+
#
|
513
515
|
# See StateMachines::Machine for more information about using integrations
|
514
516
|
# and the individual integration docs for information about the actual
|
515
517
|
# scopes that are generated.
|