aasm 4.0.5 → 4.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|