aasm 4.0.5 → 4.0.6
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 +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +5 -0
- data/README_FROM_VERSION_3_TO_4.md +1 -1
- data/aasm.gemspec +1 -1
- data/lib/aasm/aasm.rb +1 -1
- data/lib/aasm/core/event.rb +10 -2
- data/lib/aasm/core/transition.rb +0 -2
- data/lib/aasm/persistence/base.rb +1 -1
- data/lib/aasm/version.rb +1 -1
- data/spec/database.rb +1 -1
- data/spec/models/callbacks/basic.rb +33 -20
- data/spec/models/callbacks/with_args.rb +20 -4
- data/spec/models/persistence.rb +18 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/unit/callbacks_spec.rb +55 -32
- data/spec/unit/complex_example_spec.rb +9 -9
- data/spec/unit/event_spec.rb +6 -6
- data/spec/unit/inspection_spec.rb +2 -2
- data/spec/unit/persistence/active_record_persistence_spec.rb +36 -39
- data/spec/unit/subclassing_spec.rb +1 -1
- data/spec/unit/transition_spec.rb +10 -10
- metadata +4 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d4a2455383d1017cdc688cf4f01c8d9d4ce9a03
|
4
|
+
data.tar.gz: a100390b837f02f283afebc66dc8495df2b950e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d9cbefb8cfc6644923134aa679d8cbc5c672da11f428f969974777edcda43b947b2a88df6743006e384f2b5a4ecb9bc36b8c937332e144bd8af7abe5a7215d0
|
7
|
+
data.tar.gz: bc56510d4cf59437d92e1b2853e87b478709dbd2dc98841aa7e3b1a2c8405011a5cbef75f882b8e4c0ee755a7b16014359ac843e9fe43f05e396674de09413de
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,11 @@
|
|
5
5
|
* `aasm_column` has been removed. Use `aasm.attribute_name` instead
|
6
6
|
* `aasm_human_event_name` has been removed. Use `aasm.human_event_name` instead
|
7
7
|
|
8
|
+
## 4.0.6
|
9
|
+
|
10
|
+
* bugfix: `false` is treated as uninitialised state (same as `nil`) (see [issue #195](https://github.com/aasm/aasm/issues/195) for details)
|
11
|
+
* bugfix: an event's `:error` callback now retrieves all arguments passed to the event (see [issue #196](https://github.com/aasm/aasm/issues/196) for details)
|
12
|
+
|
8
13
|
## 4.0.5
|
9
14
|
|
10
15
|
* bugfix: initialize the aasm state column after initialization of the _ActiveRecord_ instance only if the attribute has been loaded (see [issue #193](https://github.com/aasm/aasm/issues/193) for details)
|
data/aasm.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.add_development_dependency 'rake'
|
17
17
|
s.add_development_dependency 'sdoc'
|
18
|
-
s.add_development_dependency 'rspec'
|
18
|
+
s.add_development_dependency 'rspec'
|
19
19
|
|
20
20
|
# debugging
|
21
21
|
# s.add_development_dependency 'debugger'
|
data/lib/aasm/aasm.rb
CHANGED
data/lib/aasm/core/event.rb
CHANGED
@@ -124,14 +124,22 @@ module AASM::Core
|
|
124
124
|
def invoke_callbacks(code, record, args)
|
125
125
|
case code
|
126
126
|
when Symbol, String
|
127
|
-
record.
|
127
|
+
unless record.respond_to?(code)
|
128
|
+
raise NoMethodError.new("NoMethodError: undefined method `#{code}' for #{self.inspect}:#{self.class}")
|
129
|
+
end
|
130
|
+
arity = record.send(:method, code.to_sym).arity
|
131
|
+
record.send(code, *(arity < 0 ? args : args[0...arity]))
|
128
132
|
true
|
133
|
+
|
129
134
|
when Proc
|
130
|
-
|
135
|
+
arity = code.arity
|
136
|
+
record.instance_exec(*(arity < 0 ? args : args[0...arity]), &code)
|
131
137
|
true
|
138
|
+
|
132
139
|
when Array
|
133
140
|
code.each {|a| invoke_callbacks(a, record, args)}
|
134
141
|
true
|
142
|
+
|
135
143
|
else
|
136
144
|
false
|
137
145
|
end
|
data/lib/aasm/core/transition.rb
CHANGED
@@ -50,11 +50,9 @@ module AASM::Core
|
|
50
50
|
|
51
51
|
case code
|
52
52
|
when Symbol, String
|
53
|
-
# QUESTION : record.send(code, *args) ?
|
54
53
|
arity = record.send(:method, code.to_sym).arity
|
55
54
|
arity == 0 ? record.send(code) : record.send(code, *args)
|
56
55
|
when Proc
|
57
|
-
# QUESTION : record.instance_exec(*args, &code) ?
|
58
56
|
code.arity == 0 ? record.instance_exec(&code) : record.instance_exec(*args, &code)
|
59
57
|
when Array
|
60
58
|
if options[:guard]
|
data/lib/aasm/version.rb
CHANGED
data/spec/database.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
ActiveRecord::Migration.suppress_messages do
|
2
|
-
%w{gates readers writers transients simples no_scopes no_direct_assignments thieves localizer_test_models persisted_states provided_and_persisted_states with_enums with_true_enums with_false_enums}.each do |table_name|
|
2
|
+
%w{gates readers writers transients simples no_scopes no_direct_assignments thieves localizer_test_models persisted_states provided_and_persisted_states with_enums with_true_enums with_false_enums false_states}.each do |table_name|
|
3
3
|
ActiveRecord::Migration.create_table table_name, :force => true do |t|
|
4
4
|
t.string "aasm_state"
|
5
5
|
end
|
@@ -6,6 +6,15 @@ module Callbacks
|
|
6
6
|
@fail_event_guard = options[:fail_event_guard]
|
7
7
|
@fail_transition_guard = options[:fail_transition_guard]
|
8
8
|
@log = options[:log]
|
9
|
+
reset_data
|
10
|
+
end
|
11
|
+
|
12
|
+
def reset_data
|
13
|
+
@data = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def data
|
17
|
+
@data.join(' ')
|
9
18
|
end
|
10
19
|
|
11
20
|
aasm do
|
@@ -35,28 +44,32 @@ module Callbacks
|
|
35
44
|
end
|
36
45
|
|
37
46
|
def log(text)
|
47
|
+
@data << text
|
38
48
|
puts text if @log
|
39
49
|
end
|
40
50
|
|
41
|
-
def
|
42
|
-
|
43
|
-
def
|
44
|
-
def
|
45
|
-
def
|
46
|
-
def
|
47
|
-
|
48
|
-
def
|
49
|
-
|
50
|
-
def
|
51
|
-
def
|
52
|
-
def
|
53
|
-
def
|
54
|
-
|
55
|
-
def
|
56
|
-
|
57
|
-
def
|
58
|
-
|
59
|
-
|
60
|
-
def
|
51
|
+
def aasm_write_state(*args); log('aasm_write_state'); true; end
|
52
|
+
|
53
|
+
def before_enter_open; log('before_enter_open'); end
|
54
|
+
def enter_open; log('enter_open'); end
|
55
|
+
def before_exit_open; log('before_exit_open'); end
|
56
|
+
def after_enter_open; log('after_enter_open'); end
|
57
|
+
def exit_open; log('exit_open'); end
|
58
|
+
def after_exit_open; log('after_exit_open'); end
|
59
|
+
|
60
|
+
def before_enter_closed; log('before_enter_closed'); end
|
61
|
+
def enter_closed; log('enter_closed'); end
|
62
|
+
def before_exit_closed; log('before_exit_closed'); end
|
63
|
+
def exit_closed; log('exit_closed'); end
|
64
|
+
def after_enter_closed; log('after_enter_closed'); end
|
65
|
+
def after_exit_closed; log('after_exit_closed'); end
|
66
|
+
|
67
|
+
def event_guard; log('event_guard'); !@fail_event_guard; end
|
68
|
+
def transition_guard; log('transition_guard'); !@fail_transition_guard; end
|
69
|
+
|
70
|
+
def after_transition; log('after_transition'); end
|
71
|
+
|
72
|
+
def before_event; log('before_event'); end
|
73
|
+
def after_event; log('after_event'); end
|
61
74
|
end
|
62
75
|
end
|
@@ -2,6 +2,19 @@ module Callbacks
|
|
2
2
|
class WithArgs
|
3
3
|
include AASM
|
4
4
|
|
5
|
+
def initialize(options={})
|
6
|
+
@log = options[:log]
|
7
|
+
reset_data
|
8
|
+
end
|
9
|
+
|
10
|
+
def reset_data
|
11
|
+
@data = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def data
|
15
|
+
@data.join(' ')
|
16
|
+
end
|
17
|
+
|
5
18
|
aasm do
|
6
19
|
state :open, :initial => true,
|
7
20
|
:before_enter => :before_enter_open,
|
@@ -25,9 +38,12 @@ module Callbacks
|
|
25
38
|
end
|
26
39
|
|
27
40
|
def log(text)
|
28
|
-
|
41
|
+
@data << text
|
42
|
+
puts text if @log
|
29
43
|
end
|
30
44
|
|
45
|
+
def aasm_write_state(*args); log('aasm_write_state'); true; end
|
46
|
+
|
31
47
|
def before_enter_open; log('before_enter_open'); end
|
32
48
|
def before_exit_open; log('before_exit_open'); end
|
33
49
|
def after_enter_open; log('after_enter_open'); end
|
@@ -38,8 +54,8 @@ module Callbacks
|
|
38
54
|
def after_enter_closed; log('after_enter_closed'); end
|
39
55
|
def after_exit_closed; log('after_exit_closed'); end
|
40
56
|
|
41
|
-
def before(*args); log(
|
42
|
-
def transition_proc(arg1, arg2); log(
|
43
|
-
def after(*args); log(
|
57
|
+
def before(arg1, *args); log("before(#{arg1.inspect},#{args.map(&:inspect).join(',')})"); end
|
58
|
+
def transition_proc(arg1, arg2); log("transition_proc(#{arg1.inspect},#{arg2.inspect})"); end
|
59
|
+
def after(*args); log("after(#{args.map(&:inspect).join(',')})"); end
|
44
60
|
end
|
45
61
|
end
|
data/spec/models/persistence.rb
CHANGED
@@ -18,6 +18,24 @@ class Gate < ActiveRecord::Base
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
class FalseState < ActiveRecord::Base
|
22
|
+
include AASM
|
23
|
+
|
24
|
+
def initialize(*args)
|
25
|
+
super
|
26
|
+
self.aasm_state = false
|
27
|
+
end
|
28
|
+
|
29
|
+
aasm do
|
30
|
+
state :opened
|
31
|
+
state :closed
|
32
|
+
|
33
|
+
event :view do
|
34
|
+
transitions :to => :read, :from => [:needs_attention]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
21
39
|
class WithEnum < ActiveRecord::Base
|
22
40
|
include AASM
|
23
41
|
|
data/spec/spec_helper.rb
CHANGED
data/spec/unit/callbacks_spec.rb
CHANGED
@@ -128,51 +128,44 @@ describe 'callbacks for the new DSL' do
|
|
128
128
|
end
|
129
129
|
|
130
130
|
it "should properly pass arguments" do
|
131
|
-
cb = Callbacks::WithArgs.new
|
132
|
-
|
133
|
-
# TODO: use expect syntax here
|
134
|
-
cb.should_receive(:before).with(:arg1, :arg2).once.ordered
|
135
|
-
cb.should_receive(:before_exit_open).once.ordered # these should be before the state changes
|
136
|
-
cb.should_receive(:transition_proc).with(:arg1, :arg2).once.ordered
|
137
|
-
cb.should_receive(:before_enter_closed).once.ordered
|
138
|
-
cb.should_receive(:aasm_write_state).once.ordered.and_return(true) # this is when the state changes
|
139
|
-
cb.should_receive(:after_exit_open).once.ordered # these should be after the state changes
|
140
|
-
cb.should_receive(:after_enter_closed).once.ordered
|
141
|
-
cb.should_receive(:after).with(:arg1, :arg2).once.ordered
|
131
|
+
cb = Callbacks::WithArgs.new(:log => false)
|
132
|
+
cb.aasm.current_state
|
142
133
|
|
134
|
+
cb.reset_data
|
143
135
|
cb.close!(:arg1, :arg2)
|
136
|
+
expect(cb.data).to eql 'before(:arg1,:arg2) before_exit_open transition_proc(:arg1,:arg2) before_enter_closed aasm_write_state after_exit_open after_enter_closed after(:arg1,:arg2)'
|
144
137
|
end
|
145
138
|
|
146
139
|
it "should call the callbacks given the to-state as argument" do
|
147
140
|
cb = Callbacks::WithStateArg.new
|
148
|
-
cb.
|
149
|
-
cb.
|
150
|
-
cb.
|
151
|
-
cb.
|
141
|
+
expect(cb).to receive(:before_method).with(:arg1).once.ordered
|
142
|
+
expect(cb).to receive(:transition_method).never
|
143
|
+
expect(cb).to receive(:transition_method2).with(:arg1).once.ordered
|
144
|
+
expect(cb).to receive(:after_method).with(:arg1).once.ordered
|
152
145
|
cb.close!(:out_to_lunch, :arg1)
|
153
146
|
|
154
147
|
cb = Callbacks::WithStateArg.new
|
155
148
|
some_object = double('some object')
|
156
|
-
cb.
|
157
|
-
cb.
|
158
|
-
cb.
|
149
|
+
expect(cb).to receive(:before_method).with(some_object).once.ordered
|
150
|
+
expect(cb).to receive(:transition_method2).with(some_object).once.ordered
|
151
|
+
expect(cb).to receive(:after_method).with(some_object).once.ordered
|
159
152
|
cb.close!(:out_to_lunch, some_object)
|
160
153
|
end
|
161
154
|
|
162
155
|
it "should call the proper methods just with arguments" do
|
163
156
|
cb = Callbacks::WithStateArg.new
|
164
|
-
cb.
|
165
|
-
cb.
|
166
|
-
cb.
|
167
|
-
cb.
|
157
|
+
expect(cb).to receive(:before_method).with(:arg1).once.ordered
|
158
|
+
expect(cb).to receive(:transition_method).with(:arg1).once.ordered
|
159
|
+
expect(cb).to receive(:transition_method).never
|
160
|
+
expect(cb).to receive(:after_method).with(:arg1).once.ordered
|
168
161
|
cb.close!(:arg1)
|
169
162
|
|
170
163
|
cb = Callbacks::WithStateArg.new
|
171
164
|
some_object = double('some object')
|
172
|
-
cb.
|
173
|
-
cb.
|
174
|
-
cb.
|
175
|
-
cb.
|
165
|
+
expect(cb).to receive(:before_method).with(some_object).once.ordered
|
166
|
+
expect(cb).to receive(:transition_method).with(some_object).once.ordered
|
167
|
+
expect(cb).to receive(:transition_method).never
|
168
|
+
expect(cb).to receive(:after_method).with(some_object).once.ordered
|
176
169
|
cb.close!(some_object)
|
177
170
|
end
|
178
171
|
end
|
@@ -181,6 +174,10 @@ describe 'event callbacks' do
|
|
181
174
|
describe "with an error callback defined" do
|
182
175
|
before do
|
183
176
|
class Foo
|
177
|
+
# this hack is needed to allow testing of parameters, since RSpec
|
178
|
+
# destroys a method's arity when mocked
|
179
|
+
attr_accessor :data
|
180
|
+
|
184
181
|
aasm do
|
185
182
|
event :safe_close, :success => :success_callback, :error => :error_callback do
|
186
183
|
transitions :to => :closed, :from => [:open]
|
@@ -191,16 +188,42 @@ describe 'event callbacks' do
|
|
191
188
|
@foo = Foo.new
|
192
189
|
end
|
193
190
|
|
194
|
-
|
195
|
-
|
191
|
+
context "error_callback defined" do
|
192
|
+
it "should run error_callback if an exception is raised" do
|
193
|
+
def @foo.error_callback(e)
|
194
|
+
@data = [e]
|
195
|
+
end
|
196
|
+
|
197
|
+
allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
|
198
|
+
|
199
|
+
@foo.safe_close!
|
200
|
+
expect(@foo.data).to eql [e]
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should run error_callback without parameters if callback does not support any" do
|
204
|
+
def @foo.error_callback(e)
|
205
|
+
@data = []
|
206
|
+
end
|
196
207
|
|
197
|
-
|
198
|
-
expect(@foo).to receive(:error_callback).with(e)
|
208
|
+
allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
|
199
209
|
|
200
|
-
|
210
|
+
@foo.safe_close!('arg1', 'arg2')
|
211
|
+
expect(@foo.data).to eql []
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should run error_callback with parameters if callback supports them" do
|
215
|
+
def @foo.error_callback(e, arg1, arg2)
|
216
|
+
@data = [arg1, arg2]
|
217
|
+
end
|
218
|
+
|
219
|
+
allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
|
220
|
+
|
221
|
+
@foo.safe_close!('arg1', 'arg2')
|
222
|
+
expect(@foo.data).to eql ['arg1', 'arg2']
|
223
|
+
end
|
201
224
|
end
|
202
225
|
|
203
|
-
it "should raise NoMethodError if
|
226
|
+
it "should raise NoMethodError if exception is raised and error_callback is declared but not defined" do
|
204
227
|
allow(@foo).to receive(:before_enter).and_raise(StandardError)
|
205
228
|
expect{@foo.safe_close!}.to raise_error(NoMethodError)
|
206
229
|
end
|
@@ -8,7 +8,7 @@ describe 'on initialization' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'should have an activation code' do
|
11
|
-
expect(auth.has_activation_code?).to
|
11
|
+
expect(auth.has_activation_code?).to be_truthy
|
12
12
|
expect(auth.activation_code).not_to be_nil
|
13
13
|
end
|
14
14
|
end
|
@@ -19,24 +19,24 @@ describe 'when being unsuspended' do
|
|
19
19
|
it 'should be able to be unsuspended' do
|
20
20
|
auth.activate!
|
21
21
|
auth.suspend!
|
22
|
-
expect(auth.may_unsuspend?).to
|
22
|
+
expect(auth.may_unsuspend?).to be_truthy
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should not be able to be unsuspended into active' do
|
26
26
|
auth.suspend!
|
27
|
-
expect(auth.may_unsuspend?(:active)).not_to
|
27
|
+
expect(auth.may_unsuspend?(:active)).not_to be_truthy
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'should be able to be unsuspended into active if polite' do
|
31
31
|
auth.suspend!
|
32
|
-
expect(auth.may_wait?(:waiting, :please)).to
|
32
|
+
expect(auth.may_wait?(:waiting, :please)).to be_truthy
|
33
33
|
auth.wait!(nil, :please)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'should not be able to be unsuspended into active if not polite' do
|
37
37
|
auth.suspend!
|
38
|
-
expect(auth.may_wait?(:waiting)).not_to
|
39
|
-
expect(auth.may_wait?(:waiting, :rude)).not_to
|
38
|
+
expect(auth.may_wait?(:waiting)).not_to be_truthy
|
39
|
+
expect(auth.may_wait?(:waiting, :rude)).not_to be_truthy
|
40
40
|
expect {auth.wait!(nil, :rude)}.to raise_error(AASM::InvalidTransition)
|
41
41
|
expect {auth.wait!}.to raise_error(AASM::InvalidTransition)
|
42
42
|
end
|
@@ -46,7 +46,7 @@ describe 'when being unsuspended' do
|
|
46
46
|
auth.suspend!
|
47
47
|
auth.unsuspend!
|
48
48
|
|
49
|
-
expect(auth.may_unpassify?).not_to
|
49
|
+
expect(auth.may_unpassify?).not_to be_truthy
|
50
50
|
expect {auth.unpassify!}.to raise_error(AASM::InvalidTransition)
|
51
51
|
end
|
52
52
|
|
@@ -74,11 +74,11 @@ describe 'when being unsuspended' do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should be able to fire known events" do
|
77
|
-
expect(auth.aasm.may_fire_event?(:activate)).to
|
77
|
+
expect(auth.aasm.may_fire_event?(:activate)).to be_truthy
|
78
78
|
end
|
79
79
|
|
80
80
|
it "should not be able to fire unknown events" do
|
81
|
-
expect(auth.aasm.may_fire_event?(:unknown)).to
|
81
|
+
expect(auth.aasm.may_fire_event?(:unknown)).to be_falsey
|
82
82
|
end
|
83
83
|
|
84
84
|
end
|
data/spec/unit/event_spec.rb
CHANGED
@@ -43,18 +43,18 @@ describe 'transition inspection' do
|
|
43
43
|
|
44
44
|
it 'should support inspecting transitions from other states' do
|
45
45
|
expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
|
46
|
-
expect(event.transitions_from_state?(:sleeping)).to
|
46
|
+
expect(event.transitions_from_state?(:sleeping)).to be_truthy
|
47
47
|
|
48
48
|
expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([])
|
49
|
-
expect(event.transitions_from_state?(:cleaning)).to
|
49
|
+
expect(event.transitions_from_state?(:cleaning)).to be_falsey
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'should support inspecting transitions to other states' do
|
53
53
|
expect(event.transitions_to_state(:running).map(&:from)).to eq([:sleeping])
|
54
|
-
expect(event.transitions_to_state?(:running)).to
|
54
|
+
expect(event.transitions_to_state?(:running)).to be_truthy
|
55
55
|
|
56
56
|
expect(event.transitions_to_state(:cleaning).map(&:to)).to eq([])
|
57
|
-
expect(event.transitions_to_state?(:cleaning)).to
|
57
|
+
expect(event.transitions_to_state?(:cleaning)).to be_falsey
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -67,10 +67,10 @@ describe 'transition inspection without from' do
|
|
67
67
|
|
68
68
|
it 'should support inspecting transitions from other states' do
|
69
69
|
expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
|
70
|
-
expect(event.transitions_from_state?(:sleeping)).to
|
70
|
+
expect(event.transitions_from_state?(:sleeping)).to be_truthy
|
71
71
|
|
72
72
|
expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([:running])
|
73
|
-
expect(event.transitions_from_state?(:cleaning)).to
|
73
|
+
expect(event.transitions_from_state?(:cleaning)).to be_truthy
|
74
74
|
end
|
75
75
|
|
76
76
|
end
|
@@ -67,11 +67,11 @@ describe "special cases" do
|
|
67
67
|
expect(Argument.aasm.states).to include(:valid)
|
68
68
|
|
69
69
|
argument = Argument.new
|
70
|
-
expect(argument.invalid?).to
|
70
|
+
expect(argument.invalid?).to be_truthy
|
71
71
|
expect(argument.aasm.current_state).to eq(:invalid)
|
72
72
|
|
73
73
|
argument.valid!
|
74
|
-
expect(argument.valid?).to
|
74
|
+
expect(argument.valid?).to be_truthy
|
75
75
|
expect(argument.aasm.current_state).to eq(:valid)
|
76
76
|
end
|
77
77
|
end
|
@@ -30,15 +30,15 @@ describe "instance methods" do
|
|
30
30
|
let(:columns_hash) { Hash[column_name, column] }
|
31
31
|
|
32
32
|
before :each do
|
33
|
-
gate.class.aasm.
|
34
|
-
gate.class.
|
33
|
+
allow(gate.class.aasm).to receive(:attribute_name).and_return(column_name.to_sym)
|
34
|
+
allow(gate.class).to receive(:columns_hash).and_return(columns_hash)
|
35
35
|
end
|
36
36
|
|
37
37
|
context "when AASM column has integer type" do
|
38
38
|
let(:column) { double(Object, type: :integer) }
|
39
39
|
|
40
40
|
it "returns true" do
|
41
|
-
expect(subject.call).to
|
41
|
+
expect(subject.call).to be_truthy
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -46,7 +46,7 @@ describe "instance methods" do
|
|
46
46
|
let(:column) { double(Object, type: :string) }
|
47
47
|
|
48
48
|
it "returns false" do
|
49
|
-
expect(subject.call).to
|
49
|
+
expect(subject.call).to be_falsey
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -55,7 +55,7 @@ describe "instance methods" do
|
|
55
55
|
subject { lambda{ gate.send(:aasm_guess_enum_method) } }
|
56
56
|
|
57
57
|
before :each do
|
58
|
-
gate.class.aasm.
|
58
|
+
allow(gate.class.aasm).to receive(:attribute_name).and_return(:value)
|
59
59
|
end
|
60
60
|
|
61
61
|
it "pluralizes AASM column name" do
|
@@ -75,7 +75,7 @@ describe "instance methods" do
|
|
75
75
|
context "when AASM enum setting is simply set to true" do
|
76
76
|
let(:with_true_enum) { WithTrueEnum.new }
|
77
77
|
before :each do
|
78
|
-
WithTrueEnum.aasm.
|
78
|
+
allow(WithTrueEnum.aasm).to receive(:attribute_name).and_return(:value)
|
79
79
|
end
|
80
80
|
|
81
81
|
it "infers enum method name from pluralized column name" do
|
@@ -93,12 +93,12 @@ describe "instance methods" do
|
|
93
93
|
|
94
94
|
context "when AASM enum setting is not enabled" do
|
95
95
|
before :each do
|
96
|
-
Gate.aasm.
|
96
|
+
allow(Gate.aasm).to receive(:attribute_name).and_return(:value)
|
97
97
|
end
|
98
98
|
|
99
99
|
context "when AASM column looks like enum" do
|
100
100
|
before :each do
|
101
|
-
gate.
|
101
|
+
allow(gate).to receive(:aasm_column_looks_like_enum).and_return(true)
|
102
102
|
end
|
103
103
|
|
104
104
|
it "infers enum method name from pluralized column name" do
|
@@ -108,7 +108,7 @@ describe "instance methods" do
|
|
108
108
|
|
109
109
|
context "when AASM column doesn't look like enum'" do
|
110
110
|
before :each do
|
111
|
-
gate.
|
111
|
+
allow(gate).to receive(:aasm_column_looks_like_enum)
|
112
112
|
.and_return(false)
|
113
113
|
end
|
114
114
|
|
@@ -126,24 +126,17 @@ describe "instance methods" do
|
|
126
126
|
let(:enum) { Hash[state_sym, state_code] }
|
127
127
|
|
128
128
|
before :each do
|
129
|
-
gate
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
gate
|
136
|
-
.class
|
137
|
-
.stub(enum_name)
|
138
|
-
.and_return(enum)
|
129
|
+
allow(gate).to receive(:aasm_enum).and_return(enum_name)
|
130
|
+
allow(gate).to receive(:aasm_write_attribute)
|
131
|
+
allow(gate).to receive(:write_attribute)
|
132
|
+
|
133
|
+
allow(Gate).to receive(enum_name).and_return(enum)
|
139
134
|
end
|
140
135
|
|
141
136
|
describe "aasm_write_state" do
|
142
137
|
context "when AASM is configured to skip validations on save" do
|
143
138
|
before :each do
|
144
|
-
gate
|
145
|
-
.stub(:aasm_skipping_validations)
|
146
|
-
.and_return(true)
|
139
|
+
allow(gate).to receive(:aasm_skipping_validations).and_return(true)
|
147
140
|
end
|
148
141
|
|
149
142
|
it "passes state code instead of state symbol to update_all" do
|
@@ -151,10 +144,7 @@ describe "instance methods" do
|
|
151
144
|
# parameters in the middle of the chain, so we need to use
|
152
145
|
# intermediate object instead.
|
153
146
|
obj = double(Object, update_all: 1)
|
154
|
-
|
155
|
-
.class
|
156
|
-
.stub(:where)
|
157
|
-
.and_return(obj)
|
147
|
+
allow(Gate).to receive(:where).and_return(obj)
|
158
148
|
|
159
149
|
gate.aasm_write_state state_sym
|
160
150
|
|
@@ -166,7 +156,7 @@ describe "instance methods" do
|
|
166
156
|
context "when AASM is not skipping validations" do
|
167
157
|
it "delegates state update to the helper method" do
|
168
158
|
# Let's pretend that validation is passed
|
169
|
-
gate.
|
159
|
+
allow(gate).to receive(:save).and_return(true)
|
170
160
|
|
171
161
|
gate.aasm_write_state state_sym
|
172
162
|
|
@@ -197,9 +187,7 @@ describe "instance methods" do
|
|
197
187
|
let(:state_sym) { :running }
|
198
188
|
|
199
189
|
before :each do
|
200
|
-
gate
|
201
|
-
.stub(:aasm_enum)
|
202
|
-
.and_return(nil)
|
190
|
+
allow(gate).to receive(:aasm_enum).and_return(nil)
|
203
191
|
end
|
204
192
|
|
205
193
|
describe "aasm_raw_attribute_value" do
|
@@ -215,9 +203,8 @@ describe "instance methods" do
|
|
215
203
|
let(:value) { 42 }
|
216
204
|
|
217
205
|
before :each do
|
218
|
-
gate.
|
219
|
-
gate.
|
220
|
-
.and_return(value)
|
206
|
+
allow(gate).to receive(:write_attribute)
|
207
|
+
allow(gate).to receive(:aasm_raw_attribute_value).and_return(value)
|
221
208
|
|
222
209
|
gate.send(:aasm_write_attribute, sym)
|
223
210
|
end
|
@@ -270,6 +257,16 @@ describe "instance methods" do
|
|
270
257
|
|
271
258
|
end
|
272
259
|
|
260
|
+
describe "direct state column access" do
|
261
|
+
it "accepts false states" do
|
262
|
+
f = FalseState.create!
|
263
|
+
expect(f.aasm_state).to eql false
|
264
|
+
expect {
|
265
|
+
f.aasm.events.map(&:name)
|
266
|
+
}.to_not raise_error
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
273
270
|
describe 'subclasses' do
|
274
271
|
it "should have the same states as its parent class" do
|
275
272
|
expect(DerivateNewDsl.aasm.states).to eq(SimpleNewDsl.aasm.states)
|
@@ -289,7 +286,7 @@ describe "named scopes with the new DSL" do
|
|
289
286
|
context "Does not already respond_to? the scope name" do
|
290
287
|
it "should add a scope" do
|
291
288
|
expect(SimpleNewDsl).to respond_to(:unknown_scope)
|
292
|
-
expect(SimpleNewDsl.unknown_scope.is_a?(ActiveRecord::Relation)).to
|
289
|
+
expect(SimpleNewDsl.unknown_scope.is_a?(ActiveRecord::Relation)).to be_truthy
|
293
290
|
end
|
294
291
|
end
|
295
292
|
|
@@ -348,7 +345,7 @@ describe 'transitions with persistence' do
|
|
348
345
|
|
349
346
|
validator.name = nil
|
350
347
|
expect(validator).not_to be_valid
|
351
|
-
expect(validator.run!).to
|
348
|
+
expect(validator.run!).to be_falsey
|
352
349
|
expect(validator).to be_sleeping
|
353
350
|
|
354
351
|
validator.reload
|
@@ -357,7 +354,7 @@ describe 'transitions with persistence' do
|
|
357
354
|
|
358
355
|
validator.name = 'another name'
|
359
356
|
expect(validator).to be_valid
|
360
|
-
expect(validator.run!).to
|
357
|
+
expect(validator.run!).to be_truthy
|
361
358
|
expect(validator).to be_running
|
362
359
|
|
363
360
|
validator.reload
|
@@ -372,7 +369,7 @@ describe 'transitions with persistence' do
|
|
372
369
|
|
373
370
|
persistor.name = nil
|
374
371
|
expect(persistor).not_to be_valid
|
375
|
-
expect(persistor.run!).to
|
372
|
+
expect(persistor.run!).to be_truthy
|
376
373
|
expect(persistor).to be_running
|
377
374
|
|
378
375
|
persistor = InvalidPersistor.find(persistor.id)
|
@@ -477,7 +474,7 @@ describe "invalid states with persistence" do
|
|
477
474
|
it "should not store states" do
|
478
475
|
validator = Validator.create(:name => 'name')
|
479
476
|
validator.status = 'invalid_state'
|
480
|
-
expect(validator.save).to
|
477
|
+
expect(validator.save).to be_falsey
|
481
478
|
expect {validator.save!}.to raise_error(ActiveRecord::RecordInvalid)
|
482
479
|
|
483
480
|
validator.reload
|
@@ -487,7 +484,7 @@ describe "invalid states with persistence" do
|
|
487
484
|
it "should store invalid states if configured" do
|
488
485
|
persistor = InvalidPersistor.create(:name => 'name')
|
489
486
|
persistor.status = 'invalid_state'
|
490
|
-
expect(persistor.save).to
|
487
|
+
expect(persistor.save).to be_truthy
|
491
488
|
|
492
489
|
persistor.reload
|
493
490
|
expect(persistor.status).to eq('invalid_state')
|
@@ -10,19 +10,19 @@ describe 'transitions' do
|
|
10
10
|
|
11
11
|
it 'should not raise an exception when not whiny' do
|
12
12
|
silencer = Silencer.new
|
13
|
-
expect(silencer.smile!).to
|
13
|
+
expect(silencer.smile!).to be_falsey
|
14
14
|
expect(silencer).to be_silent
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should not raise an exception when superclass not whiny' do
|
18
18
|
sub = SubClassing.new
|
19
|
-
expect(sub.smile!).to
|
19
|
+
expect(sub.smile!).to be_falsey
|
20
20
|
expect(sub).to be_silent
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should not raise an exception when from is nil even if whiny' do
|
24
24
|
silencer = Silencer.new
|
25
|
-
expect(silencer.smile_any!).to
|
25
|
+
expect(silencer.smile_any!).to be_truthy
|
26
26
|
expect(silencer).to be_smiling
|
27
27
|
end
|
28
28
|
|
@@ -43,7 +43,7 @@ describe 'transitions' do
|
|
43
43
|
silencer.smile! do
|
44
44
|
success = true
|
45
45
|
end
|
46
|
-
}.not_to change { success }
|
46
|
+
}.not_to change { success }
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
@@ -64,14 +64,14 @@ describe AASM::Core::Transition do
|
|
64
64
|
it 'should set on_transition with deprecation warning' do
|
65
65
|
opts = {:from => 'foo', :to => 'bar'}
|
66
66
|
st = AASM::Core::Transition.allocate
|
67
|
-
st.
|
67
|
+
expect(st).to receive(:warn).with('[DEPRECATION] :on_transition is deprecated, use :after instead')
|
68
68
|
|
69
69
|
st.send :initialize, opts do
|
70
70
|
guard :gg
|
71
71
|
on_transition :after_callback
|
72
72
|
end
|
73
73
|
|
74
|
-
st.opts[:after].
|
74
|
+
expect(st.opts[:after]).to eql [:after_callback]
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'should set after and guard from dsl' do
|
@@ -81,8 +81,8 @@ describe AASM::Core::Transition do
|
|
81
81
|
after :after_callback
|
82
82
|
end
|
83
83
|
|
84
|
-
st.opts[:guard].
|
85
|
-
st.opts[:after].
|
84
|
+
expect(st.opts[:guard]).to eql ['g', :gg]
|
85
|
+
expect(st.opts[:after]).to eql [:after_callback] # TODO fix this bad code coupling
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should pass equality check if from and to are the same' do
|
@@ -124,7 +124,7 @@ describe AASM::Core::Transition, '- when performing guard checks' do
|
|
124
124
|
opts = {:from => 'foo', :to => 'bar'}
|
125
125
|
st = AASM::Core::Transition.new(opts)
|
126
126
|
|
127
|
-
expect(st.allowed?(nil)).to
|
127
|
+
expect(st.allowed?(nil)).to be_truthy
|
128
128
|
end
|
129
129
|
|
130
130
|
it 'should call the method on the object if guard is a symbol' do
|
@@ -185,7 +185,7 @@ describe AASM::Core::Transition, '- when executing the transition with a Proc' d
|
|
185
185
|
args = {:arg1 => '1', :arg2 => '2'}
|
186
186
|
obj = double('object', :aasm => 'aasm')
|
187
187
|
|
188
|
-
obj.
|
188
|
+
expect(obj).to receive(:test).with(args)
|
189
189
|
|
190
190
|
st.execute(obj, args)
|
191
191
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Barron
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-12-
|
13
|
+
date: 2014-12-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -46,20 +46,14 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '2.99'
|
49
|
+
version: '0'
|
53
50
|
type: :development
|
54
51
|
prerelease: false
|
55
52
|
version_requirements: !ruby/object:Gem::Requirement
|
56
53
|
requirements:
|
57
54
|
- - ">="
|
58
55
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '2.99'
|
56
|
+
version: '0'
|
63
57
|
- !ruby/object:Gem::Dependency
|
64
58
|
name: pry
|
65
59
|
requirement: !ruby/object:Gem::Requirement
|