simply_fsm 0.2.0 → 0.2.1
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/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/lib/simply_fsm/version.rb +1 -1
- data/lib/simply_fsm.rb +14 -9
- data/spec/unit/multi_transition_fail_events_spec.rb +64 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0fbbc600cd621a9dc61fe1e27e7f1713ffa51e52719e13975e32aae5963ae5b2
|
|
4
|
+
data.tar.gz: ad107702004bbb2e877b71a55404c53294dc8cdad83dfecbdacbe5cb5bcf7ab1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c308a333334a16a02f1d885848c529ef4dc6066367c221cdb93c6ada4eb1fc909557e4376d340df13c34f81ddd03bca7e06f22cac0ca8f71a23c08e18818652a
|
|
7
|
+
data.tar.gz: b1775decefc14bc483fbe035d8d2b1f65957e07fc8bad9893b3a4c41b5deee0c01f54c67a63cdb32e5f111055bc65619476941981d333f21f520dd9ad8dc79f4
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/lib/simply_fsm/version.rb
CHANGED
data/lib/simply_fsm.rb
CHANGED
|
@@ -113,8 +113,19 @@ module SimplyFSM
|
|
|
113
113
|
}
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
+
def setup_fail_lambda_for(fail)
|
|
117
|
+
return unless fail
|
|
118
|
+
|
|
119
|
+
if fail.is_a?(String) || fail.is_a?(Symbol)
|
|
120
|
+
->(event_name) { send(fail, event_name) }
|
|
121
|
+
else
|
|
122
|
+
->(event_name) { instance_exec(event_name, &fail) }
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
116
126
|
def setup_multi_transition_event_method(event_name, transitions:, guard:, var_name:, fail:)
|
|
117
127
|
state_machine_name = @name
|
|
128
|
+
fail_lambda = setup_fail_lambda_for(fail)
|
|
118
129
|
make_owner_method event_name, lambda {
|
|
119
130
|
if !guard || instance_exec(&guard)
|
|
120
131
|
current = send(state_machine_name)
|
|
@@ -126,7 +137,7 @@ module SimplyFSM
|
|
|
126
137
|
return true
|
|
127
138
|
end
|
|
128
139
|
end
|
|
129
|
-
instance_exec(&
|
|
140
|
+
instance_exec(event_name, &fail_lambda) if fail_lambda
|
|
130
141
|
false
|
|
131
142
|
}
|
|
132
143
|
end
|
|
@@ -136,20 +147,14 @@ module SimplyFSM
|
|
|
136
147
|
end
|
|
137
148
|
|
|
138
149
|
def setup_event_method(event_name, var_name:, may_event_name:, to:, fail:, &after)
|
|
150
|
+
fail_lambda = setup_fail_lambda_for(fail)
|
|
139
151
|
method_lambda = lambda {
|
|
140
152
|
if send(may_event_name)
|
|
141
153
|
instance_variable_set(var_name, to)
|
|
142
154
|
instance_exec(&after) if after
|
|
143
155
|
return true
|
|
144
156
|
end
|
|
145
|
-
|
|
146
|
-
if fail
|
|
147
|
-
if fail.is_a?(String) || fail.is_a?(Symbol)
|
|
148
|
-
send(fail, event_name)
|
|
149
|
-
else
|
|
150
|
-
instance_exec(event_name, &fail)
|
|
151
|
-
end
|
|
152
|
-
end
|
|
157
|
+
instance_exec(event_name, &fail_lambda) if fail_lambda
|
|
153
158
|
false
|
|
154
159
|
}
|
|
155
160
|
make_owner_method event_name, method_lambda
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MultiTransitionFailHandlingStateMachine
|
|
4
|
+
class Error < StandardError; end
|
|
5
|
+
class RunError < StandardError; end
|
|
6
|
+
|
|
7
|
+
include SimplyFSM
|
|
8
|
+
|
|
9
|
+
state_machine :activity, fail: :on_any_fail do
|
|
10
|
+
state :sleeping, initial: true
|
|
11
|
+
state :running
|
|
12
|
+
state :cleaning
|
|
13
|
+
|
|
14
|
+
event :run,
|
|
15
|
+
fail: ->(_event) { raise RunError, "Cannot run" },
|
|
16
|
+
transitions: [{ from: :sleeping, to: :running }]
|
|
17
|
+
|
|
18
|
+
event :clean, transitions: [
|
|
19
|
+
{ from: :running, to: :cleaning }
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
event :sleep, transitions: [
|
|
23
|
+
{ from: :running, to: :sleeping },
|
|
24
|
+
{ when: -> { cleaning? }, to: :sleeping }
|
|
25
|
+
]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def on_any_fail(event_name)
|
|
29
|
+
raise Error, "Cannot do: #{event_name}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
RSpec.describe MultiTransitionFailHandlingStateMachine do
|
|
34
|
+
describe "#sleep" do
|
|
35
|
+
it "error if already sleeping" do
|
|
36
|
+
expect { subject.sleep }.to raise_error(MultiTransitionFailHandlingStateMachine::Error)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "#run" do
|
|
41
|
+
it "custom error if already running" do
|
|
42
|
+
subject.run
|
|
43
|
+
expect { subject.run }.to raise_error(MultiTransitionFailHandlingStateMachine::RunError)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "custom error if cleaning" do
|
|
47
|
+
subject.run
|
|
48
|
+
subject.clean
|
|
49
|
+
expect { subject.run }.to raise_error(MultiTransitionFailHandlingStateMachine::RunError)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "#clean" do
|
|
54
|
+
it "error if sleeping" do
|
|
55
|
+
expect { subject.clean }.to raise_error(MultiTransitionFailHandlingStateMachine::Error)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "error if already cleaning" do
|
|
59
|
+
subject.run
|
|
60
|
+
subject.clean
|
|
61
|
+
expect { subject.clean }.to raise_error(MultiTransitionFailHandlingStateMachine::Error)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simply_fsm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- nogginly
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-03-
|
|
11
|
+
date: 2022-03-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rdoc
|
|
@@ -65,6 +65,7 @@ files:
|
|
|
65
65
|
- spec/support/state_machine_examples.rb
|
|
66
66
|
- spec/unit/fail_events_spec.rb
|
|
67
67
|
- spec/unit/guard_events_spec.rb
|
|
68
|
+
- spec/unit/multi_transition_fail_events_spec.rb
|
|
68
69
|
- spec/unit/multi_transition_state_machine_spec.rb
|
|
69
70
|
- spec/unit/one_state_machine_spec.rb
|
|
70
71
|
- spec/unit/simply_fsm_spec.rb
|
|
@@ -100,6 +101,7 @@ test_files:
|
|
|
100
101
|
- spec/support/state_machine_examples.rb
|
|
101
102
|
- spec/unit/fail_events_spec.rb
|
|
102
103
|
- spec/unit/guard_events_spec.rb
|
|
104
|
+
- spec/unit/multi_transition_fail_events_spec.rb
|
|
103
105
|
- spec/unit/multi_transition_state_machine_spec.rb
|
|
104
106
|
- spec/unit/one_state_machine_spec.rb
|
|
105
107
|
- spec/unit/simply_fsm_spec.rb
|