aasm 4.12.1 → 4.12.2
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.
- checksums.yaml +4 -4
- data/Appraisals +1 -4
- data/CHANGELOG.md +8 -3
- data/README.md +46 -31
- data/gemfiles/rails_5.0.gemfile +1 -0
- data/lib/aasm/aasm.rb +2 -0
- data/lib/aasm/core/event.rb +10 -11
- data/lib/aasm/core/transition.rb +1 -1
- data/lib/aasm/errors.rb +1 -4
- data/lib/aasm/version.rb +1 -1
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/unit/complex_example_spec.rb +2 -2
- data/spec/unit/complex_multiple_example_spec.rb +3 -3
- data/spec/unit/event_multiple_spec.rb +1 -1
- data/spec/unit/event_spec.rb +4 -4
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13bde38e3731e93db61f6058f32cba8a1a1f6fa0
|
4
|
+
data.tar.gz: a5ab477ba4a18e4e90d2d61c9010421fb39e2011
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f51ca4fab23d2e61bdb392ae49a63b2a003a6de07251e39c8dcab892e2282073ed420f35c9bf131f2261ed68bd7d4fdbabd338acd5dbe4ec7f98e1eefaa6c757
|
7
|
+
data.tar.gz: a4eb3ffcceee128b4b3f33bc9e27d69993887a4f7ce2d56a0d4fa0541f154eb3c7cb16d2d9b75a9c4f86fced4af73cf9415b90ca5dd3fcd3d79f3cd81fa981ad
|
data/Appraisals
CHANGED
@@ -37,10 +37,7 @@ appraise 'rails_5.0' do
|
|
37
37
|
gem 'rails', '5.0.0'
|
38
38
|
gem 'mongoid', '~>6.0'
|
39
39
|
gem 'sequel'
|
40
|
-
|
41
|
-
# dynamoid is not yet Rails 5 compatible
|
42
|
-
# gem 'dynamoid', '~> 1', :platforms => :ruby
|
43
|
-
|
40
|
+
gem 'dynamoid', '~> 1', :platforms => :ruby
|
44
41
|
gem 'aws-sdk', '~>2', :platforms => :ruby
|
45
42
|
gem 'redis-objects'
|
46
43
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
3
|
## unreleased
|
4
|
+
## 4.12.2
|
5
|
+
|
6
|
+
* Fix guards parameter [#484](https://github.com/aasm/aasm/pull/484), thanks to [teohm](https://github.com/teohm)
|
7
|
+
* Make errors more inspectable [#452](https://github.com/aasm/aasm/pull/452), thanks to [flexoid](https://github.com/flexoid)
|
8
|
+
* Enable Dynamoid for Rails 5 [#483](https://github.com/aasm/aasm/pull/483), thanks to [focusshifter](https://github.com/focusshifter)
|
4
9
|
|
5
10
|
## 4.12.1
|
6
11
|
|
7
|
-
* DRY-up Mongoid and ActiveRecord Persistence, Add Sequel transactions and locking #475, thanks to [@Aryk] (https://github.com/Aryk)
|
8
|
-
* Add aliases for event methods #476, thanks to [@Aryk] (https://github.com/Aryk)
|
9
|
-
* Support Minitest spec expectations
|
12
|
+
* DRY-up Mongoid and ActiveRecord Persistence, Add Sequel transactions and locking [#475](https://github.com/aasm/aasm/pull/475), thanks to [@Aryk] (https://github.com/Aryk)
|
13
|
+
* Add aliases for event methods [#476](https://github.com/aasm/aasm/pull/476), thanks to [@Aryk] (https://github.com/Aryk)
|
14
|
+
* Support Minitest spec expectations [#387](https://github.com/aasm/aasm/pull/387), thanks to [@faragorn] (https://github.com/faragorn)
|
10
15
|
## 4.12.0
|
11
16
|
|
12
17
|
* Fix thread safe issue with concurrent-ruby gem [see [pull-request #422](https://github.com/aasm/aasm/pull/442), thanks to [@reidmorrison](https://github.com/reidmorrison)
|
data/README.md
CHANGED
@@ -165,37 +165,6 @@ class LogRunTime
|
|
165
165
|
end
|
166
166
|
```
|
167
167
|
|
168
|
-
Here you can see a list of all possible callbacks, together with their order of calling:
|
169
|
-
|
170
|
-
```ruby
|
171
|
-
begin
|
172
|
-
event before_all_events
|
173
|
-
event before
|
174
|
-
event guards
|
175
|
-
transition guards
|
176
|
-
old_state before_exit
|
177
|
-
old_state exit
|
178
|
-
after_all_transitions
|
179
|
-
transition after
|
180
|
-
new_state before_enter
|
181
|
-
new_state enter
|
182
|
-
...update state...
|
183
|
-
event before_success # if persist successful
|
184
|
-
transition success # if persist successful
|
185
|
-
event success # if persist successful
|
186
|
-
old_state after_exit
|
187
|
-
new_state after_enter
|
188
|
-
event after
|
189
|
-
event after_all_events
|
190
|
-
rescue
|
191
|
-
event error
|
192
|
-
event error_on_all_events
|
193
|
-
ensure
|
194
|
-
event ensure
|
195
|
-
event ensure_on_all_events
|
196
|
-
end
|
197
|
-
```
|
198
|
-
|
199
168
|
Also, you can pass parameters to events:
|
200
169
|
|
201
170
|
```ruby
|
@@ -228,6 +197,39 @@ and the target state (the to state), like this:
|
|
228
197
|
end
|
229
198
|
```
|
230
199
|
|
200
|
+
#### Lifecycle
|
201
|
+
|
202
|
+
Here you can see a list of all possible callbacks, together with their order of calling:
|
203
|
+
|
204
|
+
```ruby
|
205
|
+
begin
|
206
|
+
event before_all_events
|
207
|
+
event before
|
208
|
+
event guards
|
209
|
+
transition guards
|
210
|
+
old_state before_exit
|
211
|
+
old_state exit
|
212
|
+
after_all_transitions
|
213
|
+
transition after
|
214
|
+
new_state before_enter
|
215
|
+
new_state enter
|
216
|
+
...update state...
|
217
|
+
event before_success # if persist successful
|
218
|
+
transition success # if persist successful
|
219
|
+
event success # if persist successful
|
220
|
+
old_state after_exit
|
221
|
+
new_state after_enter
|
222
|
+
event after
|
223
|
+
event after_all_events
|
224
|
+
rescue
|
225
|
+
event error
|
226
|
+
event error_on_all_events
|
227
|
+
ensure
|
228
|
+
event ensure
|
229
|
+
event ensure_on_all_events
|
230
|
+
end
|
231
|
+
```
|
232
|
+
|
231
233
|
#### The current event triggered
|
232
234
|
|
233
235
|
While running the callbacks you can easily retrieve the name of the event triggered
|
@@ -280,11 +282,19 @@ class Cleaner
|
|
280
282
|
end
|
281
283
|
transitions :from => :idle, :to => :idle
|
282
284
|
end
|
285
|
+
|
286
|
+
event :clean_if_dirty do
|
287
|
+
transitions :from => :idle, :to => :cleaning, :guard => :if_dirty?
|
288
|
+
end
|
283
289
|
end
|
284
290
|
|
285
291
|
def cleaning_needed?
|
286
292
|
false
|
287
293
|
end
|
294
|
+
|
295
|
+
def if_dirty?(status)
|
296
|
+
status == :dirty
|
297
|
+
end
|
288
298
|
end
|
289
299
|
|
290
300
|
job = Cleaner.new
|
@@ -292,6 +302,9 @@ job.may_clean? # => false
|
|
292
302
|
job.clean # => raises AASM::InvalidTransition
|
293
303
|
job.may_clean_if_needed? # => true
|
294
304
|
job.clean_if_needed! # idle
|
305
|
+
|
306
|
+
job.clean_if_dirty(:clean) # => false
|
307
|
+
job.clean_if_dirty(:dirty) # => true
|
295
308
|
```
|
296
309
|
|
297
310
|
You can even provide a number of guards, which all have to succeed to proceed
|
@@ -1016,6 +1029,8 @@ class Job
|
|
1016
1029
|
end
|
1017
1030
|
```
|
1018
1031
|
|
1032
|
+
You can hide warnings by setting `AASM::Configuration.hide_warnings = true`
|
1033
|
+
|
1019
1034
|
### RubyMotion support
|
1020
1035
|
|
1021
1036
|
Now supports [CodeDataQuery](https://github.com/infinitered/cdq.git) !
|
data/gemfiles/rails_5.0.gemfile
CHANGED
data/lib/aasm/aasm.rb
CHANGED
data/lib/aasm/core/event.rb
CHANGED
@@ -40,11 +40,11 @@ module AASM::Core
|
|
40
40
|
# a neutered version of fire - it doesn't actually fire the event, it just
|
41
41
|
# executes the transition guards to determine if a transition is even
|
42
42
|
# an option given current conditions.
|
43
|
-
def may_fire?(obj, to_state
|
43
|
+
def may_fire?(obj, to_state=::AASM::NO_VALUE, *args)
|
44
44
|
_fire(obj, {:test_only => true}, to_state, *args) # true indicates test firing
|
45
45
|
end
|
46
46
|
|
47
|
-
def fire(obj, options={}, to_state
|
47
|
+
def fire(obj, options={}, to_state=::AASM::NO_VALUE, *args)
|
48
48
|
_fire(obj, options, to_state, *args) # false indicates this is not a test (fire!)
|
49
49
|
end
|
50
50
|
|
@@ -121,20 +121,19 @@ module AASM::Core
|
|
121
121
|
definitions
|
122
122
|
end
|
123
123
|
|
124
|
-
def _fire(obj, options={}, to_state
|
124
|
+
def _fire(obj, options={}, to_state=::AASM::NO_VALUE, *args)
|
125
125
|
result = options[:test_only] ? false : nil
|
126
126
|
transitions = @transitions.select { |t| t.from == obj.aasm(state_machine.name).current_state || t.from == nil}
|
127
127
|
return result if transitions.size == 0
|
128
128
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
args.unshift(to_state)
|
134
|
-
to_state = nil
|
135
|
-
end
|
129
|
+
if to_state == ::AASM::NO_VALUE
|
130
|
+
to_state = nil
|
131
|
+
elsif to_state.respond_to?(:to_sym) && transitions.map(&:to).flatten.include?(to_state.to_sym)
|
132
|
+
# nop, to_state is a valid to-state
|
136
133
|
else
|
137
|
-
|
134
|
+
# to_state is an argument
|
135
|
+
args.unshift(to_state)
|
136
|
+
to_state = nil
|
138
137
|
end
|
139
138
|
|
140
139
|
transitions.each do |transition|
|
data/lib/aasm/core/transition.rb
CHANGED
@@ -69,7 +69,7 @@ module AASM::Core
|
|
69
69
|
|
70
70
|
case code
|
71
71
|
when Symbol, String
|
72
|
-
result = (record.__send__(:method, code.to_sym).arity
|
72
|
+
result = (record.__send__(:method, code.to_sym).arity == 0 ? record.__send__(code) : record.__send__(code, *args))
|
73
73
|
failures << code unless result
|
74
74
|
result
|
75
75
|
when Proc
|
data/lib/aasm/errors.rb
CHANGED
@@ -7,10 +7,7 @@ module AASM
|
|
7
7
|
|
8
8
|
def initialize(object, event_name, state_machine_name, failures = [])
|
9
9
|
@object, @event_name, @originating_state, @failures = object, event_name, object.aasm(state_machine_name).current_state, failures
|
10
|
-
|
11
|
-
|
12
|
-
def message
|
13
|
-
"Event '#{event_name}' cannot transition from '#{originating_state}'. #{reasoning}"
|
10
|
+
super("Event '#{event_name}' cannot transition from '#{originating_state}'. #{reasoning}")
|
14
11
|
end
|
15
12
|
|
16
13
|
def reasoning
|
data/lib/aasm/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
class GuardArgumentsCheck
|
2
|
+
include AASM
|
3
|
+
|
4
|
+
aasm do
|
5
|
+
state :new, :reviewed, :finalized
|
6
|
+
|
7
|
+
event :mark_as_reviewed,
|
8
|
+
:guard => proc { |*args| arguments_list(*args) } do
|
9
|
+
transitions :from => :new, :to => :reviewed
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def arguments_list(arg1, arg2)
|
14
|
+
return false unless arg1.nil?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
@@ -30,14 +30,14 @@ describe 'when being unsuspended' do
|
|
30
30
|
it 'should be able to be unsuspended into active if polite' do
|
31
31
|
auth.suspend!
|
32
32
|
expect(auth.may_wait?(:waiting, :please)).to be true
|
33
|
-
auth.wait!(
|
33
|
+
auth.wait!(:please)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'should not be able to be unsuspended into active if not polite' do
|
37
37
|
auth.suspend!
|
38
38
|
expect(auth.may_wait?(:waiting)).not_to be true
|
39
39
|
expect(auth.may_wait?(:waiting, :rude)).not_to be true
|
40
|
-
expect {auth.wait!(
|
40
|
+
expect {auth.wait!(:rude)}.to raise_error(AASM::InvalidTransition)
|
41
41
|
expect {auth.wait!}.to raise_error(AASM::InvalidTransition)
|
42
42
|
end
|
43
43
|
|
@@ -39,18 +39,18 @@ describe 'when being unsuspended' do
|
|
39
39
|
it 'should be able to wait into waiting if polite' do
|
40
40
|
auth.left_suspend!
|
41
41
|
expect(auth.may_left_wait?(:waiting, :please)).to be true
|
42
|
-
auth.left_wait!(
|
42
|
+
auth.left_wait!(:please)
|
43
43
|
|
44
44
|
auth.right_suspend!
|
45
45
|
expect(auth.may_right_wait?(:waiting)).to be false
|
46
|
-
auth.right_wait!(
|
46
|
+
auth.right_wait!(:please)
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should not be able to be unsuspended into active if not polite' do
|
50
50
|
auth.left_suspend!
|
51
51
|
expect(auth.may_left_wait?(:waiting)).not_to be true
|
52
52
|
expect(auth.may_left_wait?(:waiting, :rude)).not_to be true
|
53
|
-
expect {auth.left_wait!(
|
53
|
+
expect {auth.left_wait!(:rude)}.to raise_error(AASM::InvalidTransition)
|
54
54
|
expect {auth.left_wait!}.to raise_error(AASM::InvalidTransition)
|
55
55
|
end
|
56
56
|
|
data/spec/unit/event_spec.rb
CHANGED
@@ -106,7 +106,7 @@ describe 'firing an event' do
|
|
106
106
|
obj = double('object', :aasm => double('aasm', :current_state => :open))
|
107
107
|
expect(obj).to receive(:guard_fn).with('arg1', 'arg2').and_return(true)
|
108
108
|
|
109
|
-
expect(event.fire(obj, {},
|
109
|
+
expect(event.fire(obj, {}, 'arg1', 'arg2')).to eq(:closed)
|
110
110
|
end
|
111
111
|
|
112
112
|
context 'when given a gaurd proc' do
|
@@ -118,7 +118,7 @@ describe 'firing an event' do
|
|
118
118
|
line_number = __LINE__ - 2
|
119
119
|
obj = double('object', :aasm => double('aasm', :current_state => :student))
|
120
120
|
|
121
|
-
event.fire(obj, {}
|
121
|
+
event.fire(obj, {})
|
122
122
|
expect(event.failed_callbacks).to eq ["#{__FILE__}##{line_number}"]
|
123
123
|
end
|
124
124
|
end
|
@@ -133,7 +133,7 @@ describe 'firing an event' do
|
|
133
133
|
obj = double('object', :aasm => double('aasm', :current_state => :student))
|
134
134
|
allow(obj).to receive(:paid_tuition?).and_return(false)
|
135
135
|
|
136
|
-
event.fire(obj, {}
|
136
|
+
event.fire(obj, {})
|
137
137
|
expect(event.failed_callbacks).to eq [:paid_tuition?]
|
138
138
|
end
|
139
139
|
end
|
@@ -315,7 +315,7 @@ describe 'parametrised events' do
|
|
315
315
|
end
|
316
316
|
|
317
317
|
it 'should transition to default state when :after transition invoked' do
|
318
|
-
pe.dress!(
|
318
|
+
pe.dress!('purple', 'dressy')
|
319
319
|
expect(pe.aasm.current_state).to eq(:working)
|
320
320
|
end
|
321
321
|
|
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: 4.12.
|
4
|
+
version: 4.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thorsten Boettger
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-08-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|
@@ -234,6 +234,7 @@ files:
|
|
234
234
|
- spec/models/dynamoid/dynamoid_simple.rb
|
235
235
|
- spec/models/foo.rb
|
236
236
|
- spec/models/foo_callback_multiple.rb
|
237
|
+
- spec/models/guard_arguments_check.rb
|
237
238
|
- spec/models/guard_with_params.rb
|
238
239
|
- spec/models/guard_with_params_multiple.rb
|
239
240
|
- spec/models/guardian.rb
|
@@ -298,6 +299,7 @@ files:
|
|
298
299
|
- spec/unit/event_naming_spec.rb
|
299
300
|
- spec/unit/event_spec.rb
|
300
301
|
- spec/unit/exception_spec.rb
|
302
|
+
- spec/unit/guard_arguments_check_spec.rb
|
301
303
|
- spec/unit/guard_multiple_spec.rb
|
302
304
|
- spec/unit/guard_spec.rb
|
303
305
|
- spec/unit/guard_with_params_multiple_spec.rb
|
@@ -356,7 +358,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
356
358
|
version: '0'
|
357
359
|
requirements: []
|
358
360
|
rubyforge_project:
|
359
|
-
rubygems_version: 2.
|
361
|
+
rubygems_version: 2.6.12
|
360
362
|
signing_key:
|
361
363
|
specification_version: 4
|
362
364
|
summary: State machine mixin for Ruby objects
|
@@ -414,6 +416,7 @@ test_files:
|
|
414
416
|
- spec/models/dynamoid/dynamoid_simple.rb
|
415
417
|
- spec/models/foo.rb
|
416
418
|
- spec/models/foo_callback_multiple.rb
|
419
|
+
- spec/models/guard_arguments_check.rb
|
417
420
|
- spec/models/guard_with_params.rb
|
418
421
|
- spec/models/guard_with_params_multiple.rb
|
419
422
|
- spec/models/guardian.rb
|
@@ -478,6 +481,7 @@ test_files:
|
|
478
481
|
- spec/unit/event_naming_spec.rb
|
479
482
|
- spec/unit/event_spec.rb
|
480
483
|
- spec/unit/exception_spec.rb
|
484
|
+
- spec/unit/guard_arguments_check_spec.rb
|
481
485
|
- spec/unit/guard_multiple_spec.rb
|
482
486
|
- spec/unit/guard_spec.rb
|
483
487
|
- spec/unit/guard_with_params_multiple_spec.rb
|