nxt_state_machine 0.1.6 → 0.1.7
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/Gemfile.lock +14 -14
- data/README.md +13 -4
- data/lib/nxt_state_machine/event.rb +1 -0
- data/lib/nxt_state_machine/integrations/active_record.rb +1 -1
- data/lib/nxt_state_machine/integrations/attr_accessor.rb +2 -2
- data/lib/nxt_state_machine/integrations/hash.rb +2 -2
- data/lib/nxt_state_machine/state_machine.rb +11 -0
- data/lib/nxt_state_machine/transition.rb +8 -3
- data/lib/nxt_state_machine/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37f01d32a03c0c09b47018719f8b05b2439497034807ad0e6fa098a6d7d832ed
|
4
|
+
data.tar.gz: '02682339637194f92d32240b759e51cab84cd590a789af74c66109e27d5ce912'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e777bbfeffb013b7591d0d2e18169a7311d324aefe7ad2a97f181b53926f6d6aa0f2a3cd08728ca1e544ac21b5ca5893ae4479c39ff93e54ac083a0b8399cdb5
|
7
|
+
data.tar.gz: 53ff5dd521de00050a1fe553c7dfd560f1cc8fde10e8cfc1cdea571873b22f4ac3be103ec1863314b64da0a04d95244a19f655e41794395dbcc4b8708f720a8e
|
data/Gemfile.lock
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nxt_state_machine (0.1.
|
4
|
+
nxt_state_machine (0.1.7)
|
5
5
|
activesupport
|
6
6
|
nxt_registry (~> 0.1.3)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activemodel (6.0.2.
|
12
|
-
activesupport (= 6.0.2.
|
13
|
-
activerecord (6.0.2.
|
14
|
-
activemodel (= 6.0.2.
|
15
|
-
activesupport (= 6.0.2.
|
16
|
-
activesupport (6.0.2.
|
11
|
+
activemodel (6.0.2.2)
|
12
|
+
activesupport (= 6.0.2.2)
|
13
|
+
activerecord (6.0.2.2)
|
14
|
+
activemodel (= 6.0.2.2)
|
15
|
+
activesupport (= 6.0.2.2)
|
16
|
+
activesupport (6.0.2.2)
|
17
17
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
18
|
i18n (>= 0.7, < 2)
|
19
19
|
minitest (~> 5.1)
|
20
20
|
tzinfo (~> 1.1)
|
21
21
|
zeitwerk (~> 2.2)
|
22
22
|
coderay (1.1.2)
|
23
|
-
concurrent-ruby (1.1.
|
23
|
+
concurrent-ruby (1.1.6)
|
24
24
|
diff-lcs (1.3)
|
25
25
|
i18n (1.8.2)
|
26
26
|
concurrent-ruby (~> 1.0)
|
27
|
-
method_source (0.
|
27
|
+
method_source (1.0.0)
|
28
28
|
minitest (5.14.0)
|
29
|
-
nxt_registry (0.1.
|
29
|
+
nxt_registry (0.1.5)
|
30
30
|
activesupport
|
31
|
-
pry (0.
|
32
|
-
coderay (~> 1.1
|
33
|
-
method_source (~>
|
31
|
+
pry (0.13.0)
|
32
|
+
coderay (~> 1.1)
|
33
|
+
method_source (~> 1.0)
|
34
34
|
rake (12.3.3)
|
35
35
|
rspec (3.9.0)
|
36
36
|
rspec-core (~> 3.9.0)
|
@@ -51,7 +51,7 @@ GEM
|
|
51
51
|
thread_safe (0.3.6)
|
52
52
|
tzinfo (1.2.6)
|
53
53
|
thread_safe (~> 0.1)
|
54
|
-
zeitwerk (2.
|
54
|
+
zeitwerk (2.3.0)
|
55
55
|
|
56
56
|
PLATFORMS
|
57
57
|
ruby
|
data/README.md
CHANGED
@@ -83,6 +83,10 @@ class ArticleWorkflow
|
|
83
83
|
puts 'around transition exit'
|
84
84
|
end
|
85
85
|
|
86
|
+
on_success from: any_state, to: :approved do |transition|
|
87
|
+
# This is the last callback in the chain - It runs outside of the active record transaction
|
88
|
+
end
|
89
|
+
|
86
90
|
on_error CustomError from: any_state, to: :approved do |error, transition|
|
87
91
|
end
|
88
92
|
end
|
@@ -277,10 +281,10 @@ Transitions can be halted in callbacks and during the transition itself simply b
|
|
277
281
|
|
278
282
|
### Callbacks
|
279
283
|
|
280
|
-
You can register `before_transition`, `around_transition` and `
|
281
|
-
:from and :to states you decide on which transitions the callback actually runs. Around callbacks need
|
282
|
-
proc object that they get passed in. Registering callbacks inside an event block or on the state_machine top
|
283
|
-
behaves exactly the same way and is only a matter of structure. The only thing that defines when callbacks run is
|
284
|
+
You can register `before_transition`, `around_transition`, `after_transition` and `on_success` callbacks.
|
285
|
+
By defining the :from and :to states you decide on which transitions the callback actually runs. Around callbacks need
|
286
|
+
to call the proc object that they get passed in. Registering callbacks inside an event block or on the state_machine top
|
287
|
+
level behaves exactly the same way and is only a matter of structure. The only thing that defines when callbacks run is
|
284
288
|
the :from and :to parameters with which they are registered.
|
285
289
|
|
286
290
|
|
@@ -298,6 +302,11 @@ event :approve do
|
|
298
302
|
block.call
|
299
303
|
puts 'around transition exit'
|
300
304
|
end
|
305
|
+
|
306
|
+
# Use this to trigger another event after the transaction around the transition completed
|
307
|
+
on_success from: any_state, to: :approved do |transition|
|
308
|
+
# This is the last callback in the chain - It runs outside of the active record transaction
|
309
|
+
end
|
301
310
|
end
|
302
311
|
```
|
303
312
|
|
@@ -22,7 +22,7 @@ module NxtStateMachine
|
|
22
22
|
result = set_state(target, transition, state_attr)
|
23
23
|
transition.run_after_callbacks
|
24
24
|
|
25
|
-
result
|
25
|
+
transition.run_success_callbacks || result
|
26
26
|
rescue StandardError => error
|
27
27
|
target.send("#{state_attr}=", transition.from.enum)
|
28
28
|
|
@@ -38,7 +38,7 @@ module NxtStateMachine
|
|
38
38
|
result = set_state(target, transition, state_attr)
|
39
39
|
transition.run_after_callbacks
|
40
40
|
|
41
|
-
result
|
41
|
+
transition.run_success_callbacks || result
|
42
42
|
rescue StandardError
|
43
43
|
target.send("#{state_attr}=", transition.from.enum)
|
44
44
|
raise
|
@@ -21,7 +21,7 @@ module NxtStateMachine
|
|
21
21
|
transition.run_before_callbacks
|
22
22
|
result = set_state(current_target, transition, state_attr)
|
23
23
|
transition.run_after_callbacks
|
24
|
-
result
|
24
|
+
transition.run_success_callbacks || result
|
25
25
|
rescue StandardError => error
|
26
26
|
current_target[state_attr] = transition.from.enum
|
27
27
|
|
@@ -37,7 +37,7 @@ module NxtStateMachine
|
|
37
37
|
result = set_state(current_target, transition, state_attr)
|
38
38
|
transition.run_after_callbacks
|
39
39
|
|
40
|
-
result
|
40
|
+
transition.run_success_callbacks || result
|
41
41
|
rescue StandardError
|
42
42
|
current_target[state_attr] = transition.from.enum
|
43
43
|
raise
|
@@ -117,6 +117,10 @@ module NxtStateMachine
|
|
117
117
|
callbacks.register(from, to, :after, run, block)
|
118
118
|
end
|
119
119
|
|
120
|
+
def on_success(from:, to:, run: nil, &block)
|
121
|
+
callbacks.register(from, to, :success, run, block)
|
122
|
+
end
|
123
|
+
|
120
124
|
def defuse(errors = [], from:, to:)
|
121
125
|
defuse_registry.register(from, to, errors)
|
122
126
|
end
|
@@ -147,16 +151,23 @@ module NxtStateMachine
|
|
147
151
|
run_callbacks(transition, :after, context)
|
148
152
|
end
|
149
153
|
|
154
|
+
def run_success_callbacks(transition, context)
|
155
|
+
run_callbacks(transition, :success, context)
|
156
|
+
end
|
157
|
+
|
150
158
|
def find_error_callback(error, transition)
|
151
159
|
error_callback_registry.resolve(error, transition)
|
152
160
|
end
|
153
161
|
|
154
162
|
def run_callbacks(transition, kind, context)
|
155
163
|
current_callbacks = callbacks.resolve(transition, kind)
|
164
|
+
return unless current_callbacks.any?
|
156
165
|
|
157
166
|
current_callbacks.each do |callback|
|
158
167
|
Callable.new(callback).bind(context).call(transition)
|
159
168
|
end
|
169
|
+
|
170
|
+
true
|
160
171
|
end
|
161
172
|
|
162
173
|
def current_state_name(context)
|
@@ -11,9 +11,10 @@ module NxtStateMachine
|
|
11
11
|
@set_state_method = set_state_method
|
12
12
|
@context = context
|
13
13
|
@block = block
|
14
|
+
@result = nil
|
14
15
|
end
|
15
16
|
|
16
|
-
attr_reader :name, :from, :to, :block, :event
|
17
|
+
attr_reader :name, :from, :to, :block, :event, :result
|
17
18
|
|
18
19
|
# This triggers the set state method
|
19
20
|
def trigger
|
@@ -31,7 +32,7 @@ module NxtStateMachine
|
|
31
32
|
|
32
33
|
# This must be used in set_state method to actually execute the transition within the around callback chain
|
33
34
|
def execute(&block)
|
34
|
-
Transition::Proxy.new(event, state_machine,self, context).call(&block)
|
35
|
+
self.result = Transition::Proxy.new(event, state_machine,self, context).call(&block)
|
35
36
|
end
|
36
37
|
|
37
38
|
alias_method :with_around_callbacks, :execute
|
@@ -44,9 +45,13 @@ module NxtStateMachine
|
|
44
45
|
state_machine.run_after_callbacks(self, context)
|
45
46
|
end
|
46
47
|
|
48
|
+
def run_success_callbacks
|
49
|
+
state_machine.run_success_callbacks(self, context)
|
50
|
+
end
|
51
|
+
|
47
52
|
private
|
48
53
|
|
49
54
|
attr_reader :state_machine, :set_state_method, :context
|
50
|
-
attr_writer :block
|
55
|
+
attr_writer :block, :result
|
51
56
|
end
|
52
57
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nxt_state_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Robecke
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date: 2020-03-
|
14
|
+
date: 2020-03-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|