aasm 4.11.1 → 4.12.1

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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +19 -16
  3. data/Appraisals +46 -0
  4. data/CHANGELOG.md +19 -0
  5. data/CONTRIBUTING.md +24 -0
  6. data/Gemfile +4 -21
  7. data/README.md +154 -39
  8. data/Rakefile +6 -1
  9. data/TESTING.md +25 -0
  10. data/aasm.gemspec +3 -0
  11. data/gemfiles/rails_3.2.gemfile +13 -0
  12. data/gemfiles/rails_4.0.gemfile +8 -9
  13. data/gemfiles/rails_4.2.gemfile +10 -9
  14. data/gemfiles/rails_4.2_mongoid_5.gemfile +5 -9
  15. data/gemfiles/rails_5.0.gemfile +8 -16
  16. data/lib/aasm/aasm.rb +9 -3
  17. data/lib/aasm/base.rb +11 -1
  18. data/lib/aasm/configuration.rb +4 -0
  19. data/lib/aasm/core/event.rb +18 -4
  20. data/lib/aasm/core/state.rb +7 -0
  21. data/lib/aasm/core/transition.rb +10 -1
  22. data/lib/aasm/instance_base.rb +0 -2
  23. data/lib/aasm/minitest/allow_event.rb +13 -0
  24. data/lib/aasm/minitest/allow_transition_to.rb +13 -0
  25. data/lib/aasm/minitest/have_state.rb +13 -0
  26. data/lib/aasm/minitest/transition_from.rb +21 -0
  27. data/lib/aasm/minitest.rb +5 -0
  28. data/lib/aasm/minitest_spec.rb +15 -0
  29. data/lib/aasm/persistence/active_record_persistence.rb +25 -101
  30. data/lib/aasm/persistence/base.rb +7 -3
  31. data/lib/aasm/persistence/mongoid_persistence.rb +25 -31
  32. data/lib/aasm/persistence/orm.rb +142 -0
  33. data/lib/aasm/persistence/redis_persistence.rb +16 -11
  34. data/lib/aasm/persistence/sequel_persistence.rb +36 -63
  35. data/lib/aasm/persistence.rb +0 -3
  36. data/lib/aasm/state_machine.rb +4 -2
  37. data/lib/aasm/state_machine_store.rb +5 -2
  38. data/lib/aasm/version.rb +1 -1
  39. data/lib/generators/active_record/templates/migration.rb +1 -1
  40. data/lib/generators/active_record/templates/migration_existing.rb +1 -1
  41. data/lib/motion-aasm.rb +2 -1
  42. data/spec/generators/active_record_generator_spec.rb +42 -39
  43. data/spec/generators/mongoid_generator_spec.rb +4 -6
  44. data/spec/models/active_record/complex_active_record_example.rb +5 -1
  45. data/spec/models/{invalid_persistor.rb → active_record/invalid_persistor.rb} +0 -2
  46. data/spec/models/{silent_persistor.rb → active_record/silent_persistor.rb} +0 -2
  47. data/spec/models/{transactor.rb → active_record/transactor.rb} +0 -2
  48. data/spec/models/{validator.rb → active_record/validator.rb} +0 -2
  49. data/spec/models/callbacks/basic.rb +5 -2
  50. data/spec/models/guard_with_params.rb +1 -1
  51. data/spec/models/guardian_without_from_specified.rb +18 -0
  52. data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
  53. data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
  54. data/spec/models/mongoid/validator_mongoid.rb +100 -0
  55. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
  56. data/spec/models/namespaced_multiple_example.rb +14 -0
  57. data/spec/models/parametrised_event.rb +7 -0
  58. data/spec/models/{mongo_mapper/complex_mongo_mapper_example.rb → redis/complex_redis_example.rb} +8 -5
  59. data/spec/models/redis/redis_multiple.rb +20 -0
  60. data/spec/models/redis/redis_simple.rb +20 -0
  61. data/spec/models/sequel/complex_sequel_example.rb +4 -3
  62. data/spec/models/sequel/invalid_persistor.rb +52 -0
  63. data/spec/models/sequel/sequel_multiple.rb +13 -13
  64. data/spec/models/sequel/sequel_simple.rb +13 -12
  65. data/spec/models/sequel/silent_persistor.rb +50 -0
  66. data/spec/models/sequel/transactor.rb +112 -0
  67. data/spec/models/sequel/validator.rb +93 -0
  68. data/spec/models/sequel/worker.rb +12 -0
  69. data/spec/models/simple_multiple_example.rb +12 -0
  70. data/spec/models/sub_class.rb +34 -0
  71. data/spec/spec_helper.rb +0 -33
  72. data/spec/spec_helpers/active_record.rb +7 -0
  73. data/spec/spec_helpers/dynamoid.rb +33 -0
  74. data/spec/spec_helpers/mongoid.rb +7 -0
  75. data/spec/spec_helpers/redis.rb +15 -0
  76. data/spec/spec_helpers/remove_warnings.rb +1 -0
  77. data/spec/spec_helpers/sequel.rb +7 -0
  78. data/spec/unit/api_spec.rb +76 -73
  79. data/spec/unit/callbacks_spec.rb +5 -0
  80. data/spec/unit/event_spec.rb +12 -0
  81. data/spec/unit/guard_spec.rb +17 -0
  82. data/spec/unit/guard_with_params_spec.rb +4 -0
  83. data/spec/unit/guard_without_from_specified_spec.rb +10 -0
  84. data/spec/unit/localizer_spec.rb +55 -53
  85. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
  86. data/spec/unit/namespaced_multiple_example_spec.rb +22 -0
  87. data/spec/unit/override_warning_spec.rb +8 -0
  88. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +453 -449
  89. data/spec/unit/persistence/active_record_persistence_spec.rb +524 -502
  90. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +4 -9
  91. data/spec/unit/persistence/dynamoid_persistence_spec.rb +4 -9
  92. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +83 -9
  93. data/spec/unit/persistence/mongoid_persistence_spec.rb +85 -9
  94. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
  95. data/spec/unit/persistence/redis_persistence_spec.rb +8 -32
  96. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +6 -11
  97. data/spec/unit/persistence/sequel_persistence_spec.rb +278 -10
  98. data/spec/unit/simple_multiple_example_spec.rb +28 -0
  99. data/spec/unit/subclassing_multiple_spec.rb +37 -2
  100. data/spec/unit/subclassing_spec.rb +17 -2
  101. data/test/minitest_helper.rb +57 -0
  102. data/test/unit/minitest_matcher_test.rb +80 -0
  103. metadata +99 -28
  104. data/gemfiles/rails_3.2_stable.gemfile +0 -15
  105. data/gemfiles/rails_4.0_mongo_mapper.gemfile +0 -16
  106. data/gemfiles/rails_4.2_mongo_mapper.gemfile +0 -17
  107. data/lib/aasm/persistence/mongo_mapper_persistence.rb +0 -163
  108. data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +0 -21
  109. data/spec/models/mongo_mapper/simple_mongo_mapper.rb +0 -23
  110. data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +0 -25
  111. data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +0 -149
  112. data/spec/unit/persistence/mongo_mapper_persistence_spec.rb +0 -96
  113. /data/spec/models/{worker.rb → active_record/worker.rb} +0 -0
