micromachine 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -11,7 +11,7 @@ all provide a nice DSL for declaring events, exceptions, callbacks,
11
11
  and all kinds of niceties in general.
12
12
 
13
13
  But if all you want is a finite state machine, look no further: this
14
- is only 22 lines of code and provides everything a finite state
14
+ has less than 50 lines of code and provides everything a finite state
15
15
  machine must have, and nothing more.
16
16
 
17
17
  Usage
@@ -22,9 +22,10 @@ require 'micromachine'
22
22
 
23
23
  machine = MicroMachine.new(:new) # Initial state.
24
24
 
25
- machine.transitions_for[:confirm] = { :new => :confirmed }
26
- machine.transitions_for[:ignore] = { :new => :ignored }
27
- machine.transitions_for[:reset] = { :confirmed => :new, :ignored => :new }
25
+ # Define the possible transitions for each event.
26
+ machine.when(:confirm, :new => :confirmed)
27
+ machine.when(:ignore, :new => :ignored)
28
+ machine.when(:reset, :confirmed => :new, :ignored => :new)
28
29
 
29
30
  machine.trigger(:confirm) #=> true
30
31
  machine.state #=> :confirmed
@@ -39,6 +40,15 @@ machine.trigger(:ignore) #=> true
39
40
  machine.state #=> :ignored
40
41
  ```
41
42
 
43
+ The `when` helper is syntactic sugar for assigning to the
44
+ `transitions_for` hash. This code is equivalent:
45
+
46
+ ``` ruby
47
+ machine.transitions_for[:confirm] = { :new => :confirmed }
48
+ machine.transitions_for[:ignore] = { :new => :ignored }
49
+ machine.transitions_for[:reset] = { :confirmed => :new, :ignored => :new }
50
+ ```
51
+
42
52
  You can also ask if an event will trigger a change in state. Following
43
53
  the example above:
44
54
 
@@ -103,9 +113,9 @@ class Event < ActiveRecord::Base
103
113
  @confirmation ||= begin
104
114
  fsm = MicroMachine.new(confirmation_state || "pending")
105
115
 
106
- fsm.transitions_for[:confirm] = { "pending" => "confirmed" }
107
- fsm.transitions_for[:cancel] = { "confirmed" => "cancelled" }
108
- fsm.transitions_for[:reset] = { "confirmed" => "pending", "cancelled" => "pending" }
116
+ fsm.when(:confirm, "pending" => "confirmed")
117
+ fsm.when(:cancel, "confirmed" => "cancelled")
118
+ fsm.when(:reset, "confirmed" => "pending", "cancelled" => "pending")
109
119
 
110
120
  fsm
111
121
  end
@@ -143,9 +153,9 @@ class Event < ActiveRecord::Base
143
153
  @confirmation ||= begin
144
154
  fsm = MicroMachine.new(confirmation_state || "pending")
145
155
 
146
- fsm.transitions_for[:confirm] = { "pending" => "confirmed" }
147
- fsm.transitions_for[:cancel] = { "confirmed" => "cancelled" }
148
- fsm.transitions_for[:reset] = { "confirmed" => "pending", "cancelled" => "pending" }
156
+ fsm.when(:confirm, "pending" => "confirmed")
157
+ fsm.when(:cancel, "confirmed" => "cancelled")
158
+ fsm.when(:reset, "confirmed" => "pending", "cancelled" => "pending")
149
159
 
150
160
  fsm.on(:any) { self.confirmation_state = confirmation.state }
151
161
 
data/lib/micromachine.rb CHANGED
@@ -14,6 +14,10 @@ class MicroMachine
14
14
  @callbacks[key] << block
15
15
  end
16
16
 
17
+ def when(event, transitions)
18
+ transitions_for[event] = transitions
19
+ end
20
+
17
21
  def trigger event
18
22
  if trigger?(event)
19
23
  @state = transitions_for[event][@state]
@@ -31,6 +35,10 @@ class MicroMachine
31
35
  raise InvalidEvent
32
36
  end
33
37
 
38
+ def events
39
+ transitions_for.keys
40
+ end
41
+
34
42
  def ==(some_state)
35
43
  state == some_state
36
44
  end
data/micromachine.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'micromachine'
3
- s.version = '1.0.0'
3
+ s.version = '1.0.1'
4
4
  s.summary = %{Minimal Finite State Machine.}
5
5
  s.description = %Q{There are many finite state machine implementations for Ruby, and they all provide a nice DSL for declaring events, exceptions, callbacks, and all kinds of niceties in general.\n\nBut if all you want is a finite state machine, look no further: this is only 22 lines of code and provides everything a finite state machine must have, and nothing more.}
6
6
  s.author = "Michel Martens"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micromachine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-28 00:00:00.000000000 Z
12
+ date: 2012-03-29 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'There are many finite state machine implementations for Ruby, and
15
15
  they all provide a nice DSL for declaring events, exceptions, callbacks, and all