state_machines 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
 - data/LICENSE.txt +1 -1
 - data/README.md +18 -13
 - data/lib/state_machines/branch.rb +81 -79
 - data/lib/state_machines/callback.rb +22 -21
 - data/lib/state_machines/eval_helpers.rb +15 -15
 - data/lib/state_machines/event.rb +31 -28
 - data/lib/state_machines/event_collection.rb +26 -25
 - data/lib/state_machines/extensions.rb +2 -2
 - data/lib/state_machines/helper_module.rb +1 -1
 - data/lib/state_machines/integrations/base.rb +2 -5
 - data/lib/state_machines/integrations.rb +9 -13
 - data/lib/state_machines/machine.rb +386 -379
 - data/lib/state_machines/machine_collection.rb +11 -10
 - data/lib/state_machines/macro_methods.rb +100 -100
 - data/lib/state_machines/matcher.rb +23 -23
 - data/lib/state_machines/matcher_helpers.rb +11 -11
 - data/lib/state_machines/node_collection.rb +15 -13
 - data/lib/state_machines/path.rb +56 -55
 - data/lib/state_machines/path_collection.rb +38 -38
 - data/lib/state_machines/state.rb +28 -22
 - data/lib/state_machines/state_collection.rb +21 -20
 - data/lib/state_machines/state_context.rb +33 -35
 - data/lib/state_machines/transition.rb +180 -178
 - data/lib/state_machines/transition_collection.rb +170 -168
 - data/lib/state_machines/version.rb +1 -1
 - metadata +5 -852
 - data/.gitignore +0 -21
 - data/.rspec +0 -3
 - data/.travis.yml +0 -14
 - data/Changelog.md +0 -16
 - data/Contributors.md +0 -39
 - data/Gemfile +0 -8
 - data/Rakefile +0 -12
 - data/Testing.md +0 -0
 - data/state_machines.gemspec +0 -23
 - data/test/files/integrations/event_on_failure_integration.rb +0 -10
 - data/test/files/integrations/vehicle.rb +0 -7
 - data/test/files/models/auto_shop.rb +0 -31
 - data/test/files/models/car.rb +0 -21
 - data/test/files/models/model_base.rb +0 -6
 - data/test/files/models/motorcycle.rb +0 -11
 - data/test/files/models/traffic_light.rb +0 -47
 - data/test/files/models/vehicle.rb +0 -127
 - data/test/files/node.rb +0 -5
 - data/test/files/switch.rb +0 -15
 - data/test/functional/auto_shop_available_test.rb +0 -20
 - data/test/functional/auto_shop_busy_test.rb +0 -25
 - data/test/functional/car_backing_up_test.rb +0 -45
 - data/test/functional/car_test.rb +0 -49
 - data/test/functional/motorcycle_test.rb +0 -46
 - data/test/functional/traffic_light_caution_test.rb +0 -17
 - data/test/functional/traffic_light_proceed_test.rb +0 -17
 - data/test/functional/traffic_light_stop_test.rb +0 -26
 - data/test/functional/vehicle_first_gear_test.rb +0 -42
 - data/test/functional/vehicle_idling_test.rb +0 -59
 - data/test/functional/vehicle_locked_test.rb +0 -29
 - data/test/functional/vehicle_parked_test.rb +0 -53
 - data/test/functional/vehicle_repaired_test.rb +0 -20
 - data/test/functional/vehicle_second_gear_test.rb +0 -42
 - data/test/functional/vehicle_stalled_test.rb +0 -65
 - data/test/functional/vehicle_test.rb +0 -20
 - data/test/functional/vehicle_third_gear_test.rb +0 -42
 - data/test/functional/vehicle_unsaved_test.rb +0 -181
 - data/test/functional/vehicle_with_event_attributes_test.rb +0 -30
 - data/test/functional/vehicle_with_parallel_events_test.rb +0 -36
 - data/test/test_helper.rb +0 -15
 - data/test/unit/assertions/assert_exclusive_keys_test.rb +0 -22
 - data/test/unit/assertions/assert_valid_key_test.rb +0 -12
 - data/test/unit/branch/branch_test.rb +0 -28
 - data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +0 -27
 - data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +0 -8
 - data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +0 -8
 - data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +0 -8
 - data/test/unit/branch/branch_with_different_requirements_test.rb +0 -41
 - data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +0 -8
 - data/test/unit/branch/branch_with_except_from_requirement_test.rb +0 -36
 - data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +0 -8
 - data/test/unit/branch/branch_with_except_on_requirement_test.rb +0 -36
 - data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +0 -8
 - data/test/unit/branch/branch_with_except_to_requirement_test.rb +0 -36
 - data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +0 -20
 - data/test/unit/branch/branch_with_from_requirement_test.rb +0 -45
 - data/test/unit/branch/branch_with_if_conditional_test.rb +0 -27
 - data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +0 -23
 - data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +0 -20
 - data/test/unit/branch/branch_with_implicit_requirement_test.rb +0 -20
 - data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +0 -16
 - data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +0 -20
 - data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +0 -16
 - data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +0 -20
 - data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +0 -16
 - data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +0 -20
 - data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +0 -53
 - data/test/unit/branch/branch_with_multiple_on_requirements_test.rb +0 -20
 - data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +0 -20
 - data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +0 -20
 - data/test/unit/branch/branch_with_nil_requirements_test.rb +0 -28
 - data/test/unit/branch/branch_with_no_requirements_test.rb +0 -36
 - data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +0 -16
 - data/test/unit/branch/branch_with_on_requirement_test.rb +0 -45
 - data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +0 -20
 - data/test/unit/branch/branch_with_to_requirement_test.rb +0 -45
 - data/test/unit/branch/branch_with_unless_conditional_test.rb +0 -27
 - data/test/unit/branch/branch_without_guards_test.rb +0 -27
 - data/test/unit/callback/callback_by_default_test.rb +0 -25
 - data/test/unit/callback/callback_test.rb +0 -53
 - data/test/unit/callback/callback_with_application_bound_object_test.rb +0 -23
 - data/test/unit/callback/callback_with_application_terminator_test.rb +0 -24
 - data/test/unit/callback/callback_with_arguments_test.rb +0 -14
 - data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +0 -25
 - data/test/unit/callback/callback_with_around_type_and_block_test.rb +0 -44
 - data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +0 -23
 - data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +0 -93
 - data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +0 -17
 - data/test/unit/callback/callback_with_block_test.rb +0 -20
 - data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +0 -28
 - data/test/unit/callback/callback_with_bound_method_test.rb +0 -35
 - data/test/unit/callback/callback_with_do_method_test.rb +0 -18
 - data/test/unit/callback/callback_with_explicit_requirements_test.rb +0 -32
 - data/test/unit/callback/callback_with_if_condition_test.rb +0 -17
 - data/test/unit/callback/callback_with_implicit_requirements_test.rb +0 -32
 - data/test/unit/callback/callback_with_method_argument_test.rb +0 -18
 - data/test/unit/callback/callback_with_mixed_methods_test.rb +0 -31
 - data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +0 -21
 - data/test/unit/callback/callback_with_multiple_do_methods_test.rb +0 -29
 - data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +0 -29
 - data/test/unit/callback/callback_with_terminator_test.rb +0 -22
 - data/test/unit/callback/callback_with_unbound_method_test.rb +0 -14
 - data/test/unit/callback/callback_with_unless_condition_test.rb +0 -17
 - data/test/unit/callback/callback_without_arguments_test.rb +0 -14
 - data/test/unit/callback/callback_without_terminator_test.rb +0 -12
 - data/test/unit/error/error_by_default_test.rb +0 -21
 - data/test/unit/error/error_with_message_test.rb +0 -23
 - data/test/unit/eval_helper/eval_helpers_base_test.rb +0 -8
 - data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +0 -14
 - data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +0 -14
 - data/test/unit/eval_helper/eval_helpers_proc_test.rb +0 -13
 - data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +0 -13
 - data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +0 -13
 - data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +0 -18
 - data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +0 -14
 - data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +0 -19
 - data/test/unit/eval_helper/eval_helpers_string_test.rb +0 -25
 - data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +0 -12
 - data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +0 -20
 - data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +0 -17
 - data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +0 -17
 - data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +0 -18
 - data/test/unit/eval_helper/eval_helpers_symbol_test.rb +0 -16
 - data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +0 -16
 - data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +0 -16
 - data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +0 -16
 - data/test/unit/eval_helper/eval_helpers_test.rb +0 -13
 - data/test/unit/event/event_after_being_copied_test.rb +0 -17
 - data/test/unit/event/event_by_default_test.rb +0 -60
 - data/test/unit/event/event_context_test.rb +0 -16
 - data/test/unit/event/event_on_failure_test.rb +0 -44
 - data/test/unit/event/event_test.rb +0 -34
 - data/test/unit/event/event_transitions_test.rb +0 -62
 - data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +0 -79
 - data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +0 -58
 - data/test/unit/event/event_with_conflicting_machine_test.rb +0 -48
 - data/test/unit/event/event_with_dynamic_human_name_test.rb +0 -26
 - data/test/unit/event/event_with_human_name_test.rb +0 -13
 - data/test/unit/event/event_with_invalid_current_state_test.rb +0 -30
 - data/test/unit/event/event_with_machine_action_test.rb +0 -33
 - data/test/unit/event/event_with_marshalling_test.rb +0 -47
 - data/test/unit/event/event_with_matching_disabled_transitions_test.rb +0 -115
 - data/test/unit/event/event_with_matching_enabled_transitions_test.rb +0 -75
 - data/test/unit/event/event_with_multiple_transitions_test.rb +0 -61
 - data/test/unit/event/event_with_namespace_test.rb +0 -34
 - data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +0 -60
 - data/test/unit/event/event_with_transition_with_loopback_state_test.rb +0 -36
 - data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +0 -36
 - data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +0 -51
 - data/test/unit/event/event_with_transition_without_to_state_test.rb +0 -36
 - data/test/unit/event/event_with_transitions_test.rb +0 -32
 - data/test/unit/event/event_without_matching_transitions_test.rb +0 -41
 - data/test/unit/event/event_without_transitions_test.rb +0 -28
 - data/test/unit/event/invalid_event_test.rb +0 -20
 - data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +0 -62
 - data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +0 -36
 - data/test/unit/event_collection/event_collection_by_default_test.rb +0 -26
 - data/test/unit/event_collection/event_collection_test.rb +0 -39
 - data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +0 -31
 - data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +0 -76
 - data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +0 -27
 - data/test/unit/event_collection/event_collection_with_validations_test.rb +0 -74
 - data/test/unit/event_collection/event_collection_without_machine_action_test.rb +0 -18
 - data/test/unit/event_collection/event_string_collection_test.rb +0 -31
 - data/test/unit/helper_module_test.rb +0 -17
 - data/test/unit/integrations/integration_finder_test.rb +0 -16
 - data/test/unit/integrations/integration_matcher_test.rb +0 -27
 - data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +0 -18
 - data/test/unit/invalid_transition/invalid_transition_test.rb +0 -47
 - data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +0 -45
 - data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +0 -32
 - data/test/unit/machine/machine_after_being_copied_test.rb +0 -62
 - data/test/unit/machine/machine_after_changing_initial_state.rb +0 -28
 - data/test/unit/machine/machine_after_changing_owner_class_test.rb +0 -31
 - data/test/unit/machine/machine_by_default_test.rb +0 -160
 - data/test/unit/machine/machine_finder_custom_options_test.rb +0 -17
 - data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +0 -85
 - data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +0 -23
 - data/test/unit/machine/machine_finder_without_existing_machine_test.rb +0 -25
 - data/test/unit/machine/machine_persistence_test.rb +0 -52
 - data/test/unit/machine/machine_state_initialization_test.rb +0 -56
 - data/test/unit/machine/machine_test.rb +0 -30
 - data/test/unit/machine/machine_with_action_already_overridden_test.rb +0 -23
 - data/test/unit/machine/machine_with_action_defined_in_class_test.rb +0 -37
 - data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +0 -46
 - data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +0 -43
 - data/test/unit/machine/machine_with_action_undefined_test.rb +0 -33
 - data/test/unit/machine/machine_with_cached_state_test.rb +0 -20
 - data/test/unit/machine/machine_with_class_helpers_test.rb +0 -179
 - data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +0 -244
 - data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +0 -175
 - data/test/unit/machine/machine_with_custom_action_test.rb +0 -11
 - data/test/unit/machine/machine_with_custom_attribute_test.rb +0 -103
 - data/test/unit/machine/machine_with_custom_initialize_test.rb +0 -24
 - data/test/unit/machine/machine_with_custom_integration_test.rb +0 -72
 - data/test/unit/machine/machine_with_custom_invalidation_test.rb +0 -39
 - data/test/unit/machine/machine_with_custom_name_test.rb +0 -57
 - data/test/unit/machine/machine_with_custom_plural_test.rb +0 -52
 - data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +0 -65
 - data/test/unit/machine/machine_with_event_matchers_test.rb +0 -41
 - data/test/unit/machine/machine_with_events_test.rb +0 -52
 - data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +0 -18
 - data/test/unit/machine/machine_with_events_with_transitions_test.rb +0 -37
 - data/test/unit/machine/machine_with_existing_event_test.rb +0 -17
 - data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +0 -20
 - data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +0 -71
 - data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +0 -31
 - data/test/unit/machine/machine_with_existing_state_test.rb +0 -27
 - data/test/unit/machine/machine_with_failure_callbacks_test.rb +0 -48
 - data/test/unit/machine/machine_with_helpers_test.rb +0 -14
 - data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +0 -25
 - data/test/unit/machine/machine_with_initialize_and_super_test.rb +0 -17
 - data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +0 -31
 - data/test/unit/machine/machine_with_initialize_without_super_test.rb +0 -17
 - data/test/unit/machine/machine_with_instance_helpers_test.rb +0 -179
 - data/test/unit/machine/machine_with_integration_test.rb +0 -72
 - data/test/unit/machine/machine_with_multiple_events_test.rb +0 -32
 - data/test/unit/machine/machine_with_namespace_test.rb +0 -48
 - data/test/unit/machine/machine_with_nil_action_test.rb +0 -27
 - data/test/unit/machine/machine_with_other_states.rb +0 -22
 - data/test/unit/machine/machine_with_owner_subclass_test.rb +0 -18
 - data/test/unit/machine/machine_with_paths_test.rb +0 -25
 - data/test/unit/machine/machine_with_private_action_test.rb +0 -43
 - data/test/unit/machine/machine_with_state_matchers_test.rb +0 -41
 - data/test/unit/machine/machine_with_state_with_matchers_test.rb +0 -19
 - data/test/unit/machine/machine_with_states_test.rb +0 -55
 - data/test/unit/machine/machine_with_states_with_behaviors_test.rb +0 -23
 - data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +0 -18
 - data/test/unit/machine/machine_with_states_with_custom_values_test.rb +0 -21
 - data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +0 -19
 - data/test/unit/machine/machine_with_static_initial_state_test.rb +0 -49
 - data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +0 -36
 - data/test/unit/machine/machine_with_transition_callbacks_test.rb +0 -144
 - data/test/unit/machine/machine_with_transitions_test.rb +0 -87
 - data/test/unit/machine/machine_without_initialization_test.rb +0 -31
 - data/test/unit/machine/machine_without_initialize_test.rb +0 -14
 - data/test/unit/machine/machine_without_integration_test.rb +0 -31
 - data/test/unit/machine_collection/machine_collection_by_default_test.rb +0 -11
 - data/test/unit/machine_collection/machine_collection_fire_attributes_with_validations_test.rb +0 -72
 - data/test/unit/machine_collection/machine_collection_fire_test.rb +0 -80
 - data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +0 -54
 - data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +0 -76
 - data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +0 -111
 - data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +0 -25
 - data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +0 -20
 - data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +0 -26
 - data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +0 -25
 - data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +0 -25
 - data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +0 -31
 - data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +0 -26
 - data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +0 -25
 - data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +0 -27
 - data/test/unit/matcher/all_matcher_test.rb +0 -29
 - data/test/unit/matcher/blacklist_matcher_test.rb +0 -30
 - data/test/unit/matcher/loopback_matcher_test.rb +0 -27
 - data/test/unit/matcher/matcher_by_default_test.rb +0 -15
 - data/test/unit/matcher/matcher_with_multiple_values_test.rb +0 -15
 - data/test/unit/matcher/matcher_with_value_test.rb +0 -15
 - data/test/unit/matcher/whitelist_matcher_test.rb +0 -30
 - data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +0 -14
 - data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +0 -14
 - data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +0 -13
 - data/test/unit/node_collection/node_collection_after_being_copied_test.rb +0 -46
 - data/test/unit/node_collection/node_collection_after_update_test.rb +0 -36
 - data/test/unit/node_collection/node_collection_by_default_test.rb +0 -22
 - data/test/unit/node_collection/node_collection_test.rb +0 -23
 - data/test/unit/node_collection/node_collection_with_indices_test.rb +0 -42
 - data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +0 -25
 - data/test/unit/node_collection/node_collection_with_nodes_test.rb +0 -46
 - data/test/unit/node_collection/node_collection_with_numeric_index_test.rb +0 -24
 - data/test/unit/node_collection/node_collection_with_postdefined_contexts_test.rb +0 -22
 - data/test/unit/node_collection/node_collection_with_predefined_contexts_test.rb +0 -23
 - data/test/unit/node_collection/node_collection_with_string_index_test.rb +0 -20
 - data/test/unit/node_collection/node_collection_with_symbol_index_test.rb +0 -20
 - data/test/unit/node_collection/node_collection_without_indices_test.rb +0 -30
 - data/test/unit/path/path_by_default_test.rb +0 -54
 - data/test/unit/path/path_test.rb +0 -14
 - data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +0 -40
 - data/test/unit/path/path_with_available_transitions_test.rb +0 -54
 - data/test/unit/path/path_with_deep_target_reached_test.rb +0 -50
 - data/test/unit/path/path_with_deep_target_test.rb +0 -40
 - data/test/unit/path/path_with_duplicates_test.rb +0 -32
 - data/test/unit/path/path_with_encountered_transitions_test.rb +0 -34
 - data/test/unit/path/path_with_guarded_transitions_test.rb +0 -42
 - data/test/unit/path/path_with_reached_target_test.rb +0 -35
 - data/test/unit/path/path_with_transitions_test.rb +0 -54
 - data/test/unit/path/path_with_unreached_target_test.rb +0 -31
 - data/test/unit/path/path_without_transitions_test.rb +0 -24
 - data/test/unit/path_collection/path_collection_by_default_test.rb +0 -46
 - data/test/unit/path_collection/path_collection_test.rb +0 -24
 - data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +0 -43
 - data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +0 -31
 - data/test/unit/path_collection/path_collection_with_from_state_test.rb +0 -27
 - data/test/unit/path_collection/path_collection_with_paths_test.rb +0 -47
 - data/test/unit/path_collection/path_collection_with_to_state_test.rb +0 -29
 - data/test/unit/path_collection/path_with_guarded_paths_test.rb +0 -25
 - data/test/unit/state/state_after_being_copied_test.rb +0 -19
 - data/test/unit/state/state_by_default_test.rb +0 -41
 - data/test/unit/state/state_final_test.rb +0 -28
 - data/test/unit/state/state_initial_test.rb +0 -13
 - data/test/unit/state/state_not_final_test.rb +0 -32
 - data/test/unit/state/state_not_initial_test.rb +0 -13
 - data/test/unit/state/state_test.rb +0 -44
 - data/test/unit/state/state_with_cached_lambda_value_test.rb +0 -29
 - data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +0 -38
 - data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +0 -29
 - data/test/unit/state/state_with_conflicting_machine_name_test.rb +0 -20
 - data/test/unit/state/state_with_conflicting_machine_test.rb +0 -37
 - data/test/unit/state/state_with_context_test.rb +0 -60
 - data/test/unit/state/state_with_dynamic_human_name_test.rb +0 -25
 - data/test/unit/state/state_with_existing_context_method_test.rb +0 -24
 - data/test/unit/state/state_with_human_name_test.rb +0 -13
 - data/test/unit/state/state_with_integer_value_test.rb +0 -32
 - data/test/unit/state/state_with_invalid_method_call_test.rb +0 -21
 - data/test/unit/state/state_with_lambda_value_test.rb +0 -37
 - data/test/unit/state/state_with_matcher_test.rb +0 -18
 - data/test/unit/state/state_with_multiple_contexts_test.rb +0 -57
 - data/test/unit/state/state_with_name_test.rb +0 -43
 - data/test/unit/state/state_with_namespace_test.rb +0 -22
 - data/test/unit/state/state_with_nil_value_test.rb +0 -35
 - data/test/unit/state/state_with_redefined_context_method_test.rb +0 -45
 - data/test/unit/state/state_with_symbolic_value_test.rb +0 -32
 - data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +0 -40
 - data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +0 -33
 - data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +0 -41
 - data/test/unit/state/state_without_cached_lambda_value_test.rb +0 -25
 - data/test/unit/state/state_without_name_test.rb +0 -39
 - data/test/unit/state_collection/state_collection_by_default_test.rb +0 -21
 - data/test/unit/state_collection/state_collection_string_test.rb +0 -35
 - data/test/unit/state_collection/state_collection_test.rb +0 -74
 - data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +0 -29
 - data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +0 -39
 - data/test/unit/state_collection/state_collection_with_initial_state_test.rb +0 -40
 - data/test/unit/state_collection/state_collection_with_namespace_test.rb +0 -21
 - data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +0 -40
 - data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +0 -29
 - data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +0 -40
 - data/test/unit/state_context/state_context_proxy_test.rb +0 -26
 - data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +0 -42
 - data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +0 -64
 - data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +0 -32
 - data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +0 -32
 - data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +0 -64
 - data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +0 -31
 - data/test/unit/state_context/state_context_test.rb +0 -28
 - data/test/unit/state_context/state_context_transition_test.rb +0 -104
 - data/test/unit/state_context/state_context_with_matching_transition_test.rb +0 -27
 - data/test/unit/state_machine/state_machine_by_default_test.rb +0 -12
 - data/test/unit/state_machine/state_machine_test.rb +0 -20
 - data/test/unit/transition/transition_after_being_performed_test.rb +0 -48
 - data/test/unit/transition/transition_after_being_persisted_test.rb +0 -46
 - data/test/unit/transition/transition_after_being_rolled_back_test.rb +0 -35
 - data/test/unit/transition/transition_equality_test.rb +0 -52
 - data/test/unit/transition/transition_loopback_test.rb +0 -18
 - data/test/unit/transition/transition_test.rb +0 -96
 - data/test/unit/transition/transition_transient_test.rb +0 -20
 - data/test/unit/transition/transition_with_action_test.rb +0 -27
 - data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +0 -127
 - data/test/unit/transition/transition_with_after_callbacks_test.rb +0 -93
 - data/test/unit/transition/transition_with_around_callbacks_test.rb +0 -141
 - data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +0 -30
 - data/test/unit/transition/transition_with_before_callbacks_test.rb +0 -104
 - data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +0 -28
 - data/test/unit/transition/transition_with_different_states_test.rb +0 -18
 - data/test/unit/transition/transition_with_dynamic_to_value_test.rb +0 -19
 - data/test/unit/transition/transition_with_failure_callbacks_test.rb +0 -84
 - data/test/unit/transition/transition_with_invalid_nodes_test.rb +0 -29
 - data/test/unit/transition/transition_with_mixed_callbacks_test.rb +0 -105
 - data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +0 -40
 - data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +0 -114
 - data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +0 -40
 - data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +0 -40
 - data/test/unit/transition/transition_with_namespace_test.rb +0 -47
 - data/test/unit/transition/transition_with_perform_arguments_test.rb +0 -35
 - data/test/unit/transition/transition_with_transactions_test.rb +0 -42
 - data/test/unit/transition/transition_without_callbacks_test.rb +0 -33
 - data/test/unit/transition/transition_without_reading_state_test.rb +0 -22
 - data/test/unit/transition/transition_without_running_action_test.rb +0 -47
 - data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +0 -23
 - data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +0 -64
 - data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +0 -44
 - data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +0 -44
 - data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +0 -32
 - data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +0 -33
 - data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +0 -32
 - data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +0 -32
 - data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +0 -33
 - data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +0 -33
 - data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +0 -32
 - data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +0 -33
 - data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +0 -68
 - data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +0 -41
 - data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +0 -44
 - data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +0 -42
 - data/test/unit/transition_collection/transition_collection_by_default_test.rb +0 -23
 - data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +0 -23
 - data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +0 -12
 - data/test/unit/transition_collection/transition_collection_invalid_test.rb +0 -21
 - data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +0 -69
 - data/test/unit/transition_collection/transition_collection_test.rb +0 -26
 - data/test/unit/transition_collection/transition_collection_valid_test.rb +0 -57
 - data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +0 -66
 - data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +0 -60
 - data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +0 -17
 - data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +0 -17
 - data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +0 -37
 - data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +0 -34
 - data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +0 -29
 - data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +0 -17
 - data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +0 -79
 - data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +0 -45
 - data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +0 -48
 - data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +0 -42
 - data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +0 -51
 - data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -47
 - data/test/unit/transition_collection/transition_collection_with_block_test.rb +0 -46
 - data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +0 -135
 - data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +0 -189
 - data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +0 -48
 - data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +0 -41
 - data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +0 -41
 - data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +0 -34
 - data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +0 -69
 - data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +0 -53
 - data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +0 -34
 - data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +0 -65
 - data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +0 -29
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1d22dcf0b70eca7cbf9a6894d592609874cfdef01474b70a2226018c0e8966b7
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9a9bed680181f45bc613649bf4f3b90a4ea1e198e8fb19f734d264c7652e5051
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d1446488cbb427e407611d2cba2e571401931a4a20f9f8655e14ebf896990468d24a94a02ba708627db8beb3a3821ac481b220551f0d0c02e366ba3d78112da4
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 4949561813ac58b6442611d37083091b6c4532f41227f3f9f0999bbecc18c18aacc458f9aa6d6570b5855b6a30a24394d421e6b6012dfa4ebed638a642da82f3
         
     | 
    
        data/LICENSE.txt
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,9 +1,11 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
            [
         
     | 
| 
      
 2 
     | 
    
         
            +
            [](https://codeclimate.com/github/state-machines/state_machines)
         
     | 
| 
       3 
3 
     | 
    
         
             
            # State Machines
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            State Machines adds support for creating state machines for attributes on any Ruby class.
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            *Please note that multiple integrations are available for [Active Model](https://github.com/state-machines/state_machines-activemodel), [Active Record](https://github.com/state-machines/state_machines-activerecord), [Mongoid](https://github.com/state-machines/state_machines-mongoid) and more in the [State Machines organisation](https://github.com/state-machines).*  If you want to save state in your database, **you need one of these additional integrations**.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       7 
9 
     | 
    
         
             
            ## Installation
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
       9 
11 
     | 
    
         
             
            Add this line to your application's Gemfile:
         
     | 
| 
         @@ -40,10 +42,10 @@ class Vehicle 
     | 
|
| 
       40 
42 
     | 
    
         
             
              attr_accessor :seatbelt_on, :time_used, :auto_shop_busy
         
     | 
| 
       41 
43 
     | 
    
         | 
| 
       42 
44 
     | 
    
         
             
              state_machine :state, initial: :parked do
         
     | 
| 
       43 
     | 
    
         
            -
                before_transition parked:  
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
                before_transition parked: any - :parked, do: :put_on_seatbelt
         
     | 
| 
      
 46 
     | 
    
         
            +
                
         
     | 
| 
       45 
47 
     | 
    
         
             
                after_transition on: :crash, do: :tow
         
     | 
| 
       46 
     | 
    
         
            -
                after_transition on: :repair,  
     | 
| 
      
 48 
     | 
    
         
            +
                after_transition on: :repair, do: :fix
         
     | 
| 
       47 
49 
     | 
    
         
             
                after_transition any => :parked do |vehicle, transition|
         
     | 
| 
       48 
50 
     | 
    
         
             
                  vehicle.seatbelt_on = false
         
     | 
| 
       49 
51 
     | 
    
         
             
                end
         
     | 
| 
         @@ -83,7 +85,7 @@ class Vehicle 
     | 
|
| 
       83 
85 
     | 
    
         
             
                event :repair do
         
     | 
| 
       84 
86 
     | 
    
         
             
                  # The first transition that matches the state and passes its conditions
         
     | 
| 
       85 
87 
     | 
    
         
             
                  # will be used
         
     | 
| 
       86 
     | 
    
         
            -
                  transition stalled: parked, unless: :auto_shop_busy
         
     | 
| 
      
 88 
     | 
    
         
            +
                  transition stalled: :parked, unless: :auto_shop_busy
         
     | 
| 
       87 
89 
     | 
    
         
             
                  transition stalled: same
         
     | 
| 
       88 
90 
     | 
    
         
             
                end
         
     | 
| 
       89 
91 
     | 
    
         | 
| 
         @@ -217,7 +219,7 @@ vehicle.fire_events(:shift_down, :enable_alarm) # => true 
     | 
|
| 
       217 
219 
     | 
    
         
             
            vehicle.state_name                              # => :first_gear
         
     | 
| 
       218 
220 
     | 
    
         
             
            vehicle.alarm_state_name                        # => :active
         
     | 
| 
       219 
221 
     | 
    
         | 
| 
       220 
     | 
    
         
            -
            vehicle.fire_events!(:ignite, :enable_alarm)    # => StateMachines: 
     | 
| 
      
 222 
     | 
    
         
            +
            vehicle.fire_events!(:ignite, :enable_alarm)    # => StateMachines:InvalidParallelTransition: Cannot run events in parallel: ignite, enable_alarm
         
     | 
| 
       221 
223 
     | 
    
         | 
| 
       222 
224 
     | 
    
         
             
            # Human-friendly names can be accessed for states/events
         
     | 
| 
       223 
225 
     | 
    
         
             
            Vehicle.human_state_name(:first_gear)               # => "first gear"
         
     | 
| 
         @@ -235,6 +237,10 @@ vehicle.state_paths                                       # => [[#<StateMachines 
     | 
|
| 
       235 
237 
     | 
    
         
             
            vehicle.state_paths.to_states                             # => [:parked, :idling, :first_gear, :stalled, :second_gear, :third_gear]
         
     | 
| 
       236 
238 
     | 
    
         
             
            vehicle.state_paths.events                                # => [:park, :ignite, :shift_up, :idle, :crash, :repair, :shift_down]
         
     | 
| 
       237 
239 
     | 
    
         | 
| 
      
 240 
     | 
    
         
            +
            # Possible states can be analyzed for a class
         
     | 
| 
      
 241 
     | 
    
         
            +
            Vehicle.state_machine.states.to_a                   # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
         
     | 
| 
      
 242 
     | 
    
         
            +
            Vehicle.state_machines[:state].states.to_a          # [#<StateMachines::State name=:parked value="parked" initial=true>, #<StateMachines::State name=:idling value="idling" initial=false>, ...]
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
       238 
244 
     | 
    
         
             
            # Find all paths that start and end on certain states
         
     | 
| 
       239 
245 
     | 
    
         
             
            vehicle.state_paths(:from => :parked, :to => :first_gear) # => [[
         
     | 
| 
       240 
246 
     | 
    
         
             
                                                                      #       #<StateMachines:Transition attribute=:state event=:ignite from="parked" ...>,
         
     | 
| 
         @@ -400,8 +406,8 @@ For example, transitions and callbacks can be defined like so: 
     | 
|
| 
       400 
406 
     | 
    
         
             
            class Vehicle
         
     | 
| 
       401 
407 
     | 
    
         
             
              state_machine initial: :parked do
         
     | 
| 
       402 
408 
     | 
    
         
             
                before_transition from: :parked, except_to: :parked, do: :put_on_seatbelt
         
     | 
| 
       403 
     | 
    
         
            -
                after_transition to: :parked do |transition|
         
     | 
| 
       404 
     | 
    
         
            -
                   
     | 
| 
      
 409 
     | 
    
         
            +
                after_transition to: :parked do |vehicle, transition|
         
     | 
| 
      
 410 
     | 
    
         
            +
                  vehicle.seatbelt = 'off'
         
     | 
| 
       405 
411 
     | 
    
         
             
                end
         
     | 
| 
       406 
412 
     | 
    
         | 
| 
       407 
413 
     | 
    
         
             
                event :ignite do
         
     | 
| 
         @@ -425,7 +431,7 @@ class Vehicle 
     | 
|
| 
       425 
431 
     | 
    
         
             
                ...
         
     | 
| 
       426 
432 
     | 
    
         | 
| 
       427 
433 
     | 
    
         
             
                state :parked do
         
     | 
| 
       428 
     | 
    
         
            -
                  transition to 
     | 
| 
      
 434 
     | 
    
         
            +
                  transition to: :idling, :on => [:ignite, :shift_up], if: :seatbelt_on?
         
     | 
| 
       429 
435 
     | 
    
         | 
| 
       430 
436 
     | 
    
         
             
                  def speed
         
     | 
| 
       431 
437 
     | 
    
         
             
                    0
         
     | 
| 
         @@ -463,7 +469,6 @@ class Vehicle 
     | 
|
| 
       463 
469 
     | 
    
         
             
                transition parked: :idling, :on => [:ignite, :shift_up]
         
     | 
| 
       464 
470 
     | 
    
         
             
                transition first_gear: :second_gear, second_gear: :third_gear, on: :shift_up
         
     | 
| 
       465 
471 
     | 
    
         
             
                transition [:idling, :first_gear] => :parked, on: :park
         
     | 
| 
       466 
     | 
    
         
            -
                transition [:idling, :first_gear] => :parked, on: :park
         
     | 
| 
       467 
472 
     | 
    
         
             
                transition all - [:parked, :stalled]: :stalled, unless: :auto_shop_busy?
         
     | 
| 
       468 
473 
     | 
    
         
             
              end
         
     | 
| 
       469 
474 
     | 
    
         
             
            end
         
     | 
| 
         @@ -561,7 +566,7 @@ end 
     | 
|
| 
       561 
566 
     | 
    
         
             
            vehicle = Vehicle.new                   # => #<Vehicle:0xb708412c @state="parked" ...>
         
     | 
| 
       562 
567 
     | 
    
         
             
            vehicle.state                           # => "parked"
         
     | 
| 
       563 
568 
     | 
    
         
             
            vehicle.machine.ignite                  # => true
         
     | 
| 
       564 
     | 
    
         
            -
            vehicle.machine.state                   # => "idling
         
     | 
| 
      
 569 
     | 
    
         
            +
            vehicle.machine.state                   # => "idling"
         
     | 
| 
       565 
570 
     | 
    
         
             
            vehicle.state                           # => "idling"
         
     | 
| 
       566 
571 
     | 
    
         
             
            vehicle.machine.state_transitions       # => [#<StateMachines:Transition ...>]
         
     | 
| 
       567 
572 
     | 
    
         
             
            vehicle.machine.definition.states.keys  # => :first_gear, :second_gear, :parked, :idling
         
     | 
| 
         @@ -575,7 +580,7 @@ transitions. 
     | 
|
| 
       575 
580 
     | 
    
         | 
| 
       576 
581 
     | 
    
         
             
            Ruby versions officially supported and tested:
         
     | 
| 
       577 
582 
     | 
    
         | 
| 
       578 
     | 
    
         
            -
            * Ruby (MRI) 2. 
     | 
| 
      
 583 
     | 
    
         
            +
            * Ruby (MRI) 2.6.0+
         
     | 
| 
       579 
584 
     | 
    
         
             
            * JRuby
         
     | 
| 
       580 
585 
     | 
    
         
             
            * Rubinius
         
     | 
| 
       581 
586 
     | 
    
         | 
| 
         @@ -6,68 +6,68 @@ module StateMachines 
     | 
|
| 
       6 
6 
     | 
    
         
             
              class Branch
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                include EvalHelpers
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       10 
10 
     | 
    
         
             
                # The condition that must be met on an object
         
     | 
| 
       11 
11 
     | 
    
         
             
                attr_reader :if_condition
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       13 
13 
     | 
    
         
             
                # The condition that must *not* be met on an object
         
     | 
| 
       14 
14 
     | 
    
         
             
                attr_reader :unless_condition
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       16 
16 
     | 
    
         
             
                # The requirement for verifying the event being matched
         
     | 
| 
       17 
17 
     | 
    
         
             
                attr_reader :event_requirement
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       19 
19 
     | 
    
         
             
                # One or more requirements for verifying the states being matched.  All
         
     | 
| 
       20 
20 
     | 
    
         
             
                # requirements contain a mapping of {:from => matcher, :to => matcher}.
         
     | 
| 
       21 
21 
     | 
    
         
             
                attr_reader :state_requirements
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       23 
23 
     | 
    
         
             
                # A list of all of the states known to this branch.  This will pull states
         
     | 
| 
       24 
24 
     | 
    
         
             
                # from the following options (in the same order):
         
     | 
| 
       25 
25 
     | 
    
         
             
                # * +from+ / +except_from+
         
     | 
| 
       26 
26 
     | 
    
         
             
                # * +to+ / +except_to+
         
     | 
| 
       27 
27 
     | 
    
         
             
                attr_reader :known_states
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       29 
29 
     | 
    
         
             
                # Creates a new branch
         
     | 
| 
       30 
30 
     | 
    
         
             
                def initialize(options = {}) #:nodoc:
         
     | 
| 
       31 
31 
     | 
    
         
             
                  # Build conditionals
         
     | 
| 
       32 
32 
     | 
    
         
             
                  @if_condition = options.delete(:if)
         
     | 
| 
       33 
33 
     | 
    
         
             
                  @unless_condition = options.delete(:unless)
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
       35 
35 
     | 
    
         
             
                  # Build event requirement
         
     | 
| 
       36 
36 
     | 
    
         
             
                  @event_requirement = build_matcher(options, :on, :except_on)
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       38 
38 
     | 
    
         
             
                  if (options.keys - [:from, :to, :on, :except_from, :except_to, :except_on]).empty?
         
     | 
| 
       39 
39 
     | 
    
         
             
                    # Explicit from/to requirements specified
         
     | 
| 
       40 
     | 
    
         
            -
                    @state_requirements = [{: 
     | 
| 
      
 40 
     | 
    
         
            +
                    @state_requirements = [{from: build_matcher(options, :from, :except_from), to: build_matcher(options, :to, :except_to)}]
         
     | 
| 
       41 
41 
     | 
    
         
             
                  else
         
     | 
| 
       42 
42 
     | 
    
         
             
                    # Separate out the event requirement
         
     | 
| 
       43 
43 
     | 
    
         
             
                    options.delete(:on)
         
     | 
| 
       44 
44 
     | 
    
         
             
                    options.delete(:except_on)
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       46 
46 
     | 
    
         
             
                    # Implicit from/to requirements specified
         
     | 
| 
       47 
47 
     | 
    
         
             
                    @state_requirements = options.collect do |from, to|
         
     | 
| 
       48 
48 
     | 
    
         
             
                      from = WhitelistMatcher.new(from) unless from.is_a?(Matcher)
         
     | 
| 
       49 
49 
     | 
    
         
             
                      to = WhitelistMatcher.new(to) unless to.is_a?(Matcher)
         
     | 
| 
       50 
     | 
    
         
            -
                      {: 
     | 
| 
      
 50 
     | 
    
         
            +
                      {from: from, to: to}
         
     | 
| 
       51 
51 
     | 
    
         
             
                    end
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       54 
54 
     | 
    
         
             
                  # Track known states.  The order that requirements are iterated is based
         
     | 
| 
       55 
55 
     | 
    
         
             
                  # on the priority in which tracked states should be added.
         
     | 
| 
       56 
56 
     | 
    
         
             
                  @known_states = []
         
     | 
| 
       57 
57 
     | 
    
         
             
                  @state_requirements.each do |state_requirement|
         
     | 
| 
       58 
     | 
    
         
            -
                    [:from, :to].each {|option| @known_states |= state_requirement[option].values}
         
     | 
| 
      
 58 
     | 
    
         
            +
                    [:from, :to].each { |option| @known_states |= state_requirement[option].values }
         
     | 
| 
       59 
59 
     | 
    
         
             
                  end
         
     | 
| 
       60 
60 
     | 
    
         
             
                end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
       62 
62 
     | 
    
         
             
                # Determines whether the given object / query matches the requirements
         
     | 
| 
       63 
63 
     | 
    
         
             
                # configured for this branch.  In addition to matching the event, from state,
         
     | 
| 
       64 
64 
     | 
    
         
             
                # and to state, this will also check whether the configured :if/:unless
         
     | 
| 
       65 
65 
     | 
    
         
             
                # conditions pass on the given object.
         
     | 
| 
       66 
     | 
    
         
            -
                # 
     | 
| 
      
 66 
     | 
    
         
            +
                #
         
     | 
| 
       67 
67 
     | 
    
         
             
                # == Examples
         
     | 
| 
       68 
     | 
    
         
            -
                # 
     | 
| 
      
 68 
     | 
    
         
            +
                #
         
     | 
| 
       69 
69 
     | 
    
         
             
                #   branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
         
     | 
| 
       70 
     | 
    
         
            -
                # 
     | 
| 
      
 70 
     | 
    
         
            +
                #
         
     | 
| 
       71 
71 
     | 
    
         
             
                #   # Successful
         
     | 
| 
       72 
72 
     | 
    
         
             
                #   branch.matches?(object, :on => :ignite)                                   # => true
         
     | 
| 
       73 
73 
     | 
    
         
             
                #   branch.matches?(object, :from => nil)                                     # => true
         
     | 
| 
         @@ -75,7 +75,7 @@ module StateMachines 
     | 
|
| 
       75 
75 
     | 
    
         
             
                #   branch.matches?(object, :to => :idling)                                   # => true
         
     | 
| 
       76 
76 
     | 
    
         
             
                #   branch.matches?(object, :from => :parked, :to => :idling)                 # => true
         
     | 
| 
       77 
77 
     | 
    
         
             
                #   branch.matches?(object, :on => :ignite, :from => :parked, :to => :idling) # => true
         
     | 
| 
       78 
     | 
    
         
            -
                # 
     | 
| 
      
 78 
     | 
    
         
            +
                #
         
     | 
| 
       79 
79 
     | 
    
         
             
                #   # Unsuccessful
         
     | 
| 
       80 
80 
     | 
    
         
             
                #   branch.matches?(object, :on => :park)                                     # => false
         
     | 
| 
       81 
81 
     | 
    
         
             
                #   branch.matches?(object, :from => :idling)                                 # => false
         
     | 
| 
         @@ -85,16 +85,16 @@ module StateMachines 
     | 
|
| 
       85 
85 
     | 
    
         
             
                def matches?(object, query = {})
         
     | 
| 
       86 
86 
     | 
    
         
             
                  !match(object, query).nil?
         
     | 
| 
       87 
87 
     | 
    
         
             
                end
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
       89 
89 
     | 
    
         
             
                # Attempts to match the given object / query against the set of requirements
         
     | 
| 
       90 
90 
     | 
    
         
             
                # configured for this branch.  In addition to matching the event, from state,
         
     | 
| 
       91 
91 
     | 
    
         
             
                # and to state, this will also check whether the configured :if/:unless
         
     | 
| 
       92 
92 
     | 
    
         
             
                # conditions pass on the given object.
         
     | 
| 
       93 
     | 
    
         
            -
                # 
     | 
| 
      
 93 
     | 
    
         
            +
                #
         
     | 
| 
       94 
94 
     | 
    
         
             
                # If a match is found, then the event/state requirements that the query
         
     | 
| 
       95 
95 
     | 
    
         
             
                # passed successfully will be returned.  Otherwise, nil is returned if there
         
     | 
| 
       96 
96 
     | 
    
         
             
                # was no match.
         
     | 
| 
       97 
     | 
    
         
            -
                # 
     | 
| 
      
 97 
     | 
    
         
            +
                #
         
     | 
| 
       98 
98 
     | 
    
         
             
                # Query options:
         
     | 
| 
       99 
99 
     | 
    
         
             
                # * <tt>:from</tt> - One or more states being transitioned from.  If none
         
     | 
| 
       100 
100 
     | 
    
         
             
                #   are specified, then this will always match.
         
     | 
| 
         @@ -104,16 +104,16 @@ module StateMachines 
     | 
|
| 
       104 
104 
     | 
    
         
             
                #   are specified, then this will always match.
         
     | 
| 
       105 
105 
     | 
    
         
             
                # * <tt>:guard</tt> - Whether to guard matches with the if/unless
         
     | 
| 
       106 
106 
     | 
    
         
             
                #   conditionals defined for this branch.  Default is true.
         
     | 
| 
       107 
     | 
    
         
            -
                # 
     | 
| 
      
 107 
     | 
    
         
            +
                #
         
     | 
| 
       108 
108 
     | 
    
         
             
                # == Examples
         
     | 
| 
       109 
     | 
    
         
            -
                # 
     | 
| 
      
 109 
     | 
    
         
            +
                #
         
     | 
| 
       110 
110 
     | 
    
         
             
                #   branch = StateMachines::Branch.new(:parked => :idling, :on => :ignite)
         
     | 
| 
       111 
     | 
    
         
            -
                # 
     | 
| 
      
 111 
     | 
    
         
            +
                #
         
     | 
| 
       112 
112 
     | 
    
         
             
                #   branch.match(object, :on => :ignite)  # => {:to => ..., :from => ..., :on => ...}
         
     | 
| 
       113 
113 
     | 
    
         
             
                #   branch.match(object, :on => :park)    # => nil
         
     | 
| 
       114 
114 
     | 
    
         
             
                def match(object, query = {})
         
     | 
| 
       115 
115 
     | 
    
         
             
                  query.assert_valid_keys(:from, :to, :on, :guard)
         
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
       117 
117 
     | 
    
         
             
                  if (match = match_query(query)) && matches_conditions?(object, query)
         
     | 
| 
       118 
118 
     | 
    
         
             
                    match
         
     | 
| 
       119 
119 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -122,62 +122,64 @@ module StateMachines 
     | 
|
| 
       122 
122 
     | 
    
         
             
                def draw(graph, event, valid_states)
         
     | 
| 
       123 
123 
     | 
    
         
             
                 fail NotImplementedError
         
     | 
| 
       124 
124 
     | 
    
         
             
                end
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                     
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                  
         
     | 
| 
       145 
     | 
    
         
            -
                  # Verifies that all configured requirements (event and state) match the
         
     | 
| 
       146 
     | 
    
         
            -
                  # given query.  If a match is found, then a hash containing the
         
     | 
| 
       147 
     | 
    
         
            -
                  # event/state requirements that passed will be returned; otherwise, nil.
         
     | 
| 
       148 
     | 
    
         
            -
                  def match_query(query)
         
     | 
| 
       149 
     | 
    
         
            -
                    query ||= {}
         
     | 
| 
       150 
     | 
    
         
            -
                    
         
     | 
| 
       151 
     | 
    
         
            -
                    if match_event(query) && (state_requirement = match_states(query))
         
     | 
| 
       152 
     | 
    
         
            -
                      state_requirement.merge(:on => event_requirement)
         
     | 
| 
       153 
     | 
    
         
            -
                    end
         
     | 
| 
       154 
     | 
    
         
            -
                  end
         
     | 
| 
       155 
     | 
    
         
            -
                  
         
     | 
| 
       156 
     | 
    
         
            -
                  # Verifies that the event requirement matches the given query
         
     | 
| 
       157 
     | 
    
         
            -
                  def match_event(query)
         
     | 
| 
       158 
     | 
    
         
            -
                    matches_requirement?(query, :on, event_requirement)
         
     | 
| 
       159 
     | 
    
         
            -
                  end
         
     | 
| 
       160 
     | 
    
         
            -
                  
         
     | 
| 
       161 
     | 
    
         
            -
                  # Verifies that the state requirements match the given query.  If a
         
     | 
| 
       162 
     | 
    
         
            -
                  # matching requirement is found, then it is returned.
         
     | 
| 
       163 
     | 
    
         
            -
                  def match_states(query)
         
     | 
| 
       164 
     | 
    
         
            -
                    state_requirements.detect do |state_requirement|
         
     | 
| 
       165 
     | 
    
         
            -
                      [:from, :to].all? {|option| matches_requirement?(query, option, state_requirement[option])}
         
     | 
| 
       166 
     | 
    
         
            -
                    end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
              protected
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                # Builds a matcher strategy to use for the given options.  If neither a
         
     | 
| 
      
 129 
     | 
    
         
            +
                # whitelist nor a blacklist option is specified, then an AllMatcher is
         
     | 
| 
      
 130 
     | 
    
         
            +
                # built.
         
     | 
| 
      
 131 
     | 
    
         
            +
                def build_matcher(options, whitelist_option, blacklist_option)
         
     | 
| 
      
 132 
     | 
    
         
            +
                  options.assert_exclusive_keys(whitelist_option, blacklist_option)
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                  if options.include?(whitelist_option)
         
     | 
| 
      
 135 
     | 
    
         
            +
                    value = options[whitelist_option]
         
     | 
| 
      
 136 
     | 
    
         
            +
                    value.is_a?(Matcher) ? value : WhitelistMatcher.new(options[whitelist_option])
         
     | 
| 
      
 137 
     | 
    
         
            +
                  elsif options.include?(blacklist_option)
         
     | 
| 
      
 138 
     | 
    
         
            +
                    value = options[blacklist_option]
         
     | 
| 
      
 139 
     | 
    
         
            +
                    raise ArgumentError, ":#{blacklist_option} option cannot use matchers; use :#{whitelist_option} instead" if value.is_a?(Matcher)
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                    BlacklistMatcher.new(value)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  else
         
     | 
| 
      
 143 
     | 
    
         
            +
                    AllMatcher.instance
         
     | 
| 
       167 
144 
     | 
    
         
             
                  end
         
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
      
 145 
     | 
    
         
            +
                end
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                # Verifies that all configured requirements (event and state) match the
         
     | 
| 
      
 148 
     | 
    
         
            +
                # given query.  If a match is found, then a hash containing the
         
     | 
| 
      
 149 
     | 
    
         
            +
                # event/state requirements that passed will be returned; otherwise, nil.
         
     | 
| 
      
 150 
     | 
    
         
            +
                def match_query(query)
         
     | 
| 
      
 151 
     | 
    
         
            +
                  query ||= {}
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                  if match_event(query) && (state_requirement = match_states(query))
         
     | 
| 
      
 154 
     | 
    
         
            +
                    state_requirement.merge(on: event_requirement)
         
     | 
| 
       173 
155 
     | 
    
         
             
                  end
         
     | 
| 
       174 
     | 
    
         
            -
             
     | 
| 
       175 
     | 
    
         
            -
             
     | 
| 
       176 
     | 
    
         
            -
             
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
      
 156 
     | 
    
         
            +
                end
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                # Verifies that the event requirement matches the given query
         
     | 
| 
      
 159 
     | 
    
         
            +
                def match_event(query)
         
     | 
| 
      
 160 
     | 
    
         
            +
                  matches_requirement?(query, :on, event_requirement)
         
     | 
| 
      
 161 
     | 
    
         
            +
                end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
                # Verifies that the state requirements match the given query.  If a
         
     | 
| 
      
 164 
     | 
    
         
            +
                # matching requirement is found, then it is returned.
         
     | 
| 
      
 165 
     | 
    
         
            +
                def match_states(query)
         
     | 
| 
      
 166 
     | 
    
         
            +
                  state_requirements.detect do |state_requirement|
         
     | 
| 
      
 167 
     | 
    
         
            +
                    [:from, :to].all? { |option| matches_requirement?(query, option, state_requirement[option]) }
         
     | 
| 
       181 
168 
     | 
    
         
             
                  end
         
     | 
| 
      
 169 
     | 
    
         
            +
                end
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
                # Verifies that an option in the given query matches the values required
         
     | 
| 
      
 172 
     | 
    
         
            +
                # for that option
         
     | 
| 
      
 173 
     | 
    
         
            +
                def matches_requirement?(query, option, requirement)
         
     | 
| 
      
 174 
     | 
    
         
            +
                  !query.include?(option) || requirement.matches?(query[option], query)
         
     | 
| 
      
 175 
     | 
    
         
            +
                end
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                # Verifies that the conditionals for this branch evaluate to true for the
         
     | 
| 
      
 178 
     | 
    
         
            +
                # given object
         
     | 
| 
      
 179 
     | 
    
         
            +
                def matches_conditions?(object, query)
         
     | 
| 
      
 180 
     | 
    
         
            +
                  query[:guard] == false ||
         
     | 
| 
      
 181 
     | 
    
         
            +
                  Array(if_condition).all? { |condition| evaluate_method(object, condition) } &&
         
     | 
| 
      
 182 
     | 
    
         
            +
                  !Array(unless_condition).any? { |condition| evaluate_method(object, condition) }
         
     | 
| 
      
 183 
     | 
    
         
            +
                end
         
     | 
| 
       182 
184 
     | 
    
         
             
              end
         
     | 
| 
       183 
185 
     | 
    
         
             
            end
         
     | 
| 
         @@ -16,38 +16,38 @@ module StateMachines 
     | 
|
| 
       16 
16 
     | 
    
         
             
                  # the callback.  This can be configured on an application-wide basis by
         
     | 
| 
       17 
17 
     | 
    
         
             
                  # setting this configuration to +true+ or +false+.  The default value
         
     | 
| 
       18 
18 
     | 
    
         
             
                  # is +false+.
         
     | 
| 
       19 
     | 
    
         
            -
                  # 
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
       20 
20 
     | 
    
         
             
                  # *Note* that the DataMapper and Sequel integrations automatically
         
     | 
| 
       21 
21 
     | 
    
         
             
                  # configure this value on a per-callback basis, so it does not have to
         
     | 
| 
       22 
22 
     | 
    
         
             
                  # be enabled application-wide.
         
     | 
| 
       23 
     | 
    
         
            -
                  # 
     | 
| 
      
 23 
     | 
    
         
            +
                  #
         
     | 
| 
       24 
24 
     | 
    
         
             
                  # == Examples
         
     | 
| 
       25 
     | 
    
         
            -
                  # 
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
       26 
26 
     | 
    
         
             
                  # When not bound to the object:
         
     | 
| 
       27 
     | 
    
         
            -
                  # 
     | 
| 
      
 27 
     | 
    
         
            +
                  #
         
     | 
| 
       28 
28 
     | 
    
         
             
                  #   class Vehicle
         
     | 
| 
       29 
29 
     | 
    
         
             
                  #     state_machine do
         
     | 
| 
       30 
30 
     | 
    
         
             
                  #       before_transition do |vehicle|
         
     | 
| 
       31 
31 
     | 
    
         
             
                  #         vehicle.set_alarm
         
     | 
| 
       32 
32 
     | 
    
         
             
                  #       end
         
     | 
| 
       33 
33 
     | 
    
         
             
                  #     end
         
     | 
| 
       34 
     | 
    
         
            -
                  # 
     | 
| 
      
 34 
     | 
    
         
            +
                  #
         
     | 
| 
       35 
35 
     | 
    
         
             
                  #     def set_alarm
         
     | 
| 
       36 
36 
     | 
    
         
             
                  #       ...
         
     | 
| 
       37 
37 
     | 
    
         
             
                  #     end
         
     | 
| 
       38 
38 
     | 
    
         
             
                  #   end
         
     | 
| 
       39 
     | 
    
         
            -
                  # 
     | 
| 
      
 39 
     | 
    
         
            +
                  #
         
     | 
| 
       40 
40 
     | 
    
         
             
                  # When bound to the object:
         
     | 
| 
       41 
     | 
    
         
            -
                  # 
     | 
| 
      
 41 
     | 
    
         
            +
                  #
         
     | 
| 
       42 
42 
     | 
    
         
             
                  #   StateMachines::Callback.bind_to_object = true
         
     | 
| 
       43 
     | 
    
         
            -
                  # 
     | 
| 
      
 43 
     | 
    
         
            +
                  #
         
     | 
| 
       44 
44 
     | 
    
         
             
                  #   class Vehicle
         
     | 
| 
       45 
45 
     | 
    
         
             
                  #     state_machine do
         
     | 
| 
       46 
46 
     | 
    
         
             
                  #       before_transition do
         
     | 
| 
       47 
47 
     | 
    
         
             
                  #         self.set_alarm
         
     | 
| 
       48 
48 
     | 
    
         
             
                  #       end
         
     | 
| 
       49 
49 
     | 
    
         
             
                  #     end
         
     | 
| 
       50 
     | 
    
         
            -
                  # 
     | 
| 
      
 50 
     | 
    
         
            +
                  #
         
     | 
| 
       51 
51 
     | 
    
         
             
                  #     def set_alarm
         
     | 
| 
       52 
52 
     | 
    
         
             
                  #       ...
         
     | 
| 
       53 
53 
     | 
    
         
             
                  #     end
         
     | 
| 
         @@ -57,7 +57,7 @@ module StateMachines 
     | 
|
| 
       57 
57 
     | 
    
         
             
                  # The application-wide terminator to use for callbacks when not
         
     | 
| 
       58 
58 
     | 
    
         
             
                  # explicitly defined.  Terminators determine whether to cancel a
         
     | 
| 
       59 
59 
     | 
    
         
             
                  # callback chain based on the return value of the callback.
         
     | 
| 
       60 
     | 
    
         
            -
                  # 
     | 
| 
      
 60 
     | 
    
         
            +
                  #
         
     | 
| 
       61 
61 
     | 
    
         
             
                  # See StateMachines::Callback#terminator for more information.
         
     | 
| 
       62 
62 
     | 
    
         
             
                  attr_accessor :terminator
         
     | 
| 
       63 
63 
     | 
    
         
             
                end
         
     | 
| 
         @@ -75,11 +75,11 @@ module StateMachines 
     | 
|
| 
       75 
75 
     | 
    
         
             
                # chain never cancels based on the return value (i.e. there is no implicit
         
     | 
| 
       76 
76 
     | 
    
         
             
                # terminator).  Certain integrations, such as ActiveRecord and Sequel,
         
     | 
| 
       77 
77 
     | 
    
         
             
                # change this default value.
         
     | 
| 
       78 
     | 
    
         
            -
                # 
     | 
| 
      
 78 
     | 
    
         
            +
                #
         
     | 
| 
       79 
79 
     | 
    
         
             
                # == Examples
         
     | 
| 
       80 
     | 
    
         
            -
                # 
     | 
| 
      
 80 
     | 
    
         
            +
                #
         
     | 
| 
       81 
81 
     | 
    
         
             
                # Canceling the callback chain without a terminator:
         
     | 
| 
       82 
     | 
    
         
            -
                # 
     | 
| 
      
 82 
     | 
    
         
            +
                #
         
     | 
| 
       83 
83 
     | 
    
         
             
                #   class Vehicle
         
     | 
| 
       84 
84 
     | 
    
         
             
                #     state_machine do
         
     | 
| 
       85 
85 
     | 
    
         
             
                #       before_transition do |vehicle|
         
     | 
| 
         @@ -87,9 +87,9 @@ module StateMachines 
     | 
|
| 
       87 
87 
     | 
    
         
             
                #       end
         
     | 
| 
       88 
88 
     | 
    
         
             
                #     end
         
     | 
| 
       89 
89 
     | 
    
         
             
                #   end
         
     | 
| 
       90 
     | 
    
         
            -
                # 
     | 
| 
      
 90 
     | 
    
         
            +
                #
         
     | 
| 
       91 
91 
     | 
    
         
             
                # Canceling the callback chain with a terminator value of +false+:
         
     | 
| 
       92 
     | 
    
         
            -
                # 
     | 
| 
      
 92 
     | 
    
         
            +
                #
         
     | 
| 
       93 
93 
     | 
    
         
             
                #   class Vehicle
         
     | 
| 
       94 
94 
     | 
    
         
             
                #     state_machine do
         
     | 
| 
       95 
95 
     | 
    
         
             
                #       before_transition do |vehicle|
         
     | 
| 
         @@ -102,13 +102,13 @@ module StateMachines 
     | 
|
| 
       102 
102 
     | 
    
         
             
                # The branch that determines whether or not this callback can be invoked
         
     | 
| 
       103 
103 
     | 
    
         
             
                # based on the context of the transition.  The event, from state, and
         
     | 
| 
       104 
104 
     | 
    
         
             
                # to state must all match in order for the branch to pass.
         
     | 
| 
       105 
     | 
    
         
            -
                # 
     | 
| 
      
 105 
     | 
    
         
            +
                #
         
     | 
| 
       106 
106 
     | 
    
         
             
                # See StateMachines::Branch for more information.
         
     | 
| 
       107 
107 
     | 
    
         
             
                attr_reader :branch
         
     | 
| 
       108 
108 
     | 
    
         | 
| 
       109 
109 
     | 
    
         
             
                # Creates a new callback that can get called based on the configured
         
     | 
| 
       110 
110 
     | 
    
         
             
                # options.
         
     | 
| 
       111 
     | 
    
         
            -
                # 
     | 
| 
      
 111 
     | 
    
         
            +
                #
         
     | 
| 
       112 
112 
     | 
    
         
             
                # In addition to the possible configuration options for branches, the
         
     | 
| 
       113 
113 
     | 
    
         
             
                # following options can be configured:
         
     | 
| 
       114 
114 
     | 
    
         
             
                # * <tt>:bind_to_object</tt> - Whether to bind the callback to the object involved.
         
     | 
| 
         @@ -117,7 +117,7 @@ module StateMachines 
     | 
|
| 
       117 
117 
     | 
    
         
             
                # * <tt>:terminator</tt> - A block/proc that determines what callback
         
     | 
| 
       118 
118 
     | 
    
         
             
                #   results should cause the callback chain to halt (if not using the
         
     | 
| 
       119 
119 
     | 
    
         
             
                #   default <tt>throw :halt</tt> technique).
         
     | 
| 
       120 
     | 
    
         
            -
                # 
     | 
| 
      
 120 
     | 
    
         
            +
                #
         
     | 
| 
       121 
121 
     | 
    
         
             
                # More information about how those options affect the behavior of the
         
     | 
| 
       122 
122 
     | 
    
         
             
                # callback can be found in their attribute definitions.
         
     | 
| 
       123 
123 
     | 
    
         
             
                def initialize(type, *args, &block)
         
     | 
| 
         @@ -130,7 +130,7 @@ module StateMachines 
     | 
|
| 
       130 
130 
     | 
    
         
             
                  @methods << block if block_given?
         
     | 
| 
       131 
131 
     | 
    
         
             
                  raise ArgumentError, 'Method(s) for callback must be specified' unless @methods.any?
         
     | 
| 
       132 
132 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
                  options = {: 
     | 
| 
      
 133 
     | 
    
         
            +
                  options = {bind_to_object: self.class.bind_to_object, terminator: self.class.terminator}.merge(options)
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
       135 
135 
     | 
    
         
             
                  # Proxy lambda blocks so that they're bound to the object
         
     | 
| 
       136 
136 
     | 
    
         
             
                  bind_to_object = options.delete(:bind_to_object)
         
     | 
| 
         @@ -151,7 +151,7 @@ module StateMachines 
     | 
|
| 
       151 
151 
     | 
    
         
             
                # Runs the callback as long as the transition context matches the branch
         
     | 
| 
       152 
152 
     | 
    
         
             
                # requirements configured for this callback.  If a block is provided, it
         
     | 
| 
       153 
153 
     | 
    
         
             
                # will be called when the last method has run.
         
     | 
| 
       154 
     | 
    
         
            -
                # 
     | 
| 
      
 154 
     | 
    
         
            +
                #
         
     | 
| 
       155 
155 
     | 
    
         
             
                # If a terminator has been configured and it matches the result from the
         
     | 
| 
       156 
156 
     | 
    
         
             
                # evaluated method, then the callback chain should be halted.
         
     | 
| 
       157 
157 
     | 
    
         
             
                def call(object, context = {}, *args, &block)
         
     | 
| 
         @@ -163,7 +163,8 @@ module StateMachines 
     | 
|
| 
       163 
163 
     | 
    
         
             
                  end
         
     | 
| 
       164 
164 
     | 
    
         
             
                end
         
     | 
| 
       165 
165 
     | 
    
         | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
      
 166 
     | 
    
         
            +
              private
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
       167 
168 
     | 
    
         
             
                # Runs all of the methods configured for this callback.
         
     | 
| 
       168 
169 
     | 
    
         
             
                #
         
     | 
| 
       169 
170 
     | 
    
         
             
                # When running +around+ callbacks, this will evaluate each method and
         
     | 
| 
         @@ -7,46 +7,46 @@ module StateMachines 
     | 
|
| 
       7 
7 
     | 
    
         
             
                # * Symbol
         
     | 
| 
       8 
8 
     | 
    
         
             
                # * Method / Proc
         
     | 
| 
       9 
9 
     | 
    
         
             
                # * String
         
     | 
| 
       10 
     | 
    
         
            -
                # 
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
       11 
11 
     | 
    
         
             
                # == Examples
         
     | 
| 
       12 
     | 
    
         
            -
                # 
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
       13 
13 
     | 
    
         
             
                # Below are examples of the various ways that a method can be evaluated
         
     | 
| 
       14 
14 
     | 
    
         
             
                # on an object:
         
     | 
| 
       15 
     | 
    
         
            -
                # 
     | 
| 
      
 15 
     | 
    
         
            +
                #
         
     | 
| 
       16 
16 
     | 
    
         
             
                #   class Person
         
     | 
| 
       17 
17 
     | 
    
         
             
                #     def initialize(name)
         
     | 
| 
       18 
18 
     | 
    
         
             
                #       @name = name
         
     | 
| 
       19 
19 
     | 
    
         
             
                #     end
         
     | 
| 
       20 
     | 
    
         
            -
                # 
     | 
| 
      
 20 
     | 
    
         
            +
                #
         
     | 
| 
       21 
21 
     | 
    
         
             
                #     def name
         
     | 
| 
       22 
22 
     | 
    
         
             
                #       @name
         
     | 
| 
       23 
23 
     | 
    
         
             
                #     end
         
     | 
| 
       24 
24 
     | 
    
         
             
                #   end
         
     | 
| 
       25 
     | 
    
         
            -
                # 
     | 
| 
      
 25 
     | 
    
         
            +
                #
         
     | 
| 
       26 
26 
     | 
    
         
             
                #   class PersonCallback
         
     | 
| 
       27 
27 
     | 
    
         
             
                #     def self.run(person)
         
     | 
| 
       28 
28 
     | 
    
         
             
                #       person.name
         
     | 
| 
       29 
29 
     | 
    
         
             
                #     end
         
     | 
| 
       30 
30 
     | 
    
         
             
                #   end
         
     | 
| 
       31 
     | 
    
         
            -
                # 
     | 
| 
      
 31 
     | 
    
         
            +
                #
         
     | 
| 
       32 
32 
     | 
    
         
             
                #   person = Person.new('John Smith')
         
     | 
| 
       33 
     | 
    
         
            -
                # 
     | 
| 
      
 33 
     | 
    
         
            +
                #
         
     | 
| 
       34 
34 
     | 
    
         
             
                #   evaluate_method(person, :name)                            # => "John Smith"
         
     | 
| 
       35 
35 
     | 
    
         
             
                #   evaluate_method(person, PersonCallback.method(:run))      # => "John Smith"
         
     | 
| 
       36 
36 
     | 
    
         
             
                #   evaluate_method(person, Proc.new {|person| person.name})  # => "John Smith"
         
     | 
| 
       37 
37 
     | 
    
         
             
                #   evaluate_method(person, lambda {|person| person.name})    # => "John Smith"
         
     | 
| 
       38 
38 
     | 
    
         
             
                #   evaluate_method(person, '@name')                          # => "John Smith"
         
     | 
| 
       39 
     | 
    
         
            -
                # 
     | 
| 
      
 39 
     | 
    
         
            +
                #
         
     | 
| 
       40 
40 
     | 
    
         
             
                # == Additional arguments
         
     | 
| 
       41 
     | 
    
         
            -
                # 
     | 
| 
      
 41 
     | 
    
         
            +
                #
         
     | 
| 
       42 
42 
     | 
    
         
             
                # Additional arguments can be passed to the methods being evaluated.  If
         
     | 
| 
       43 
43 
     | 
    
         
             
                # the method defines additional arguments other than the object context,
         
     | 
| 
       44 
44 
     | 
    
         
             
                # then all arguments are required.
         
     | 
| 
       45 
     | 
    
         
            -
                # 
     | 
| 
      
 45 
     | 
    
         
            +
                #
         
     | 
| 
       46 
46 
     | 
    
         
             
                # For example,
         
     | 
| 
       47 
     | 
    
         
            -
                # 
     | 
| 
      
 47 
     | 
    
         
            +
                #
         
     | 
| 
       48 
48 
     | 
    
         
             
                #   person = Person.new('John Smith')
         
     | 
| 
       49 
     | 
    
         
            -
                # 
     | 
| 
      
 49 
     | 
    
         
            +
                #
         
     | 
| 
       50 
50 
     | 
    
         
             
                #   evaluate_method(person, lambda {|person| person.name}, 21)                              # => "John Smith"
         
     | 
| 
       51 
51 
     | 
    
         
             
                #   evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21)          # => "John Smith is 21"
         
     | 
| 
       52 
52 
     | 
    
         
             
                #   evaluate_method(person, lambda {|person, age| "#{person.name} is #{age}"}, 21, 'male')  # => ArgumentError: wrong number of arguments (3 for 2)
         
     | 
| 
         @@ -59,7 +59,7 @@ module StateMachines 
     | 
|
| 
       59 
59 
     | 
    
         
             
                    when Proc, Method
         
     | 
| 
       60 
60 
     | 
    
         
             
                      args.unshift(object)
         
     | 
| 
       61 
61 
     | 
    
         
             
                      arity = method.arity
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       63 
63 
     | 
    
         
             
                      # Procs don't support blocks in < Ruby 1.9, so it's tacked on as an
         
     | 
| 
       64 
64 
     | 
    
         
             
                      # argument for consistency across versions of Ruby
         
     | 
| 
       65 
65 
     | 
    
         
             
                      if block_given? && Proc === method && arity != 0
         
     | 
| 
         @@ -75,10 +75,10 @@ module StateMachines 
     | 
|
| 
       75 
75 
     | 
    
         
             
                        # These method types are only called with 0, 1, or n arguments
         
     | 
| 
       76 
76 
     | 
    
         
             
                        args = args[0, arity] if [0, 1].include?(arity)
         
     | 
| 
       77 
77 
     | 
    
         
             
                      end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
       79 
79 
     | 
    
         
             
                      method.is_a?(Proc) ? method.call(*args) : method.call(*args, &block)
         
     | 
| 
       80 
80 
     | 
    
         
             
                    when String
         
     | 
| 
       81 
     | 
    
         
            -
                      eval(method, object.instance_eval {binding}, &block)
         
     | 
| 
      
 81 
     | 
    
         
            +
                      eval(method, object.instance_eval { binding }, &block)
         
     | 
| 
       82 
82 
     | 
    
         
             
                    else
         
     | 
| 
       83 
83 
     | 
    
         
             
                      raise ArgumentError, 'Methods must be a symbol denoting the method to call, a block to be invoked, or a string to be evaluated'
         
     | 
| 
       84 
84 
     | 
    
         
             
                  end
         
     |