aasm 4.11.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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.travis.yml +56 -23
- data/Appraisals +67 -0
- data/CHANGELOG.md +112 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +44 -0
- data/Gemfile +3 -21
- data/Gemfile.lock_old +151 -0
- data/LICENSE +1 -1
- data/README.md +540 -139
- data/Rakefile +6 -1
- data/TESTING.md +25 -0
- data/aasm.gemspec +5 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_4.2.gemfile +13 -11
- data/gemfiles/rails_4.2_mongoid_5.gemfile +8 -11
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +11 -18
- 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 +40 -29
- data/lib/aasm/base.rb +61 -11
- data/lib/aasm/configuration.rb +10 -0
- data/lib/aasm/core/event.rb +45 -37
- 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 +22 -13
- data/lib/aasm/core/transition.rb +17 -69
- data/lib/aasm/dsl_helper.rb +24 -22
- data/lib/aasm/errors.rb +4 -6
- data/lib/aasm/instance_base.rb +22 -4
- data/lib/aasm/localizer.rb +13 -3
- 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 +49 -105
- data/lib/aasm/persistence/base.rb +20 -5
- data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
- data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
- data/lib/aasm/persistence/mongoid_persistence.rb +26 -32
- 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 +2 -1
- data/lib/aasm/persistence/redis_persistence.rb +16 -11
- data/lib/aasm/persistence/sequel_persistence.rb +36 -64
- data/lib/aasm/persistence.rb +3 -3
- data/lib/aasm/rspec/allow_event.rb +5 -1
- data/lib/aasm/rspec/allow_transition_to.rb +5 -1
- data/lib/aasm/rspec/transition_from.rb +5 -1
- data/lib/aasm/state_machine.rb +4 -2
- data/lib/aasm/state_machine_store.rb +5 -2
- data/lib/aasm/version.rb +1 -1
- data/lib/aasm.rb +5 -2
- data/lib/generators/aasm/orm_helpers.rb +6 -0
- data/lib/generators/active_record/aasm_generator.rb +3 -1
- data/lib/generators/active_record/templates/migration.rb +1 -1
- data/lib/generators/active_record/templates/migration_existing.rb +1 -1
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +3 -1
- data/spec/database.rb +20 -7
- data/spec/en.yml +0 -3
- data/spec/generators/active_record_generator_spec.rb +49 -40
- data/spec/generators/mongoid_generator_spec.rb +4 -6
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/{en_deprecated_style.yml → localizer_test_model_deprecated_style.yml} +6 -3
- 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/complex_active_record_example.rb +5 -1
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/{invalid_persistor.rb → active_record/invalid_persistor.rb} +0 -2
- data/spec/models/active_record/localizer_test_model.rb +11 -3
- data/spec/models/active_record/namespaced.rb +16 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/{silent_persistor.rb → active_record/silent_persistor.rb} +0 -2
- data/spec/models/active_record/simple_new_dsl.rb +15 -0
- data/spec/models/active_record/timestamp_example.rb +16 -0
- data/spec/models/{transactor.rb → active_record/transactor.rb} +25 -2
- data/spec/models/{validator.rb → active_record/validator.rb} +0 -2
- data/spec/models/active_record/work.rb +3 -0
- data/spec/models/{worker.rb → active_record/worker.rb} +0 -0
- data/spec/models/callbacks/basic.rb +5 -2
- data/spec/models/callbacks/with_state_arg.rb +5 -1
- data/spec/models/callbacks/with_state_arg_multiple.rb +4 -1
- data/spec/models/default_state.rb +1 -1
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/models/guard_with_params.rb +1 -1
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/timestamp_example_mongoid.rb +20 -0
- data/spec/models/mongoid/validator_mongoid.rb +100 -0
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
- data/spec/models/namespaced_multiple_example.rb +14 -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/{mongo_mapper/simple_mongo_mapper.rb → nobrainer/simple_no_brainer.rb} +8 -8
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/parametrised_event.rb +7 -0
- data/spec/models/{mongo_mapper/complex_mongo_mapper_example.rb → redis/complex_redis_example.rb} +8 -5
- 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 +4 -3
- data/spec/models/sequel/invalid_persistor.rb +52 -0
- data/spec/models/sequel/sequel_multiple.rb +13 -13
- data/spec/models/sequel/sequel_simple.rb +13 -12
- 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/simple_example.rb +8 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/models/simple_multiple_example.rb +12 -0
- data/spec/models/sub_class.rb +34 -0
- data/spec/models/timestamps_example.rb +19 -0
- data/spec/models/timestamps_with_named_machine_example.rb +13 -0
- data/spec/spec_helper.rb +15 -33
- 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 +79 -72
- data/spec/unit/callback_multiple_spec.rb +7 -3
- data/spec/unit/callbacks_spec.rb +37 -2
- data/spec/unit/complex_example_spec.rb +12 -3
- data/spec/unit/complex_multiple_example_spec.rb +20 -4
- data/spec/unit/event_multiple_spec.rb +1 -1
- data/spec/unit/event_spec.rb +29 -4
- data/spec/unit/exception_spec.rb +1 -1
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- data/spec/unit/guard_spec.rb +17 -0
- data/spec/unit/guard_with_params_spec.rb +4 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/inspection_multiple_spec.rb +9 -5
- data/spec/unit/inspection_spec.rb +7 -3
- 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 +85 -52
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +22 -0
- data/spec/unit/override_warning_spec.rb +8 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +468 -447
- data/spec/unit/persistence/active_record_persistence_spec.rb +639 -486
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +4 -9
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +4 -9
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +83 -13
- data/spec/unit/persistence/mongoid_persistence_spec.rb +97 -13
- 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 +8 -32
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +6 -11
- data/spec/unit/persistence/sequel_persistence_spec.rb +278 -10
- data/spec/unit/rspec_matcher_spec.rb +9 -0
- data/spec/unit/simple_example_spec.rb +15 -0
- data/spec/unit/simple_multiple_example_spec.rb +28 -0
- data/spec/unit/state_spec.rb +23 -7
- data/spec/unit/subclassing_multiple_spec.rb +37 -2
- data/spec/unit/subclassing_spec.rb +17 -2
- data/spec/unit/timestamps_spec.rb +32 -0
- data/spec/unit/transition_spec.rb +1 -1
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- metadata +213 -37
- data/callbacks.txt +0 -51
- data/gemfiles/rails_3.2_stable.gemfile +0 -15
- data/gemfiles/rails_4.0.gemfile +0 -16
- data/gemfiles/rails_4.0_mongo_mapper.gemfile +0 -16
- data/gemfiles/rails_4.2_mongo_mapper.gemfile +0 -17
- data/lib/aasm/persistence/mongo_mapper_persistence.rb +0 -163
- data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +0 -21
- data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +0 -25
- data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +0 -149
- data/spec/unit/persistence/mongo_mapper_persistence_spec.rb +0 -96
|
@@ -1,44 +1,53 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
-
require 'generator_spec'
|
|
3
|
-
require 'generators/active_record/aasm_generator'
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
3
|
+
if defined?(ActiveRecord)
|
|
4
|
+
require 'generator_spec'
|
|
5
|
+
require 'generators/active_record/aasm_generator'
|
|
6
|
+
|
|
7
|
+
describe ActiveRecord::Generators::AASMGenerator, type: :generator do
|
|
8
|
+
destination File.expand_path("../../../tmp", __FILE__)
|
|
9
|
+
|
|
10
|
+
before(:all) do
|
|
11
|
+
prepare_destination
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "creates model with aasm block for default column_name" do
|
|
15
|
+
run_generator %w(user)
|
|
16
|
+
assert_file "app/models/user.rb", /include AASM\n\n aasm do\n end\n/
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "creates model with aasm block for custom column_name" do
|
|
20
|
+
run_generator %w(user state)
|
|
21
|
+
assert_file "app/models/user.rb", /aasm :column => 'state' do\n end\n/
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "creates model with aasm block for namespaced model" do
|
|
25
|
+
run_generator %w(Admin::User state)
|
|
26
|
+
assert_file "app/models/admin/user.rb", /aasm :column => 'state' do\n end\n/
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "creates migration for model with aasm_column" do
|
|
30
|
+
run_generator %w(post)
|
|
31
|
+
assert_migration "db/migrate/aasm_create_posts.rb", /create_table(:posts) do |t|\n t.string :aasm_state\n/
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "add aasm_column in existing model" do
|
|
35
|
+
run_generator %w(job)
|
|
36
|
+
assert_file "app/models/job.rb"
|
|
37
|
+
run_generator %w(job)
|
|
38
|
+
assert_migration "db/migrate/add_aasm_state_to_jobs.rb"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "add custom aasm_column in existing model" do
|
|
42
|
+
run_generator %w(job state)
|
|
43
|
+
assert_migration "db/migrate/add_state_to_jobs.rb"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "dont add column if column is already exists" do
|
|
47
|
+
require 'models/active_record/work.rb'
|
|
48
|
+
load_schema
|
|
49
|
+
run_generator %w(work status)
|
|
50
|
+
assert_no_migration "db/migrate/add_status_to_jobs.rb"
|
|
51
|
+
end
|
|
25
52
|
end
|
|
26
|
-
|
|
27
|
-
it "creates migration for model with aasm_column" do
|
|
28
|
-
run_generator %w(post)
|
|
29
|
-
assert_migration "db/migrate/aasm_create_posts.rb", /create_table(:posts) do |t|\n t.string :aasm_state\n/
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "add aasm_column in existing model" do
|
|
33
|
-
run_generator %w(job)
|
|
34
|
-
assert_file "app/models/job.rb"
|
|
35
|
-
run_generator %w(job)
|
|
36
|
-
assert_migration "db/migrate/add_aasm_state_to_jobs.rb"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "add custom aasm_column in existing model" do
|
|
40
|
-
run_generator %w(job state)
|
|
41
|
-
assert_migration "db/migrate/add_state_to_jobs.rb"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
53
|
end
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
-
require 'generator_spec'
|
|
3
|
-
require 'generators/mongoid/aasm_generator'
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
require
|
|
3
|
+
if defined?(Mongoid::Document)
|
|
4
|
+
require 'generator_spec'
|
|
5
|
+
require 'generators/mongoid/aasm_generator'
|
|
7
6
|
|
|
8
7
|
describe Mongoid::Generators::AASMGenerator, type: :generator do
|
|
9
8
|
destination File.expand_path("../../../tmp", __FILE__)
|
|
@@ -28,6 +27,5 @@ begin
|
|
|
28
27
|
end
|
|
29
28
|
|
|
30
29
|
end
|
|
31
|
-
|
|
32
|
-
puts "Not running Mongoid specs because mongoid gem is not installed!!!"
|
|
30
|
+
|
|
33
31
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
if defined?(NoBrainer::Document)
|
|
4
|
+
require 'generator_spec'
|
|
5
|
+
require 'generators/nobrainer/aasm_generator'
|
|
6
|
+
|
|
7
|
+
describe NoBrainer::Generators::AASMGenerator, type: :generator do
|
|
8
|
+
destination File.expand_path('../../../tmp', __FILE__)
|
|
9
|
+
|
|
10
|
+
before(:all) do
|
|
11
|
+
prepare_destination
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'creates model with aasm block for default column_name' do
|
|
15
|
+
run_generator %w[user]
|
|
16
|
+
assert_file 'app/models/user.rb', /include AASM\n\n aasm do\n end\n/
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'creates model with aasm block for custom column_name' do
|
|
20
|
+
run_generator %w[user state]
|
|
21
|
+
assert_file 'app/models/user.rb', /aasm :column => 'state' do\n end\n/
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'creates model with aasm block for namespaced model' do
|
|
25
|
+
run_generator %w[Admin::User state]
|
|
26
|
+
assert_file 'app/models/admin/user.rb', /aasm :column => 'state' do\n end\n/
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
en:
|
|
2
2
|
activerecord:
|
|
3
|
-
|
|
3
|
+
attributes:
|
|
4
4
|
localizer_test_model:
|
|
5
|
-
|
|
5
|
+
aasm_state:
|
|
6
|
+
opened: "It's open now!"
|
|
6
7
|
|
|
8
|
+
fr:
|
|
9
|
+
activerecord:
|
|
7
10
|
attributes:
|
|
8
11
|
localizer_test_model:
|
|
9
12
|
aasm_state:
|
|
10
|
-
opened: "
|
|
13
|
+
opened: "C'est ouvert maintenant!"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
class ActiveRecordCallback < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
def reset_data
|
|
5
|
+
@data = []
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def data
|
|
9
|
+
@data.join(' ')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
aasm column: :status do
|
|
13
|
+
before_all_events :before_all_events
|
|
14
|
+
after_all_events :after_all_events
|
|
15
|
+
ensure_on_all_events :ensure_on_all_events
|
|
16
|
+
after_all_transitions :after_all_transitions
|
|
17
|
+
|
|
18
|
+
state :open, :initial => true,
|
|
19
|
+
:before_enter => :before_enter_open,
|
|
20
|
+
:enter => :enter_open,
|
|
21
|
+
:after_enter => :after_enter_open,
|
|
22
|
+
:before_exit => :before_exit_open,
|
|
23
|
+
:exit => :exit_open,
|
|
24
|
+
:after_exit => :after_exit_open
|
|
25
|
+
|
|
26
|
+
state :closed,
|
|
27
|
+
:before_enter => :before_enter_closed,
|
|
28
|
+
:enter => :enter_closed,
|
|
29
|
+
:after_enter => :after_enter_closed,
|
|
30
|
+
:before_exit => :before_exit_closed,
|
|
31
|
+
:exit => :exit_closed,
|
|
32
|
+
:after_exit => :after_exit_closed
|
|
33
|
+
|
|
34
|
+
event :close,
|
|
35
|
+
:before => :before_event,
|
|
36
|
+
:after => :after_event,
|
|
37
|
+
:guard => :event_guard,
|
|
38
|
+
:before_success => :event_before_success,
|
|
39
|
+
:after_commit => :event_after_commit,
|
|
40
|
+
:ensure => :ensure_event do
|
|
41
|
+
transitions :to => :closed, :from => [:open],
|
|
42
|
+
:guard => :transition_guard,
|
|
43
|
+
:after => :after_transition,
|
|
44
|
+
:success => :success_transition
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
event :open, :before => :before_event, :after => :after_event do
|
|
48
|
+
transitions :to => :open, :from => :closed
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def log(text)
|
|
53
|
+
@data ||= []
|
|
54
|
+
@data << text
|
|
55
|
+
#puts text
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def aasm_write_state(*args); log('aasm_write_state'); true; end
|
|
59
|
+
def before_enter_open; log('before_enter_open'); end
|
|
60
|
+
def enter_open; log('enter_open'); end
|
|
61
|
+
def before_exit_open; log('before_exit_open'); end
|
|
62
|
+
def after_enter_open; log('after_enter_open'); end
|
|
63
|
+
def exit_open; log('exit_open'); end
|
|
64
|
+
def after_exit_open; log('after_exit_open'); end
|
|
65
|
+
|
|
66
|
+
def before_enter_closed; log('before_enter_closed'); end
|
|
67
|
+
def enter_closed; log('enter_closed'); end
|
|
68
|
+
def before_exit_closed; log('before_exit_closed'); end
|
|
69
|
+
def exit_closed; log('exit_closed'); end
|
|
70
|
+
def after_enter_closed; log('after_enter_closed'); end
|
|
71
|
+
def after_exit_closed; log('after_exit_closed'); end
|
|
72
|
+
|
|
73
|
+
def event_guard; log('event_guard'); !@fail_event_guard; end
|
|
74
|
+
def transition_guard; log('transition_guard'); !@fail_transition_guard; end
|
|
75
|
+
|
|
76
|
+
def event_before_success; log('event_before_success'); end
|
|
77
|
+
|
|
78
|
+
def after_transition; log('after_transition'); end
|
|
79
|
+
def after_all_transitions; log('after_all_transitions'); end
|
|
80
|
+
|
|
81
|
+
def before_all_events; log('before_all_events') end
|
|
82
|
+
def before_event; log('before_event'); end
|
|
83
|
+
def after_event; log('after_event'); end
|
|
84
|
+
def after_all_events; log('after_all_events'); end
|
|
85
|
+
|
|
86
|
+
def after_transition; log('after_transition'); end
|
|
87
|
+
def success_transition; log('transition_success'); end
|
|
88
|
+
|
|
89
|
+
def ensure_event; log('ensure'); end
|
|
90
|
+
def ensure_on_all_events; log('ensure'); end
|
|
91
|
+
|
|
92
|
+
def event_after_commit; log('after_commit'); end
|
|
93
|
+
end
|
|
@@ -7,7 +7,7 @@ class ComplexActiveRecordExample < ActiveRecord::Base
|
|
|
7
7
|
state :three
|
|
8
8
|
|
|
9
9
|
event :increment do
|
|
10
|
-
transitions :from => :one, :to => :two
|
|
10
|
+
transitions :from => :one, :to => :two, guard: :allowed?
|
|
11
11
|
transitions :from => :two, :to => :three
|
|
12
12
|
end
|
|
13
13
|
event :reset do
|
|
@@ -15,6 +15,10 @@ class ComplexActiveRecordExample < ActiveRecord::Base
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
def allowed?
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
|
|
18
22
|
aasm :right, :column => 'right' do
|
|
19
23
|
state :alpha, :initial => true
|
|
20
24
|
state :beta
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class InstanceLevelSkipValidationExample < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm :state do
|
|
5
|
+
state :new, :initial => true
|
|
6
|
+
state :draft
|
|
7
|
+
state :complete
|
|
8
|
+
|
|
9
|
+
event :set_draft do
|
|
10
|
+
transitions from: :new, to: :draft
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
event :complete do
|
|
14
|
+
transitions from: %i[draft new], to: :complete
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
validates :some_string, presence: true
|
|
19
|
+
end
|
|
@@ -11,24 +11,32 @@ end
|
|
|
11
11
|
|
|
12
12
|
describe 'localized state names' do
|
|
13
13
|
before(:all) do
|
|
14
|
-
I18n.load_path << 'spec/
|
|
15
|
-
I18n.default_locale = :en
|
|
14
|
+
I18n.load_path << 'spec/localizer_test_model_new_style.yml'
|
|
16
15
|
I18n.reload!
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
after(:all) do
|
|
20
|
-
I18n.load_path.
|
|
19
|
+
I18n.load_path.delete('spec/localizer_test_model_new_style.yml')
|
|
20
|
+
I18n.backend.load_translations
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
it 'should localize' do
|
|
24
24
|
state = LocalizerTestModel.aasm.states.detect {|s| s == :opened}
|
|
25
25
|
expect(state.localized_name).to eq("It's open now!")
|
|
26
26
|
expect(state.human_name).to eq("It's open now!")
|
|
27
|
+
expect(state.display_name).to eq("It's open now!")
|
|
28
|
+
|
|
29
|
+
I18n.with_locale(:fr) do
|
|
30
|
+
expect(state.localized_name).to eq("C'est ouvert maintenant!")
|
|
31
|
+
expect(state.human_name).to eq("C'est ouvert maintenant!")
|
|
32
|
+
expect(state.display_name).to eq("C'est ouvert maintenant!")
|
|
33
|
+
end
|
|
27
34
|
end
|
|
28
35
|
|
|
29
36
|
it 'should use fallback' do
|
|
30
37
|
state = LocalizerTestModel.aasm.states.detect {|s| s == :closed}
|
|
31
38
|
expect(state.localized_name).to eq('Closed')
|
|
32
39
|
expect(state.human_name).to eq('Closed')
|
|
40
|
+
expect(state.display_name).to eq('Closed')
|
|
33
41
|
end
|
|
34
42
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class MultipleNamespaced < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm(:status, namespace: :car) do
|
|
5
|
+
state :unsold, initial: true
|
|
6
|
+
state :sold
|
|
7
|
+
|
|
8
|
+
event :sell do
|
|
9
|
+
transitions from: :unsold, to: :sold
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
event :return do
|
|
13
|
+
transitions from: :sold, to: :unsold
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class Base < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm column: 'status' do
|
|
5
|
+
state :inactive, initial: true
|
|
6
|
+
state :active
|
|
7
|
+
|
|
8
|
+
event :activate do
|
|
9
|
+
transitions from: :inactive, to: :active
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
event :deactivate do
|
|
13
|
+
transitions from: :active, to: :inactive
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
self.abstract_class = true
|
|
18
|
+
self.table_name = 'users'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Person < Base
|
|
23
|
+
end
|
|
@@ -15,3 +15,18 @@ class MultipleSimpleNewDsl < ActiveRecord::Base
|
|
|
15
15
|
state :new
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
class AbstractClassDsl < ActiveRecord::Base
|
|
20
|
+
include AASM
|
|
21
|
+
|
|
22
|
+
self.abstract_class = true
|
|
23
|
+
|
|
24
|
+
aasm :column => :status
|
|
25
|
+
aasm do
|
|
26
|
+
state :unknown_scope, :another_unknown_scope
|
|
27
|
+
state :new
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class ImplementedAbstractClassDsl < AbstractClassDsl
|
|
32
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class TimestampExample < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm column: :aasm_state, timestamps: true do
|
|
5
|
+
state :opened
|
|
6
|
+
state :closed
|
|
7
|
+
|
|
8
|
+
event :open do
|
|
9
|
+
transitions to: :opened
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
event :close do
|
|
13
|
+
transitions to: :closed
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
require 'active_record'
|
|
2
|
-
|
|
3
1
|
class Transactor < ActiveRecord::Base
|
|
4
2
|
|
|
5
3
|
belongs_to :worker
|
|
@@ -74,6 +72,31 @@ class LockNoWaitTransactor < ActiveRecord::Base
|
|
|
74
72
|
end
|
|
75
73
|
end
|
|
76
74
|
|
|
75
|
+
class NoTransactor < ActiveRecord::Base
|
|
76
|
+
|
|
77
|
+
belongs_to :worker
|
|
78
|
+
|
|
79
|
+
include AASM
|
|
80
|
+
aasm :column => :status, use_transactions: false do
|
|
81
|
+
state :sleeping, :initial => true
|
|
82
|
+
state :running, :before_enter => :start_worker, :after_enter => :fail
|
|
83
|
+
|
|
84
|
+
event :run do
|
|
85
|
+
transitions :to => :running, :from => :sleeping
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def start_worker
|
|
92
|
+
worker.update_attribute(:status, 'running')
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def fail
|
|
96
|
+
raise StandardError.new('failed on purpose')
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
77
100
|
class MultipleTransactor < ActiveRecord::Base
|
|
78
101
|
|
|
79
102
|
belongs_to :worker
|
|
File without changes
|
|
@@ -43,6 +43,7 @@ module Callbacks
|
|
|
43
43
|
:before => :before_event,
|
|
44
44
|
:after => :after_event,
|
|
45
45
|
:guard => :event_guard,
|
|
46
|
+
:before_success => :event_before_success,
|
|
46
47
|
:ensure => :ensure_event do
|
|
47
48
|
transitions :to => :closed, :from => [:open],
|
|
48
49
|
:guard => :transition_guard,
|
|
@@ -78,6 +79,8 @@ module Callbacks
|
|
|
78
79
|
def event_guard; log('event_guard'); !@fail_event_guard; end
|
|
79
80
|
def transition_guard; log('transition_guard'); !@fail_transition_guard; end
|
|
80
81
|
|
|
82
|
+
def event_before_success; log('event_before_success'); end
|
|
83
|
+
|
|
81
84
|
def after_transition; log('after_transition'); end
|
|
82
85
|
def after_all_transitions; log('after_all_transitions'); end
|
|
83
86
|
|
|
@@ -86,8 +89,8 @@ module Callbacks
|
|
|
86
89
|
def after_event; log('after_event'); end
|
|
87
90
|
def after_all_events; log('after_all_events'); end
|
|
88
91
|
|
|
89
|
-
def after_transition;
|
|
90
|
-
def success_transition;
|
|
92
|
+
def after_transition; log('after_transition'); end
|
|
93
|
+
def success_transition; log('transition_success'); end
|
|
91
94
|
|
|
92
95
|
def ensure_event; log('ensure'); end
|
|
93
96
|
def ensure_on_all_events; log('ensure'); end
|
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
|
8
8
|
state :closed
|
|
9
9
|
state :out_to_lunch
|
|
10
10
|
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method3 do
|
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method, :success => :success_method
|
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2, :success => :success_method2
|
|
14
14
|
end
|
|
@@ -16,6 +16,8 @@ module Callbacks
|
|
|
16
16
|
|
|
17
17
|
def before_method(arg); end
|
|
18
18
|
|
|
19
|
+
def before_success_method(arg); end
|
|
20
|
+
|
|
19
21
|
def after_method(arg); end
|
|
20
22
|
|
|
21
23
|
def transition_method(arg); end
|
|
@@ -26,5 +28,7 @@ module Callbacks
|
|
|
26
28
|
|
|
27
29
|
def success_method2(arg); end
|
|
28
30
|
|
|
31
|
+
def success_method3(arg); end
|
|
32
|
+
|
|
29
33
|
end
|
|
30
34
|
end
|
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
|
8
8
|
state :closed
|
|
9
9
|
state :out_to_lunch
|
|
10
10
|
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method do
|
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method
|
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2
|
|
14
14
|
end
|
|
@@ -16,11 +16,14 @@ module Callbacks
|
|
|
16
16
|
|
|
17
17
|
def before_method(arg); end
|
|
18
18
|
|
|
19
|
+
def before_success_method(arg); end
|
|
20
|
+
|
|
19
21
|
def after_method(arg); end
|
|
20
22
|
|
|
21
23
|
def transition_method(arg); end
|
|
22
24
|
|
|
23
25
|
def transition_method2(arg); end
|
|
24
26
|
|
|
27
|
+
def success_method(arg); end
|
|
25
28
|
end
|
|
26
29
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class GuardArgumentsCheck
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm do
|
|
5
|
+
state :new, :reviewed, :finalized
|
|
6
|
+
|
|
7
|
+
event :mark_as_reviewed,
|
|
8
|
+
:guard => proc { |*args| arguments_list(*args) } do
|
|
9
|
+
transitions :from => :new, :to => :reviewed
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def arguments_list(arg1, arg2)
|
|
14
|
+
return false unless arg1.nil?
|
|
15
|
+
true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class GuardianWithoutFromSpecified
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm do
|
|
5
|
+
state :alpha, :initial => true
|
|
6
|
+
state :beta
|
|
7
|
+
state :gamma
|
|
8
|
+
|
|
9
|
+
event :use_guards_where_the_first_fails do
|
|
10
|
+
transitions :to => :beta, :guard => :fail
|
|
11
|
+
transitions :to => :gamma, :guard => :succeed
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def fail; false; end
|
|
17
|
+
def succeed; true; end
|
|
18
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
class InvalidPersistorMongoid
|
|
2
|
+
include Mongoid::Document
|
|
3
|
+
include AASM
|
|
4
|
+
|
|
5
|
+
field :name
|
|
6
|
+
field :status
|
|
7
|
+
|
|
8
|
+
aasm :left, column: :status, skip_validation_on_save: true do
|
|
9
|
+
state :sleeping, :initial => true
|
|
10
|
+
state :running
|
|
11
|
+
event :run do
|
|
12
|
+
transitions :to => :running, :from => :sleeping
|
|
13
|
+
end
|
|
14
|
+
event :sleep do
|
|
15
|
+
transitions :to => :sleeping, :from => :running
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
validates_presence_of :name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class MultipleInvalidPersistorMongoid
|
|
22
|
+
include Mongoid::Document
|
|
23
|
+
include AASM
|
|
24
|
+
|
|
25
|
+
field :name
|
|
26
|
+
field :status
|
|
27
|
+
|
|
28
|
+
aasm :left, column: :status, skip_validation_on_save: true do
|
|
29
|
+
state :sleeping, :initial => true
|
|
30
|
+
state :running
|
|
31
|
+
event :run do
|
|
32
|
+
transitions :to => :running, :from => :sleeping
|
|
33
|
+
end
|
|
34
|
+
event :sleep do
|
|
35
|
+
transitions :to => :sleeping, :from => :running
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
validates_presence_of :name
|
|
39
|
+
end
|