@@ -1,8 +1,7 @@
1
- describe 'dynamoid' do
2
- begin
3
- require 'dynamoid'
4
- require 'logger'
5
- require 'spec_helper'
1
+ require 'spec_helper'
2
+
3
+ if defined?(Dynamoid)
4
+ describe 'dynamoid' do
6
5
 
7
6
  Dir[File.dirname(__FILE__) + "/../../models/dynamoid/*.rb"].sort.each do |f|
8
7
  require File.expand_path(f)
@@ -132,9 +131,5 @@ describe 'dynamoid' do
132
131
  end
133
132
  end
134
133
 
135
- rescue LoadError
136
- puts "------------------------------------------------------------------------"
137
- puts "Not running Dynamoid multiple-specs because dynamoid gem is not installed!!!"
138
- puts "------------------------------------------------------------------------"
139
134
  end
140
135
  end
@@ -1,8 +1,7 @@
1
- describe 'dynamoid' do
2
- begin
3
- require 'dynamoid'
4
- require 'logger'
5
- require 'spec_helper'
1
+ require 'spec_helper'
2
+
3
+ if defined?(Dynamoid)
4
+ describe 'dynamoid' do
6
5
 
7
6
  Dir[File.dirname(__FILE__) + "/../../models/dynamoid/*.rb"].sort.each do |f|
8
7
  require File.expand_path(f)
@@ -81,9 +80,5 @@ describe 'dynamoid' do
81
80
  end
82
81
  end
83
82
 
84
- rescue LoadError
85
- puts "------------------------------------------------------------------------"
86
- puts "Not running Dynamoid specs because dynamoid gem is not installed!!!"
87
- puts "------------------------------------------------------------------------"
88
83
  end
89
84
  end
