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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb54d24c49d69bc4cb382e6c4181a586fe9eef471dd1e44bcef0d95555fb33ae
4
- data.tar.gz: 2f336e971e10827c1b731948376b4f2a177e012093c3f66457380df21c0f110c
3
+ metadata.gz: 0fbbc600cd621a9dc61fe1e27e7f1713ffa51e52719e13975e32aae5963ae5b2
4
+ data.tar.gz: ad107702004bbb2e877b71a55404c53294dc8cdad83dfecbdacbe5cb5bcf7ab1
5
5
  SHA512:
6
- metadata.gz: 9afdd28a4281a6d6c4d40abe7d52e5ab674e9bf1e626a9bc2bf47ee678e047f0fd3c4e5ab3f6857a01fc6fd6647a5eab416a6cc1c03f7ebbbdda1a72b6b1d71b
7
- data.tar.gz: 21c938cbced1efb61d61c0cc62c4887d1f8084c4b42c6bc2effd0cda358a9cbade73a958250fdb9d81a17a183ed2b092e7d6896ae043fc1dfcc2afa7c9914134
6
+ metadata.gz: c308a333334a16a02f1d885848c529ef4dc6066367c221cdb93c6ada4eb1fc909557e4376d340df13c34f81ddd03bca7e06f22cac0ca8f71a23c08e18818652a
7
+ data.tar.gz: b1775decefc14bc483fbe035d8d2b1f65957e07fc8bad9893b3a4c41b5deee0c01f54c67a63cdb32e5f111055bc65619476941981d333f21f520dd9ad8dc79f4
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  - None right now
4
4
 
5
+ ## [0.2.1] - 2022-03-05
6
+
7
+ - Fixed bug where named fail handlers were not called properly for multi-transition events.
8
+
5
9
  ## [0.2.0] - 2022-03-01
6
10
 
7
11
  - *Breaks API* (sorry!)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simply_fsm (0.1.1)
4
+ simply_fsm (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimplyFSM
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
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(&fail) if fail
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
- # unable to satisfy pre-conditions for the event
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.0
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-01 00:00:00.000000000 Z
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