statemachine 0.0.2 → 0.0.3
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.
- data/CHANGES +10 -0
- data/lib/statemachine/state.rb +6 -0
- data/lib/statemachine/state_machine.rb +5 -5
- data/lib/statemachine/transition.rb +0 -2
- data/lib/statemachine/version.rb +1 -1
- data/spec/sm_entry_exit_actions_spec.rb +29 -0
- data/spec/sm_simple_spec.rb +0 -11
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
= StateMachine Changelog
|
2
2
|
|
3
|
+
== Version 0.0.3
|
4
|
+
|
5
|
+
Bug fix dealing with entry and exit actions. The state machine's state need to be set to the entered/exited state before calling the
|
6
|
+
exit/entry action.
|
7
|
+
* added a couple specs in the exit_entry_spec
|
8
|
+
* modified state.entered/exited methods to set the state
|
9
|
+
* modifed the StateMachine.state to accept state objects.
|
10
|
+
* removed running attribute from StateMachine because it wasn't much use
|
11
|
+
* also removed the nil (end state)
|
12
|
+
|
3
13
|
== Version 0.0.2
|
4
14
|
|
5
15
|
More conventional file structure
|
data/lib/statemachine/state.rb
CHANGED
@@ -41,15 +41,21 @@ module StateMachine
|
|
41
41
|
|
42
42
|
def exit(args)
|
43
43
|
@statemachine.trace("\texiting #{self}")
|
44
|
+
activate
|
44
45
|
call_proc(@exit_action, args, "exit action for #{self}") if @exit_action
|
45
46
|
@superstate.existing(self) if @superstate
|
46
47
|
end
|
47
48
|
|
48
49
|
def enter(args)
|
49
50
|
@statemachine.trace("\tentering #{self}")
|
51
|
+
activate
|
50
52
|
call_proc(@entry_action, args, "entry action for #{self}") if @entry_action
|
51
53
|
end
|
52
54
|
|
55
|
+
def activate
|
56
|
+
@statemachine.state = self
|
57
|
+
end
|
58
|
+
|
53
59
|
def is_superstate?
|
54
60
|
return false
|
55
61
|
end
|
@@ -15,7 +15,7 @@ module StateMachine
|
|
15
15
|
|
16
16
|
include ProcCalling
|
17
17
|
|
18
|
-
attr_reader :states, :state
|
18
|
+
attr_reader :states, :state
|
19
19
|
attr_accessor :start_state, :tracer
|
20
20
|
|
21
21
|
def initialize
|
@@ -34,7 +34,6 @@ module StateMachine
|
|
34
34
|
|
35
35
|
def run
|
36
36
|
@state = @start_state
|
37
|
-
@running = true
|
38
37
|
end
|
39
38
|
alias :reset :run
|
40
39
|
|
@@ -43,7 +42,9 @@ module StateMachine
|
|
43
42
|
end
|
44
43
|
|
45
44
|
def state= value
|
46
|
-
if
|
45
|
+
if value.is_a? State
|
46
|
+
@state = value
|
47
|
+
elsif @states[value]
|
47
48
|
@state = @states[value]
|
48
49
|
elsif value and @states[value.to_sym]
|
49
50
|
@state = @states[value.to_sym]
|
@@ -55,11 +56,10 @@ module StateMachine
|
|
55
56
|
if @state
|
56
57
|
transition = @state.transitions[event]
|
57
58
|
if transition
|
58
|
-
|
59
|
+
transition.invoke(@state, args)
|
59
60
|
else
|
60
61
|
raise MissingTransitionException.new("#{@state} does not respond to the '#{event}' event.")
|
61
62
|
end
|
62
|
-
@running = @state != nil
|
63
63
|
else
|
64
64
|
raise StateMachineException.new("The state machine isn't in any state. Did you forget to call run?")
|
65
65
|
end
|
data/lib/statemachine/version.rb
CHANGED
@@ -44,6 +44,35 @@ context "State Machine Entry and Exit Actions" do
|
|
44
44
|
@log.join(",").should_equal "exited_off(one),on,entered_on(one,two)"
|
45
45
|
end
|
46
46
|
|
47
|
+
specify "current state is set prior to exit and entry actions" do
|
48
|
+
@sm[:off].on_exit Proc.new { @log << @sm.state.id }
|
49
|
+
@sm[:on].on_entry Proc.new { @log << @sm.state.id }
|
50
|
+
|
51
|
+
@sm.toggle
|
52
|
+
|
53
|
+
@log.join(",").should_equal "off,on,on"
|
54
|
+
end
|
55
|
+
|
56
|
+
specify "current state is set prior to exit and entry actions even with super states" do
|
57
|
+
@sm.add(:off_super, :toggle, :on, Proc.new { @log << "super_on" } )
|
58
|
+
@sm.add(:on_super, :toggle, :off, Proc.new { @log << "super_off" } )
|
59
|
+
@sm[:off_super].add_substates(:off)
|
60
|
+
@sm[:on_super].add_substates(:on)
|
61
|
+
@sm[:off_super].on_exit Proc.new { @log << @sm.state.id }
|
62
|
+
@sm[:on_super].on_entry Proc.new { @log << @sm.state.id }
|
63
|
+
|
64
|
+
@sm.toggle
|
65
|
+
@log.join(",").should_equal "off_super,super_on,on_super"
|
66
|
+
end
|
67
|
+
|
68
|
+
specify "entry actions invokes another event" do
|
69
|
+
@sm[:on].on_entry Proc.new { @sm.toggle }
|
70
|
+
|
71
|
+
@sm.toggle
|
72
|
+
@log.join(",").should_equal "on,off"
|
73
|
+
@sm.state.id.should_be :off
|
74
|
+
end
|
75
|
+
|
47
76
|
|
48
77
|
|
49
78
|
end
|
data/spec/sm_simple_spec.rb
CHANGED
@@ -25,16 +25,6 @@ context "simple cases:" do
|
|
25
25
|
transition = origin[:flip]
|
26
26
|
check_transition(transition, :on, :off, :flip, @proc)
|
27
27
|
end
|
28
|
-
|
29
|
-
specify "end state" do
|
30
|
-
@sm.add(:start, :blah, nil, @proc)
|
31
|
-
|
32
|
-
@sm.run
|
33
|
-
@sm.running.should.be true
|
34
|
-
@sm.process_event(:blah)
|
35
|
-
@sm.state.should.be nil
|
36
|
-
@sm.running.should.be false;
|
37
|
-
end
|
38
28
|
|
39
29
|
specify "reset" do
|
40
30
|
@sm.add(:start, :blah, nil, @proc)
|
@@ -44,7 +34,6 @@ context "simple cases:" do
|
|
44
34
|
@sm.reset
|
45
35
|
|
46
36
|
@sm.state.should.be @sm[:start]
|
47
|
-
@sm.running.should.be true
|
48
37
|
end
|
49
38
|
|
50
39
|
specify "exception when state machine is not running" do
|
metadata
CHANGED
@@ -3,9 +3,9 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: statemachine
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2006-10-
|
8
|
-
summary: StateMachine-0.0.
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2006-10-26 00:00:00 -05:00
|
8
|
+
summary: StateMachine-0.0.3 - State Machine Library for Ruby http://statemachine.rubyforge.org/
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: statemachine-devel@rubyforge.org
|