@@ -1,8 +1,7 @@
1
- describe 'mongoid' do
2
- begin
3
- require 'mongoid'
4
- require 'logger'
5
- require 'spec_helper'
1
+ require 'spec_helper'
2
+
3
+ if defined?(Mongoid::Document)
4
+ describe 'mongoid' do
6
5
 
7
6
  Dir[File.dirname(__FILE__) + "/../../models/mongoid/*.rb"].sort.each do |f|
8
7
  require File.expand_path(f)
@@ -72,6 +71,85 @@ describe 'mongoid' do
72
71
 
73
72
  end
74
73
 
74
+ describe 'transitions with persistence' do
75
+
76
+ it "should work for valid models" do
77
+ valid_object = MultipleValidatorMongoid.create(:name => 'name')
78
+ expect(valid_object).to be_sleeping
79
+ valid_object.status = :running
80
+ expect(valid_object).to be_running
81
+ end
82
+
83
+ it 'should not store states for invalid models' do
84
+ validator = MultipleValidatorMongoid.create(:name => 'name')
85
+ expect(validator).to be_valid
86
+ expect(validator).to be_sleeping
87
+
88
+ validator.name = nil
89
+ expect(validator).not_to be_valid
90
+ expect { validator.run! }.to raise_error(Mongoid::Errors::Validations)
91
+ expect(validator).to be_sleeping
92
+
93
+ validator.reload
94
+ expect(validator).not_to be_running
95
+ expect(validator).to be_sleeping
96
+
97
+ validator.name = 'another name'
98
+ expect(validator).to be_valid
99
+ expect(validator.run!).to be_truthy
100
+ expect(validator).to be_running
101
+
102
+ validator.reload
103
+ expect(validator).to be_running
104
+ expect(validator).not_to be_sleeping
105
+ end
106
+
107
+ it 'should not store states for invalid models silently if configured' do
108
+ validator = MultipleSilentPersistorMongoid.create(:name => 'name')
109
+ expect(validator).to be_valid
110
+ expect(validator).to be_sleeping
111
+
112
+ validator.name = nil
113
+ expect(validator).not_to be_valid
114
+ expect(validator.run!).to be_falsey
115
+ expect(validator).to be_sleeping
116
+
117
+ validator.reload
118
+ expect(validator).not_to be_running
119
+ expect(validator).to be_sleeping
120
+
121
+ validator.name = 'another name'
122
+ expect(validator).to be_valid
123
+ expect(validator.run!).to be_truthy
124
+ expect(validator).to be_running
125
+
126
+ validator.reload
127
+ expect(validator).to be_running
128
+ expect(validator).not_to be_sleeping
129
+ end
130
+
131
+ it 'should store states for invalid models if configured' do
132
+ persistor = MultipleInvalidPersistorMongoid.create(:name => 'name')
133
+ expect(persistor).to be_valid
134
+ expect(persistor).to be_sleeping
135
+
136
+ persistor.name = nil
137
+ expect(persistor).not_to be_valid
138
+ expect(persistor.run!).to be_truthy
139
+ expect(persistor).to be_running
140
+
141
+ persistor = MultipleInvalidPersistorMongoid.find(persistor.id)
142
+ persistor.valid?
143
+ expect(persistor).to be_valid
144
+ expect(persistor).to be_running
145
+ expect(persistor).not_to be_sleeping
146
+
147
+ persistor.reload
148
+ expect(persistor).to be_running
149
+ expect(persistor).not_to be_sleeping
150
+ end
151
+ end
152
+
75
153
  describe "complex example" do
76
154
  it "works" do
77
155
  record = ComplexMongoidExample.new
@@ -122,9 +200,5 @@ describe 'mongoid' do
122
200
  end
123
201
  end
124
202
 
125
- rescue LoadError
126
- puts "--------------------------------------------------------------------------"
127
- puts "Not running Mongoid multiple-specs because mongoid gem is not installed!!!"
128
- puts "--------------------------------------------------------------------------"
129
203
  end
130
204
  end
@@ -1,8 +1,7 @@
1
- describe 'mongoid' do
2
- begin
3
- require 'mongoid'
4
- require 'logger'
5
- require 'spec_helper'
1
+ require 'spec_helper'
2
+
3
+ if defined?(Mongoid::Document)
4
+ describe 'mongoid' do
6
5
 
7
6
  Dir[File.dirname(__FILE__) + "/../../models/mongoid/*.rb"].sort.each do |f|
8
7
  require File.expand_path(f)
@@ -85,9 +84,86 @@ describe 'mongoid' do
85
84
 
86
85
  end
87
86
 
