aasm 5.0.5 → 5.0.6
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/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.travis.yml +15 -12
- data/CHANGELOG.md +8 -0
- data/Dockerfile +1 -6
- data/README.md +19 -4
- data/aasm.gemspec +2 -0
- data/lib/aasm/aasm.rb +29 -27
- data/lib/aasm/base.rb +19 -0
- data/lib/aasm/core/event.rb +3 -3
- data/lib/aasm/instance_base.rb +4 -3
- data/lib/aasm/version.rb +1 -1
- data/spec/database.rb +5 -0
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/callbacks/with_state_arg.rb +5 -1
- data/spec/models/callbacks/with_state_arg_multiple.rb +4 -1
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/callback_multiple_spec.rb +4 -0
- data/spec/unit/callbacks_spec.rb +4 -0
- data/spec/unit/complex_example_spec.rb +0 -1
- data/spec/unit/event_spec.rb +13 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +4 -4
- data/spec/unit/persistence/active_record_persistence_spec.rb +26 -4
- metadata +34 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 51dfd1ad2a78034c409ddc556625e765260dd067
|
|
4
|
+
data.tar.gz: f934e43d4a35fc75a06d161190a8794e36066c02
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 983b08a4a0977c37dd73b77c5d80d014a05025d7f2841c26788518c82a8e738825ab9fa5fc8a36577e9c6a23fd33cf341c6fefc954630836e213ab40ee12c909
|
|
7
|
+
data.tar.gz: b091bca286362fb33a31f1b9705840f664ebd0a948c6b2dffbaa2436144c5931a04950080b18e16c1a7d9e4e1b8f517b7ea6c2c133259a3860905928fda32b90
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Describe the bug**
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
**To Reproduce**
|
|
14
|
+
Steps to reproduce the behavior:
|
|
15
|
+
1. Go to '...'
|
|
16
|
+
2. Click on '....'
|
|
17
|
+
3. Scroll down to '....'
|
|
18
|
+
4. See error
|
|
19
|
+
|
|
20
|
+
**Expected behavior**
|
|
21
|
+
A clear and concise description of what you expected to happen.
|
|
22
|
+
|
|
23
|
+
**Screenshots**
|
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
|
25
|
+
|
|
26
|
+
**Additional context**
|
|
27
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
**Describe the solution you'd like**
|
|
14
|
+
A clear and concise description of what you want to happen.
|
|
15
|
+
|
|
16
|
+
**Describe alternatives you've considered**
|
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
+
|
|
19
|
+
**Additional context**
|
|
20
|
+
Add any other context or screenshots about the feature request here.
|
data/.travis.yml
CHANGED
|
@@ -2,6 +2,9 @@ sudo: false
|
|
|
2
2
|
language: ruby
|
|
3
3
|
cache: bundler
|
|
4
4
|
|
|
5
|
+
jdk:
|
|
6
|
+
- openjdk8
|
|
7
|
+
|
|
5
8
|
before_install:
|
|
6
9
|
- rvm list
|
|
7
10
|
- gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
|
|
@@ -17,17 +20,17 @@ services:
|
|
|
17
20
|
- mongodb
|
|
18
21
|
- redis-server
|
|
19
22
|
|
|
20
|
-
addons:
|
|
21
|
-
rethinkdb: '2.3.
|
|
23
|
+
#addons:
|
|
24
|
+
# rethinkdb: '2.3.4'
|
|
22
25
|
|
|
23
26
|
gemfile:
|
|
24
27
|
- gemfiles/norails.gemfile
|
|
25
28
|
- gemfiles/rails_3.2.gemfile
|
|
26
29
|
- gemfiles/rails_4.2.gemfile
|
|
27
30
|
- gemfiles/rails_4.2_mongoid_5.gemfile
|
|
28
|
-
- gemfiles/rails_4.2_nobrainer.gemfile
|
|
31
|
+
# - gemfiles/rails_4.2_nobrainer.gemfile
|
|
29
32
|
- gemfiles/rails_5.0.gemfile
|
|
30
|
-
- gemfiles/rails_5.0_nobrainer.gemfile
|
|
33
|
+
# - gemfiles/rails_5.0_nobrainer.gemfile
|
|
31
34
|
- gemfiles/rails_5.1.gemfile
|
|
32
35
|
- gemfiles/rails_5.2.gemfile
|
|
33
36
|
|
|
@@ -47,8 +50,8 @@ matrix:
|
|
|
47
50
|
gemfile: gemfiles/norails.gemfile
|
|
48
51
|
- rvm: 2.3.0
|
|
49
52
|
gemfile: gemfiles/rails_5.0.gemfile
|
|
50
|
-
- rvm: 2.3.0
|
|
51
|
-
gemfile: gemfiles/rails_5.0_nobrainer.gemfile
|
|
53
|
+
# - rvm: 2.3.0
|
|
54
|
+
# gemfile: gemfiles/rails_5.0_nobrainer.gemfile
|
|
52
55
|
- rvm: 2.3.0
|
|
53
56
|
gemfile: gemfiles/rails_5.1.gemfile
|
|
54
57
|
- rvm: 2.3.0
|
|
@@ -59,8 +62,8 @@ matrix:
|
|
|
59
62
|
gemfile: gemfiles/rails_4.2.gemfile
|
|
60
63
|
- rvm: 2.5.0
|
|
61
64
|
gemfile: gemfiles/rails_4.2_mongoid_5.gemfile
|
|
62
|
-
- rvm: 2.5.0
|
|
63
|
-
gemfile: gemfiles/rails_4.2_nobrainer.gemfile
|
|
65
|
+
# - rvm: 2.5.0
|
|
66
|
+
# gemfile: gemfiles/rails_4.2_nobrainer.gemfile
|
|
64
67
|
- rvm: jruby-9.1.12.0
|
|
65
68
|
gemfile: gemfiles/norails.gemfile
|
|
66
69
|
- rvm: jruby-9.1.12.0
|
|
@@ -69,10 +72,10 @@ matrix:
|
|
|
69
72
|
gemfile: gemfiles/rails_5.1.gemfile
|
|
70
73
|
- rvm: jruby-9.1.12.0
|
|
71
74
|
gemfile: gemfiles/rails_5.2.gemfile
|
|
72
|
-
- rvm: jruby-9.1.12.0
|
|
73
|
-
gemfile: gemfiles/rails_4.2_nobrainer.gemfile
|
|
74
|
-
- rvm: jruby-9.1.12.0
|
|
75
|
-
gemfile: gemfiles/rails_5.0_nobrainer.gemfile
|
|
75
|
+
# - rvm: jruby-9.1.12.0
|
|
76
|
+
# gemfile: gemfiles/rails_4.2_nobrainer.gemfile
|
|
77
|
+
# - rvm: jruby-9.1.12.0
|
|
78
|
+
# gemfile: gemfiles/rails_5.0_nobrainer.gemfile
|
|
76
79
|
|
|
77
80
|
notifications:
|
|
78
81
|
slack:
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## unreleased
|
|
4
4
|
|
|
5
|
+
## 5.0.6
|
|
6
|
+
|
|
7
|
+
* Fix no_direct_assignment, couldn't be turned off pragmatically [#636](https://github.com/aasm/aasm/issues/636)
|
|
8
|
+
* Add instance level validation skip option [#644](https://github.com/aasm/aasm/pull/644), thanks to [Nitin-Salunke](https://github.com/Nitin-Salunke)
|
|
9
|
+
* Fixed aasm.current_event incorrectly yields nil when calling aasm.fire!(:event) [#551](https://github.com/aasm/aasm/issues/551) in [#638](https://github.com/aasm/aasm/pull/638), thanks to [DoubleJarvis](https://github.com/DoubleJarvis)
|
|
10
|
+
* Code Refactor [#634](https://github.com/aasm/aasm/pull/634) , thanks to [rahulknojha](https://github.com/rahulknojha)
|
|
11
|
+
* Fixed callback argument for :before_success & :success callback, [#630](https://github.com/aasm/aasm/pull/630)
|
|
12
|
+
|
|
5
13
|
## 5.0.5
|
|
6
14
|
|
|
7
15
|
* Independent of ActiveSupport methods, [#627](https://github.com/aasm/aasm/pull/627),
|
data/Dockerfile
CHANGED
data/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
[](http://badge.fury.io/rb/aasm)
|
|
4
4
|
[](https://travis-ci.org/aasm/aasm)
|
|
5
5
|
[](https://codeclimate.com/github/aasm/aasm)
|
|
6
|
+
[](https://codecov.io/gh/aasm/aasm)
|
|
6
7
|
|
|
7
8
|
## Index
|
|
8
9
|
- [Upgrade from version 3 to 4](#upgrade-from-version-3-to-4)
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
- [Transaction support](#transaction-support)
|
|
30
31
|
- [Pessimistic Locking](#pessimistic-locking)
|
|
31
32
|
- [Column name & migration](#column-name--migration)
|
|
33
|
+
- [Log State Changes](#log-state-changes)
|
|
32
34
|
- [Inspection](#inspection)
|
|
33
35
|
- [Warning output](#warning-output)
|
|
34
36
|
- [RubyMotion support](#rubymotion-support)
|
|
@@ -214,13 +216,11 @@ Also, you can pass parameters to events:
|
|
|
214
216
|
|
|
215
217
|
```ruby
|
|
216
218
|
job = Job.new
|
|
217
|
-
job.run(:
|
|
219
|
+
job.run(:defragmentation)
|
|
218
220
|
```
|
|
219
221
|
|
|
220
222
|
In this case the `set_process` would be called with `:defragmentation` argument.
|
|
221
223
|
|
|
222
|
-
Note that when passing arguments to a state transition, the first argument should be the desired end state. In the above example, we wish to transition to `:running` state and run the callback with `:defragmentation` argument. You can also omit or pass in `nil` as the desired end state, and AASM will try to transition to the first end state defined for that event.
|
|
223
|
-
|
|
224
224
|
In case of an error during the event processing the error is rescued and passed to `:error`
|
|
225
225
|
callback, which can handle it or re-raise it for further propagation.
|
|
226
226
|
|
|
@@ -741,6 +741,14 @@ class Job < ActiveRecord::Base
|
|
|
741
741
|
end
|
|
742
742
|
```
|
|
743
743
|
|
|
744
|
+
Also You can skip the validation at instance level with `some_event_name_without_validation!` method.
|
|
745
|
+
With this you have the flexibility of having validation for all your transitions by default and then skip it wherever required.
|
|
746
|
+
Please note that only state column will be updated as mentioned in the above example.
|
|
747
|
+
|
|
748
|
+
```ruby
|
|
749
|
+
job.run_without_validation!
|
|
750
|
+
```
|
|
751
|
+
|
|
744
752
|
If you want to make sure that the _AASM_ column for storing the state is not directly assigned,
|
|
745
753
|
configure _AASM_ to not allow direct assignment, like this:
|
|
746
754
|
|
|
@@ -1082,6 +1090,13 @@ class AddJobState < ActiveRecord::Migration
|
|
|
1082
1090
|
end
|
|
1083
1091
|
```
|
|
1084
1092
|
|
|
1093
|
+
### Log State Changes
|
|
1094
|
+
|
|
1095
|
+
Logging state change can be done using [paper_trail](https://github.com/paper-trail-gem/paper_trail) gem
|
|
1096
|
+
|
|
1097
|
+
Example of implementation can be found here [https://github.com/nitsujri/aasm-papertrail-example](https://github.com/nitsujri/aasm-papertrail-example)
|
|
1098
|
+
|
|
1099
|
+
|
|
1085
1100
|
### Inspection
|
|
1086
1101
|
|
|
1087
1102
|
AASM supports query methods for states and events
|
|
@@ -1193,7 +1208,7 @@ the 'instance method symbol / string' way whenever possible when defining guardi
|
|
|
1193
1208
|
#### RSpec
|
|
1194
1209
|
|
|
1195
1210
|
AASM provides some matchers for [RSpec](http://rspec.info):
|
|
1196
|
-
|
|
1211
|
+
* `transition_from`,
|
|
1197
1212
|
* `have_state`, `allow_event`
|
|
1198
1213
|
* and `allow_transition_to`.
|
|
1199
1214
|
|
data/aasm.gemspec
CHANGED
|
@@ -23,6 +23,8 @@ Gem::Specification.new do |s|
|
|
|
23
23
|
s.add_development_dependency 'rspec', ">= 3"
|
|
24
24
|
s.add_development_dependency 'generator_spec'
|
|
25
25
|
s.add_development_dependency 'appraisal'
|
|
26
|
+
s.add_development_dependency "simplecov"
|
|
27
|
+
s.add_development_dependency "codecov", ">= 0.1.10"
|
|
26
28
|
|
|
27
29
|
# debugging
|
|
28
30
|
# s.add_development_dependency 'debugger'
|
data/lib/aasm/aasm.rb
CHANGED
|
@@ -99,25 +99,10 @@ private
|
|
|
99
99
|
begin
|
|
100
100
|
old_state = aasm(state_machine_name).state_object_for_name(aasm(state_machine_name).current_state)
|
|
101
101
|
|
|
102
|
-
event.
|
|
103
|
-
:before_all_events,
|
|
104
|
-
self,
|
|
105
|
-
*process_args(event, aasm(state_machine_name).current_state, *args)
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
# new event before callback
|
|
109
|
-
event.fire_callbacks(
|
|
110
|
-
:before,
|
|
111
|
-
self,
|
|
112
|
-
*process_args(event, aasm(state_machine_name).current_state, *args)
|
|
113
|
-
)
|
|
102
|
+
fire_default_callbacks(event, *process_args(event, aasm(state_machine_name).current_state, *args))
|
|
114
103
|
|
|
115
104
|
if may_fire_to = event.may_fire?(self, *args)
|
|
116
|
-
old_state
|
|
117
|
-
*process_args(event, aasm(state_machine_name).current_state, *args))
|
|
118
|
-
old_state.fire_callbacks(:exit, self,
|
|
119
|
-
*process_args(event, aasm(state_machine_name).current_state, *args))
|
|
120
|
-
|
|
105
|
+
fire_exit_callbacks(old_state, *process_args(event, aasm(state_machine_name).current_state, *args))
|
|
121
106
|
if new_state_name = event.fire(self, {:may_fire => may_fire_to}, *args)
|
|
122
107
|
aasm_fired(state_machine_name, event, old_state, new_state_name, options, *args, &block)
|
|
123
108
|
else
|
|
@@ -137,25 +122,44 @@ private
|
|
|
137
122
|
end
|
|
138
123
|
end
|
|
139
124
|
|
|
125
|
+
def fire_default_callbacks(event, *processed_args)
|
|
126
|
+
event.fire_global_callbacks(
|
|
127
|
+
:before_all_events,
|
|
128
|
+
self,
|
|
129
|
+
*processed_args
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# new event before callback
|
|
133
|
+
event.fire_callbacks(
|
|
134
|
+
:before,
|
|
135
|
+
self,
|
|
136
|
+
*processed_args
|
|
137
|
+
)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def fire_exit_callbacks(old_state, *processed_args)
|
|
141
|
+
old_state.fire_callbacks(:before_exit, self, *processed_args)
|
|
142
|
+
old_state.fire_callbacks(:exit, self, *processed_args)
|
|
143
|
+
end
|
|
144
|
+
|
|
140
145
|
def aasm_fired(state_machine_name, event, old_state, new_state_name, options, *args)
|
|
141
146
|
persist = options[:persist]
|
|
142
147
|
|
|
143
148
|
new_state = aasm(state_machine_name).state_object_for_name(new_state_name)
|
|
149
|
+
callback_args = process_args(event, aasm(state_machine_name).current_state, *args)
|
|
144
150
|
|
|
145
|
-
new_state.fire_callbacks(:before_enter, self,
|
|
146
|
-
*process_args(event, aasm(state_machine_name).current_state, *args))
|
|
151
|
+
new_state.fire_callbacks(:before_enter, self, *callback_args)
|
|
147
152
|
|
|
148
|
-
new_state.fire_callbacks(:enter, self,
|
|
149
|
-
*process_args(event, aasm(state_machine_name).current_state, *args)) # TODO: remove for AASM 4?
|
|
153
|
+
new_state.fire_callbacks(:enter, self, *callback_args) # TODO: remove for AASM 4?
|
|
150
154
|
|
|
151
155
|
persist_successful = true
|
|
152
156
|
if persist
|
|
153
157
|
persist_successful = aasm(state_machine_name).set_current_state_with_persistence(new_state_name)
|
|
154
158
|
if persist_successful
|
|
155
159
|
yield if block_given?
|
|
156
|
-
event.fire_callbacks(:before_success, self)
|
|
160
|
+
event.fire_callbacks(:before_success, self, *callback_args)
|
|
157
161
|
event.fire_transition_callbacks(self, *process_args(event, old_state.name, *args))
|
|
158
|
-
event.fire_callbacks(:success, self)
|
|
162
|
+
event.fire_callbacks(:success, self, *callback_args)
|
|
159
163
|
end
|
|
160
164
|
else
|
|
161
165
|
aasm(state_machine_name).current_state = new_state_name
|
|
@@ -168,10 +172,8 @@ private
|
|
|
168
172
|
end
|
|
169
173
|
|
|
170
174
|
if persist_successful
|
|
171
|
-
old_state.fire_callbacks(:after_exit, self,
|
|
172
|
-
|
|
173
|
-
new_state.fire_callbacks(:after_enter, self,
|
|
174
|
-
*process_args(event, aasm(state_machine_name).current_state, *args))
|
|
175
|
+
old_state.fire_callbacks(:after_exit, self, *callback_args)
|
|
176
|
+
new_state.fire_callbacks(:after_enter, self, *callback_args)
|
|
175
177
|
event.fire_callbacks(
|
|
176
178
|
:after,
|
|
177
179
|
self,
|
data/lib/aasm/base.rb
CHANGED
|
@@ -59,6 +59,8 @@ module AASM
|
|
|
59
59
|
@klass.send(:define_method, "#{@state_machine.config.column}=") do |state_name|
|
|
60
60
|
if self.class.aasm(:"#{aasm_name}").state_machine.config.no_direct_assignment
|
|
61
61
|
raise AASM::NoDirectAssignmentError.new('direct assignment of AASM column has been disabled (see AASM configuration for this class)')
|
|
62
|
+
else
|
|
63
|
+
super(state_name)
|
|
62
64
|
end
|
|
63
65
|
end
|
|
64
66
|
end
|
|
@@ -133,6 +135,8 @@ module AASM
|
|
|
133
135
|
aasm_fire_event(aasm_name, event, {:persist => false}, *args, &block)
|
|
134
136
|
end
|
|
135
137
|
|
|
138
|
+
skip_instance_level_validation(event, name, aasm_name, klass)
|
|
139
|
+
|
|
136
140
|
# Create aliases for the event methods. Keep the old names to maintain backwards compatibility.
|
|
137
141
|
if namespace?
|
|
138
142
|
klass.send(:alias_method, "may_#{name}_#{namespace}?", "may_#{name}?")
|
|
@@ -248,5 +252,20 @@ module AASM
|
|
|
248
252
|
end
|
|
249
253
|
end
|
|
250
254
|
|
|
255
|
+
def skip_instance_level_validation(event, name, aasm_name, klass)
|
|
256
|
+
# Overrides the skip_validation config for an instance (If skip validation is set to false in original config) and
|
|
257
|
+
# restores it back to the original value after the event is fired.
|
|
258
|
+
safely_define_method klass, "#{name}_without_validation!", ->(*args, &block) do
|
|
259
|
+
original_config = AASM::StateMachineStore.fetch(self.class, true).machine(aasm_name).config.skip_validation_on_save
|
|
260
|
+
begin
|
|
261
|
+
AASM::StateMachineStore.fetch(self.class, true).machine(aasm_name).config.skip_validation_on_save = true unless original_config
|
|
262
|
+
aasm(aasm_name).current_event = :"#{name}!"
|
|
263
|
+
aasm_fire_event(aasm_name, event, {:persist => true}, *args, &block)
|
|
264
|
+
ensure
|
|
265
|
+
AASM::StateMachineStore.fetch(self.class, true).machine(aasm_name).config.skip_validation_on_save = original_config
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
251
270
|
end
|
|
252
271
|
end
|
data/lib/aasm/core/event.rb
CHANGED
|
@@ -131,13 +131,13 @@ module AASM::Core
|
|
|
131
131
|
|
|
132
132
|
if to_state == ::AASM::NO_VALUE
|
|
133
133
|
to_state = nil
|
|
134
|
-
elsif to_state.respond_to?(:to_sym) && transitions.map(&:to).flatten.include?(to_state.to_sym)
|
|
135
|
-
# nop, to_state is a valid to-state
|
|
136
|
-
else
|
|
134
|
+
elsif !(to_state.respond_to?(:to_sym) && transitions.map(&:to).flatten.include?(to_state.to_sym))
|
|
137
135
|
# to_state is an argument
|
|
138
136
|
args.unshift(to_state)
|
|
139
137
|
to_state = nil
|
|
140
138
|
end
|
|
139
|
+
|
|
140
|
+
# nop, to_state is a valid to-state
|
|
141
141
|
|
|
142
142
|
transitions.each do |transition|
|
|
143
143
|
next if to_state and !Array(transition.to).include?(to_state)
|
data/lib/aasm/instance_base.rb
CHANGED
|
@@ -91,7 +91,7 @@ module AASM
|
|
|
91
91
|
when Proc
|
|
92
92
|
state.call(@instance)
|
|
93
93
|
else
|
|
94
|
-
raise NotImplementedError, "Unrecognized state-type given.
|
|
94
|
+
raise NotImplementedError, "Unrecognized state-type given. Expected Symbol, String, or Proc."
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
@@ -104,11 +104,12 @@ module AASM
|
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def fire(event_name, *args, &block)
|
|
107
|
-
@instance.send(
|
|
107
|
+
@instance.send(event_name, *args, &block)
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
def fire!(event_name, *args, &block)
|
|
111
|
-
|
|
111
|
+
event_name = event_name.to_s.+("!").to_sym
|
|
112
|
+
@instance.send(event_name, *args, &block)
|
|
112
113
|
end
|
|
113
114
|
|
|
114
115
|
def set_current_state_with_persistence(state)
|
data/lib/aasm/version.rb
CHANGED
data/spec/database.rb
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class InstanceLevelSkipValidationExample < ActiveRecord::Base
|
|
2
|
+
include AASM
|
|
3
|
+
|
|
4
|
+
aasm :state do
|
|
5
|
+
state :new, :initial => true
|
|
6
|
+
state :draft
|
|
7
|
+
state :complete
|
|
8
|
+
|
|
9
|
+
event :set_draft do
|
|
10
|
+
transitions from: :new, to: :draft
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
event :complete do
|
|
14
|
+
transitions from: %i[draft new], to: :complete
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
validates :some_string, presence: true
|
|
19
|
+
end
|
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
|
8
8
|
state :closed
|
|
9
9
|
state :out_to_lunch
|
|
10
10
|
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method3 do
|
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method, :success => :success_method
|
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2, :success => :success_method2
|
|
14
14
|
end
|
|
@@ -16,6 +16,8 @@ module Callbacks
|
|
|
16
16
|
|
|
17
17
|
def before_method(arg); end
|
|
18
18
|
|
|
19
|
+
def before_success_method(arg); end
|
|
20
|
+
|
|
19
21
|
def after_method(arg); end
|
|
20
22
|
|
|
21
23
|
def transition_method(arg); end
|
|
@@ -26,5 +28,7 @@ module Callbacks
|
|
|
26
28
|
|
|
27
29
|
def success_method2(arg); end
|
|
28
30
|
|
|
31
|
+
def success_method3(arg); end
|
|
32
|
+
|
|
29
33
|
end
|
|
30
34
|
end
|
|
@@ -8,7 +8,7 @@ module Callbacks
|
|
|
8
8
|
state :closed
|
|
9
9
|
state :out_to_lunch
|
|
10
10
|
|
|
11
|
-
event :close, :before => :before_method, :after => :after_method do
|
|
11
|
+
event :close, :before => :before_method, :after => :after_method, :before_success => :before_success_method, :success => :success_method do
|
|
12
12
|
transitions :to => :closed, :from => [:open], :after => :transition_method
|
|
13
13
|
transitions :to => :out_to_lunch, :from => [:open], :after => :transition_method2
|
|
14
14
|
end
|
|
@@ -16,11 +16,14 @@ module Callbacks
|
|
|
16
16
|
|
|
17
17
|
def before_method(arg); end
|
|
18
18
|
|
|
19
|
+
def before_success_method(arg); end
|
|
20
|
+
|
|
19
21
|
def after_method(arg); end
|
|
20
22
|
|
|
21
23
|
def transition_method(arg); end
|
|
22
24
|
|
|
23
25
|
def transition_method2(arg); end
|
|
24
26
|
|
|
27
|
+
def success_method(arg); end
|
|
25
28
|
end
|
|
26
29
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
require 'simplecov'
|
|
2
|
+
SimpleCov.start do
|
|
3
|
+
add_filter '/spec/'
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
if ENV['CI'] == 'true'
|
|
7
|
+
require 'codecov'
|
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
|
9
|
+
end
|
|
10
|
+
|
|
1
11
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
|
2
12
|
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
|
3
13
|
require 'aasm'
|
|
@@ -154,6 +154,8 @@ describe 'callbacks for the new DSL' do
|
|
|
154
154
|
expect(cb).to receive(:before_method).with(:arg1).once.ordered
|
|
155
155
|
expect(cb).to receive(:transition_method).never
|
|
156
156
|
expect(cb).to receive(:transition_method2).with(:arg1).once.ordered
|
|
157
|
+
expect(cb).to receive(:before_success_method).with(:arg1).once.ordered
|
|
158
|
+
expect(cb).to receive(:success_method).with(:arg1).once.ordered
|
|
157
159
|
expect(cb).to receive(:after_method).with(:arg1).once.ordered
|
|
158
160
|
cb.close!(:out_to_lunch, :arg1)
|
|
159
161
|
|
|
@@ -161,6 +163,8 @@ describe 'callbacks for the new DSL' do
|
|
|
161
163
|
some_object = double('some object')
|
|
162
164
|
expect(cb).to receive(:before_method).with(some_object).once.ordered
|
|
163
165
|
expect(cb).to receive(:transition_method2).with(some_object).once.ordered
|
|
166
|
+
expect(cb).to receive(:before_success_method).with(some_object).once.ordered
|
|
167
|
+
expect(cb).to receive(:success_method).with(some_object).once.ordered
|
|
164
168
|
expect(cb).to receive(:after_method).with(some_object).once.ordered
|
|
165
169
|
cb.close!(:out_to_lunch, some_object)
|
|
166
170
|
end
|
data/spec/unit/callbacks_spec.rb
CHANGED
|
@@ -315,7 +315,9 @@ describe 'callbacks for the new DSL' do
|
|
|
315
315
|
expect(cb).to receive(:before_method).with(:arg1).once.ordered
|
|
316
316
|
expect(cb).to receive(:transition_method).with(:arg1).once.ordered
|
|
317
317
|
expect(cb).to receive(:transition_method).never
|
|
318
|
+
expect(cb).to receive(:before_success_method).with(:arg1).once.ordered
|
|
318
319
|
expect(cb).to receive(:success_method).with(:arg1).once.ordered
|
|
320
|
+
expect(cb).to receive(:success_method3).with(:arg1).once.ordered
|
|
319
321
|
expect(cb).to receive(:success_method).never
|
|
320
322
|
expect(cb).to receive(:after_method).with(:arg1).once.ordered
|
|
321
323
|
cb.close!(:arg1)
|
|
@@ -325,7 +327,9 @@ describe 'callbacks for the new DSL' do
|
|
|
325
327
|
expect(cb).to receive(:before_method).with(some_object).once.ordered
|
|
326
328
|
expect(cb).to receive(:transition_method).with(some_object).once.ordered
|
|
327
329
|
expect(cb).to receive(:transition_method).never
|
|
330
|
+
expect(cb).to receive(:before_success_method).with(some_object).once.ordered
|
|
328
331
|
expect(cb).to receive(:success_method).with(some_object).once.ordered
|
|
332
|
+
expect(cb).to receive(:success_method3).with(some_object).once.ordered
|
|
329
333
|
expect(cb).to receive(:success_method).never
|
|
330
334
|
expect(cb).to receive(:after_method).with(some_object).once.ordered
|
|
331
335
|
cb.close!(some_object)
|
data/spec/unit/event_spec.rb
CHANGED
|
@@ -294,6 +294,19 @@ describe 'current event' do
|
|
|
294
294
|
pe.wakeup!
|
|
295
295
|
expect(pe.aasm.current_event).to eql :wakeup!
|
|
296
296
|
end
|
|
297
|
+
|
|
298
|
+
describe "when calling events with fire/fire!" do
|
|
299
|
+
it "fire should populate aasm.current_event and transition (sleeping to showering)" do
|
|
300
|
+
pe.aasm.fire(:wakeup)
|
|
301
|
+
expect(pe.aasm.current_event).to eq :wakeup
|
|
302
|
+
expect(pe.aasm.current_state).to eq :showering
|
|
303
|
+
end
|
|
304
|
+
it "fire! should populate aasm.current_event and transition (sleeping to showering)" do
|
|
305
|
+
pe.aasm.fire!(:wakeup)
|
|
306
|
+
expect(pe.aasm.current_event).to eq :wakeup!
|
|
307
|
+
expect(pe.aasm.current_state).to eq :showering
|
|
308
|
+
end
|
|
309
|
+
end
|
|
297
310
|
end
|
|
298
311
|
|
|
299
312
|
describe 'parametrised events' do
|
|
@@ -359,13 +359,13 @@ if defined?(ActiveRecord)
|
|
|
359
359
|
|
|
360
360
|
# allow it temporarily
|
|
361
361
|
MultipleNoDirectAssignment.aasm(:left).state_machine.config.no_direct_assignment = false
|
|
362
|
-
obj.aasm_state = :
|
|
363
|
-
expect(obj.aasm_state.to_sym).to eql :
|
|
362
|
+
obj.aasm_state = :running
|
|
363
|
+
expect(obj.aasm_state.to_sym).to eql :running
|
|
364
364
|
|
|
365
365
|
# and forbid it again
|
|
366
366
|
MultipleNoDirectAssignment.aasm(:left).state_machine.config.no_direct_assignment = true
|
|
367
|
-
expect {obj.aasm_state = :
|
|
368
|
-
expect(obj.aasm_state.to_sym).to eql :
|
|
367
|
+
expect {obj.aasm_state = :pending}.to raise_error(AASM::NoDirectAssignmentError)
|
|
368
|
+
expect(obj.aasm_state.to_sym).to eql :running
|
|
369
369
|
end
|
|
370
370
|
end # direct assignment
|
|
371
371
|
|
|
@@ -393,13 +393,13 @@ if defined?(ActiveRecord)
|
|
|
393
393
|
|
|
394
394
|
# allow it temporarily
|
|
395
395
|
NoDirectAssignment.aasm.state_machine.config.no_direct_assignment = false
|
|
396
|
-
obj.aasm_state = :
|
|
397
|
-
expect(obj.aasm_state.to_sym).to eql :
|
|
396
|
+
obj.aasm_state = :running
|
|
397
|
+
expect(obj.aasm_state.to_sym).to eql :running
|
|
398
398
|
|
|
399
399
|
# and forbid it again
|
|
400
400
|
NoDirectAssignment.aasm.state_machine.config.no_direct_assignment = true
|
|
401
|
-
expect {obj.aasm_state = :
|
|
402
|
-
expect(obj.aasm_state.to_sym).to eql :
|
|
401
|
+
expect {obj.aasm_state = :pending}.to raise_error(AASM::NoDirectAssignmentError)
|
|
402
|
+
expect(obj.aasm_state.to_sym).to eql :running
|
|
403
403
|
end
|
|
404
404
|
end # direct assignment
|
|
405
405
|
|
|
@@ -748,4 +748,26 @@ if defined?(ActiveRecord)
|
|
|
748
748
|
expect { job.run }.to raise_error(AASM::InvalidTransition)
|
|
749
749
|
end
|
|
750
750
|
end
|
|
751
|
+
|
|
752
|
+
describe 'testing the instance_level skip validation with _without_validation method' do
|
|
753
|
+
let(:example) do
|
|
754
|
+
obj = InstanceLevelSkipValidationExample.new(state: 'new')
|
|
755
|
+
obj.save(validate: false)
|
|
756
|
+
obj
|
|
757
|
+
end
|
|
758
|
+
|
|
759
|
+
it 'should be able to change the state with invalid record' do
|
|
760
|
+
expect(example.valid?).to be_falsey
|
|
761
|
+
expect(example.complete!).to be_falsey
|
|
762
|
+
expect(example.complete_without_validation!).to be_truthy
|
|
763
|
+
expect(example.state).to eq('complete')
|
|
764
|
+
end
|
|
765
|
+
|
|
766
|
+
it 'shouldn\'t affect the behaviour of existing method after calling _without_validation! method' do
|
|
767
|
+
expect(example.set_draft!).to be_falsey
|
|
768
|
+
expect(example.set_draft_without_validation!).to be_truthy
|
|
769
|
+
expect(example.state).to eq('draft')
|
|
770
|
+
expect(example.complete!).to be_falsey
|
|
771
|
+
end
|
|
772
|
+
end
|
|
751
773
|
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: 5.0.
|
|
4
|
+
version: 5.0.6
|
|
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: 2019-
|
|
12
|
+
date: 2019-09-04 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: concurrent-ruby
|
|
@@ -95,6 +95,34 @@ dependencies:
|
|
|
95
95
|
- - ">="
|
|
96
96
|
- !ruby/object:Gem::Version
|
|
97
97
|
version: '0'
|
|
98
|
+
- !ruby/object:Gem::Dependency
|
|
99
|
+
name: simplecov
|
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
|
101
|
+
requirements:
|
|
102
|
+
- - ">="
|
|
103
|
+
- !ruby/object:Gem::Version
|
|
104
|
+
version: '0'
|
|
105
|
+
type: :development
|
|
106
|
+
prerelease: false
|
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
108
|
+
requirements:
|
|
109
|
+
- - ">="
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: '0'
|
|
112
|
+
- !ruby/object:Gem::Dependency
|
|
113
|
+
name: codecov
|
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
|
115
|
+
requirements:
|
|
116
|
+
- - ">="
|
|
117
|
+
- !ruby/object:Gem::Version
|
|
118
|
+
version: 0.1.10
|
|
119
|
+
type: :development
|
|
120
|
+
prerelease: false
|
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 0.1.10
|
|
98
126
|
- !ruby/object:Gem::Dependency
|
|
99
127
|
name: pry
|
|
100
128
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -117,6 +145,8 @@ extensions: []
|
|
|
117
145
|
extra_rdoc_files: []
|
|
118
146
|
files:
|
|
119
147
|
- ".document"
|
|
148
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
|
149
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
|
120
150
|
- ".gitignore"
|
|
121
151
|
- ".travis.yml"
|
|
122
152
|
- API
|
|
@@ -207,6 +237,7 @@ files:
|
|
|
207
237
|
- spec/models/active_record/derivate_new_dsl.rb
|
|
208
238
|
- spec/models/active_record/false_state.rb
|
|
209
239
|
- spec/models/active_record/gate.rb
|
|
240
|
+
- spec/models/active_record/instance_level_skip_validation_example.rb
|
|
210
241
|
- spec/models/active_record/invalid_persistor.rb
|
|
211
242
|
- spec/models/active_record/localizer_test_model.rb
|
|
212
243
|
- spec/models/active_record/no_direct_assignment.rb
|
|
@@ -410,6 +441,7 @@ test_files:
|
|
|
410
441
|
- spec/models/active_record/derivate_new_dsl.rb
|
|
411
442
|
- spec/models/active_record/false_state.rb
|
|
412
443
|
- spec/models/active_record/gate.rb
|
|
444
|
+
- spec/models/active_record/instance_level_skip_validation_example.rb
|
|
413
445
|
- spec/models/active_record/invalid_persistor.rb
|
|
414
446
|
- spec/models/active_record/localizer_test_model.rb
|
|
415
447
|
- spec/models/active_record/no_direct_assignment.rb
|