micromachine 0.0.9 → 0.0.10
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/README.markdown +38 -0
- data/lib/micromachine.rb +2 -1
- data/micromachine.gemspec +1 -1
- metadata +3 -3
data/README.markdown
CHANGED
@@ -36,6 +36,15 @@ It can also have callbacks when entering some state:
|
|
36
36
|
puts "Confirmed"
|
37
37
|
end
|
38
38
|
|
39
|
+
Or callbacks on any transition:
|
40
|
+
|
41
|
+
machine.on(:any) do
|
42
|
+
puts "Transitioned..."
|
43
|
+
end
|
44
|
+
|
45
|
+
Note that `:any` is a special key. Using it as a state when declaring
|
46
|
+
transitions will give you unexpected results.
|
47
|
+
|
39
48
|
Adding MicroMachine to your models
|
40
49
|
----------------------------------
|
41
50
|
|
@@ -82,6 +91,35 @@ This example asumes you have a :confirmation_state attribute in your
|
|
82
91
|
model. This may look like a very verbose implementation, but you gain a
|
83
92
|
lot in flexibility.
|
84
93
|
|
94
|
+
An alternative approach, using callbacks:
|
95
|
+
|
96
|
+
class Event < ActiveRecord::Base
|
97
|
+
def confirm!
|
98
|
+
confirmation.trigger(:confirm)
|
99
|
+
end
|
100
|
+
|
101
|
+
def cancel!
|
102
|
+
confirmation.trigger(:cancel)
|
103
|
+
end
|
104
|
+
|
105
|
+
def reset!
|
106
|
+
confirmation.trigger(:reset)
|
107
|
+
end
|
108
|
+
|
109
|
+
def confirmation
|
110
|
+
@confirmation ||= begin
|
111
|
+
confirmation = MicroMachine.new(confirmation_state || "pending")
|
112
|
+
confirmation.transitions_for[:confirm] = { "pending" => "confirmed" }
|
113
|
+
confirmation.transitions_for[:cancel] = { "confirmed" => "cancelled" }
|
114
|
+
confirmation.transitions_for[:reset] = { "confirmed" => "pending", "cancelled" => "pending" }
|
115
|
+
confirmation.on(:any) { self.confirmation_state = confirmation.state }
|
116
|
+
confirmation
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
Now, on any transition the `confirmation_state` attribute in the model will be updated.
|
122
|
+
|
85
123
|
Installation
|
86
124
|
------------
|
87
125
|
|
data/lib/micromachine.rb
CHANGED
@@ -17,7 +17,8 @@ class MicroMachine
|
|
17
17
|
def trigger event
|
18
18
|
if trigger?(event)
|
19
19
|
@state = transitions_for[event][@state]
|
20
|
-
@callbacks[@state]
|
20
|
+
callbacks = @callbacks[@state] + @callbacks[:any]
|
21
|
+
callbacks.each { |callback| callback.call }
|
21
22
|
true
|
22
23
|
end
|
23
24
|
end
|
data/micromachine.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'micromachine'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.10'
|
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: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-03-01 00:00:00 -03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
56
|
requirements: []
|
57
57
|
|
58
58
|
rubyforge_project:
|
59
|
-
rubygems_version: 1.3.
|
59
|
+
rubygems_version: 1.3.5
|
60
60
|
signing_key:
|
61
61
|
specification_version: 3
|
62
62
|
summary: Minimal Finite State Machine.
|