aasm 3.0.12 → 3.0.13
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 +7 -1
- data/lib/aasm/aasm.rb +2 -2
- data/lib/aasm/persistence/active_record_persistence.rb +7 -1
- data/lib/aasm/version.rb +1 -1
- data/spec/models/transactor.rb +26 -0
- data/spec/models/worker.rb +2 -0
- data/spec/schema.rb +11 -0
- data/spec/unit/active_record_persistence_spec.rb +14 -0
- metadata +25 -21
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
|
@@ -5,7 +5,13 @@ This package contains AASM, a library for adding finite state machines to Ruby c
|
|
|
5
5
|
AASM started as the acts_as_state_machine plugin but has evolved into a more generic library
|
|
6
6
|
that no longer targets only ActiveRecord models. It currently provides adapters for
|
|
7
7
|
[ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html) and
|
|
8
|
-
[Mongoid](http://mongoid.org/)
|
|
8
|
+
[Mongoid](http://mongoid.org/), but it can be used for any Ruby class, no matter its
|
|
9
|
+
parent class.
|
|
10
|
+
|
|
11
|
+
### Transaction support
|
|
12
|
+
|
|
13
|
+
Since version 3.0.13 AASM supports ActiveRecord transactions. So whenever a transition
|
|
14
|
+
callback fails, all changes to any database record are rolled back.
|
|
9
15
|
|
|
10
16
|
## Features ##
|
|
11
17
|
|
data/lib/aasm/aasm.rb
CHANGED
|
@@ -7,7 +7,7 @@ module AASM
|
|
|
7
7
|
AASM::StateMachine[base] = AASM::StateMachine.new('')
|
|
8
8
|
end
|
|
9
9
|
AASM::Persistence.set_persistence(base)
|
|
10
|
-
|
|
10
|
+
super
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
module ClassMethods
|
|
@@ -72,7 +72,7 @@ module AASM
|
|
|
72
72
|
def aasm_human_event_name(event)
|
|
73
73
|
AASM::SupportingClasses::Localizer.new.human_event_name(self, event)
|
|
74
74
|
end
|
|
75
|
-
end
|
|
75
|
+
end # ClassMethods
|
|
76
76
|
|
|
77
77
|
# this method does what? does it deliver the current state?
|
|
78
78
|
def aasm_current_state
|
|
@@ -42,7 +42,7 @@ module AASM
|
|
|
42
42
|
base.before_validation(:aasm_ensure_initial_state, :on => :create)
|
|
43
43
|
else
|
|
44
44
|
base.before_validation_on_create(:aasm_ensure_initial_state)
|
|
45
|
-
end
|
|
45
|
+
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
module ClassMethods
|
|
@@ -149,6 +149,12 @@ module AASM
|
|
|
149
149
|
aasm_enter_initial_state if send(self.class.aasm_column).blank?
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
+
def aasm_fire_event(name, options, *args)
|
|
153
|
+
transaction do
|
|
154
|
+
super
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
152
158
|
end
|
|
153
159
|
|
|
154
160
|
module WriteStateWithoutPersistence
|
data/lib/aasm/version.rb
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'active_record'
|
|
2
|
+
class Transactor < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
belongs_to :worker
|
|
5
|
+
|
|
6
|
+
include AASM
|
|
7
|
+
aasm :column => :status do
|
|
8
|
+
state :sleeping, :initial => true
|
|
9
|
+
state :running, :before_enter => :start_worker, :after_enter => :fail
|
|
10
|
+
|
|
11
|
+
event :run do
|
|
12
|
+
transitions :to => :running, :from => :sleeping
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def start_worker
|
|
19
|
+
worker.update_attribute(:status, 'running')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def fail
|
|
23
|
+
raise StandardError.new('failed on purpose')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
data/spec/schema.rb
CHANGED
|
@@ -11,6 +11,17 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
11
11
|
t.string "status"
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
create_table "transactors", :force => true do |t|
|
|
15
|
+
t.string "name"
|
|
16
|
+
t.string "status"
|
|
17
|
+
t.integer "worker_id"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
create_table "workers", :force => true do |t|
|
|
21
|
+
t.string "name"
|
|
22
|
+
t.string "status"
|
|
23
|
+
end
|
|
24
|
+
|
|
14
25
|
create_table "invalid_persistors", :force => true do |t|
|
|
15
26
|
t.string "name"
|
|
16
27
|
t.string "status"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'active_record'
|
|
3
3
|
require 'logger'
|
|
4
|
+
require 'spec_helper'
|
|
4
5
|
|
|
5
6
|
load_schema
|
|
6
7
|
|
|
@@ -317,4 +318,17 @@ describe 'transitions with persistence' do
|
|
|
317
318
|
persistor.should_not be_sleeping
|
|
318
319
|
end
|
|
319
320
|
|
|
321
|
+
describe 'transactions' do
|
|
322
|
+
it 'should rollback all changes' do
|
|
323
|
+
worker = Worker.create!(:name => 'worker', :status => 'sleeping')
|
|
324
|
+
transactor = Transactor.create!(:name => 'transactor', :worker => worker)
|
|
325
|
+
transactor.should be_sleeping
|
|
326
|
+
worker.status.should == 'sleeping'
|
|
327
|
+
|
|
328
|
+
lambda {transactor.run!}.should raise_error(StandardError, 'failed on purpose')
|
|
329
|
+
transactor.should be_running
|
|
330
|
+
worker.reload.status.should == 'sleeping'
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
320
334
|
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.13
|
|
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: 2012-10-
|
|
15
|
+
date: 2012-10-24 00:00:00.000000000 Z
|
|
16
16
|
dependencies:
|
|
17
17
|
- !ruby/object:Gem::Dependency
|
|
18
18
|
name: activerecord
|
|
19
|
-
requirement: &
|
|
19
|
+
requirement: &70225605361380 !ruby/object:Gem::Requirement
|
|
20
20
|
none: false
|
|
21
21
|
requirements:
|
|
22
22
|
- - ! '>='
|
|
@@ -24,10 +24,10 @@ dependencies:
|
|
|
24
24
|
version: '0'
|
|
25
25
|
type: :development
|
|
26
26
|
prerelease: false
|
|
27
|
-
version_requirements: *
|
|
27
|
+
version_requirements: *70225605361380
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: rake
|
|
30
|
-
requirement: &
|
|
30
|
+
requirement: &70225605360580 !ruby/object:Gem::Requirement
|
|
31
31
|
none: false
|
|
32
32
|
requirements:
|
|
33
33
|
- - ! '>='
|
|
@@ -35,10 +35,10 @@ dependencies:
|
|
|
35
35
|
version: '0'
|
|
36
36
|
type: :development
|
|
37
37
|
prerelease: false
|
|
38
|
-
version_requirements: *
|
|
38
|
+
version_requirements: *70225605360580
|
|
39
39
|
- !ruby/object:Gem::Dependency
|
|
40
40
|
name: sdoc
|
|
41
|
-
requirement: &
|
|
41
|
+
requirement: &70225605359780 !ruby/object:Gem::Requirement
|
|
42
42
|
none: false
|
|
43
43
|
requirements:
|
|
44
44
|
- - ! '>='
|
|
@@ -46,10 +46,10 @@ dependencies:
|
|
|
46
46
|
version: '0'
|
|
47
47
|
type: :development
|
|
48
48
|
prerelease: false
|
|
49
|
-
version_requirements: *
|
|
49
|
+
version_requirements: *70225605359780
|
|
50
50
|
- !ruby/object:Gem::Dependency
|
|
51
51
|
name: rspec
|
|
52
|
-
requirement: &
|
|
52
|
+
requirement: &70225605358760 !ruby/object:Gem::Requirement
|
|
53
53
|
none: false
|
|
54
54
|
requirements:
|
|
55
55
|
- - ~>
|
|
@@ -57,10 +57,10 @@ dependencies:
|
|
|
57
57
|
version: '2.0'
|
|
58
58
|
type: :development
|
|
59
59
|
prerelease: false
|
|
60
|
-
version_requirements: *
|
|
60
|
+
version_requirements: *70225605358760
|
|
61
61
|
- !ruby/object:Gem::Dependency
|
|
62
62
|
name: rr
|
|
63
|
-
requirement: &
|
|
63
|
+
requirement: &70225605358000 !ruby/object:Gem::Requirement
|
|
64
64
|
none: false
|
|
65
65
|
requirements:
|
|
66
66
|
- - ! '>='
|
|
@@ -68,10 +68,10 @@ dependencies:
|
|
|
68
68
|
version: '0'
|
|
69
69
|
type: :development
|
|
70
70
|
prerelease: false
|
|
71
|
-
version_requirements: *
|
|
71
|
+
version_requirements: *70225605358000
|
|
72
72
|
- !ruby/object:Gem::Dependency
|
|
73
73
|
name: shoulda
|
|
74
|
-
requirement: &
|
|
74
|
+
requirement: &70225605357260 !ruby/object:Gem::Requirement
|
|
75
75
|
none: false
|
|
76
76
|
requirements:
|
|
77
77
|
- - ! '>='
|
|
@@ -79,10 +79,10 @@ dependencies:
|
|
|
79
79
|
version: '0'
|
|
80
80
|
type: :development
|
|
81
81
|
prerelease: false
|
|
82
|
-
version_requirements: *
|
|
82
|
+
version_requirements: *70225605357260
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: sqlite3
|
|
85
|
-
requirement: &
|
|
85
|
+
requirement: &70225605356360 !ruby/object:Gem::Requirement
|
|
86
86
|
none: false
|
|
87
87
|
requirements:
|
|
88
88
|
- - ! '>='
|
|
@@ -90,10 +90,10 @@ dependencies:
|
|
|
90
90
|
version: '0'
|
|
91
91
|
type: :development
|
|
92
92
|
prerelease: false
|
|
93
|
-
version_requirements: *
|
|
93
|
+
version_requirements: *70225605356360
|
|
94
94
|
- !ruby/object:Gem::Dependency
|
|
95
95
|
name: minitest
|
|
96
|
-
requirement: &
|
|
96
|
+
requirement: &70225605355320 !ruby/object:Gem::Requirement
|
|
97
97
|
none: false
|
|
98
98
|
requirements:
|
|
99
99
|
- - ! '>='
|
|
@@ -101,10 +101,10 @@ dependencies:
|
|
|
101
101
|
version: '0'
|
|
102
102
|
type: :development
|
|
103
103
|
prerelease: false
|
|
104
|
-
version_requirements: *
|
|
104
|
+
version_requirements: *70225605355320
|
|
105
105
|
- !ruby/object:Gem::Dependency
|
|
106
106
|
name: ruby-debug-completion
|
|
107
|
-
requirement: &
|
|
107
|
+
requirement: &70225605367020 !ruby/object:Gem::Requirement
|
|
108
108
|
none: false
|
|
109
109
|
requirements:
|
|
110
110
|
- - ! '>='
|
|
@@ -112,7 +112,7 @@ dependencies:
|
|
|
112
112
|
version: '0'
|
|
113
113
|
type: :development
|
|
114
114
|
prerelease: false
|
|
115
|
-
version_requirements: *
|
|
115
|
+
version_requirements: *70225605367020
|
|
116
116
|
description: AASM is a continuation of the acts as state machine rails plugin, built
|
|
117
117
|
for plain Ruby objects.
|
|
118
118
|
email: scott@elitists.net, ttilley@gmail.com, aasm@mt7.de
|
|
@@ -152,7 +152,9 @@ files:
|
|
|
152
152
|
- spec/models/process_with_new_dsl.rb
|
|
153
153
|
- spec/models/silencer.rb
|
|
154
154
|
- spec/models/sub_classing.rb
|
|
155
|
+
- spec/models/transactor.rb
|
|
155
156
|
- spec/models/validator.rb
|
|
157
|
+
- spec/models/worker.rb
|
|
156
158
|
- spec/schema.rb
|
|
157
159
|
- spec/spec_helper.rb
|
|
158
160
|
- spec/spec_helpers/models_spec_helper.rb
|
|
@@ -188,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
188
190
|
version: '0'
|
|
189
191
|
requirements: []
|
|
190
192
|
rubyforge_project:
|
|
191
|
-
rubygems_version: 1.8.
|
|
193
|
+
rubygems_version: 1.8.11
|
|
192
194
|
signing_key:
|
|
193
195
|
specification_version: 3
|
|
194
196
|
summary: State machine mixin for Ruby objects
|
|
@@ -202,7 +204,9 @@ test_files:
|
|
|
202
204
|
- spec/models/process_with_new_dsl.rb
|
|
203
205
|
- spec/models/silencer.rb
|
|
204
206
|
- spec/models/sub_classing.rb
|
|
207
|
+
- spec/models/transactor.rb
|
|
205
208
|
- spec/models/validator.rb
|
|
209
|
+
- spec/models/worker.rb
|
|
206
210
|
- spec/schema.rb
|
|
207
211
|
- spec/spec_helper.rb
|
|
208
212
|
- spec/spec_helpers/models_spec_helper.rb
|