barebone-fsm 0.0.2 → 0.0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +22 -0
- data/README.rdoc +4 -3
- data/example/door.rb +51 -0
- data/example/microwave.rb +49 -0
- data/lib/barebone-fsm.rb +5 -2
- data/spec/barebone-fsm_spec.rb +58 -0
- metadata +9 -4
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013, Md. Imrul Hassan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
== Overview
|
2
|
-
This module implements a basic finite-state machine (FSM).
|
2
|
+
This module, barebone-fsm, implements a basic finite-state machine (FSM).
|
3
3
|
An FSM consists of a finite number of states,
|
4
4
|
with one of them being the current state of the FSM.
|
5
5
|
Transitions are defined between states, which are triggered on events.
|
6
|
-
For details on FSM, see this wiki page: {
|
6
|
+
For details on FSM, see this wiki page: {http://en.wikipedia.org/wiki/Finite-state_machine FSM}.
|
7
7
|
|
8
8
|
The motivation behind the module was to implement a very basic barebone FSM in Ruby.
|
9
9
|
Features are kept at minimum as well as the code.
|
@@ -12,7 +12,8 @@ Only two classes for the FSM are defined as the following:
|
|
12
12
|
* FSMState -> the state class
|
13
13
|
|
14
14
|
Author:: Md. Imrul Hassan (mailto:mihassan@gmail.com)
|
15
|
-
Copyright:: Copyright
|
15
|
+
Copyright:: Copyright (c) 2013, Md. Imrul Hassan
|
16
|
+
License:: Barebone-fsm is released under the MIT license. Please check the {file:MIT-LICENSE LICENSE} file for more details.
|
16
17
|
|
17
18
|
== Features
|
18
19
|
Apart from having support for states and events, this module offers the following features:
|
data/example/door.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require '../lib/barebone-fsm'
|
2
|
+
|
3
|
+
fsm = FSM::FSM.new(:default)
|
4
|
+
|
5
|
+
fsm.build do
|
6
|
+
|
7
|
+
state :default do
|
8
|
+
event :open do
|
9
|
+
puts "#{@x} transition: default->open"
|
10
|
+
:open
|
11
|
+
end
|
12
|
+
event :close do
|
13
|
+
puts "#{@x} transition: default->close"
|
14
|
+
:close
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
state :open do
|
19
|
+
event :close do
|
20
|
+
@x ||= 0
|
21
|
+
@x+=1
|
22
|
+
puts "#{@x} transition: open->close"
|
23
|
+
:close
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
state :close do
|
28
|
+
event :open do
|
29
|
+
@x ||= 0
|
30
|
+
@x+=1
|
31
|
+
puts "#{@x} transition: close->open"
|
32
|
+
:open
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
puts fsm
|
39
|
+
|
40
|
+
fsm.run do
|
41
|
+
|
42
|
+
event :close
|
43
|
+
event :open
|
44
|
+
event :close
|
45
|
+
event :undefined
|
46
|
+
event :open
|
47
|
+
event :close
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
puts fsm
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require '../lib/barebone-fsm'
|
2
|
+
|
3
|
+
fsm = FSM::FSM.new
|
4
|
+
|
5
|
+
fsm.build do
|
6
|
+
|
7
|
+
state :stopped do
|
8
|
+
event :open do
|
9
|
+
puts "[#{@state}]->#{@event}"
|
10
|
+
:open
|
11
|
+
end
|
12
|
+
event :start do
|
13
|
+
puts "[#{@state}]->#{@event}"
|
14
|
+
:started
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
state :open do
|
19
|
+
event :close do
|
20
|
+
puts "[#{@state}]->#{@event}"
|
21
|
+
:stopped
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
state :started do
|
26
|
+
event :open do
|
27
|
+
puts "[#{@state}]->#{@event}"
|
28
|
+
:open
|
29
|
+
end
|
30
|
+
event :stop do
|
31
|
+
puts "[#{@state}]->#{@event}"
|
32
|
+
:stopped
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
fsm.run do
|
39
|
+
|
40
|
+
event :open
|
41
|
+
event :close
|
42
|
+
event :start
|
43
|
+
event :open
|
44
|
+
event :close
|
45
|
+
event :start
|
46
|
+
event :stop
|
47
|
+
end
|
48
|
+
|
49
|
+
puts fsm
|
data/lib/barebone-fsm.rb
CHANGED
@@ -91,12 +91,15 @@ module FSM
|
|
91
91
|
# end
|
92
92
|
#
|
93
93
|
class FSM
|
94
|
+
|
94
95
|
attr_writer :event
|
96
|
+
|
97
|
+
# Creates a new FSM object with an optional default state set.
|
95
98
|
def initialize(default_state=nil)
|
96
99
|
@states = {}
|
97
100
|
if default_state then
|
98
|
-
@
|
99
|
-
@states[@
|
101
|
+
@default = default_state
|
102
|
+
@states[@default] = FSMState.new(self, @default)
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require '../lib/barebone-fsm'
|
2
|
+
|
3
|
+
describe FSM::FSM do
|
4
|
+
|
5
|
+
context "with default state" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@fsm = FSM::FSM.new :default
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should set the default state" do
|
12
|
+
@fsm.build do
|
13
|
+
state :start do
|
14
|
+
end
|
15
|
+
end
|
16
|
+
@fsm[].state.should be_eql(:start)
|
17
|
+
@fsm.run do
|
18
|
+
event :undefined
|
19
|
+
end
|
20
|
+
@fsm[].state.should be_eql(:default)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context "without default state" do
|
26
|
+
|
27
|
+
before :each do
|
28
|
+
@fsm = FSM::FSM.new
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should not set the default state" do
|
32
|
+
@fsm.build do
|
33
|
+
state :start do
|
34
|
+
end
|
35
|
+
end
|
36
|
+
@fsm[].state.should be_eql(:start)
|
37
|
+
@fsm.run do
|
38
|
+
event :undefined
|
39
|
+
end
|
40
|
+
@fsm[].state.should be_eql(:start)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should create states on the fly" do
|
46
|
+
@fsm = FSM::FSM.new
|
47
|
+
@fsm[:new_state].state.should eq(:new_state)
|
48
|
+
@fsm.state(:another_state).state.should eq(:another_state)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should set current state to the first accessed state" do
|
52
|
+
@fsm = FSM::FSM.new
|
53
|
+
@fsm[:new_state].state.should eq(:new_state)
|
54
|
+
@fsm.state(:another_state).state.should eq(:another_state)
|
55
|
+
@fsm.state().state.should eq(:new_state)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barebone-fsm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.2
|
4
|
+
version: 0.0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2013-01-20 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: A barebone implementation of finite state machine keeping simplicity
|
14
|
+
description: A barebone implementation of the finite state machine keeping simplicity
|
15
15
|
in mind.
|
16
16
|
email: mihassan@gmail.com
|
17
17
|
executables: []
|
@@ -19,10 +19,15 @@ extensions: []
|
|
19
19
|
extra_rdoc_files:
|
20
20
|
- README.rdoc
|
21
21
|
files:
|
22
|
+
- example/door.rb
|
23
|
+
- example/microwave.rb
|
24
|
+
- spec/barebone-fsm_spec.rb
|
22
25
|
- lib/barebone-fsm.rb
|
23
26
|
- README.rdoc
|
24
|
-
|
25
|
-
|
27
|
+
- MIT-LICENSE
|
28
|
+
homepage: https://github.com/mihassan/barebone-fsm/
|
29
|
+
licenses:
|
30
|
+
- MIT
|
26
31
|
post_install_message:
|
27
32
|
rdoc_options: []
|
28
33
|
require_paths:
|