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