simple_state_machine 0.2.1 → 0.2.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -8,12 +8,12 @@ module SimpleStateMachine::ActiveRecord
8
8
 
9
9
  class Decorator < SimpleStateMachine::Decorator
10
10
 
11
- def decorate event_name, from, to
12
- super event_name, from, to
13
- unless @subject.method_defined?("#{event_name}_and_save")
14
- @subject.send(:define_method, "#{event_name}_and_save") do |*args|
11
+ def decorate transition
12
+ super transition
13
+ unless @subject.method_defined?("#{transition.event_name}_and_save")
14
+ @subject.send(:define_method, "#{transition.event_name}_and_save") do |*args|
15
15
  old_state = state
16
- send "#{event_name}", *args
16
+ send "#{transition.event_name}", *args
17
17
  if !self.errors.entries.empty?
18
18
  self.state = old_state
19
19
  return false
@@ -27,10 +27,10 @@ module SimpleStateMachine::ActiveRecord
27
27
  end
28
28
  end
29
29
  end
30
- unless @subject.method_defined?("#{event_name}_and_save!")
31
- @subject.send(:define_method, "#{event_name}_and_save!") do |*args|
30
+ unless @subject.method_defined?("#{transition.event_name}_and_save!")
31
+ @subject.send(:define_method, "#{transition.event_name}_and_save!") do |*args|
32
32
  old_state = state
33
- send "#{event_name}", *args
33
+ send "#{transition.event_name}", *args
34
34
  if !self.errors.entries.empty?
35
35
  self.state = old_state
36
36
  raise ActiveRecord::RecordInvalid.new(self)
@@ -4,19 +4,30 @@ module SimpleStateMachine
4
4
 
5
5
  def event event_name, state_transitions
6
6
  state_transitions.each do |from, to|
7
- state_machine_definition.add_transition(event_name, from, to)
8
- state_machine_decorator(self).decorate( event_name, from, to)
7
+ transition = state_machine_definition.add_transition(event_name, from, to)
8
+ state_machine_decorator(self).decorate(transition)
9
9
  end
10
10
  end
11
11
 
12
12
  def state_machine_definition
13
13
  @state_machine_definition ||= StateMachineDefinition.new
14
14
  end
15
+
16
+ def state_machine_definition= state_machine_definition
17
+ @state_machine_definition = state_machine_definition
18
+ state_machine_definition.transitions.each do |transition|
19
+ state_machine_decorator(self).decorate(transition)
20
+ end
21
+ end
15
22
 
16
23
  def state_machine_decorator subject
17
24
  Decorator.new subject
18
25
  end
19
26
 
27
+ def inherited(subclass)
28
+ subclass.state_machine_definition = state_machine_definition.clone
29
+ super
30
+ end
20
31
  end
21
32
 
22
33
  include EventMixin
@@ -24,12 +35,13 @@ module SimpleStateMachine
24
35
  class StateMachineDefinition
25
36
 
26
37
  def transitions
27
- @transitions ||= {}
38
+ @transitions ||= []
28
39
  end
29
40
 
30
41
  def add_transition event_name, from, to
31
- transitions[event_name.to_s] ||= {}
32
- transitions[event_name.to_s][from.to_s] = to.to_s
42
+ transition = Transition.new(event_name.to_s, from.to_s, to.to_s)
43
+ transitions << transition
44
+ transition
33
45
  end
34
46
 
35
47
  end
@@ -41,7 +53,8 @@ module SimpleStateMachine
41
53
  end
42
54
 
43
55
  def next_state(event_name)
44
- transitions[event_name.to_s][@subject.state.to_s]
56
+ transition = transitions.select{|t| t.event_name.to_s == event_name.to_s && @subject.state.to_s == t.from.to_s}.first
57
+ transition ? transition.to : nil
45
58
  end
46
59
 
47
60
  def transition(event_name)
@@ -77,6 +90,9 @@ module SimpleStateMachine
77
90
 
78
91
  end
79
92
 
93
+ class Transition < Struct.new(:event_name, :from, :to)
94
+ end
95
+
80
96
  class Decorator
81
97
 
82
98
  def initialize(subject)
@@ -86,11 +102,11 @@ module SimpleStateMachine
86
102
  define_state_setter_method
87
103
  end
88
104
 
89
- def decorate event_name, from, to
90
- define_state_helper_method(from)
91
- define_state_helper_method(to)
92
- define_event_method(event_name)
93
- decorate_event_method(event_name)
105
+ def decorate transition
106
+ define_state_helper_method(transition.from)
107
+ define_state_helper_method(transition.to)
108
+ define_event_method(transition.event_name)
109
+ decorate_event_method(transition.event_name)
94
110
  end
95
111
 
96
112
  private
@@ -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.2.1"
8
+ s.version = "0.2.2"
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"]
@@ -58,6 +58,17 @@ describe SimpleStateMachine do
58
58
 
59
59
  end
60
60
 
61
+ describe "state_machine_definition" do
62
+ it "is inherited by subclasses" do
63
+ example = Class.new(SimpleExample).new
64
+ example.should be_state1
65
+ example.event1
66
+ example.should be_state2
67
+ example.event1
68
+ example.should be_state3
69
+ end
70
+ end
71
+
61
72
  describe "state_machine" do
62
73
  it "has a next_state method" do
63
74
  example = SimpleExample.new
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: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Marek de Heus