simplefsm 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/simplefsm.rb +48 -32
- metadata +11 -7
- checksums.yaml +0 -15
data/lib/simplefsm.rb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# License:: MIT License
|
16
16
|
|
17
17
|
module SimpleFSM
|
18
|
-
VERSION = '0.
|
18
|
+
VERSION = '0.2.0'
|
19
19
|
|
20
20
|
def initialize
|
21
21
|
@state ||= {}
|
@@ -54,6 +54,7 @@ module SimpleFSM
|
|
54
54
|
fsm_prepare_state args
|
55
55
|
|
56
56
|
if args
|
57
|
+
# If we have args here it must be an Array
|
57
58
|
if args.class != Array
|
58
59
|
return
|
59
60
|
end
|
@@ -71,52 +72,67 @@ module SimpleFSM
|
|
71
72
|
uniquestates = []
|
72
73
|
|
73
74
|
if statetrans
|
75
|
+
# All transitions for this event in the current state
|
74
76
|
trans = statetrans.select{|t| !t.select{|k, v| k==:event and v == ev}.empty?}
|
75
77
|
|
76
78
|
if trans and trans.size>0
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
79
|
+
# The first transition that is triggered
|
80
|
+
index_triggered = trans.index do |v|
|
81
|
+
# Guard specifiers:
|
82
|
+
# :guard - all must be true
|
83
|
+
# :guard_not - all must be false
|
84
|
+
# :guard_or - at least one must be true
|
85
|
+
# All guard specified specifiers must evaluate to true
|
86
|
+
# in order for transition to be triggered.
|
87
|
+
guard_all = true
|
88
|
+
guards_and = []
|
89
|
+
guards_or = []
|
90
|
+
guards_not = []
|
91
|
+
if v.has_key?(:guard)
|
92
|
+
guards_and << v[:guard]
|
93
|
+
guards_and.flatten!
|
87
94
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
if numstates > 1
|
92
|
-
raise "Error in transition (event #{ev}, state #{st}): More than 1 (#{numstates}) new state (#{uniquestates.inspect})."
|
93
|
-
return
|
94
|
-
elsif numstates < 1
|
95
|
-
return
|
95
|
+
if v.has_key?(:guard_or)
|
96
|
+
guards_or << v[:guard_or]
|
97
|
+
guards_or.flatten!
|
96
98
|
end
|
99
|
+
if v.has_key?(:guard_not)
|
100
|
+
guards_not << v[:guard_not]
|
101
|
+
guards_not.flatten!
|
102
|
+
end
|
103
|
+
|
104
|
+
guard_all &&= guards_and.all? {|g| send(g, args) } if guards_and.size > 0
|
105
|
+
guard_all &&= guards_or.any? {|g| send(g, args) } if guards_or.size > 0
|
106
|
+
guard_all &&= !guards_not.any? {|g| send(g, args) } if guards_not.size > 0
|
107
|
+
guard_all
|
108
|
+
end
|
109
|
+
if index_triggered
|
110
|
+
trans_triggered = trans[index_triggered]
|
111
|
+
new_state = trans_triggered[:new] if trans_triggered.has_key?(:new)
|
112
|
+
|
113
|
+
#START of :action keyword => call procs for event
|
114
|
+
# :do keyword - is not prefered
|
115
|
+
# because it confuses source code editors
|
116
|
+
action_keys = ['do'.to_sym, :action]
|
97
117
|
|
98
|
-
#:do keyword => call proc for event
|
99
118
|
doprocs = []
|
100
|
-
|
101
|
-
doprocs <<
|
119
|
+
action_keys.each do |key|
|
120
|
+
doprocs << trans_triggered[key] if trans_triggered.has_key?(key)
|
102
121
|
end
|
103
|
-
doprocs.
|
122
|
+
doprocs.flatten!
|
104
123
|
|
105
|
-
if doprocs.size > 0
|
106
|
-
|
107
|
-
send(p, args)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
#end :do keyword
|
124
|
+
doprocs.each {|p| send(p, args)} if doprocs.size > 0
|
125
|
+
#END of :action keyword
|
111
126
|
|
112
|
-
do_transform
|
127
|
+
do_transform new_state, args
|
113
128
|
end
|
114
129
|
end
|
130
|
+
end
|
115
131
|
fsm_save_state args
|
116
132
|
end
|
117
133
|
end
|
118
134
|
end
|
119
|
-
|
135
|
+
|
120
136
|
|
121
137
|
### FSM keywords: state, transitions_for ###
|
122
138
|
|
@@ -200,7 +216,7 @@ module SimpleFSM
|
|
200
216
|
|
201
217
|
## private class methods ######################
|
202
218
|
|
203
|
-
#
|
219
|
+
# Add transition to state's transitions if it does not exist
|
204
220
|
def self.add_transition st, t
|
205
221
|
if !@@transitions[st].any? {|v| v == t}
|
206
222
|
@@transitions[st] << t
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simplefsm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Edin Pjanic
|
@@ -9,7 +10,7 @@ authors:
|
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
+
date: 2013-03-22 00:00:00.000000000 Z
|
13
14
|
dependencies: []
|
14
15
|
description: A simple and lightweight domain specific language (DSL) for modeling finite state machines (FSM).
|
15
16
|
email:
|
@@ -22,7 +23,6 @@ files:
|
|
22
23
|
- lib/simplefsm.rb
|
23
24
|
homepage: http://github.com/edictlab/SimpleFSM
|
24
25
|
licenses: []
|
25
|
-
metadata: {}
|
26
26
|
post_install_message:
|
27
27
|
rdoc_options: []
|
28
28
|
require_paths:
|
@@ -31,16 +31,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
31
31
|
requirements:
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: !binary |-
|
35
|
+
MA==
|
36
|
+
none: false
|
35
37
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
38
|
requirements:
|
37
39
|
- - ">="
|
38
40
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
41
|
+
version: !binary |-
|
42
|
+
MA==
|
43
|
+
none: false
|
40
44
|
requirements: []
|
41
45
|
rubyforge_project:
|
42
|
-
rubygems_version:
|
46
|
+
rubygems_version: 1.8.24
|
43
47
|
signing_key:
|
44
|
-
specification_version:
|
48
|
+
specification_version: 3
|
45
49
|
summary: SimpleFSM - a Ruby DSL for FSMs
|
46
50
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
NzAxMzU4MGU4YWZjMzZjOGI5MWZkNTU2ZjI2MzFiYzgyZWRkZjkyOA==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YzAyODkyYjFiZWRkOWUwMWI3MGZkOTliMmI3Yzk3NmY1ZDRjNmRjZg==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
OTE0MmRiNmUwZTc3NjgyZTdkYWJlZjNhOTEzZmNhZmE3ZGFhMTExMDBiNDAy
|
10
|
-
OTM0M2Y5Y2VkNDhlNGIyMWJmMjVjYmMxNGIwNGIxY2U1Y2ZkYjk0ZDE1N2U4
|
11
|
-
MmE0OTM0ZWVhZmYwZWZkNWI3YWQyMWNhY2U0MjgzNmQxOTE5ZWY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2Q4MTFiOTBmNDBkZDlmNTYwZTVkYWU2ZWI4N2VmZWE3NWU3NTdhY2MzMTJh
|
14
|
-
MGNmZjdlZmE0Yzc5NjkxOGQ3ZjkzNDI2MDBiODUxZjFkMjBjYTA1ZTk1OTIx
|
15
|
-
NjQyZDg2NWVjODlkYTZkMGQwNGI3ODZiMmQwZWY4NWY2M2Q5ZTA=
|