aasm 4.5.1 → 5.5.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 +1 -1
- data/README.md +809 -129
- data/lib/aasm/aasm.rb +74 -37
- data/lib/aasm/base.rb +188 -41
- data/lib/aasm/configuration.rb +27 -2
- data/lib/aasm/core/event.rb +75 -47
- 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 +49 -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 +30 -23
- data/lib/aasm/dsl_helper.rb +24 -22
- data/lib/aasm/errors.rb +8 -5
- data/lib/aasm/instance_base.rb +63 -15
- 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 +87 -79
- data/lib/aasm/persistence/base.rb +30 -30
- 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 +49 -35
- 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 +112 -0
- data/lib/aasm/persistence/sequel_persistence.rb +37 -67
- data/lib/aasm/persistence.rb +20 -5
- 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 +8 -4
- data/lib/aasm/state_machine.rb +6 -12
- data/lib/aasm/state_machine_store.rb +76 -0
- data/lib/aasm/version.rb +1 -1
- data/lib/aasm.rb +8 -2
- 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
- metadata +104 -259
- data/.document +0 -6
- data/.gitignore +0 -19
- data/.travis.yml +0 -37
- data/API +0 -34
- data/CHANGELOG.md +0 -272
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -15
- data/HOWTO +0 -12
- data/PLANNED_CHANGES.md +0 -11
- data/README_FROM_VERSION_3_TO_4.md +0 -240
- data/Rakefile +0 -26
- data/aasm.gemspec +0 -31
- data/callbacks.txt +0 -51
- data/gemfiles/rails_3.2.gemfile +0 -14
- data/gemfiles/rails_4.0.gemfile +0 -12
- data/gemfiles/rails_4.0_mongo_mapper.gemfile +0 -14
- data/gemfiles/rails_4.1.gemfile +0 -12
- data/gemfiles/rails_4.1_mongo_mapper.gemfile +0 -14
- data/gemfiles/rails_4.2.gemfile +0 -12
- data/gemfiles/rails_4.2_mongo_mapper.gemfile +0 -14
- data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -12
- data/lib/aasm/persistence/mongo_mapper_persistence.rb +0 -157
- data/spec/database.rb +0 -63
- data/spec/database.yml +0 -3
- data/spec/en.yml +0 -9
- data/spec/en_deprecated_style.yml +0 -10
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
- data/spec/models/active_record/complex_active_record_example.rb +0 -33
- data/spec/models/active_record/derivate_new_dsl.rb +0 -7
- data/spec/models/active_record/false_state.rb +0 -35
- data/spec/models/active_record/gate.rb +0 -39
- data/spec/models/active_record/localizer_test_model.rb +0 -34
- data/spec/models/active_record/no_direct_assignment.rb +0 -21
- data/spec/models/active_record/no_scope.rb +0 -21
- data/spec/models/active_record/persisted_state.rb +0 -12
- data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
- data/spec/models/active_record/reader.rb +0 -7
- data/spec/models/active_record/readme_job.rb +0 -21
- data/spec/models/active_record/simple_new_dsl.rb +0 -17
- data/spec/models/active_record/thief.rb +0 -29
- data/spec/models/active_record/transient.rb +0 -6
- data/spec/models/active_record/with_enum.rb +0 -39
- data/spec/models/active_record/with_false_enum.rb +0 -31
- data/spec/models/active_record/with_true_enum.rb +0 -39
- data/spec/models/active_record/writer.rb +0 -6
- data/spec/models/basic_two_state_machines_example.rb +0 -25
- data/spec/models/callbacks/basic.rb +0 -78
- data/spec/models/callbacks/basic_multiple.rb +0 -75
- data/spec/models/callbacks/guard_within_block.rb +0 -66
- data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
- data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -65
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
- data/spec/models/callbacks/private_method.rb +0 -44
- data/spec/models/callbacks/private_method_multiple.rb +0 -44
- data/spec/models/callbacks/with_args.rb +0 -61
- data/spec/models/callbacks/with_args_multiple.rb +0 -61
- data/spec/models/callbacks/with_state_arg.rb +0 -26
- data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
- data/spec/models/complex_example.rb +0 -222
- data/spec/models/conversation.rb +0 -93
- data/spec/models/default_state.rb +0 -12
- data/spec/models/double_definer.rb +0 -21
- data/spec/models/foo.rb +0 -92
- data/spec/models/foo_callback_multiple.rb +0 -45
- data/spec/models/guardian.rb +0 -48
- data/spec/models/guardian_multiple.rb +0 -48
- data/spec/models/initial_state_proc.rb +0 -31
- data/spec/models/invalid_persistor.rb +0 -31
- data/spec/models/mongo_mapper/complex_mongo_mapper_example.rb +0 -37
- data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +0 -21
- data/spec/models/mongo_mapper/simple_mongo_mapper.rb +0 -23
- data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +0 -25
- data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
- data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
- data/spec/models/mongoid/simple_mongoid.rb +0 -23
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
- data/spec/models/no_initial_state.rb +0 -25
- data/spec/models/not_auto_loaded/process.rb +0 -21
- data/spec/models/parametrised_event.rb +0 -29
- data/spec/models/parametrised_event_multiple.rb +0 -29
- data/spec/models/process_with_new_dsl.rb +0 -31
- data/spec/models/provided_state.rb +0 -24
- data/spec/models/sequel/complex_sequel_example.rb +0 -45
- data/spec/models/sequel/sequel_multiple.rb +0 -25
- data/spec/models/sequel/sequel_simple.rb +0 -25
- data/spec/models/silencer.rb +0 -27
- data/spec/models/simple_example.rb +0 -15
- data/spec/models/simple_multiple_example.rb +0 -30
- data/spec/models/state_machine_with_failed_event.rb +0 -12
- data/spec/models/sub_class.rb +0 -7
- data/spec/models/sub_class_with_more_states.rb +0 -18
- data/spec/models/sub_classing.rb +0 -3
- data/spec/models/super_class.rb +0 -46
- data/spec/models/this_name_better_not_be_in_use.rb +0 -11
- data/spec/models/transactor.rb +0 -53
- data/spec/models/valid_state_name.rb +0 -23
- data/spec/models/validator.rb +0 -79
- data/spec/models/worker.rb +0 -2
- data/spec/spec_helper.rb +0 -25
- data/spec/unit/api_spec.rb +0 -77
- data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
- data/spec/unit/callback_multiple_spec.rb +0 -295
- data/spec/unit/callbacks_spec.rb +0 -296
- data/spec/unit/complex_example_spec.rb +0 -84
- data/spec/unit/complex_multiple_example_spec.rb +0 -99
- data/spec/unit/edge_cases_spec.rb +0 -16
- data/spec/unit/event_multiple_spec.rb +0 -73
- data/spec/unit/event_naming_spec.rb +0 -11
- data/spec/unit/event_spec.rb +0 -322
- data/spec/unit/guard_multiple_spec.rb +0 -60
- data/spec/unit/guard_spec.rb +0 -60
- data/spec/unit/initial_state_multiple_spec.rb +0 -15
- data/spec/unit/initial_state_spec.rb +0 -12
- data/spec/unit/inspection_multiple_spec.rb +0 -201
- data/spec/unit/inspection_spec.rb +0 -111
- data/spec/unit/localizer_spec.rb +0 -76
- data/spec/unit/memory_leak_spec.rb +0 -38
- data/spec/unit/new_dsl_spec.rb +0 -12
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -573
- data/spec/unit/persistence/active_record_persistence_spec.rb +0 -552
- data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +0 -146
- data/spec/unit/persistence/mongo_mapper_persistence_spec.rb +0 -93
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -127
- data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -79
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -153
- data/spec/unit/persistence/sequel_persistence_spec.rb +0 -100
- data/spec/unit/readme_spec.rb +0 -42
- data/spec/unit/reloading_spec.rb +0 -15
- data/spec/unit/rspec_matcher_spec.rb +0 -79
- data/spec/unit/simple_example_spec.rb +0 -42
- data/spec/unit/simple_multiple_example_spec.rb +0 -63
- data/spec/unit/state_spec.rb +0 -89
- data/spec/unit/subclassing_multiple_spec.rb +0 -39
- data/spec/unit/subclassing_spec.rb +0 -31
- data/spec/unit/transition_spec.rb +0 -291
data/gemfiles/rails_3.2.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem 'rubysl', :platforms => :rbx
|
5
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
6
|
-
gem "jruby-openssl", :platforms => :jruby
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
|
-
gem "rails", "3.2.21"
|
9
|
-
gem 'mongoid', '~>3.1' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
-
gem 'sequel'
|
11
|
-
gem 'mongo_mapper', '~>0.13'
|
12
|
-
gem 'bson_ext', :platforms => :ruby
|
13
|
-
|
14
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4.0.gemfile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem 'rubysl', :platforms => :rbx
|
5
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
6
|
-
gem "jruby-openssl", :platforms => :jruby
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
|
-
gem "rails", "4.0.13"
|
9
|
-
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
-
gem 'sequel'
|
11
|
-
|
12
|
-
gemspec :path => "../"
|
@@ -1,14 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem "coveralls"
|
5
|
-
gem 'rubysl', :platforms => :rbx
|
6
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
7
|
-
gem "jruby-openssl", :platforms => :jruby
|
8
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
9
|
-
gem "rails", "4.0.13"
|
10
|
-
gem 'sequel'
|
11
|
-
gem 'mongo_mapper', '~>0.13'
|
12
|
-
gem 'bson_ext', :platforms => :ruby
|
13
|
-
|
14
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4.1.gemfile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem 'rubysl', :platforms => :rbx
|
5
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
6
|
-
gem "jruby-openssl", :platforms => :jruby
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
|
-
gem "rails", "4.1.9"
|
9
|
-
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
-
gem 'sequel'
|
11
|
-
|
12
|
-
gemspec :path => "../"
|
@@ -1,14 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem "coveralls"
|
5
|
-
gem 'rubysl', :platforms => :rbx
|
6
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
7
|
-
gem "jruby-openssl", :platforms => :jruby
|
8
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
9
|
-
gem "rails", "4.1.9"
|
10
|
-
gem 'sequel'
|
11
|
-
gem 'mongo_mapper', '~> 0.13'
|
12
|
-
gem 'bson_ext', :platforms => :ruby
|
13
|
-
|
14
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4.2.gemfile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem 'rubysl', :platforms => :rbx
|
5
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
6
|
-
gem "jruby-openssl", :platforms => :jruby
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
|
-
gem "rails", "4.2.0"
|
9
|
-
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
-
gem 'sequel'
|
11
|
-
|
12
|
-
gemspec :path => "../"
|
@@ -1,14 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem "coveralls"
|
5
|
-
gem 'rubysl', :platforms => :rbx
|
6
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
7
|
-
gem "jruby-openssl", :platforms => :jruby
|
8
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
9
|
-
gem "rails", "4.2.0"
|
10
|
-
gem 'sequel'
|
11
|
-
gem 'mongo_mapper'
|
12
|
-
gem 'bson_ext', :platforms => :ruby
|
13
|
-
|
14
|
-
gemspec :path => "../"
|
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem 'rubysl', :platforms => :rbx
|
5
|
-
gem 'rubinius-developer_tools', :platforms => :rbx
|
6
|
-
gem "jruby-openssl", :platforms => :jruby
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
|
-
gem "rails", "4.2.0"
|
9
|
-
gem 'mongoid', '~>5.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
-
gem 'sequel'
|
11
|
-
|
12
|
-
gemspec :path => "../"
|
@@ -1,157 +0,0 @@
|
|
1
|
-
require_relative 'base'
|
2
|
-
|
3
|
-
module AASM
|
4
|
-
module Persistence
|
5
|
-
module MongoMapperPersistence
|
6
|
-
# This method:
|
7
|
-
#
|
8
|
-
# * extends the model with ClassMethods
|
9
|
-
# * includes InstanceMethods
|
10
|
-
#
|
11
|
-
# Adds
|
12
|
-
#
|
13
|
-
# before_validation :aasm_ensure_initial_state, :on => :create
|
14
|
-
#
|
15
|
-
# As a result, it doesn't matter when you define your methods - the following 2 are equivalent
|
16
|
-
#
|
17
|
-
# class Foo
|
18
|
-
# include MongoMapper::Document
|
19
|
-
# def aasm_write_state(state)
|
20
|
-
# "bar"
|
21
|
-
# end
|
22
|
-
# include AASM
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# class Foo < ActiveRecord::Base
|
26
|
-
# include MongoMapper::Document
|
27
|
-
# include AASM
|
28
|
-
# def aasm_write_state(state)
|
29
|
-
# "bar"
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
def self.included(base)
|
34
|
-
base.send(:include, AASM::Persistence::Base)
|
35
|
-
base.send(:include, AASM::Persistence::MongoMapperPersistence::InstanceMethods)
|
36
|
-
|
37
|
-
base.before_create :aasm_ensure_initial_state
|
38
|
-
|
39
|
-
# ensure state is in the list of states
|
40
|
-
base.validate :aasm_validate_states
|
41
|
-
end
|
42
|
-
|
43
|
-
module InstanceMethods
|
44
|
-
|
45
|
-
# Writes <tt>state</tt> to the state column and persists it to the database
|
46
|
-
#
|
47
|
-
# foo = Foo.find(1)
|
48
|
-
# foo.aasm.current_state # => :opened
|
49
|
-
# foo.close!
|
50
|
-
# foo.aasm.current_state # => :closed
|
51
|
-
# Foo.find(1).aasm.current_state # => :closed
|
52
|
-
#
|
53
|
-
# NOTE: intended to be called from an event
|
54
|
-
def aasm_write_state(state, name=:default)
|
55
|
-
old_value = read_attribute(self.class.aasm(name).attribute_name)
|
56
|
-
write_attribute(self.class.aasm(name).attribute_name, state)
|
57
|
-
|
58
|
-
success = if aasm_skipping_validations(name)
|
59
|
-
value = aasm_raw_attribute_value(state, name)
|
60
|
-
self.class.where(self.class.primary_key => self.id).update_all(self.class.aasm(name).attribute_name => value) == 1
|
61
|
-
else
|
62
|
-
self.save
|
63
|
-
end
|
64
|
-
unless success
|
65
|
-
write_attribute(self.class.aasm(name).attribute_name, old_value)
|
66
|
-
return false
|
67
|
-
end
|
68
|
-
|
69
|
-
true
|
70
|
-
end
|
71
|
-
|
72
|
-
# Writes <tt>state</tt> to the state column, but does not persist it to the database
|
73
|
-
#
|
74
|
-
# foo = Foo.find(1)
|
75
|
-
# foo.aasm.current_state # => :opened
|
76
|
-
# foo.close
|
77
|
-
# foo.aasm.current_state # => :closed
|
78
|
-
# Foo.find(1).aasm.current_state # => :opened
|
79
|
-
# foo.save
|
80
|
-
# foo.aasm.current_state # => :closed
|
81
|
-
# Foo.find(1).aasm.current_state # => :closed
|
82
|
-
#
|
83
|
-
# NOTE: intended to be called from an event
|
84
|
-
def aasm_write_state_without_persistence(state, name=:default)
|
85
|
-
aasm_write_attribute(state, name)
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
def aasm_enum(name=:default)
|
90
|
-
case AASM::StateMachine[self.class][name].config.enum
|
91
|
-
when false then nil
|
92
|
-
when true then aasm_guess_enum_method(name)
|
93
|
-
when nil then aasm_guess_enum_method(name) if aasm_column_looks_like_enum(name)
|
94
|
-
else AASM::StateMachine[self.class][name].config.enum
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def aasm_column_looks_like_enum(name)
|
99
|
-
self.class.keys[self.class.aasm(name).attribute_name.to_s].type == Integer
|
100
|
-
end
|
101
|
-
|
102
|
-
def aasm_guess_enum_method(name)
|
103
|
-
self.class.aasm(name).attribute_name.to_s.pluralize.to_sym
|
104
|
-
end
|
105
|
-
|
106
|
-
def aasm_skipping_validations(state_machine_name)
|
107
|
-
AASM::StateMachine[self.class][state_machine_name].config.skip_validation_on_save
|
108
|
-
end
|
109
|
-
|
110
|
-
def aasm_write_attribute(state, name=:default)
|
111
|
-
write_attribute self.class.aasm(name).attribute_name, aasm_raw_attribute_value(state, name)
|
112
|
-
end
|
113
|
-
|
114
|
-
def aasm_raw_attribute_value(state, name=:default)
|
115
|
-
if aasm_enum(name)
|
116
|
-
self.class.send(aasm_enum(name))[state]
|
117
|
-
else
|
118
|
-
state.to_s
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# Ensures that if the aasm_state column is nil and the record is new
|
123
|
-
# that the initial state gets populated before validation on create
|
124
|
-
#
|
125
|
-
# foo = Foo.new
|
126
|
-
# foo.aasm_state # => nil
|
127
|
-
# foo.valid?
|
128
|
-
# foo.aasm_state # => "open" (where :open is the initial state)
|
129
|
-
#
|
130
|
-
#
|
131
|
-
# foo = Foo.find(:first)
|
132
|
-
# foo.aasm_state # => 1
|
133
|
-
# foo.aasm_state = nil
|
134
|
-
# foo.valid?
|
135
|
-
# foo.aasm_state # => nil
|
136
|
-
#
|
137
|
-
def aasm_ensure_initial_state
|
138
|
-
AASM::StateMachine[self.class].keys.each do |state_machine_name|
|
139
|
-
send("#{self.class.aasm(state_machine_name).attribute_name}=", aasm(state_machine_name).enter_initial_state.to_s) if send(self.class.aasm(state_machine_name).attribute_name).blank?
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def aasm_validate_states
|
144
|
-
AASM::StateMachine[self.class].keys.each do |state_machine_name|
|
145
|
-
send("#{self.class.aasm(state_machine_name).attribute_name}=", aasm(state_machine_name).enter_initial_state.to_s) if send(self.class.aasm(state_machine_name).attribute_name).blank?
|
146
|
-
unless AASM::StateMachine[self.class][state_machine_name].config.skip_validation_on_save
|
147
|
-
if aasm(state_machine_name).current_state && !aasm(state_machine_name).states.include?(aasm(state_machine_name).current_state)
|
148
|
-
self.errors.add(AASM::StateMachine[self.class][state_machine_name].config.column , "is invalid")
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end # InstanceMethods
|
154
|
-
|
155
|
-
end
|
156
|
-
end # Persistence
|
157
|
-
end # AASM
|
data/spec/database.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
ActiveRecord::Migration.suppress_messages do
|
2
|
-
%w{gates multiple_gates readers writers transients simples no_scopes multiple_no_scopes no_direct_assignments multiple_no_direct_assignments thieves multiple_thieves localizer_test_models persisted_states provided_and_persisted_states with_enums with_true_enums with_false_enums false_states multiple_with_enums multiple_with_true_enums multiple_with_false_enums multiple_false_states readme_jobs}.each do |table_name|
|
3
|
-
ActiveRecord::Migration.create_table table_name, :force => true do |t|
|
4
|
-
t.string "aasm_state"
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
ActiveRecord::Migration.create_table "simple_new_dsls", :force => true do |t|
|
9
|
-
t.string "status"
|
10
|
-
end
|
11
|
-
ActiveRecord::Migration.create_table "multiple_simple_new_dsls", :force => true do |t|
|
12
|
-
t.string "status"
|
13
|
-
end
|
14
|
-
|
15
|
-
ActiveRecord::Migration.create_table "complex_active_record_examples", :force => true do |t|
|
16
|
-
t.string "left"
|
17
|
-
t.string "right"
|
18
|
-
end
|
19
|
-
|
20
|
-
ActiveRecord::Migration.create_table "validators", :force => true do |t|
|
21
|
-
t.string "name"
|
22
|
-
t.string "status"
|
23
|
-
end
|
24
|
-
ActiveRecord::Migration.create_table "multiple_validators", :force => true do |t|
|
25
|
-
t.string "name"
|
26
|
-
t.string "status"
|
27
|
-
end
|
28
|
-
|
29
|
-
ActiveRecord::Migration.create_table "transactors", :force => true do |t|
|
30
|
-
t.string "name"
|
31
|
-
t.string "status"
|
32
|
-
t.integer "worker_id"
|
33
|
-
end
|
34
|
-
ActiveRecord::Migration.create_table "multiple_transactors", :force => true do |t|
|
35
|
-
t.string "name"
|
36
|
-
t.string "status"
|
37
|
-
t.integer "worker_id"
|
38
|
-
end
|
39
|
-
|
40
|
-
ActiveRecord::Migration.create_table "workers", :force => true do |t|
|
41
|
-
t.string "name"
|
42
|
-
t.string "status"
|
43
|
-
end
|
44
|
-
|
45
|
-
ActiveRecord::Migration.create_table "invalid_persistors", :force => true do |t|
|
46
|
-
t.string "name"
|
47
|
-
t.string "status"
|
48
|
-
end
|
49
|
-
ActiveRecord::Migration.create_table "multiple_invalid_persistors", :force => true do |t|
|
50
|
-
t.string "name"
|
51
|
-
t.string "status"
|
52
|
-
end
|
53
|
-
|
54
|
-
ActiveRecord::Migration.create_table "fathers", :force => true do |t|
|
55
|
-
t.string "aasm_state"
|
56
|
-
t.string "type"
|
57
|
-
end
|
58
|
-
|
59
|
-
ActiveRecord::Migration.create_table "basic_active_record_two_state_machines_examples", :force => true do |t|
|
60
|
-
t.string "search"
|
61
|
-
t.string "sync"
|
62
|
-
end
|
63
|
-
end
|
data/spec/database.yml
DELETED
data/spec/en.yml
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
class BasicActiveRecordTwoStateMachinesExample < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
aasm :search do
|
5
|
-
state :initialised, :initial => true
|
6
|
-
state :queried
|
7
|
-
state :requested
|
8
|
-
|
9
|
-
event :query do
|
10
|
-
transitions :from => [:initialised, :requested], :to => :queried
|
11
|
-
end
|
12
|
-
event :request do
|
13
|
-
transitions :from => :queried, :to => :requested
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
aasm :sync do
|
18
|
-
state :unsynced, :initial => true
|
19
|
-
state :synced
|
20
|
-
|
21
|
-
event :synchronise do
|
22
|
-
transitions :from => :unsynced, :to => :synced
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
class ComplexActiveRecordExample < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
aasm :left, :column => 'left' do
|
5
|
-
state :one, :initial => true
|
6
|
-
state :two
|
7
|
-
state :three
|
8
|
-
|
9
|
-
event :increment do
|
10
|
-
transitions :from => :one, :to => :two
|
11
|
-
transitions :from => :two, :to => :three
|
12
|
-
end
|
13
|
-
event :reset do
|
14
|
-
transitions :from => :three, :to => :one
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
aasm :right, :column => 'right' do
|
19
|
-
state :alpha, :initial => true
|
20
|
-
state :beta
|
21
|
-
state :gamma
|
22
|
-
|
23
|
-
event :level_up do
|
24
|
-
transitions :from => :alpha, :to => :beta
|
25
|
-
transitions :from => :beta, :to => :gamma
|
26
|
-
end
|
27
|
-
event :level_down do
|
28
|
-
transitions :from => :gamma, :to => :beta
|
29
|
-
transitions :from => :beta, :to => :alpha
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
class FalseState < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
def initialize(*args)
|
5
|
-
super
|
6
|
-
self.aasm_state = false
|
7
|
-
end
|
8
|
-
|
9
|
-
aasm do
|
10
|
-
state :opened
|
11
|
-
state :closed
|
12
|
-
|
13
|
-
event :view do
|
14
|
-
transitions :to => :read, :from => [:needs_attention]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class MultipleFalseState < ActiveRecord::Base
|
20
|
-
include AASM
|
21
|
-
|
22
|
-
def initialize(*args)
|
23
|
-
super
|
24
|
-
self.aasm_state = false
|
25
|
-
end
|
26
|
-
|
27
|
-
aasm :left do
|
28
|
-
state :opened
|
29
|
-
state :closed
|
30
|
-
|
31
|
-
event :view do
|
32
|
-
transitions :to => :read, :from => [:needs_attention]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class Gate < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
# Fake this column for testing purposes
|
5
|
-
# attr_accessor :aasm_state
|
6
|
-
|
7
|
-
def value
|
8
|
-
'value'
|
9
|
-
end
|
10
|
-
|
11
|
-
aasm do
|
12
|
-
state :opened
|
13
|
-
state :closed
|
14
|
-
|
15
|
-
event :view do
|
16
|
-
transitions :to => :read, :from => [:needs_attention]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class MultipleGate < ActiveRecord::Base
|
22
|
-
include AASM
|
23
|
-
|
24
|
-
# Fake this column for testing purposes
|
25
|
-
# attr_accessor :aasm_state
|
26
|
-
|
27
|
-
def value
|
28
|
-
'value'
|
29
|
-
end
|
30
|
-
|
31
|
-
aasm :left, :column => :aasm_state do
|
32
|
-
state :opened
|
33
|
-
state :closed
|
34
|
-
|
35
|
-
event :view do
|
36
|
-
transitions :to => :read, :from => [:needs_attention]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
class LocalizerTestModel < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
aasm do
|
5
|
-
state :opened, :initial => true
|
6
|
-
state :closed
|
7
|
-
event :close
|
8
|
-
event :open
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe 'localized state names' do
|
13
|
-
before(:all) do
|
14
|
-
I18n.load_path << 'spec/en.yml'
|
15
|
-
I18n.default_locale = :en
|
16
|
-
I18n.reload!
|
17
|
-
end
|
18
|
-
|
19
|
-
after(:all) do
|
20
|
-
I18n.load_path.clear
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should localize' do
|
24
|
-
state = LocalizerTestModel.aasm.states.detect {|s| s == :opened}
|
25
|
-
expect(state.localized_name).to eq("It's open now!")
|
26
|
-
expect(state.human_name).to eq("It's open now!")
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should use fallback' do
|
30
|
-
state = LocalizerTestModel.aasm.states.detect {|s| s == :closed}
|
31
|
-
expect(state.localized_name).to eq('Closed')
|
32
|
-
expect(state.human_name).to eq('Closed')
|
33
|
-
end
|
34
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class NoDirectAssignment < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
aasm :no_direct_assignment => true do
|
4
|
-
state :pending, :initial => true
|
5
|
-
state :running
|
6
|
-
event :run do
|
7
|
-
transitions :from => :pending, :to => :running
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class MultipleNoDirectAssignment < ActiveRecord::Base
|
13
|
-
include AASM
|
14
|
-
aasm :left, :column => :aasm_state, :no_direct_assignment => true do
|
15
|
-
state :pending, :initial => true
|
16
|
-
state :running
|
17
|
-
event :run do
|
18
|
-
transitions :from => :pending, :to => :running
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class NoScope < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
aasm :create_scopes => false do
|
4
|
-
state :pending, :initial => true
|
5
|
-
state :running
|
6
|
-
event :run do
|
7
|
-
transitions :from => :pending, :to => :running
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class MultipleNoScope < ActiveRecord::Base
|
13
|
-
include AASM
|
14
|
-
aasm :left, :column => :aasm_state, :create_scopes => false do
|
15
|
-
state :pending, :initial => true
|
16
|
-
state :running
|
17
|
-
event :run do
|
18
|
-
transitions :from => :pending, :to => :running
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class PersistedState < ActiveRecord::Base
|
2
|
-
attr_accessor :transient_store, :persisted_store
|
3
|
-
include AASM
|
4
|
-
aasm do
|
5
|
-
state :alpha, :initial => true
|
6
|
-
state :beta
|
7
|
-
state :gamma
|
8
|
-
event :release do
|
9
|
-
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class ProvidedAndPersistedState < ActiveRecord::Base
|
2
|
-
attr_accessor :transient_store, :persisted_store
|
3
|
-
include AASM
|
4
|
-
aasm do
|
5
|
-
state :alpha, :initial => true
|
6
|
-
state :beta
|
7
|
-
state :gamma
|
8
|
-
event :release do
|
9
|
-
transitions :from => [:alpha, :beta, :gamma], :to => :beta
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def aasm_read_state(*args)
|
14
|
-
:gamma
|
15
|
-
end
|
16
|
-
|
17
|
-
def aasm_write_state(new_state, *args)
|
18
|
-
@persisted_store = new_state
|
19
|
-
end
|
20
|
-
|
21
|
-
def aasm_write_state_without_persistence(new_state, *args)
|
22
|
-
@transient_store = new_state
|
23
|
-
end
|
24
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class ReadmeJob < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
|
4
|
-
aasm do
|
5
|
-
state :sleeping, :initial => true
|
6
|
-
state :running
|
7
|
-
state :cleaning
|
8
|
-
|
9
|
-
event :run do
|
10
|
-
transitions :from => :sleeping, :to => :running
|
11
|
-
end
|
12
|
-
|
13
|
-
event :clean do
|
14
|
-
transitions :from => :running, :to => :cleaning
|
15
|
-
end
|
16
|
-
|
17
|
-
event :sleep do
|
18
|
-
transitions :from => [:running, :cleaning], :to => :sleeping
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class SimpleNewDsl < ActiveRecord::Base
|
2
|
-
include AASM
|
3
|
-
aasm :column => :status
|
4
|
-
aasm do
|
5
|
-
state :unknown_scope
|
6
|
-
state :new
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class MultipleSimpleNewDsl < ActiveRecord::Base
|
11
|
-
include AASM
|
12
|
-
aasm :left, :column => :status
|
13
|
-
aasm :left do
|
14
|
-
state :unknown_scope
|
15
|
-
state :new
|
16
|
-
end
|
17
|
-
end
|