aasm 3.0.12 → 3.0.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.0.13
4
+
5
+ * supporting ActiveRecord transactions when firing an event
6
+
3
7
  ## 3.0.12
4
8
 
5
9
  * aasm_from_states_for_state now supports to filter for specific transition
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
 
@@ -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
- super
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
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "3.0.12"
2
+ VERSION = "3.0.13"
3
3
  end
@@ -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
@@ -0,0 +1,2 @@
1
+ class Worker < ActiveRecord::Base
2
+ end
@@ -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.12
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-19 00:00:00.000000000Z
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: &70194149278160 !ruby/object:Gem::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: *70194149278160
27
+ version_requirements: *70225605361380
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
- requirement: &70194149277740 !ruby/object:Gem::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: *70194149277740
38
+ version_requirements: *70225605360580
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: sdoc
41
- requirement: &70194149277320 !ruby/object:Gem::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: *70194149277320
49
+ version_requirements: *70225605359780
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: rspec
52
- requirement: &70194149276820 !ruby/object:Gem::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: *70194149276820
60
+ version_requirements: *70225605358760
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rr
63
- requirement: &70194149276400 !ruby/object:Gem::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: *70194149276400
71
+ version_requirements: *70225605358000
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: shoulda
74
- requirement: &70194149275940 !ruby/object:Gem::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: *70194149275940
82
+ version_requirements: *70225605357260
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: sqlite3
85
- requirement: &70194149275520 !ruby/object:Gem::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: *70194149275520
93
+ version_requirements: *70225605356360
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: minitest
96
- requirement: &70194149275100 !ruby/object:Gem::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: *70194149275100
104
+ version_requirements: *70225605355320
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: ruby-debug-completion
107
- requirement: &70194149306160 !ruby/object:Gem::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: *70194149306160
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.15
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