aasm 3.0.22 → 3.0.23
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/README.md +24 -2
- data/lib/aasm/persistence/active_record_persistence.rb +8 -1
- data/lib/aasm/version.rb +1 -1
- data/spec/models/validator.rb +14 -1
- data/spec/unit/persistence/active_record_persistence_spec.rb +17 -0
- metadata +74 -24
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 3.0.23
|
4
|
+
|
5
|
+
* added support for `after_commit` callback (transaction support) (thanks to [@tisba](https://github.com/tisba))
|
6
|
+
|
3
7
|
## 3.0.22
|
4
8
|
|
5
9
|
* fixed [issue 88](https://github.com/aasm/aasm/issues/88): wrong number of arguments for transaction method
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# AASM - Ruby state machines
|
2
2
|
|
3
|
-
[](http://travis-ci.org/aasm/aasm) [](https://codeclimate.com/github/aasm/aasm) [](https://coveralls.io/r/aasm/aasm)
|
3
|
+
[](http://badge.fury.io/rb/aasm) [](http://travis-ci.org/aasm/aasm) [](https://codeclimate.com/github/aasm/aasm) [](https://coveralls.io/r/aasm/aasm)
|
4
4
|
|
5
5
|
This package contains AASM, a library for adding finite state machines to Ruby classes.
|
6
6
|
|
@@ -307,6 +307,28 @@ Since version *3.0.13* AASM supports ActiveRecord transactions. So whenever a tr
|
|
307
307
|
callback or the state update fails, all changes to any database record are rolled back.
|
308
308
|
Mongodb does not support transactions.
|
309
309
|
|
310
|
+
If you want to make sure a depending action happens only after the transaction is committed,
|
311
|
+
use the `after_commit` callback, like this:
|
312
|
+
|
313
|
+
```ruby
|
314
|
+
class Job < ActiveRecord::Base
|
315
|
+
include AASM
|
316
|
+
|
317
|
+
aasm do
|
318
|
+
state :sleeping, :initial => true
|
319
|
+
state :running
|
320
|
+
|
321
|
+
event :run, :after_commit => :notify_about_running_job do
|
322
|
+
transitions :from => :sleeping, :to => :running
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def notify_about_running_job
|
327
|
+
...
|
328
|
+
end
|
329
|
+
end
|
330
|
+
```
|
331
|
+
|
310
332
|
### Column name & migration
|
311
333
|
|
312
334
|
As a default AASM uses the column `aasm_state` to store the states. You can override
|
@@ -338,7 +360,7 @@ class AddJobState < ActiveRecord::Migration
|
|
338
360
|
end
|
339
361
|
```
|
340
362
|
|
341
|
-
###
|
363
|
+
### Inspection
|
342
364
|
|
343
365
|
AASM supports a couple of methods to find out which states or events are provided or permissible.
|
344
366
|
|
@@ -132,9 +132,16 @@ module AASM
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def aasm_fire_event(name, options, *args)
|
135
|
-
self.class.transaction(:requires_new => true) do
|
135
|
+
success = self.class.transaction(:requires_new => true) do
|
136
136
|
super
|
137
137
|
end
|
138
|
+
|
139
|
+
if success
|
140
|
+
new_state = aasm.state_object_for_name(aasm.current_state)
|
141
|
+
new_state.fire_callbacks(:after_commit, self)
|
142
|
+
end
|
143
|
+
|
144
|
+
success
|
138
145
|
end
|
139
146
|
end # InstanceMethods
|
140
147
|
|
data/lib/aasm/version.rb
CHANGED
data/spec/models/validator.rb
CHANGED
@@ -4,13 +4,26 @@ class Validator < ActiveRecord::Base
|
|
4
4
|
include AASM
|
5
5
|
aasm :column => :status do
|
6
6
|
state :sleeping, :initial => true
|
7
|
-
state :running
|
7
|
+
state :running, :after_commit => :change_name!
|
8
|
+
state :failed, :after_enter => :fail, :after_commit => :change_name!
|
8
9
|
event :run do
|
9
10
|
transitions :to => :running, :from => :sleeping
|
10
11
|
end
|
11
12
|
event :sleep do
|
12
13
|
transitions :to => :sleeping, :from => :running
|
13
14
|
end
|
15
|
+
event :fail do
|
16
|
+
transitions :to => :failed, :from => [:sleeping, :running]
|
17
|
+
end
|
14
18
|
end
|
15
19
|
validates_presence_of :name
|
20
|
+
|
21
|
+
def change_name!
|
22
|
+
self.name = "name changed"
|
23
|
+
save!
|
24
|
+
end
|
25
|
+
|
26
|
+
def fail
|
27
|
+
raise StandardError.new('failed on purpose')
|
28
|
+
end
|
16
29
|
end
|
@@ -202,5 +202,22 @@ describe 'transitions with persistence' do
|
|
202
202
|
transactor.should be_running
|
203
203
|
worker.reload.status.should == 'sleeping'
|
204
204
|
end
|
205
|
+
|
206
|
+
describe "after_commit callback" do
|
207
|
+
it "should fire :after_commit if transaction was successful" do
|
208
|
+
validator = Validator.create(:name => 'name')
|
209
|
+
validator.should be_sleeping
|
210
|
+
validator.run!
|
211
|
+
validator.should be_running
|
212
|
+
validator.name.should_not == "name"
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should not fire :after_commit if transaction failed" do
|
216
|
+
validator = Validator.create(:name => 'name')
|
217
|
+
lambda { validator.fail! }.should raise_error(StandardError, 'failed on purpose')
|
218
|
+
validator.name.should == "name"
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
205
222
|
end
|
206
223
|
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: 3.0.
|
4
|
+
version: 3.0.23
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,22 +12,27 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activerecord
|
19
|
-
requirement:
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
|
-
- - =
|
22
|
+
- - '='
|
23
23
|
- !ruby/object:Gem::Version
|
24
24
|
version: 3.2.12
|
25
25
|
type: :development
|
26
26
|
prerelease: false
|
27
|
-
version_requirements:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - '='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.2.12
|
28
33
|
- !ruby/object:Gem::Dependency
|
29
34
|
name: mongoid
|
30
|
-
requirement:
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
31
36
|
none: false
|
32
37
|
requirements:
|
33
38
|
- - ! '>='
|
@@ -35,10 +40,15 @@ dependencies:
|
|
35
40
|
version: '0'
|
36
41
|
type: :development
|
37
42
|
prerelease: false
|
38
|
-
version_requirements:
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
39
49
|
- !ruby/object:Gem::Dependency
|
40
50
|
name: rake
|
41
|
-
requirement:
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
42
52
|
none: false
|
43
53
|
requirements:
|
44
54
|
- - ! '>='
|
@@ -46,10 +56,15 @@ dependencies:
|
|
46
56
|
version: '0'
|
47
57
|
type: :development
|
48
58
|
prerelease: false
|
49
|
-
version_requirements:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
50
65
|
- !ruby/object:Gem::Dependency
|
51
66
|
name: sdoc
|
52
|
-
requirement:
|
67
|
+
requirement: !ruby/object:Gem::Requirement
|
53
68
|
none: false
|
54
69
|
requirements:
|
55
70
|
- - ! '>='
|
@@ -57,10 +72,15 @@ dependencies:
|
|
57
72
|
version: '0'
|
58
73
|
type: :development
|
59
74
|
prerelease: false
|
60
|
-
version_requirements:
|
75
|
+
version_requirements: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
61
81
|
- !ruby/object:Gem::Dependency
|
62
82
|
name: rspec
|
63
|
-
requirement:
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
64
84
|
none: false
|
65
85
|
requirements:
|
66
86
|
- - ~>
|
@@ -68,10 +88,15 @@ dependencies:
|
|
68
88
|
version: '2.0'
|
69
89
|
type: :development
|
70
90
|
prerelease: false
|
71
|
-
version_requirements:
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.0'
|
72
97
|
- !ruby/object:Gem::Dependency
|
73
98
|
name: rr
|
74
|
-
requirement:
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
75
100
|
none: false
|
76
101
|
requirements:
|
77
102
|
- - ! '>='
|
@@ -79,10 +104,15 @@ dependencies:
|
|
79
104
|
version: '0'
|
80
105
|
type: :development
|
81
106
|
prerelease: false
|
82
|
-
version_requirements:
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
83
113
|
- !ruby/object:Gem::Dependency
|
84
114
|
name: sqlite3
|
85
|
-
requirement:
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
86
116
|
none: false
|
87
117
|
requirements:
|
88
118
|
- - ! '>='
|
@@ -90,10 +120,15 @@ dependencies:
|
|
90
120
|
version: '0'
|
91
121
|
type: :development
|
92
122
|
prerelease: false
|
93
|
-
version_requirements:
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
94
129
|
- !ruby/object:Gem::Dependency
|
95
130
|
name: minitest
|
96
|
-
requirement:
|
131
|
+
requirement: !ruby/object:Gem::Requirement
|
97
132
|
none: false
|
98
133
|
requirements:
|
99
134
|
- - ! '>='
|
@@ -101,10 +136,15 @@ dependencies:
|
|
101
136
|
version: '0'
|
102
137
|
type: :development
|
103
138
|
prerelease: false
|
104
|
-
version_requirements:
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ! '>='
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
105
145
|
- !ruby/object:Gem::Dependency
|
106
146
|
name: ruby-debug-completion
|
107
|
-
requirement:
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
108
148
|
none: false
|
109
149
|
requirements:
|
110
150
|
- - ! '>='
|
@@ -112,10 +152,15 @@ dependencies:
|
|
112
152
|
version: '0'
|
113
153
|
type: :development
|
114
154
|
prerelease: false
|
115
|
-
version_requirements:
|
155
|
+
version_requirements: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
116
161
|
- !ruby/object:Gem::Dependency
|
117
162
|
name: coveralls
|
118
|
-
requirement:
|
163
|
+
requirement: !ruby/object:Gem::Requirement
|
119
164
|
none: false
|
120
165
|
requirements:
|
121
166
|
- - ! '>='
|
@@ -123,7 +168,12 @@ dependencies:
|
|
123
168
|
version: '0'
|
124
169
|
type: :development
|
125
170
|
prerelease: false
|
126
|
-
version_requirements:
|
171
|
+
version_requirements: !ruby/object:Gem::Requirement
|
172
|
+
none: false
|
173
|
+
requirements:
|
174
|
+
- - ! '>='
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
127
177
|
description: AASM is a continuation of the acts as state machine rails plugin, built
|
128
178
|
for plain Ruby objects.
|
129
179
|
email: scott@elitists.net, ttilley@gmail.com, aasm@mt7.de
|
@@ -223,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
273
|
version: '0'
|
224
274
|
requirements: []
|
225
275
|
rubyforge_project:
|
226
|
-
rubygems_version: 1.8.
|
276
|
+
rubygems_version: 1.8.24
|
227
277
|
signing_key:
|
228
278
|
specification_version: 3
|
229
279
|
summary: State machine mixin for Ruby objects
|