simple_state_machine 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +7 -3
- data/VERSION +1 -1
- data/examples/conversation.rb +2 -3
- data/lib/simple_state_machine/simple_state_machine.rb +14 -4
- data/simple_state_machine.gemspec +1 -1
- data/spec/simple_state_machine_spec.rb +20 -0
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -83,12 +83,14 @@ To add a state machine with ActiveRecord persistence:
|
|
83
83
|
class User < ActiveRecord::Base
|
84
84
|
|
85
85
|
extend SimpleStateMachine::ActiveRecord
|
86
|
-
|
86
|
+
# define a custum state_method (state is default)
|
87
|
+
state_machine_definition.state_method = :ssm_state
|
88
|
+
|
87
89
|
def after_initialize
|
88
|
-
self.
|
90
|
+
self.ssm_state ||= 'new'
|
89
91
|
# if you get an ActiveRecord::MissingAttributeError
|
90
92
|
# you'll probably need to do (http://bit.ly/35q23b):
|
91
|
-
# write_attribute(:
|
93
|
+
# write_attribute(:ssm_state, "new") unless read_attribute(:ssm_state)
|
92
94
|
end
|
93
95
|
|
94
96
|
def invite
|
@@ -104,6 +106,8 @@ To add a state machine with ActiveRecord persistence:
|
|
104
106
|
end
|
105
107
|
event :confirm_invitation, :invited => :active
|
106
108
|
|
109
|
+
# :all can be used to catch all from states
|
110
|
+
event :suspend, :all => :suspended
|
107
111
|
end
|
108
112
|
|
109
113
|
This generates the following methods
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.3
|
data/examples/conversation.rb
CHANGED
@@ -71,7 +71,7 @@ module SimpleStateMachine
|
|
71
71
|
|
72
72
|
# Returns the next state for the subject for event_name
|
73
73
|
def next_state(event_name)
|
74
|
-
transition = transitions.select{|t| t.is_transition_for?(event_name
|
74
|
+
transition = transitions.select{|t| t.is_transition_for?(event_name, @subject.send(state_method))}.first
|
75
75
|
transition ? transition.to : nil
|
76
76
|
end
|
77
77
|
|
@@ -144,14 +144,24 @@ module SimpleStateMachine
|
|
144
144
|
end
|
145
145
|
|
146
146
|
# returns true if it's a transition for event_name
|
147
|
-
def is_transition_for?(event_name)
|
148
|
-
|
147
|
+
def is_transition_for?(event_name, subject_state)
|
148
|
+
is_same_event?(event_name) && is_same_from?(subject_state)
|
149
149
|
end
|
150
150
|
|
151
151
|
# returns true if it's a error transition for event_name and error
|
152
152
|
def is_error_transition_for?(event_name, error)
|
153
|
-
|
153
|
+
is_same_event?(event_name) && error.class == from
|
154
154
|
end
|
155
|
+
|
156
|
+
private
|
157
|
+
|
158
|
+
def is_same_event?(event_name)
|
159
|
+
self.event_name == event_name.to_s
|
160
|
+
end
|
161
|
+
|
162
|
+
def is_same_from?(subject_from)
|
163
|
+
from.to_s == 'all' || subject_from.to_s == from.to_s
|
164
|
+
end
|
155
165
|
end
|
156
166
|
|
157
167
|
##
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{simple_state_machine}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marek de Heus", "Petrik de Heus"]
|
@@ -13,6 +13,7 @@ class SimpleExample
|
|
13
13
|
end
|
14
14
|
event :event2, :state2 => :state3
|
15
15
|
event :event_with_multiple_from, [:state1, :state2] => :state3
|
16
|
+
event :event_from_all, :all => :state3
|
16
17
|
end
|
17
18
|
|
18
19
|
class SimpleExampleWithCustomStateMethod
|
@@ -57,6 +58,16 @@ describe SimpleStateMachine do
|
|
57
58
|
example.should be_state3
|
58
59
|
end
|
59
60
|
|
61
|
+
it "changes state if event has all as from" do
|
62
|
+
example = SimpleExample.new
|
63
|
+
example.event_from_all
|
64
|
+
example.should be_state3
|
65
|
+
example = SimpleExample.new 'state2'
|
66
|
+
example.should be_state2
|
67
|
+
example.event_from_all
|
68
|
+
example.should be_state3
|
69
|
+
end
|
70
|
+
|
60
71
|
it "changes state when state is a symbol instead of a string" do
|
61
72
|
example = SimpleExample.new :state1
|
62
73
|
example.state.should == :state1
|
@@ -100,6 +111,15 @@ describe SimpleStateMachine do
|
|
100
111
|
|
101
112
|
describe 'custom state method' do
|
102
113
|
|
114
|
+
it "changes state when calling events" do
|
115
|
+
example = SimpleExampleWithCustomStateMethod.new
|
116
|
+
example.should be_state1
|
117
|
+
example.event1
|
118
|
+
example.should be_state2
|
119
|
+
example.event2
|
120
|
+
example.should be_state3
|
121
|
+
end
|
122
|
+
|
103
123
|
it "raise an error if an invalid state_transition is called" do
|
104
124
|
example = SimpleExampleWithCustomStateMethod.new
|
105
125
|
lambda { example.event2 }.should raise_error(SimpleStateMachine::Error, "You cannot 'event2' when state is 'state1'")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_state_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 3
|
10
|
+
version: 0.4.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marek de Heus
|