88
- rescue LoadError
89
- puts "--------------------------------------------------------------------------"
90
- puts "Not running Mongoid specs because mongoid gem is not installed!!!"
91
- puts "--------------------------------------------------------------------------"
87
+ describe 'transitions with persistence' do
88
+
89
+ it 'should work for valid models' do
90
+ valid_object = ValidatorMongoid.create(:name => 'name')
91
+ expect(valid_object).to be_sleeping
92
+ valid_object.status = :running
93
+ expect(valid_object).to be_running
94
+ end
95
+
96
+ it 'should not store states for invalid models' do
97
+ validator = ValidatorMongoid.create(:name => 'name')
98
+ expect(validator).to be_valid
99
+ expect(validator).to be_sleeping
100
+
101
+ validator.name = nil
102
+ expect(validator).not_to be_valid
103
+ expect { validator.run! }.to raise_error(Mongoid::Errors::Validations)
104
+ expect(validator).to be_sleeping
105
+
106
+ validator.reload
107
+ expect(validator).not_to be_running
108
+ expect(validator).to be_sleeping
109
+
110
+ validator.name = 'another name'
111
+ expect(validator).to be_valid
112
+ expect(validator.run!).to be_truthy
113
+ expect(validator).to be_running
114
+
115
+ validator.reload
116
+ expect(validator).to be_running
117
+ expect(validator).not_to be_sleeping
118
+ end
119
+
120
+ it 'should not store states for invalid models silently if configured' do
121
+ validator = SilentPersistorMongoid.create(:name => 'name')
122
+ expect(validator).to be_valid
123
+ expect(validator).to be_sleeping
124
+
125
+ validator.name = nil
126
+ expect(validator).not_to be_valid
127
+ expect(validator.run!).to be_falsey
128
+ expect(validator).to be_sleeping
129
+
130
+ validator.reload
131
+ expect(validator).not_to be_running
132
+ expect(validator).to be_sleeping
133
+
134
+ validator.name = 'another name'
135
+ expect(validator).to be_valid
136
+ expect(validator.run!).to be_truthy
137
+ expect(validator).to be_running
138
+
139
+ validator.reload
140
+ expect(validator).to be_running
141
+ expect(validator).not_to be_sleeping
142
+ end
143
+
144
+ it 'should store states for invalid models if configured' do
145
+ persistor = InvalidPersistorMongoid.create(:name => 'name')
146
+ expect(persistor).to be_valid
147
+ expect(persistor).to be_sleeping
148
+
149
+ persistor.name = nil
150
+
151
+ expect(persistor).not_to be_valid
152
+ expect(persistor.run!).to be_truthy
153
+ expect(persistor).to be_running
154
+
155
+ persistor = InvalidPersistorMongoid.find(persistor.id)
156
+
157
+ persistor.valid?
158
+ expect(persistor).to be_valid
159
+ expect(persistor).to be_running
160
+ expect(persistor).not_to be_sleeping
161
+
162
+ persistor.reload
163
+ expect(persistor).to be_running
164
+ expect(persistor).not_to be_sleeping
165
+ end
166
+ end
167
+
92
168
  end
93
169
  end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(Redis)
