simple_state_machine 0.6.1 → 0.6.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/Changelog.rdoc +7 -0
- data/lib/simple_state_machine/version.rb +1 -1
- metadata +2 -41
- data/.github/workflows/build.yml +0 -46
- data/.gitignore +0 -4
- data/.rspec +0 -3
- data/.travis.yml +0 -17
- data/Gemfile +0 -11
- data/Rakefile +0 -28
- data/examples/conversation.rb +0 -33
- data/examples/lamp.rb +0 -21
- data/examples/relationship.rb +0 -87
- data/examples/traffic_light.rb +0 -17
- data/examples/user.rb +0 -41
- data/gemfiles/Gemfile.activerecord-5.2.x +0 -9
- data/gemfiles/Gemfile.activerecord-6.0.x +0 -9
- data/gemfiles/Gemfile.activerecord-6.1.x +0 -8
- data/gemfiles/Gemfile.activerecord-main.x +0 -9
- data/gemfiles/Gemfile.basic +0 -6
- data/lib/simple_state_machine/.DS_Store +0 -0
- data/simple_state_machine.gemspec +0 -21
- data/spec/.DS_Store +0 -0
- data/spec/active_record_spec.rb +0 -250
- data/spec/decorator/default_spec.rb +0 -195
- data/spec/examples_spec.rb +0 -60
- data/spec/mountable_spec.rb +0 -36
- data/spec/simple_state_machine_spec.rb +0 -165
- data/spec/spec_helper.rb +0 -20
- data/spec/state_machine_definition_spec.rb +0 -103
- data/spec/state_machine_spec.rb +0 -60
- data/spec/tools/graphviz_spec.rb +0 -30
- data/spec/tools/inspector_spec.rb +0 -70
data/spec/spec_helper.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "bundler"
|
3
|
-
Bundler.require :test
|
4
|
-
begin
|
5
|
-
require 'active_record'
|
6
|
-
rescue LoadError
|
7
|
-
puts "Skipping ActiveRecord specs"
|
8
|
-
end
|
9
|
-
|
10
|
-
ROOT = Pathname(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
11
|
-
$LOAD_PATH << File.join(ROOT, 'lib')
|
12
|
-
$LOAD_PATH << File.join(ROOT, 'spec')
|
13
|
-
$LOAD_PATH << File.join(ROOT, 'examples')
|
14
|
-
|
15
|
-
require 'simple_state_machine'
|
16
|
-
require File.join(ROOT, 'examples', 'conversation.rb')
|
17
|
-
require File.join(ROOT, 'examples', 'lamp.rb')
|
18
|
-
require File.join(ROOT, 'examples', 'traffic_light.rb')
|
19
|
-
require File.join(ROOT, 'examples', 'user.rb') if defined? ActiveRecord
|
20
|
-
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SimpleStateMachine::StateMachineDefinition do
|
4
|
-
|
5
|
-
let(:klass) do
|
6
|
-
Class.new do
|
7
|
-
extend SimpleStateMachine
|
8
|
-
def initialize(state = 'state1')
|
9
|
-
@state = state
|
10
|
-
end
|
11
|
-
event :event1, :state1 => :state2, :state2 => :state3
|
12
|
-
end
|
13
|
-
end
|
14
|
-
let(:smd) { klass.state_machine_definition }
|
15
|
-
|
16
|
-
it "is inherited by subclasses" do
|
17
|
-
subject = Class.new(klass).new
|
18
|
-
expect(subject).to be_state1
|
19
|
-
subject.event1
|
20
|
-
expect(subject).to be_state2
|
21
|
-
subject.event1
|
22
|
-
expect(subject).to be_state3
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#state_method' do
|
26
|
-
subject do
|
27
|
-
klass = Class.new do
|
28
|
-
attr_reader :ssm_state
|
29
|
-
extend SimpleStateMachine
|
30
|
-
state_machine_definition.state_method = :ssm_state
|
31
|
-
|
32
|
-
def initialize(state = 'state1')
|
33
|
-
@ssm_state = state
|
34
|
-
end
|
35
|
-
event :event1, :state1 => :state2
|
36
|
-
event :event2, :state2 => :state3
|
37
|
-
end
|
38
|
-
klass.new
|
39
|
-
end
|
40
|
-
|
41
|
-
it "is used when changing state" do
|
42
|
-
expect(subject.ssm_state).to eq('state1')
|
43
|
-
subject.event1
|
44
|
-
expect(subject.ssm_state).to eq('state2')
|
45
|
-
subject.event2
|
46
|
-
expect(subject.ssm_state).to eq('state3')
|
47
|
-
end
|
48
|
-
|
49
|
-
it "works with state helper methods" do
|
50
|
-
expect(subject).to be_state1
|
51
|
-
subject.event1
|
52
|
-
expect(subject).to be_state2
|
53
|
-
subject.event2
|
54
|
-
expect(subject).to be_state3
|
55
|
-
end
|
56
|
-
|
57
|
-
it "raise an error if an invalid state_transition is called" do
|
58
|
-
expect { subject.event2 }.to raise_error(SimpleStateMachine::IllegalStateTransitionError, "You cannot 'event2' when state is 'state1'")
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
describe '#default_error_state' do
|
64
|
-
subject do
|
65
|
-
klass = Class.new do
|
66
|
-
attr_reader :state
|
67
|
-
extend SimpleStateMachine
|
68
|
-
state_machine_definition.default_error_state = :failed
|
69
|
-
|
70
|
-
def initialize(state = 'state1')
|
71
|
-
@state = state
|
72
|
-
end
|
73
|
-
|
74
|
-
def event1
|
75
|
-
raise "Some error during event"
|
76
|
-
end
|
77
|
-
event :event1, :state1 => :state2
|
78
|
-
end
|
79
|
-
klass.new
|
80
|
-
end
|
81
|
-
|
82
|
-
it "is set when an error occurs during an event" do
|
83
|
-
expect(subject.state).to eq('state1')
|
84
|
-
subject.event1
|
85
|
-
expect(subject.state).to eq('failed')
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "#transitions" do
|
90
|
-
it "has a list of transitions" do
|
91
|
-
expect(smd.transitions).to be_a(Array)
|
92
|
-
expect(smd.transitions.first).to be_a(SimpleStateMachine::Transition)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe "#to_s" do
|
97
|
-
it "converts to readable string format" do
|
98
|
-
expect(smd.to_s).to match(Regexp.new("state1.event1! => state2"))
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
|
data/spec/state_machine_spec.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe SimpleStateMachine::StateMachine do
|
4
|
-
|
5
|
-
describe "#next_state" do
|
6
|
-
subject do
|
7
|
-
klass = Class.new do
|
8
|
-
extend SimpleStateMachine
|
9
|
-
def initialize() @state = 'state1' end
|
10
|
-
event :event1, :state1 => :state2
|
11
|
-
event :event2, :state2 => :state3
|
12
|
-
end
|
13
|
-
klass.new.state_machine
|
14
|
-
end
|
15
|
-
|
16
|
-
it "returns the next state for the event and current state" do
|
17
|
-
expect(subject.next_state('event1')).to eq('state2')
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns nil if no next state for the event and current state exists" do
|
21
|
-
expect(subject.next_state('event2')).to be_nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "#raised_error" do
|
26
|
-
context "given an error can be caught" do
|
27
|
-
let(:class_with_error) do
|
28
|
-
Class.new do
|
29
|
-
extend SimpleStateMachine
|
30
|
-
def initialize(state = 'state1'); @state = state; end
|
31
|
-
def raise_error
|
32
|
-
raise "Something went wrong"
|
33
|
-
end
|
34
|
-
event :raise_error, :state1 => :state2,
|
35
|
-
RuntimeError => :failed
|
36
|
-
event :retry, :failed => :success
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
subject do
|
41
|
-
class_with_error.new.tap{|i| i.raise_error }
|
42
|
-
end
|
43
|
-
|
44
|
-
it "the raised error is accessible" do
|
45
|
-
raised_error = subject.state_machine.raised_error
|
46
|
-
expect(raised_error).to be_a(RuntimeError)
|
47
|
-
expect(raised_error.message).to eq("Something went wrong")
|
48
|
-
end
|
49
|
-
|
50
|
-
it "the raised error is set to nil on the next transition" do
|
51
|
-
expect(subject.state_machine.raised_error).to be
|
52
|
-
subject.retry
|
53
|
-
expect(subject.state_machine.raised_error).not_to be
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
data/spec/tools/graphviz_spec.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SimpleStateMachine::Tools::Graphviz do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@klass = Class.new do
|
7
|
-
extend SimpleStateMachine
|
8
|
-
def initialize(state = 'state1')
|
9
|
-
@state = state
|
10
|
-
end
|
11
|
-
event :event1, :state1 => :state2, :state2 => :state3
|
12
|
-
end
|
13
|
-
@smd = @klass.state_machine_definition
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#to_graphviz_dot" do
|
17
|
-
it "converts to graphviz dot format" do
|
18
|
-
expect(@smd.to_graphviz_dot).to eq(%(digraph G {\n"state1"->"state2"[label=event1];\n"state2"->"state3"[label=event1]\n}))
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "#google_chart_url" do
|
23
|
-
it "shows the state and event dependencies as a Google chart" do
|
24
|
-
graph = @smd.transitions.map { |t| t.to_graphviz_dot }.sort.join(";")
|
25
|
-
expect(@smd.google_chart_url).to eq("http://chart.googleapis.com/chart?cht=gv&chl=digraph{#{::CGI.escape graph}}")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SimpleStateMachine::Tools::Inspector do
|
4
|
-
|
5
|
-
describe "#begin_states" do
|
6
|
-
before do
|
7
|
-
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
8
|
-
def add_events
|
9
|
-
define_event(:event_a, :state1 => :state2)
|
10
|
-
define_event(:event_b, :state2 => :state3)
|
11
|
-
define_event(:event_c, :state1 => :state3)
|
12
|
-
define_event(:event_c, RuntimeError => :state3)
|
13
|
-
end
|
14
|
-
|
15
|
-
def decorator_class
|
16
|
-
SimpleStateMachine::Decorator::Default
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it "returns all 'from' states that aren't 'to' states" do
|
22
|
-
expect(@klass.new.begin_states).to eq([:state1, RuntimeError])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "#end_states" do
|
27
|
-
before do
|
28
|
-
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
29
|
-
def add_events
|
30
|
-
define_event(:event_a, :state1 => :state2)
|
31
|
-
define_event(:event_b, :state2 => :state3)
|
32
|
-
define_event(:event_c, :state1 => :state3)
|
33
|
-
end
|
34
|
-
|
35
|
-
def decorator_class
|
36
|
-
SimpleStateMachine::Decorator::Default
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
it "returns all 'to' states that aren't 'from' states" do
|
43
|
-
expect(@klass.new.end_states).to eq([:state3])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "#states" do
|
48
|
-
before do
|
49
|
-
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
50
|
-
def add_events
|
51
|
-
define_event(:event_a, :state1 => :state2)
|
52
|
-
define_event(:event_b, :state2 => :state3)
|
53
|
-
define_event(:event_c, :state1 => :state3)
|
54
|
-
end
|
55
|
-
|
56
|
-
def decorator_class
|
57
|
-
SimpleStateMachine::Decorator::Default
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
it "returns all states" do
|
64
|
-
expect(@klass.new.states.map(&:to_s).sort).to eq(%w{state1 state2 state3})
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
|