finite_machine 0.0.1 → 0.1.0
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/.rspec +2 -0
- data/.travis.yml +18 -0
- data/README.md +467 -11
- data/Rakefile +40 -0
- data/lib/finite_machine.rb +44 -2
- data/lib/finite_machine/callable.rb +51 -0
- data/lib/finite_machine/dsl.rb +134 -0
- data/lib/finite_machine/event.rb +66 -0
- data/lib/finite_machine/observer.rb +136 -0
- data/lib/finite_machine/state_machine.rb +188 -0
- data/lib/finite_machine/subscribers.rb +41 -0
- data/lib/finite_machine/threadable.rb +44 -0
- data/lib/finite_machine/transition.rb +69 -0
- data/lib/finite_machine/version.rb +3 -1
- data/spec/spec_helper.rb +15 -0
- data/spec/unit/callbacks_spec.rb +391 -0
- data/spec/unit/can_spec.rb +50 -0
- data/spec/unit/define_spec.rb +32 -0
- data/spec/unit/events_spec.rb +256 -0
- data/spec/unit/finished_spec.rb +51 -0
- data/spec/unit/if_unless_spec.rb +196 -0
- data/spec/unit/initialize_spec.rb +59 -0
- data/spec/unit/is_spec.rb +33 -0
- data/spec/unit/states_spec.rb +21 -0
- data/spec/unit/transition/parse_states_spec.rb +34 -0
- metadata +35 -3
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe FiniteMachine, 'initialize' do
|
6
|
+
|
7
|
+
it "defaults initial state to :none" do
|
8
|
+
fsm = FiniteMachine.define do
|
9
|
+
events {
|
10
|
+
event :slow, :green => :yellow
|
11
|
+
event :stop, :yellow => :red
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
expect(fsm.current).to eql(:none)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "allows to specify inital state" do
|
19
|
+
fsm = FiniteMachine.define do
|
20
|
+
initial :green
|
21
|
+
|
22
|
+
events {
|
23
|
+
event :slow, :green => :yellow
|
24
|
+
event :stop, :yellow => :red
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
expect(fsm.current).to eql(:green)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "allows to specify deferred inital state" do
|
32
|
+
fsm = FiniteMachine.define do
|
33
|
+
initial state: :green, defer: true
|
34
|
+
|
35
|
+
events {
|
36
|
+
event :slow, :green => :yellow
|
37
|
+
event :stop, :yellow => :red
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
fsm.init
|
42
|
+
expect(fsm.current).to eql(:green)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "allows to specify inital start event" do
|
46
|
+
fsm = FiniteMachine.define do
|
47
|
+
initial state: :green, event: :start
|
48
|
+
|
49
|
+
events {
|
50
|
+
event :slow, :green => :yellow
|
51
|
+
event :stop, :yellow => :red
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
expect(fsm.current).to eql(:none)
|
56
|
+
fsm.start
|
57
|
+
expect(fsm.current).to eql(:green)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe FiniteMachine, 'is?' do
|
6
|
+
|
7
|
+
it "allows to check if state is reachable" do
|
8
|
+
fsm = FiniteMachine.define do
|
9
|
+
initial :green
|
10
|
+
|
11
|
+
events {
|
12
|
+
event :slow, :green => :yellow
|
13
|
+
event :stop, :yellow => :red
|
14
|
+
event :ready, :red => :yellow
|
15
|
+
event :go, :yellow => :green
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
expect(fsm.current).to eql(:green)
|
20
|
+
|
21
|
+
expect(fsm.is?(:green)).to be_true
|
22
|
+
expect(fsm.is?(:yellow)).to be_false
|
23
|
+
expect(fsm.is?([:green, :red])).to be_true
|
24
|
+
expect(fsm.is?([:yellow, :red])).to be_false
|
25
|
+
|
26
|
+
fsm.slow
|
27
|
+
|
28
|
+
expect(fsm.is?(:green)).to be_false
|
29
|
+
expect(fsm.is?(:yellow)).to be_true
|
30
|
+
expect(fsm.is?([:green, :red])).to be_false
|
31
|
+
expect(fsm.is?([:yellow, :red])).to be_true
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe FiniteMachine, 'states' do
|
6
|
+
|
7
|
+
it "retrieves all available states" do
|
8
|
+
fsm = FiniteMachine.define do
|
9
|
+
initial :green
|
10
|
+
|
11
|
+
events {
|
12
|
+
event :slow, :green => :yellow
|
13
|
+
event :stop, :yellow => :red
|
14
|
+
event :ready, :red => :yellow
|
15
|
+
event :go, :yellow => :green
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
expect(fsm.states).to eql([:none, :green, :yellow, :red])
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe FiniteMachine::Transition, 'parse_states' do
|
6
|
+
|
7
|
+
let(:object) { described_class.new(attrs) }
|
8
|
+
|
9
|
+
subject(:transition) { object.parse_states(attrs) }
|
10
|
+
|
11
|
+
context 'with :from, :to keys' do
|
12
|
+
let(:attrs) { {from: [:green, :yellow], to: :red} }
|
13
|
+
|
14
|
+
it "groups states" do
|
15
|
+
expect(transition).to eql([[:green, :yellow], :red])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when from array' do
|
20
|
+
let(:attrs) { {[:green, :yellow] => :red} }
|
21
|
+
|
22
|
+
it "groups states" do
|
23
|
+
expect(transition).to eql([[:green, :yellow], :red])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when hash of states' do
|
28
|
+
let(:attrs) { { :green => :red, :yellow => :red} }
|
29
|
+
|
30
|
+
it "groups states" do
|
31
|
+
expect(transition).to eql([[:green, :yellow], :red])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: finite_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -60,13 +60,34 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- .gitignore
|
63
|
+
- .rspec
|
64
|
+
- .travis.yml
|
63
65
|
- Gemfile
|
64
66
|
- LICENSE.txt
|
65
67
|
- README.md
|
66
68
|
- Rakefile
|
67
69
|
- finite_machine.gemspec
|
68
70
|
- lib/finite_machine.rb
|
71
|
+
- lib/finite_machine/callable.rb
|
72
|
+
- lib/finite_machine/dsl.rb
|
73
|
+
- lib/finite_machine/event.rb
|
74
|
+
- lib/finite_machine/observer.rb
|
75
|
+
- lib/finite_machine/state_machine.rb
|
76
|
+
- lib/finite_machine/subscribers.rb
|
77
|
+
- lib/finite_machine/threadable.rb
|
78
|
+
- lib/finite_machine/transition.rb
|
69
79
|
- lib/finite_machine/version.rb
|
80
|
+
- spec/spec_helper.rb
|
81
|
+
- spec/unit/callbacks_spec.rb
|
82
|
+
- spec/unit/can_spec.rb
|
83
|
+
- spec/unit/define_spec.rb
|
84
|
+
- spec/unit/events_spec.rb
|
85
|
+
- spec/unit/finished_spec.rb
|
86
|
+
- spec/unit/if_unless_spec.rb
|
87
|
+
- spec/unit/initialize_spec.rb
|
88
|
+
- spec/unit/is_spec.rb
|
89
|
+
- spec/unit/states_spec.rb
|
90
|
+
- spec/unit/transition/parse_states_spec.rb
|
70
91
|
homepage: ''
|
71
92
|
licenses:
|
72
93
|
- MIT
|
@@ -91,4 +112,15 @@ rubygems_version: 2.0.3
|
|
91
112
|
signing_key:
|
92
113
|
specification_version: 4
|
93
114
|
summary: A minimal finite state machine with a straightforward syntax.
|
94
|
-
test_files:
|
115
|
+
test_files:
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
- spec/unit/callbacks_spec.rb
|
118
|
+
- spec/unit/can_spec.rb
|
119
|
+
- spec/unit/define_spec.rb
|
120
|
+
- spec/unit/events_spec.rb
|
121
|
+
- spec/unit/finished_spec.rb
|
122
|
+
- spec/unit/if_unless_spec.rb
|
123
|
+
- spec/unit/initialize_spec.rb
|
124
|
+
- spec/unit/is_spec.rb
|
125
|
+
- spec/unit/states_spec.rb
|
126
|
+
- spec/unit/transition/parse_states_spec.rb
|