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.
@@ -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