4
+ describe 'redis' do
5
+
6
+ Dir[File.dirname(__FILE__) + "/../../models/redis/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
9
+
10
+ before(:all) do
11
+ @model = RedisMultiple
12
+ end
13
+
14
+ describe "instance methods" do
15
+ let(:model) {@model.new}
16
+
17
+ it "should respond to aasm persistence methods" do
18
+ expect(model).to respond_to(:aasm_read_state)
19
+ expect(model).to respond_to(:aasm_write_state)
20
+ expect(model).to respond_to(:aasm_write_state_without_persistence)
21
+ end
22
+
23
+ it "should return the initial state when new and the aasm field is nil" do
24
+ expect(model.aasm(:left).current_state).to eq(:alpha)
25
+ end
26
+
27
+ it "should save the initial state" do
28
+ expect(model.status).to eq("alpha")
29
+ end
30
+
31
+ it "should return the aasm column the aasm field is not nil" do
32
+ model.status = "beta"
33
+ expect(model.aasm(:left).current_state).to eq(:beta)
34
+ end
35
+
36
+ it "should allow a nil state" do
37
+ model.status = nil
38
+ expect(model.aasm(:left).current_state).to be_nil
39
+ end
40
+ end
41
+
42
+ describe 'subclasses' do
43
+ it "should have the same states as its parent class" do
44
+ expect(Class.new(@model).aasm(:left).states).to eq(@model.aasm(:left).states)
45
+ end
46
+
47
+ it "should have the same events as its parent class" do
48
+ expect(Class.new(@model).aasm(:left).events).to eq(@model.aasm(:left).events)
49
+ end
50
+
51
+ it "should have the same column as its parent even for the new dsl" do
52
+ expect(@model.aasm(:left).attribute_name).to eq(:status)
53
+ expect(Class.new(@model).aasm(:left).attribute_name).to eq(:status)
54
+ end
55
+ end
56
+
57
+ describe "complex example" do
58
+ it "works" do
59
+ record = RedisComplexExample.new
60
+
61
+ expect(record.aasm(:left).current_state).to eql :one
62
+ expect(record.aasm(:right).current_state).to eql :alpha
63
+
64
+ expect_aasm_states record, :one, :alpha
65
+
66
+ record.increment!
67
+ expect_aasm_states record, :two, :alpha
68
+
69
+ record.level_up!
70
+ expect_aasm_states record, :two, :beta
71
+
72
+ record.increment!
73
+ expect { record.increment! }.to raise_error(AASM::InvalidTransition)
74
+ expect_aasm_states record, :three, :beta
75
+
76
+ record.level_up!
77
+ expect_aasm_states record, :three, :gamma
78
+ end
79
+
80
+ def expect_aasm_states(record, left_state, right_state)
81
+ expect(record.aasm(:left).current_state).to eql left_state.to_sym
82
+ expect(record.left.value.to_s).to eql left_state.to_s
83
+ expect(record.aasm(:right).current_state).to eql right_state.to_sym
84
+ expect(record.right.value.to_s).to eql right_state.to_s
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,35 +1,14 @@
1
+ require 'spec_helper'
1
2
 
2
- describe 'redis' do
3
- begin
4
- require 'redis-objects'
5
- require 'logger'
6
- require 'spec_helper'
3
+ if defined?(Redis::Objects)
4
+ describe 'redis' do
7
5
 
8
- before(:all) do
9
- Redis.current = Redis.new(host: '127.0.0.1', port: 6379)
10
-
11
- @model = Class.new do
12
- attr_accessor :default
13
-
14
- include Redis::Objects
15
- include AASM
16
-
17
- value :status
18
-
19
- def id
20
- 1
21
- end
6
+ Dir[File.dirname(__FILE__) + "/../../models/redis/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
22
9
 
23
- aasm column: :status
24
- aasm do
25
- state :alpha, initial: true
26
- state :beta
27
- state :gamma
28
- event :release do
29
- transitions from: [:alpha, :beta, :gamma], to: :beta
30
- end
31
- end
32
- end
10
+ before(:all) do
11
+ @model = RedisSimple
33
12
  end
34
13
 
35
14
  describe "instance methods" do
@@ -70,8 +49,5 @@ describe 'redis' do
70
49
  expect(Class.new(@model).aasm.attribute_name).to eq(:status)
71
50
  end
72
51
  end
73
-
74
- rescue LoadError
75
- puts "Not running Redis specs because sequel gem is not installed!!!"
76
52
  end
77
53
  end
@@ -1,15 +1,14 @@
1
- describe 'sequel' do
2
- begin
3
- require 'sequel'
4
- require 'logger'
5
- require 'spec_helper'
1
+ require 'spec_helper'
2
+
3
+ if defined?(Sequel)
4
+ describe 'sequel' do
6
5
 
7
6
  Dir[File.dirname(__FILE__) + "/../../models/sequel/*.rb"].sort.each do |f|
8
7
  require File.expand_path(f)
9
8
  end
10
9
 
11
10
  before(:all) do
12
- @model = SequelMultiple
11
+ @model = Sequel::Multiple
13
12
  end
14
13
 
15
14
  describe "instance methods" do
@@ -94,7 +93,7 @@ describe 'sequel' do
94
93
 
95
94
  describe "complex example" do
96
95
  it "works" do
97
- record = ComplexSequelExample.new
96
+ record = Sequel::ComplexExample.new
98
97
  expect(record.aasm(:left).current_state).to eql :one
99
98
  expect(record.left).to be_nil
100
99
  expect(record.aasm(:right).current_state).to eql :alpha
@@ -145,9 +144,5 @@ describe 'sequel' do
145
144
  end
146
145
  end
147
146
 
148
- rescue LoadError
149
- puts "------------------------------------------------------------------------"
150
- puts "Not running Sequel multiple-specs because sequel gem is not installed!!!"
151
- puts "------------------------------------------------------------------------"
152
147
  end
153
148
  end