nxt_state_machine 0.1.1 → 0.1.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/Gemfile.lock +1 -1
- data/README.md +16 -7
- data/lib/nxt_state_machine/callable.rb +3 -3
- data/lib/nxt_state_machine/errors/error.rb +3 -1
- data/lib/nxt_state_machine/errors/state_with_same_index_already_registered.rb +5 -0
- data/lib/nxt_state_machine/state.rb +21 -8
- data/lib/nxt_state_machine/state_machine.rb +3 -9
- data/lib/nxt_state_machine/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48ef8c1448e9b199d064eb4d4040e7187ca141cc1e41d7a4abef5914c71cae59
|
4
|
+
data.tar.gz: 500f0d1098da66be2c4da535061f3198177f5d6f3d314716a7154a423e6c7745
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 134d73c9bfd5f12c9379a78d30ba601c8062ee530a469e4c7febda231202d1a0e4ff7ca4db9b84843ea7ff19eebadcd3f537b439738f7fc847b26884906dfbc3
|
7
|
+
data.tar.gz: 885c3d0c4898bb897cb16dcbd9bc19a7897c80fc58535dc539358ce9621f58bc1e5a183d9258715358680e2e7d77785adb790f08f3b84c2aa6bf46457ede6c84
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -41,25 +41,32 @@ class ArticleWorkflow
|
|
41
41
|
# First we setup the states
|
42
42
|
state :draft, initial: true
|
43
43
|
states :written, :submitted # define multiple states at the same time
|
44
|
-
state :approved
|
44
|
+
state :approved
|
45
45
|
state :published
|
46
|
-
state :rejected
|
47
|
-
state :deleted
|
46
|
+
state :rejected, negative: true # You can pass options to states that you can query in the transition
|
47
|
+
state :deleted, negative: true do # States can even have custom methods if options are not sufficient
|
48
|
+
def deleted_at
|
49
|
+
Time.current
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
48
53
|
|
49
54
|
event :write do
|
50
55
|
transition from: %i[draft written deleted], to: :written
|
51
56
|
end
|
52
57
|
|
53
58
|
event :submit do
|
54
|
-
#
|
55
|
-
# the
|
56
|
-
|
59
|
+
# If you want transitions to take arguments, we recommend to use keyword arguments
|
60
|
+
# When the block takes arguments (instead of just keyword arguments) the first argument
|
61
|
+
# passed to the block will always be the transition!
|
62
|
+
transition from: %i[written rejected deleted], to: :submitted do |transition, *others|
|
57
63
|
puts transition.from.enum
|
58
64
|
puts transition.to.enum
|
59
65
|
end
|
60
66
|
end
|
61
67
|
|
62
68
|
event :approve do
|
69
|
+
# use methods as callbacks with run:
|
63
70
|
before_transition from: %i[written submitted deleted], to: :approved, run: :call_me_back
|
64
71
|
|
65
72
|
transition from: %i[written submitted deleted], to: :approved do |headline:|
|
@@ -68,6 +75,7 @@ class ArticleWorkflow
|
|
68
75
|
|
69
76
|
after_transition from: %i[written submitted deleted], to: :approved, run: :call_me_back
|
70
77
|
|
78
|
+
# use blocks with callbacks
|
71
79
|
around_transition from: any_state, to: :approved do |block|
|
72
80
|
# Note that around transition callbacks get passed a proc object that you have to call
|
73
81
|
puts 'around transition enter'
|
@@ -176,7 +184,8 @@ state.next # will give you the next state in the order they have been registered
|
|
176
184
|
state.previous # will give you the previously registered state
|
177
185
|
state.first? # first registered state?
|
178
186
|
state.last? # last registered state?
|
179
|
-
state.index # gives you the index of the state in the registry
|
187
|
+
state.index # gives you the index of the state in the registry
|
188
|
+
# You can also set indexes manually by passing in indexes when defining states. Make sure they are in order!
|
180
189
|
```
|
181
190
|
|
182
191
|
### Events
|
@@ -19,9 +19,9 @@ module NxtStateMachine
|
|
19
19
|
self
|
20
20
|
end
|
21
21
|
|
22
|
-
# NOTE:
|
23
|
-
#
|
24
|
-
#
|
22
|
+
# NOTE: Currentl we only allow arguments! Not keyword args or **options
|
23
|
+
# If we would allow **options and we would pass a hash as the only argument it would
|
24
|
+
# automatically be parsed as the options!
|
25
25
|
def call(*args)
|
26
26
|
ensure_context_not_missing
|
27
27
|
|
@@ -7,6 +7,8 @@ module NxtStateMachine
|
|
7
7
|
@transitions = []
|
8
8
|
@options = opts.with_indifferent_access
|
9
9
|
@index = opts.fetch(:index)
|
10
|
+
|
11
|
+
ensure_index_not_occupied
|
10
12
|
end
|
11
13
|
|
12
14
|
attr_accessor :enum, :initial, :index, :transitions, :state_machine, :options
|
@@ -16,23 +18,34 @@ module NxtStateMachine
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def previous
|
19
|
-
|
20
|
-
|
21
|
-
state_machine.states.resolve(key)
|
21
|
+
current_index = sorted_states.index { |state| state.index == index }
|
22
|
+
sorted_states[(current_index - 1) % sorted_states.size]
|
22
23
|
end
|
23
24
|
|
24
25
|
def next
|
25
|
-
|
26
|
-
|
27
|
-
state_machine.states.resolve(key)
|
26
|
+
current_index = sorted_states.index { |state| state.index == index }
|
27
|
+
sorted_states[(current_index + 1) % sorted_states.size]
|
28
28
|
end
|
29
29
|
|
30
30
|
def last?
|
31
|
-
index ==
|
31
|
+
sorted_states.last.index == index
|
32
32
|
end
|
33
33
|
|
34
34
|
def first?
|
35
|
-
index ==
|
35
|
+
sorted_states.first.index == index
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def sorted_states
|
41
|
+
state_machine.states.values.sort_by(&:index)
|
42
|
+
end
|
43
|
+
|
44
|
+
def ensure_index_not_occupied
|
45
|
+
state_with_same_index = state_machine.states.values.find { |state| state.index == index }
|
46
|
+
return unless state_with_same_index
|
47
|
+
|
48
|
+
raise StateWithSameIndexAlreadyRegistered, "The index #{index} is already occupied by state: #{state_with_same_index.enum}"
|
36
49
|
end
|
37
50
|
end
|
38
51
|
end
|
@@ -18,21 +18,15 @@ module NxtStateMachine
|
|
18
18
|
attr_accessor :initial_state
|
19
19
|
|
20
20
|
def get_state_with(method = nil, &block)
|
21
|
-
|
22
|
-
@get_state_with ||= method_or_block ||
|
23
|
-
raise_missing_configuration_error(:get_state_with)
|
21
|
+
@get_state_with ||= (method || block) || raise_missing_configuration_error(:get_state_with)
|
24
22
|
end
|
25
23
|
|
26
24
|
def set_state_with(method = nil, &block)
|
27
|
-
|
28
|
-
@set_state_with ||= method_or_block ||
|
29
|
-
raise_missing_configuration_error(:set_state_with)
|
25
|
+
@set_state_with ||= (method || block) || raise_missing_configuration_error(:set_state_with)
|
30
26
|
end
|
31
27
|
|
32
28
|
def set_state_with!(method = nil, &block)
|
33
|
-
|
34
|
-
@set_state_with_bang ||= method_or_block ||
|
35
|
-
raise_missing_configuration_error(:set_state_with!)
|
29
|
+
@set_state_with_bang ||= (method || block) || raise_missing_configuration_error(:set_state_with!)
|
36
30
|
end
|
37
31
|
|
38
32
|
def state(*names, **opts, &block)
|
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.2
|
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-01-
|
14
|
+
date: 2020-01-08 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/nxt_state_machine/errors/invalid_callback_option.rb
|
158
158
|
- lib/nxt_state_machine/errors/missing_configuration.rb
|
159
159
|
- lib/nxt_state_machine/errors/state_already_registered.rb
|
160
|
+
- lib/nxt_state_machine/errors/state_with_same_index_already_registered.rb
|
160
161
|
- lib/nxt_state_machine/errors/transition_already_registered.rb
|
161
162
|
- lib/nxt_state_machine/errors/transition_halted.rb
|
162
163
|
- lib/nxt_state_machine/errors/transition_not_defined.rb
|