aasm 2.1.1 → 5.2.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 +7 -0
- data/.document +6 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.gitignore +20 -0
- data/.travis.yml +82 -0
- data/API +34 -0
- data/Appraisals +67 -0
- data/CHANGELOG.md +453 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +44 -0
- data/Gemfile +6 -0
- data/Gemfile.lock_old +151 -0
- data/HOWTO +12 -0
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/PLANNED_CHANGES.md +11 -0
- data/README.md +1524 -0
- data/README_FROM_VERSION_3_TO_4.md +240 -0
- data/Rakefile +20 -84
- data/TESTING.md +25 -0
- data/aasm.gemspec +37 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_4.2.gemfile +17 -0
- data/gemfiles/rails_4.2_mongoid_5.gemfile +12 -0
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +14 -0
- data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +14 -0
- data/gemfiles/rails_5.2.gemfile +14 -0
- data/lib/aasm/aasm.rb +160 -137
- data/lib/aasm/base.rb +290 -0
- data/lib/aasm/configuration.rb +48 -0
- data/lib/aasm/core/event.rb +177 -0
- data/lib/aasm/core/invoker.rb +129 -0
- data/lib/aasm/core/invokers/base_invoker.rb +75 -0
- data/lib/aasm/core/invokers/class_invoker.rb +52 -0
- data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
- data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
- data/lib/aasm/core/state.rb +91 -0
- data/lib/aasm/core/transition.rb +83 -0
- data/lib/aasm/dsl_helper.rb +32 -0
- data/lib/aasm/errors.rb +21 -0
- data/lib/aasm/instance_base.rb +133 -0
- data/lib/aasm/localizer.rb +64 -0
- data/lib/aasm/minitest/allow_event.rb +13 -0
- data/lib/aasm/minitest/allow_transition_to.rb +13 -0
- data/lib/aasm/minitest/have_state.rb +13 -0
- data/lib/aasm/minitest/transition_from.rb +21 -0
- data/lib/aasm/minitest.rb +5 -0
- data/lib/aasm/minitest_spec.rb +15 -0
- data/lib/aasm/persistence/active_record_persistence.rb +108 -173
- data/lib/aasm/persistence/base.rb +89 -0
- data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
- data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
- data/lib/aasm/persistence/mongoid_persistence.rb +126 -0
- data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
- data/lib/aasm/persistence/orm.rb +154 -0
- data/lib/aasm/persistence/plain_persistence.rb +26 -0
- data/lib/aasm/persistence/redis_persistence.rb +112 -0
- data/lib/aasm/persistence/sequel_persistence.rb +83 -0
- data/lib/aasm/persistence.rb +48 -10
- data/lib/aasm/rspec/allow_event.rb +26 -0
- data/lib/aasm/rspec/allow_transition_to.rb +26 -0
- data/lib/aasm/rspec/have_state.rb +22 -0
- data/lib/aasm/rspec/transition_from.rb +36 -0
- data/lib/aasm/rspec.rb +5 -0
- data/lib/aasm/state_machine.rb +40 -22
- data/lib/aasm/state_machine_store.rb +76 -0
- data/lib/aasm/version.rb +3 -0
- data/lib/aasm.rb +21 -1
- data/lib/generators/aasm/aasm_generator.rb +16 -0
- data/lib/generators/aasm/orm_helpers.rb +41 -0
- data/lib/generators/active_record/aasm_generator.rb +40 -0
- data/lib/generators/active_record/templates/migration.rb +8 -0
- data/lib/generators/active_record/templates/migration_existing.rb +5 -0
- data/lib/generators/mongoid/aasm_generator.rb +28 -0
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +37 -0
- data/spec/database.rb +57 -0
- data/spec/database.yml +3 -0
- data/spec/en.yml +9 -0
- data/spec/generators/active_record_generator_spec.rb +53 -0
- data/spec/generators/mongoid_generator_spec.rb +31 -0
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/localizer_test_model_deprecated_style.yml +13 -0
- data/spec/localizer_test_model_new_style.yml +11 -0
- data/spec/models/active_record/active_record_callback.rb +93 -0
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
- data/spec/models/active_record/complex_active_record_example.rb +37 -0
- data/spec/models/active_record/derivate_new_dsl.rb +7 -0
- data/spec/models/active_record/false_state.rb +35 -0
- data/spec/models/active_record/gate.rb +39 -0
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/active_record/invalid_persistor.rb +29 -0
- data/spec/models/active_record/localizer_test_model.rb +42 -0
- data/spec/models/active_record/namespaced.rb +16 -0
- data/spec/models/active_record/no_direct_assignment.rb +21 -0
- data/spec/models/active_record/no_scope.rb +21 -0
- data/spec/models/active_record/persisted_state.rb +12 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/active_record/provided_and_persisted_state.rb +24 -0
- data/spec/models/active_record/reader.rb +7 -0
- data/spec/models/active_record/readme_job.rb +21 -0
- data/spec/models/active_record/silent_persistor.rb +29 -0
- data/spec/models/active_record/simple_new_dsl.rb +32 -0
- data/spec/models/active_record/thief.rb +29 -0
- data/spec/models/active_record/timestamp_example.rb +16 -0
- data/spec/models/active_record/transactor.rb +124 -0
- data/spec/models/active_record/transient.rb +6 -0
- data/spec/models/active_record/validator.rb +118 -0
- data/spec/models/active_record/with_enum.rb +39 -0
- data/spec/models/active_record/with_enum_without_column.rb +38 -0
- data/spec/models/active_record/with_false_enum.rb +31 -0
- data/spec/models/active_record/with_true_enum.rb +39 -0
- data/spec/models/active_record/work.rb +3 -0
- data/spec/models/active_record/worker.rb +2 -0
- data/spec/models/active_record/writer.rb +6 -0
- data/spec/models/basic_two_state_machines_example.rb +25 -0
- data/spec/models/callbacks/basic.rb +98 -0
- data/spec/models/callbacks/basic_multiple.rb +75 -0
- data/spec/models/callbacks/guard_within_block.rb +67 -0
- data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
- data/spec/models/callbacks/private_method.rb +44 -0
- data/spec/models/callbacks/private_method_multiple.rb +44 -0
- data/spec/models/callbacks/with_args.rb +62 -0
- data/spec/models/callbacks/with_args_multiple.rb +61 -0
- data/spec/models/callbacks/with_state_arg.rb +34 -0
- data/spec/models/callbacks/with_state_arg_multiple.rb +29 -0
- data/spec/models/complex_example.rb +222 -0
- data/spec/models/conversation.rb +93 -0
- data/spec/models/default_state.rb +12 -0
- data/spec/models/double_definer.rb +21 -0
- data/spec/models/dynamoid/complex_dynamoid_example.rb +37 -0
- data/spec/models/dynamoid/dynamoid_multiple.rb +18 -0
- data/spec/models/dynamoid/dynamoid_simple.rb +18 -0
- data/spec/models/foo.rb +106 -0
- data/spec/models/foo_callback_multiple.rb +45 -0
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/models/guard_with_params.rb +24 -0
- data/spec/models/guard_with_params_multiple.rb +18 -0
- data/spec/models/guardian.rb +58 -0
- data/spec/models/guardian_multiple.rb +48 -0
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/initial_state_proc.rb +31 -0
- data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/mongoid_relationships.rb +26 -0
- data/spec/models/mongoid/no_scope_mongoid.rb +21 -0
- data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/simple_mongoid.rb +23 -0
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +25 -0
- data/spec/models/mongoid/timestamp_example_mongoid.rb +20 -0
- data/spec/models/mongoid/validator_mongoid.rb +100 -0
- data/spec/models/multi_transitioner.rb +34 -0
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
- data/spec/models/namespaced_multiple_example.rb +42 -0
- data/spec/models/no_initial_state.rb +25 -0
- data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
- data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
- data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
- data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
- data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/not_auto_loaded/process.rb +21 -0
- data/spec/models/parametrised_event.rb +42 -0
- data/spec/models/parametrised_event_multiple.rb +29 -0
- data/spec/models/process_with_new_dsl.rb +31 -0
- data/spec/models/provided_state.rb +24 -0
- data/spec/models/redis/complex_redis_example.rb +40 -0
- data/spec/models/redis/redis_multiple.rb +20 -0
- data/spec/models/redis/redis_simple.rb +20 -0
- data/spec/models/sequel/complex_sequel_example.rb +46 -0
- data/spec/models/sequel/invalid_persistor.rb +52 -0
- data/spec/models/sequel/sequel_multiple.rb +25 -0
- data/spec/models/sequel/sequel_simple.rb +26 -0
- data/spec/models/sequel/silent_persistor.rb +50 -0
- data/spec/models/sequel/transactor.rb +112 -0
- data/spec/models/sequel/validator.rb +93 -0
- data/spec/models/sequel/worker.rb +12 -0
- data/spec/models/silencer.rb +27 -0
- data/spec/models/simple_custom_example.rb +53 -0
- data/spec/models/simple_example.rb +23 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/models/simple_multiple_example.rb +42 -0
- data/spec/models/state_machine_with_failed_event.rb +20 -0
- data/spec/models/states_on_one_line_example.rb +8 -0
- data/spec/models/sub_class.rb +41 -0
- data/spec/models/sub_class_with_more_states.rb +18 -0
- data/spec/models/sub_classing.rb +3 -0
- data/spec/models/super_class.rb +46 -0
- data/spec/models/this_name_better_not_be_in_use.rb +11 -0
- data/spec/models/timestamps_example.rb +19 -0
- data/spec/models/timestamps_with_named_machine_example.rb +13 -0
- data/spec/models/valid_state_name.rb +23 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/spec_helpers/active_record.rb +8 -0
- data/spec/spec_helpers/dynamoid.rb +35 -0
- data/spec/spec_helpers/mongoid.rb +26 -0
- data/spec/spec_helpers/nobrainer.rb +15 -0
- data/spec/spec_helpers/redis.rb +18 -0
- data/spec/spec_helpers/remove_warnings.rb +1 -0
- data/spec/spec_helpers/sequel.rb +7 -0
- data/spec/unit/abstract_class_spec.rb +27 -0
- data/spec/unit/api_spec.rb +104 -0
- data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
- data/spec/unit/callback_multiple_spec.rb +304 -0
- data/spec/unit/callbacks_spec.rb +521 -0
- data/spec/unit/complex_example_spec.rb +93 -0
- data/spec/unit/complex_multiple_example_spec.rb +115 -0
- data/spec/unit/edge_cases_spec.rb +16 -0
- data/spec/unit/event_multiple_spec.rb +73 -0
- data/spec/unit/event_naming_spec.rb +16 -0
- data/spec/unit/event_spec.rb +394 -0
- data/spec/unit/exception_spec.rb +11 -0
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- data/spec/unit/guard_multiple_spec.rb +60 -0
- data/spec/unit/guard_spec.rb +89 -0
- data/spec/unit/guard_with_params_multiple_spec.rb +10 -0
- data/spec/unit/guard_with_params_spec.rb +14 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/initial_state_multiple_spec.rb +15 -0
- data/spec/unit/initial_state_spec.rb +12 -0
- data/spec/unit/inspection_multiple_spec.rb +205 -0
- data/spec/unit/inspection_spec.rb +153 -0
- data/spec/unit/invoker_spec.rb +189 -0
- data/spec/unit/invokers/base_invoker_spec.rb +72 -0
- data/spec/unit/invokers/class_invoker_spec.rb +95 -0
- data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
- data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
- data/spec/unit/localizer_spec.rb +109 -0
- data/spec/unit/memory_leak_spec.rb +38 -0
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +75 -0
- data/spec/unit/new_dsl_spec.rb +12 -0
- data/spec/unit/override_warning_spec.rb +94 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +635 -0
- data/spec/unit/persistence/active_record_persistence_spec.rb +852 -0
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +135 -0
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +84 -0
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +200 -0
- data/spec/unit/persistence/mongoid_persistence_spec.rb +177 -0
- data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
- data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
- data/spec/unit/persistence/redis_persistence_spec.rb +53 -0
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +148 -0
- data/spec/unit/persistence/sequel_persistence_spec.rb +368 -0
- data/spec/unit/readme_spec.rb +41 -0
- data/spec/unit/reloading_spec.rb +15 -0
- data/spec/unit/rspec_matcher_spec.rb +88 -0
- data/spec/unit/simple_custom_example_spec.rb +39 -0
- data/spec/unit/simple_example_spec.rb +57 -0
- data/spec/unit/simple_multiple_example_spec.rb +91 -0
- data/spec/unit/state_spec.rb +105 -0
- data/spec/unit/states_on_one_line_example_spec.rb +16 -0
- data/spec/unit/subclassing_multiple_spec.rb +74 -0
- data/spec/unit/subclassing_spec.rb +46 -0
- data/spec/unit/timestamps_spec.rb +32 -0
- data/spec/unit/transition_spec.rb +436 -0
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- metadata +607 -60
- data/CHANGELOG +0 -33
- data/README.rdoc +0 -122
- data/TODO +0 -9
- data/doc/jamis.rb +0 -591
- data/lib/aasm/event.rb +0 -76
- data/lib/aasm/state.rb +0 -35
- data/lib/aasm/state_transition.rb +0 -36
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
class CustomAASMBase < AASM::Base
|
|
2
|
+
# A custom transiton that we want available across many AASM models.
|
|
3
|
+
def count_transitions!
|
|
4
|
+
klass.class_eval do
|
|
5
|
+
aasm :with_klass => CustomAASMBase do
|
|
6
|
+
after_all_transitions :increment_transition_count
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# A custom annotation that we want available across many AASM models.
|
|
12
|
+
def requires_guards!
|
|
13
|
+
klass.class_eval do
|
|
14
|
+
attr_reader :authorizable_called,
|
|
15
|
+
:transition_count,
|
|
16
|
+
:fillable_called
|
|
17
|
+
|
|
18
|
+
def authorizable?
|
|
19
|
+
@authorizable_called = true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def fillable?
|
|
23
|
+
@fillable_called = true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def increment_transition_count
|
|
27
|
+
@transition_count ||= 0
|
|
28
|
+
@transition_count += 1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class SimpleCustomExample
|
|
35
|
+
include AASM
|
|
36
|
+
|
|
37
|
+
# Let's build an AASM state machine with our custom class.
|
|
38
|
+
aasm :with_klass => CustomAASMBase do
|
|
39
|
+
requires_guards!
|
|
40
|
+
count_transitions!
|
|
41
|
+
|
|
42
|
+
state :initialised, :initial => true
|
|
43
|
+
state :filled_out
|
|
44
|
+
state :authorised
|
|
45
|
+
|
|
46
|
+
event :fill_out do
|
|
47
|
+
transitions :from => :initialised, :to => :filled_out, :guard => :fillable?
|
|
48
|
+
end
|
|
49
|
+
event :authorise do
|
|
50
|
+
transitions :from => :filled_out, :to => :authorised, :guard => :authorizable?
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class SimpleExample
|
|
2
|
+
include AASM
|
|
3
|
+
aasm do
|
|
4
|
+
state :initialised, :initial => true
|
|
5
|
+
state :filled_out
|
|
6
|
+
state :denied
|
|
7
|
+
state :authorised
|
|
8
|
+
|
|
9
|
+
event :fill_out do
|
|
10
|
+
transitions :from => :initialised, :to => :filled_out
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
event :deny do
|
|
14
|
+
transitions from: :initialised, to: :denied
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
event :authorise do
|
|
18
|
+
transitions :from => :filled_out, :to => :authorised
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class SimpleExampleWithGuardArgs
|
|
2
|
+
include AASM
|
|
3
|
+
aasm do
|
|
4
|
+
state :initialised, :initial => true
|
|
5
|
+
state :filled_out_with_args
|
|
6
|
+
|
|
7
|
+
event :fill_out_with_args do
|
|
8
|
+
transitions :guard => [:arg_is_valid?],
|
|
9
|
+
:from => :initialised,
|
|
10
|
+
:to => :filled_out_with_args
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def arg_is_valid?(arg)
|
|
15
|
+
return arg
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class SimpleMultipleExample
|
|
2
|
+
include AASM
|
|
3
|
+
aasm(:move) do
|
|
4
|
+
state :standing, :initial => true
|
|
5
|
+
state :walking
|
|
6
|
+
state :running
|
|
7
|
+
|
|
8
|
+
event :walk do
|
|
9
|
+
transitions :from => :standing, :to => :walking
|
|
10
|
+
end
|
|
11
|
+
event :run do
|
|
12
|
+
transitions :from => [:standing, :walking], :to => :running
|
|
13
|
+
end
|
|
14
|
+
event :hold do
|
|
15
|
+
transitions :from => [:walking, :running], :to => :standing
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
aasm(:work) do
|
|
20
|
+
state :sleeping, :initial => true
|
|
21
|
+
state :processing
|
|
22
|
+
|
|
23
|
+
event :start do
|
|
24
|
+
transitions :from => :sleeping, :to => :processing
|
|
25
|
+
end
|
|
26
|
+
event :stop do
|
|
27
|
+
transitions :from => :processing, :to => :sleeping
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
aasm(:question) do
|
|
32
|
+
state :answered, :initial => true
|
|
33
|
+
state :asked
|
|
34
|
+
|
|
35
|
+
event :ask, :binding_event => :start do
|
|
36
|
+
transitions :from => :answered, :to => :asked
|
|
37
|
+
end
|
|
38
|
+
event :answer, :binding_event => :stop do
|
|
39
|
+
transitions :from => :asked, :to => :answered
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class StateMachineWithFailedEvent
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm do
|
|
5
|
+
state :init, :initial => true
|
|
6
|
+
state :failed
|
|
7
|
+
state :sent
|
|
8
|
+
|
|
9
|
+
event :failed do
|
|
10
|
+
transitions :from => :init, :to => :failed
|
|
11
|
+
end
|
|
12
|
+
event :send, :before => :callback do
|
|
13
|
+
transitions :from => :init, :to => :sent
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def callback
|
|
18
|
+
true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_relative 'super_class'
|
|
2
|
+
|
|
3
|
+
class SubClass < SuperClass
|
|
4
|
+
# Add an after callback that is not defined in the parent
|
|
5
|
+
aasm.state_machine.events[:foo].options[:after] = [:after_foo_event]
|
|
6
|
+
|
|
7
|
+
# Add global callback that is not defined in the parent
|
|
8
|
+
aasm.state_machine.global_callbacks[:after_all_transitions] = :after_all_event
|
|
9
|
+
|
|
10
|
+
attr_accessor :called_after
|
|
11
|
+
|
|
12
|
+
def after_foo_event
|
|
13
|
+
self.called_after = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def after_all_event; end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class SubClassMultiple < SuperClassMultiple
|
|
20
|
+
# Add after callbacks that are not defined in the parent
|
|
21
|
+
aasm(:left).state_machine.events[:foo].options[:after] = [:left_after_foo_event]
|
|
22
|
+
aasm(:right).state_machine.events[:close].options[:after] = [:right_after_close_event]
|
|
23
|
+
|
|
24
|
+
# Add global callback that is not defined in the parent
|
|
25
|
+
aasm(:left).state_machine.global_callbacks[:after_all_transitions] = :left_after_all_event
|
|
26
|
+
aasm(:right).state_machine.global_callbacks[:after_all_transitions] = :right_after_all_event
|
|
27
|
+
|
|
28
|
+
attr_accessor :left_called_after, :right_called_after
|
|
29
|
+
|
|
30
|
+
def left_after_foo_event
|
|
31
|
+
self.left_called_after = true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def right_after_close_event
|
|
35
|
+
self.right_called_after = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def left_after_all_event; end
|
|
39
|
+
|
|
40
|
+
def right_after_all_event; end
|
|
41
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require_relative 'super_class'
|
|
2
|
+
|
|
3
|
+
class SubClassWithMoreStates < SuperClass
|
|
4
|
+
include AASM
|
|
5
|
+
aasm do
|
|
6
|
+
state :foo
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class SubClassWithMoreStatesMultiple < SuperClassMultiple
|
|
11
|
+
include AASM
|
|
12
|
+
aasm(:left) do
|
|
13
|
+
state :foo
|
|
14
|
+
end
|
|
15
|
+
aasm(:right) do
|
|
16
|
+
state :archived
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
class SuperClass
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm do
|
|
5
|
+
state :read
|
|
6
|
+
state :ended
|
|
7
|
+
|
|
8
|
+
event :foo do
|
|
9
|
+
transitions :to => :ended, :from => [:read]
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def update_state
|
|
14
|
+
if may_foo?
|
|
15
|
+
foo!
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class SuperClassMultiple
|
|
21
|
+
include AASM
|
|
22
|
+
|
|
23
|
+
aasm(:left) do
|
|
24
|
+
state :read
|
|
25
|
+
state :ended
|
|
26
|
+
|
|
27
|
+
event :foo do
|
|
28
|
+
transitions :to => :ended, :from => [:read]
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
aasm(:right) do
|
|
33
|
+
state :opened
|
|
34
|
+
state :closed
|
|
35
|
+
|
|
36
|
+
event :close do
|
|
37
|
+
transitions :to => :closed, :from => [:opened]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def update_state
|
|
42
|
+
if may_foo?
|
|
43
|
+
foo!
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class TimestampsExample
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
attr_accessor :opened_at
|
|
5
|
+
attr_reader :closed_at
|
|
6
|
+
|
|
7
|
+
aasm timestamps: true do
|
|
8
|
+
state :opened
|
|
9
|
+
state :closed
|
|
10
|
+
|
|
11
|
+
event :open do
|
|
12
|
+
transitions to: :opened
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
event :close do
|
|
16
|
+
transitions to: :closed
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class ValidStateName
|
|
2
|
+
include AASM
|
|
3
|
+
aasm do
|
|
4
|
+
state :invalid, :initial => true
|
|
5
|
+
state :valid
|
|
6
|
+
|
|
7
|
+
event :valid do
|
|
8
|
+
transitions :to => :valid, :from => [:invalid]
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ValidStateNameMultiple
|
|
14
|
+
include AASM
|
|
15
|
+
aasm(:left) do
|
|
16
|
+
state :invalid, :initial => true
|
|
17
|
+
state :valid
|
|
18
|
+
|
|
19
|
+
event :valid do
|
|
20
|
+
transitions :to => :valid, :from => [:invalid]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'simplecov'
|
|
2
|
+
SimpleCov.start do
|
|
3
|
+
add_filter '/spec/'
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
if ENV['CI'] == 'true'
|
|
7
|
+
require 'codecov'
|
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
|
12
|
+
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
|
13
|
+
require 'aasm'
|
|
14
|
+
require 'rspec'
|
|
15
|
+
require 'aasm/rspec'
|
|
16
|
+
require 'i18n'
|
|
17
|
+
require 'pry'
|
|
18
|
+
|
|
19
|
+
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
|
20
|
+
# require 'ruby-debug/completion'
|
|
21
|
+
# require 'pry'
|
|
22
|
+
|
|
23
|
+
SEQUEL_DB = defined?(JRUBY_VERSION) ? 'jdbc:sqlite::memory:' : 'sqlite:/'
|
|
24
|
+
|
|
25
|
+
def load_schema
|
|
26
|
+
require 'logger'
|
|
27
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
|
28
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
|
29
|
+
ActiveRecord::Base.establish_connection(config['sqlite3'])
|
|
30
|
+
require File.dirname(__FILE__) + "/database.rb"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# custom spec helpers
|
|
34
|
+
Dir[File.dirname(__FILE__) + "/spec_helpers/**/*.rb"].sort.each { |f| require File.expand_path(f) }
|
|
35
|
+
|
|
36
|
+
# example model classes
|
|
37
|
+
Dir[File.dirname(__FILE__) + "/models/*.rb"].sort.each { |f| require File.expand_path(f) }
|
|
38
|
+
|
|
39
|
+
I18n.load_path << 'spec/en.yml'
|
|
40
|
+
I18n.enforce_available_locales = false
|
|
41
|
+
I18n.default_locale = :en
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
begin
|
|
3
|
+
require 'active_record'
|
|
4
|
+
|
|
5
|
+
puts "active_record #{ActiveRecord::VERSION::STRING} gem found, running ActiveRecord specs \e[32m#{'✔'}\e[0m"
|
|
6
|
+
rescue LoadError
|
|
7
|
+
puts "active_record gem not found, not running ActiveRecord specs \e[31m#{'✖'}\e[0m"
|
|
8
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'dynamoid'
|
|
5
|
+
require 'aws-sdk-resources'
|
|
6
|
+
puts "dynamoid #{Dynamoid::VERSION} gem found, running Dynamoid specs \e[32m#{'✔'}\e[0m"
|
|
7
|
+
|
|
8
|
+
ENV['ACCESS_KEY'] ||= 'abcd'
|
|
9
|
+
ENV['SECRET_KEY'] ||= '1234'
|
|
10
|
+
|
|
11
|
+
Aws.config.update(
|
|
12
|
+
region: 'us-west-2',
|
|
13
|
+
credentials: Aws::Credentials.new(ENV['ACCESS_KEY'], ENV['SECRET_KEY'])
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
Dynamoid.configure do |config|
|
|
17
|
+
config.namespace = 'dynamoid_tests'
|
|
18
|
+
config.endpoint = "http://#{ENV['DYNAMODB_HOST'] || '127.0.0.1'}:" \
|
|
19
|
+
"#{ENV['DYNAMODB_PORT'] || 30180}"
|
|
20
|
+
config.warn_on_scan = false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Dynamoid.logger.level = Logger::FATAL
|
|
24
|
+
|
|
25
|
+
RSpec.configure do |c|
|
|
26
|
+
c.before(:each) do
|
|
27
|
+
Dynamoid.adapter.list_tables.each do |table|
|
|
28
|
+
Dynamoid.adapter.delete_table(table) if table =~ /^#{Dynamoid::Config.namespace}/
|
|
29
|
+
end
|
|
30
|
+
Dynamoid.adapter.tables.clear
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
rescue LoadError
|
|
34
|
+
puts "dynamoid gem not found, not running Dynamoid specs \e[31m#{'✖'}\e[0m"
|
|
35
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'mongoid'
|
|
5
|
+
puts "mongoid #{Mongoid::VERSION} gem found, running mongoid specs \e[32m#{'✔'}\e[0m"
|
|
6
|
+
|
|
7
|
+
if Mongoid::VERSION.to_f <= 5
|
|
8
|
+
Mongoid::Config.sessions = {
|
|
9
|
+
default: {
|
|
10
|
+
database: "mongoid_#{Process.pid}",
|
|
11
|
+
hosts: ["#{ENV['MONGODB_HOST'] || 'localhost'}:" \
|
|
12
|
+
"#{ENV['MONGODB_PORT'] || 27017}"]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else
|
|
16
|
+
Mongoid::Config.send(:clients=, {
|
|
17
|
+
default: {
|
|
18
|
+
database: "mongoid_#{Process.pid}",
|
|
19
|
+
hosts: ["#{ENV['MONGODB_HOST'] || 'localhost'}:" \
|
|
20
|
+
"#{ENV['MONGODB_PORT'] || 27017}"]
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
end
|
|
24
|
+
rescue LoadError
|
|
25
|
+
puts "mongoid gem not found, not running mongoid specs \e[31m#{'✖'}\e[0m"
|
|
26
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'nobrainer'
|
|
5
|
+
|
|
6
|
+
NoBrainer.configure do |config|
|
|
7
|
+
config.app_name = :aasm
|
|
8
|
+
config.environment = :test
|
|
9
|
+
config.warn_on_active_record = false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
puts "nobrainer #{Gem.loaded_specs['nobrainer'].version} gem found, running nobrainer specs \e[32m#{'✔'}\e[0m"
|
|
13
|
+
rescue LoadError
|
|
14
|
+
puts "nobrainer gem not found, not running nobrainer specs \e[31m#{'✖'}\e[0m"
|
|
15
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'redis-objects'
|
|
5
|
+
require 'redis/objects/version'
|
|
6
|
+
puts "redis-objects #{Redis::Objects::VERSION} gem found, running Redis specs \e[32m#{'✔'}\e[0m"
|
|
7
|
+
|
|
8
|
+
Redis.current = Redis.new(host: (ENV['REDIS_HOST'] || '127.0.0.1'),
|
|
9
|
+
port: (ENV['REDIS_PORT'] || 6379))
|
|
10
|
+
|
|
11
|
+
RSpec.configure do |c|
|
|
12
|
+
c.before(:each) do
|
|
13
|
+
Redis.current.keys('redis_*').each { |k| Redis.current.del k }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
rescue LoadError
|
|
17
|
+
puts "redis-objects gem not found, not running Redis specs \e[31m#{'✖'}\e[0m"
|
|
18
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AASM::Configuration.hide_warnings = true
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
if defined?(ActiveRecord)
|
|
3
|
+
require 'models/active_record/person'
|
|
4
|
+
|
|
5
|
+
load_schema
|
|
6
|
+
describe 'Abstract subclassing' do
|
|
7
|
+
|
|
8
|
+
it 'should have the parent states' do
|
|
9
|
+
Person.aasm.states.each do |state|
|
|
10
|
+
expect(Base.aasm.states).to include(state)
|
|
11
|
+
end
|
|
12
|
+
expect(Person.aasm.states).to eq(Base.aasm.states)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should have the same events as its parent' do
|
|
16
|
+
expect(Base.aasm.events).to eq(Person.aasm.events)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should not break aasm methods when super class is abstract_class' do
|
|
20
|
+
person = Person.new
|
|
21
|
+
person.status = 'active'
|
|
22
|
+
person.deactivate!
|
|
23
|
+
expect(person.aasm.current_state).to eq(:inactive)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
if defined?(ActiveRecord)
|
|
4
|
+
require 'models/default_state.rb'
|
|
5
|
+
require 'models/provided_state.rb'
|
|
6
|
+
require 'models/active_record/persisted_state.rb'
|
|
7
|
+
require 'models/active_record/provided_and_persisted_state.rb'
|
|
8
|
+
|
|
9
|
+
load_schema
|
|
10
|
+
|
|
11
|
+
describe "reading the current state" do
|
|
12
|
+
it "uses the AASM default" do
|
|
13
|
+
expect(DefaultState.new.aasm.current_state).to eql :alpha
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "uses display option" do
|
|
17
|
+
expect(DefaultState.new.aasm.human_state).to eql "ALPHA"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "uses the provided method" do
|
|
21
|
+
expect(ProvidedState.new.aasm.current_state).to eql :beta
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "uses the persistence storage" do
|
|
25
|
+
expect(PersistedState.new.aasm.current_state).to eql :alpha
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "uses the provided method even if persisted" do
|
|
29
|
+
expect(ProvidedAndPersistedState.new.aasm.current_state).to eql :gamma
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "after dup" do
|
|
33
|
+
it "uses the persistence storage" do
|
|
34
|
+
source = PersistedState.create!
|
|
35
|
+
copy = source.dup
|
|
36
|
+
copy.save!
|
|
37
|
+
|
|
38
|
+
copy.release!
|
|
39
|
+
|
|
40
|
+
expect(source.aasm_state).to eql 'alpha'
|
|
41
|
+
expect(source.aasm.current_state).to eql :alpha
|
|
42
|
+
|
|
43
|
+
source2 = PersistedState.find(source.id)
|
|
44
|
+
expect(source2.reload.aasm_state).to eql 'alpha'
|
|
45
|
+
expect(source2.aasm.current_state).to eql :alpha
|
|
46
|
+
|
|
47
|
+
expect(copy.aasm_state).to eql 'beta'
|
|
48
|
+
expect(copy.aasm.current_state).to eql :beta
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "writing and persisting the current state" do
|
|
54
|
+
it "uses the AASM default" do
|
|
55
|
+
o = DefaultState.new
|
|
56
|
+
o.release!
|
|
57
|
+
expect(o.persisted_store).to be_nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "uses the provided method" do
|
|
61
|
+
o = ProvidedState.new
|
|
62
|
+
o.release!
|
|
63
|
+
expect(o.persisted_store).to eql :beta
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "uses the persistence storage" do
|
|
67
|
+
o = PersistedState.new
|
|
68
|
+
o.release!
|
|
69
|
+
expect(o.persisted_store).to be_nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "uses the provided method even if persisted" do
|
|
73
|
+
o = ProvidedAndPersistedState.new
|
|
74
|
+
o.release!
|
|
75
|
+
expect(o.persisted_store).to eql :beta
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe "writing the current state without persisting it" do
|
|
80
|
+
it "uses the AASM default" do
|
|
81
|
+
o = DefaultState.new
|
|
82
|
+
o.release
|
|
83
|
+
expect(o.transient_store).to be_nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "uses the provided method" do
|
|
87
|
+
o = ProvidedState.new
|
|
88
|
+
o.release
|
|
89
|
+
expect(o.transient_store).to eql :beta
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "uses the persistence storage" do
|
|
93
|
+
o = PersistedState.new
|
|
94
|
+
o.release
|
|
95
|
+
expect(o.transient_store).to be_nil
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "uses the provided method even if persisted" do
|
|
99
|
+
o = ProvidedAndPersistedState.new
|
|
100
|
+
o.release
|
|
101
|
+
expect(o.transient_store).to eql :beta
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'on initialization' do
|
|
4
|
+
let(:example) { BasicTwoStateMachinesExample.new }
|
|
5
|
+
|
|
6
|
+
it 'should be in the initial state' do
|
|
7
|
+
expect(example.aasm(:search).current_state).to eql :initialised
|
|
8
|
+
expect(example.aasm(:sync).current_state).to eql :unsynced
|
|
9
|
+
end
|
|
10
|
+
end
|