lab42_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/README.md +24 -1
- data/lib/lab42/state_machine/controller.rb +27 -6
- data/lib/lab42/state_machine/version.rb +1 -1
- data/lib/lab42/state_machine.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7794b97f4ada35102cd112f803d049df99e0fcdb
|
4
|
+
data.tar.gz: 5f3f4276da47d24c629f57c9f4e957c9b84e0e21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c5c90bb25e28f7585981f0557ead12e9a2231dc51c47e326d29a7170620b17537b36dfd4bec0fd3ab499b85d13bc222a5d940c91ccd9bc4c36627e8e2aa095f
|
7
|
+
data.tar.gz: 256aef995922fbba3c09d5380f3152fd3d343e7c7418d8566ce94a8c0bbf12edfcdabf6030ae501daee63314f68af7074a84d4da2856a58c7aa6a946ffaa6986
|
data/README.md
CHANGED
@@ -154,7 +154,30 @@ Really part of the *Runtime API*
|
|
154
154
|
|
155
155
|
`teardown do | last_input, last_state |` Will be called at the very end of the processing cycle.
|
156
156
|
|
157
|
-
|
158
157
|
#### transition
|
159
158
|
|
160
159
|
`transition a: :b, b: :c do |input, old_state, new_state|` These are execute when the state changes from :a to :b, or :b to :a. Of course only one transition can be indicated (and mostly will be). These handlers are executed *after* the state handlers fot the new states, that is :b or :c in our case.
|
160
|
+
|
161
|
+
### Runtime API
|
162
|
+
|
163
|
+
#### halt\_machine
|
164
|
+
|
165
|
+
```halt_machine``` stops the execution and makes run return the current `subject`
|
166
|
+
|
167
|
+
Raises a `StopIteration` and does therefore not make any sense in `setup` or `teardown` handlers
|
168
|
+
|
169
|
+
|
170
|
+
#### state
|
171
|
+
|
172
|
+
As already mentioned in the Definition and Setup API
|
173
|
+
|
174
|
+
This is the (overloaded - for the sake of a slim API) workerbee of the State Machine, it comes in three forms:
|
175
|
+
|
176
|
+
##### state querying form (0 params)
|
177
|
+
|
178
|
+
|
179
|
+
`state` Query currrent_state of the StateMachine
|
180
|
+
|
181
|
+
##### state setter form (1 param)
|
182
|
+
|
183
|
+
```state new_state``` Set new state of the StateMachine
|
@@ -2,12 +2,14 @@ module Lab42
|
|
2
2
|
class StateMachine
|
3
3
|
class Controller
|
4
4
|
|
5
|
-
def after &
|
6
|
-
|
5
|
+
def after block=nil, &blk
|
6
|
+
behavior = get_behavior block, blk
|
7
|
+
@afters << behavior
|
7
8
|
end
|
8
9
|
|
9
|
-
def before &
|
10
|
-
|
10
|
+
def before block=nil, &blk
|
11
|
+
behavior = get_behavior block, blk
|
12
|
+
@befores << behavior
|
11
13
|
end
|
12
14
|
|
13
15
|
def run input
|
@@ -58,7 +60,10 @@ module Lab42
|
|
58
60
|
@state = st
|
59
61
|
end
|
60
62
|
|
61
|
-
def setup &
|
63
|
+
def setup block=nil, &blk
|
64
|
+
behavior = get_behavior block, blk
|
65
|
+
@setups << behavior
|
66
|
+
end
|
62
67
|
|
63
68
|
def state *args, &block
|
64
69
|
raise ArgumentError, "args.size = #{args.size} instead of 0..1" if args.size > 1
|
@@ -78,7 +83,10 @@ module Lab42
|
|
78
83
|
private
|
79
84
|
def current_transition; [@old_state, @state] end
|
80
85
|
|
81
|
-
def
|
86
|
+
def get_behavior block1, block2
|
87
|
+
raise ArgumentError, "need exactly one block ( or symbol )" unless !!block1 != !!block2
|
88
|
+
mk_block block1 || block2
|
89
|
+
end
|
82
90
|
|
83
91
|
def initialize state_machine
|
84
92
|
@sm = state_machine
|
@@ -93,6 +101,19 @@ module Lab42
|
|
93
101
|
@handlers = mk_ary_hash
|
94
102
|
@transitions = mk_ary_hash
|
95
103
|
end
|
104
|
+
|
105
|
+
def mk_block blocky
|
106
|
+
case blocky
|
107
|
+
when Proc, Method
|
108
|
+
blocky
|
109
|
+
when Symbol, String
|
110
|
+
@sm.method blocky
|
111
|
+
else
|
112
|
+
blocky.to_proc
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def mk_ary_hash; Hash.new{ |h,k| h[k] = [] } end
|
96
117
|
end # class Controller
|
97
118
|
end # class StateMachine
|
98
119
|
end # module Lab42
|
data/lib/lab42/state_machine.rb
CHANGED
@@ -8,6 +8,12 @@ module Lab42
|
|
8
8
|
|
9
9
|
forward_all :after, :before, :setup, :state, :teardown, :transition, to: :controller
|
10
10
|
|
11
|
+
def behavior name, &behave
|
12
|
+
class << self; self end. module_eval do
|
13
|
+
define_method name do behave end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
11
17
|
def halt_machine
|
12
18
|
raise StopIteration, "#{self} halted"
|
13
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_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
|
- Robert Dober
|
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
version: '0'
|
84
84
|
requirements: []
|
85
85
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.0
|
86
|
+
rubygems_version: 2.1.0
|
87
87
|
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: A Simple State Machine
|