aasm 3.0.17 → 3.0.18
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.
- data/CHANGELOG.md +4 -0
- data/lib/aasm.rb +13 -12
- data/lib/aasm/aasm.rb +50 -41
- data/lib/aasm/base.rb +1 -1
- data/lib/aasm/instance_base.rb +1 -1
- data/lib/aasm/persistence/base.rb +3 -2
- data/lib/aasm/version.rb +1 -1
- data/spec/models/father.rb +21 -0
- data/spec/models/son.rb +3 -0
- data/spec/schema.rb +5 -0
- data/spec/unit/persistence/active_record_persistence_spec.rb +7 -0
- data/spec/unit/subclassing_spec.rb +12 -0
- metadata +29 -80
data/CHANGELOG.md
CHANGED
data/lib/aasm.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
%w(
|
4
|
+
version
|
5
|
+
errors
|
6
|
+
base
|
7
|
+
instance_base
|
8
|
+
transition
|
9
|
+
event
|
10
|
+
state
|
11
|
+
localizer
|
12
|
+
state_machine
|
13
|
+
persistence
|
14
|
+
aasm
|
15
|
+
).each { |file| require File.join(File.dirname(__FILE__), 'aasm', file) }
|
15
16
|
|
16
17
|
# load the deprecated methods and modules
|
17
18
|
Dir[File.join(File.dirname(__FILE__), 'aasm', 'deprecated', '*.rb')].sort.each { |f| require File.expand_path(f) }
|
data/lib/aasm/aasm.rb
CHANGED
@@ -83,7 +83,10 @@ module AASM
|
|
83
83
|
|
84
84
|
# may be overwritten by persistence mixins
|
85
85
|
def aasm_read_state
|
86
|
-
aasm.enter_initial_state
|
86
|
+
# all the following lines behave like @current_state ||= aasm.enter_initial_state
|
87
|
+
current = aasm.instance_variable_get("@current_state")
|
88
|
+
return current if current
|
89
|
+
aasm.instance_variable_set("@current_state", aasm.enter_initial_state)
|
87
90
|
end
|
88
91
|
|
89
92
|
# may be overwritten by persistence mixins
|
@@ -134,61 +137,67 @@ module AASM
|
|
134
137
|
|
135
138
|
private
|
136
139
|
|
137
|
-
def aasm_fire_event(
|
138
|
-
|
139
|
-
|
140
|
-
event = self.class.aasm_events[name]
|
140
|
+
def aasm_fire_event(event_name, options, *args)
|
141
|
+
event = self.class.aasm_events[event_name]
|
141
142
|
begin
|
142
143
|
old_state = aasm.state_object_for_name(aasm.current_state)
|
143
|
-
|
144
|
-
|
145
144
|
old_state.fire_callbacks(:exit, self)
|
146
145
|
|
147
146
|
# new event before callback
|
148
147
|
event.fire_callbacks(:before, self)
|
149
148
|
|
150
149
|
if new_state_name = event.fire(self, *args)
|
151
|
-
|
150
|
+
fired(event, old_state, new_state_name, options)
|
151
|
+
else
|
152
|
+
failed(event_name, old_state)
|
153
|
+
end
|
154
|
+
rescue StandardError => e
|
155
|
+
event.fire_callbacks(:error, self, e) || raise(e)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def fired(event, old_state, new_state_name, options)
|
160
|
+
persist = options[:persist]
|
152
161
|
|
153
|
-
|
154
|
-
old_state.fire_callbacks(:before_exit, self)
|
155
|
-
new_state.fire_callbacks(:before_enter, self)
|
162
|
+
new_state = aasm.state_object_for_name(new_state_name)
|
156
163
|
|
157
|
-
|
164
|
+
# new before_ callbacks
|
165
|
+
old_state.fire_callbacks(:before_exit, self)
|
166
|
+
new_state.fire_callbacks(:before_enter, self)
|
158
167
|
|
159
|
-
|
160
|
-
if persist
|
161
|
-
persist_successful = aasm.set_current_state_with_persistence(new_state_name)
|
162
|
-
event.fire_callbacks(:success, self) if persist_successful
|
163
|
-
else
|
164
|
-
aasm.current_state = new_state_name
|
165
|
-
end
|
168
|
+
new_state.fire_callbacks(:enter, self)
|
166
169
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
170
|
+
persist_successful = true
|
171
|
+
if persist
|
172
|
+
persist_successful = aasm.set_current_state_with_persistence(new_state_name)
|
173
|
+
event.fire_callbacks(:success, self) if persist_successful
|
174
|
+
else
|
175
|
+
aasm.current_state = new_state_name
|
176
|
+
end
|
171
177
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
178
|
+
if persist_successful
|
179
|
+
old_state.fire_callbacks(:after_exit, self)
|
180
|
+
new_state.fire_callbacks(:after_enter, self)
|
181
|
+
event.fire_callbacks(:after, self)
|
176
182
|
|
177
|
-
|
183
|
+
self.aasm_event_fired(event.name, old_state.name, aasm.current_state) if self.respond_to?(:aasm_event_fired)
|
184
|
+
else
|
185
|
+
self.aasm_event_failed(event.name, old_state.name) if self.respond_to?(:aasm_event_failed)
|
186
|
+
end
|
178
187
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
event.fire_callbacks(:error, self, e) || raise(e)
|
188
|
+
persist_successful
|
189
|
+
end
|
190
|
+
|
191
|
+
def failed(event_name, old_state)
|
192
|
+
if self.respond_to?(:aasm_event_failed)
|
193
|
+
self.aasm_event_failed(event_name, old_state.name)
|
194
|
+
end
|
195
|
+
|
196
|
+
if AASM::StateMachine[self.class].config.whiny_transitions
|
197
|
+
raise AASM::InvalidTransition, "Event '#{event_name}' cannot transition from '#{aasm.current_state}'"
|
198
|
+
else
|
199
|
+
false
|
192
200
|
end
|
193
201
|
end
|
202
|
+
|
194
203
|
end
|
data/lib/aasm/base.rb
CHANGED
@@ -30,7 +30,7 @@ module AASM
|
|
30
30
|
@state_machine.initial_state = name if options[:initial] || !@state_machine.initial_state
|
31
31
|
|
32
32
|
@clazz.send(:define_method, "#{name.to_s}?") do
|
33
|
-
|
33
|
+
aasm.current_state == name
|
34
34
|
end
|
35
35
|
|
36
36
|
unless @clazz.const_defined?("STATE_#{name.to_s.upcase}")
|
data/lib/aasm/instance_base.rb
CHANGED
@@ -33,10 +33,11 @@ module AASM
|
|
33
33
|
#
|
34
34
|
# This allows for nil aasm states - be sure to add validation to your model
|
35
35
|
def aasm_read_state
|
36
|
+
state = send(self.class.aasm_column)
|
36
37
|
if new_record?
|
37
|
-
|
38
|
+
state.blank? ? aasm.determine_state_name(self.class.aasm_initial_state) : state.to_sym
|
38
39
|
else
|
39
|
-
|
40
|
+
state.nil? ? nil : state.to_sym
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
data/lib/aasm/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
class Father < ActiveRecord::Base
|
4
|
+
include AASM
|
5
|
+
|
6
|
+
aasm do
|
7
|
+
state :missing_details, :initial => true
|
8
|
+
state :pending_details_confirmation
|
9
|
+
|
10
|
+
event :add_details do
|
11
|
+
transitions :from => :missing_details, :to => :pending_details_confirmation
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_state
|
16
|
+
if may_add_details?
|
17
|
+
add_details!
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/spec/models/son.rb
ADDED
data/spec/schema.rb
CHANGED
@@ -122,6 +122,13 @@ end
|
|
122
122
|
|
123
123
|
describe 'transitions with persistence' do
|
124
124
|
|
125
|
+
it "should work for valid models" do
|
126
|
+
valid_object = Validator.create(:name => 'name')
|
127
|
+
valid_object.should be_sleeping
|
128
|
+
valid_object.status = :running
|
129
|
+
valid_object.should be_running
|
130
|
+
end
|
131
|
+
|
125
132
|
it 'should not store states for invalid models' do
|
126
133
|
validator = Validator.create(:name => 'name')
|
127
134
|
validator.should be_valid
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'subclassing' do
|
4
|
+
let(:son) {Son.new}
|
5
|
+
|
4
6
|
it 'should have the parent states' do
|
5
7
|
Foo.aasm_states.each do |state|
|
6
8
|
FooTwo.aasm_states.should include(state)
|
@@ -15,5 +17,15 @@ describe 'subclassing' do
|
|
15
17
|
it "should have the same events as its parent" do
|
16
18
|
Baz.aasm_events.should == Bar.aasm_events
|
17
19
|
end
|
20
|
+
|
21
|
+
it 'should know how to respond to `may_add_details?`' do
|
22
|
+
son.may_add_details?.should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should not break if I call Son#update_state' do
|
26
|
+
son.update_state
|
27
|
+
son.aasm_current_state.should == :pending_details_confirmation
|
28
|
+
end
|
29
|
+
|
18
30
|
end
|
19
31
|
|
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: 3.0.
|
4
|
+
version: 3.0.18
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,11 +12,11 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-05-16 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activerecord
|
19
|
-
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirement: &70315275195540 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
22
|
- - ! '>='
|
@@ -24,15 +24,10 @@ dependencies:
|
|
24
24
|
version: '0'
|
25
25
|
type: :development
|
26
26
|
prerelease: false
|
27
|
-
version_requirements:
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ! '>='
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '0'
|
27
|
+
version_requirements: *70315275195540
|
33
28
|
- !ruby/object:Gem::Dependency
|
34
29
|
name: mongoid
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirement: &70315275193680 !ruby/object:Gem::Requirement
|
36
31
|
none: false
|
37
32
|
requirements:
|
38
33
|
- - ! '>='
|
@@ -40,15 +35,10 @@ dependencies:
|
|
40
35
|
version: '0'
|
41
36
|
type: :development
|
42
37
|
prerelease: false
|
43
|
-
version_requirements:
|
44
|
-
none: false
|
45
|
-
requirements:
|
46
|
-
- - ! '>='
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
38
|
+
version_requirements: *70315275193680
|
49
39
|
- !ruby/object:Gem::Dependency
|
50
40
|
name: rake
|
51
|
-
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirement: &70315275191760 !ruby/object:Gem::Requirement
|
52
42
|
none: false
|
53
43
|
requirements:
|
54
44
|
- - ! '>='
|
@@ -56,15 +46,10 @@ dependencies:
|
|
56
46
|
version: '0'
|
57
47
|
type: :development
|
58
48
|
prerelease: false
|
59
|
-
version_requirements:
|
60
|
-
none: false
|
61
|
-
requirements:
|
62
|
-
- - ! '>='
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '0'
|
49
|
+
version_requirements: *70315275191760
|
65
50
|
- !ruby/object:Gem::Dependency
|
66
51
|
name: sdoc
|
67
|
-
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirement: &70315275191120 !ruby/object:Gem::Requirement
|
68
53
|
none: false
|
69
54
|
requirements:
|
70
55
|
- - ! '>='
|
@@ -72,15 +57,10 @@ dependencies:
|
|
72
57
|
version: '0'
|
73
58
|
type: :development
|
74
59
|
prerelease: false
|
75
|
-
version_requirements:
|
76
|
-
none: false
|
77
|
-
requirements:
|
78
|
-
- - ! '>='
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: '0'
|
60
|
+
version_requirements: *70315275191120
|
81
61
|
- !ruby/object:Gem::Dependency
|
82
62
|
name: rspec
|
83
|
-
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirement: &70315267341460 !ruby/object:Gem::Requirement
|
84
64
|
none: false
|
85
65
|
requirements:
|
86
66
|
- - ~>
|
@@ -88,15 +68,10 @@ dependencies:
|
|
88
68
|
version: '2.0'
|
89
69
|
type: :development
|
90
70
|
prerelease: false
|
91
|
-
version_requirements:
|
92
|
-
none: false
|
93
|
-
requirements:
|
94
|
-
- - ~>
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '2.0'
|
71
|
+
version_requirements: *70315267341460
|
97
72
|
- !ruby/object:Gem::Dependency
|
98
73
|
name: rr
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirement: &70315267340520 !ruby/object:Gem::Requirement
|
100
75
|
none: false
|
101
76
|
requirements:
|
102
77
|
- - ! '>='
|
@@ -104,15 +79,10 @@ dependencies:
|
|
104
79
|
version: '0'
|
105
80
|
type: :development
|
106
81
|
prerelease: false
|
107
|
-
version_requirements:
|
108
|
-
none: false
|
109
|
-
requirements:
|
110
|
-
- - ! '>='
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '0'
|
82
|
+
version_requirements: *70315267340520
|
113
83
|
- !ruby/object:Gem::Dependency
|
114
84
|
name: shoulda
|
115
|
-
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirement: &70315267339020 !ruby/object:Gem::Requirement
|
116
86
|
none: false
|
117
87
|
requirements:
|
118
88
|
- - ! '>='
|
@@ -120,15 +90,10 @@ dependencies:
|
|
120
90
|
version: '0'
|
121
91
|
type: :development
|
122
92
|
prerelease: false
|
123
|
-
version_requirements:
|
124
|
-
none: false
|
125
|
-
requirements:
|
126
|
-
- - ! '>='
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
version: '0'
|
93
|
+
version_requirements: *70315267339020
|
129
94
|
- !ruby/object:Gem::Dependency
|
130
95
|
name: sqlite3
|
131
|
-
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirement: &70315267338380 !ruby/object:Gem::Requirement
|
132
97
|
none: false
|
133
98
|
requirements:
|
134
99
|
- - ! '>='
|
@@ -136,15 +101,10 @@ dependencies:
|
|
136
101
|
version: '0'
|
137
102
|
type: :development
|
138
103
|
prerelease: false
|
139
|
-
version_requirements:
|
140
|
-
none: false
|
141
|
-
requirements:
|
142
|
-
- - ! '>='
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '0'
|
104
|
+
version_requirements: *70315267338380
|
145
105
|
- !ruby/object:Gem::Dependency
|
146
106
|
name: minitest
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirement: &70315267336860 !ruby/object:Gem::Requirement
|
148
108
|
none: false
|
149
109
|
requirements:
|
150
110
|
- - ! '>='
|
@@ -152,15 +112,10 @@ dependencies:
|
|
152
112
|
version: '0'
|
153
113
|
type: :development
|
154
114
|
prerelease: false
|
155
|
-
version_requirements:
|
156
|
-
none: false
|
157
|
-
requirements:
|
158
|
-
- - ! '>='
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
version: '0'
|
115
|
+
version_requirements: *70315267336860
|
161
116
|
- !ruby/object:Gem::Dependency
|
162
117
|
name: ruby-debug-completion
|
163
|
-
requirement: !ruby/object:Gem::Requirement
|
118
|
+
requirement: &70315267334180 !ruby/object:Gem::Requirement
|
164
119
|
none: false
|
165
120
|
requirements:
|
166
121
|
- - ! '>='
|
@@ -168,15 +123,10 @@ dependencies:
|
|
168
123
|
version: '0'
|
169
124
|
type: :development
|
170
125
|
prerelease: false
|
171
|
-
version_requirements:
|
172
|
-
none: false
|
173
|
-
requirements:
|
174
|
-
- - ! '>='
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version: '0'
|
126
|
+
version_requirements: *70315267334180
|
177
127
|
- !ruby/object:Gem::Dependency
|
178
128
|
name: coveralls
|
179
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirement: &70315267318500 !ruby/object:Gem::Requirement
|
180
130
|
none: false
|
181
131
|
requirements:
|
182
132
|
- - ! '>='
|
@@ -184,12 +134,7 @@ dependencies:
|
|
184
134
|
version: '0'
|
185
135
|
type: :development
|
186
136
|
prerelease: false
|
187
|
-
version_requirements:
|
188
|
-
none: false
|
189
|
-
requirements:
|
190
|
-
- - ! '>='
|
191
|
-
- !ruby/object:Gem::Version
|
192
|
-
version: '0'
|
137
|
+
version_requirements: *70315267318500
|
193
138
|
description: AASM is a continuation of the acts as state machine rails plugin, built
|
194
139
|
for plain Ruby objects.
|
195
140
|
email: scott@elitists.net, ttilley@gmail.com, aasm@mt7.de
|
@@ -234,6 +179,7 @@ files:
|
|
234
179
|
- spec/models/callback_new_dsl.rb
|
235
180
|
- spec/models/callback_old_dsl.rb
|
236
181
|
- spec/models/conversation.rb
|
182
|
+
- spec/models/father.rb
|
237
183
|
- spec/models/foo.rb
|
238
184
|
- spec/models/invalid_persistor.rb
|
239
185
|
- spec/models/mongoid/simple_mongoid.rb
|
@@ -243,6 +189,7 @@ files:
|
|
243
189
|
- spec/models/persistence.rb
|
244
190
|
- spec/models/process_with_new_dsl.rb
|
245
191
|
- spec/models/silencer.rb
|
192
|
+
- spec/models/son.rb
|
246
193
|
- spec/models/sub_classing.rb
|
247
194
|
- spec/models/this_name_better_not_be_in_use.rb
|
248
195
|
- spec/models/transactor.rb
|
@@ -286,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
233
|
version: '0'
|
287
234
|
requirements: []
|
288
235
|
rubyforge_project:
|
289
|
-
rubygems_version: 1.8.
|
236
|
+
rubygems_version: 1.8.11
|
290
237
|
signing_key:
|
291
238
|
specification_version: 3
|
292
239
|
summary: State machine mixin for Ruby objects
|
@@ -301,6 +248,7 @@ test_files:
|
|
301
248
|
- spec/models/callback_new_dsl.rb
|
302
249
|
- spec/models/callback_old_dsl.rb
|
303
250
|
- spec/models/conversation.rb
|
251
|
+
- spec/models/father.rb
|
304
252
|
- spec/models/foo.rb
|
305
253
|
- spec/models/invalid_persistor.rb
|
306
254
|
- spec/models/mongoid/simple_mongoid.rb
|
@@ -310,6 +258,7 @@ test_files:
|
|
310
258
|
- spec/models/persistence.rb
|
311
259
|
- spec/models/process_with_new_dsl.rb
|
312
260
|
- spec/models/silencer.rb
|
261
|
+
- spec/models/son.rb
|
313
262
|
- spec/models/sub_classing.rb
|
314
263
|
- spec/models/this_name_better_not_be_in_use.rb
|
315
264
|
- spec/models/transactor.rb
|