can_has_state 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,8 @@ module CanHasState
|
|
3
3
|
|
4
4
|
attr_reader :column, :states, :initial_state, :triggers
|
5
5
|
|
6
|
-
def initialize(column_name, &block)
|
6
|
+
def initialize(column_name, parent_context, &block)
|
7
|
+
@parent_context = parent_context
|
7
8
|
@column = column_name.to_sym
|
8
9
|
@states = {}
|
9
10
|
@triggers = []
|
@@ -49,12 +50,12 @@ module CanHasState
|
|
49
50
|
when :on_enter
|
50
51
|
@triggers << {:from=>["*"], :to=>[state_name], :trigger=>Array(val), :type=>:on_enter}
|
51
52
|
when :on_enter_deferred
|
52
|
-
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless respond_to?(:after_save)
|
53
|
+
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless @parent_context.respond_to?(:after_save)
|
53
54
|
@triggers << {:from=>["*"], :to=>[state_name], :trigger=>Array(val), :type=>:on_enter, :deferred=>true}
|
54
55
|
when :on_exit
|
55
56
|
@triggers << {:from=>[state_name], :to=>["*"], :trigger=>Array(val), :type=>:on_exit}
|
56
57
|
when :on_exit_deferred
|
57
|
-
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless respond_to?(:after_save)
|
58
|
+
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless @parent_context.respond_to?(:after_save)
|
58
59
|
@triggers << {:from=>[state_name], :to=>["*"], :trigger=>Array(val), :type=>:on_exit, :deferred=>true}
|
59
60
|
end
|
60
61
|
end
|
@@ -66,7 +67,7 @@ module CanHasState
|
|
66
67
|
def on(pairs)
|
67
68
|
trigger = pairs.delete :trigger
|
68
69
|
deferred = pairs.delete :deferred
|
69
|
-
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") if deferred &&
|
70
|
+
raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") if deferred && !@parent_context.respond_to?(:after_save)
|
70
71
|
pairs.each do |from, to|
|
71
72
|
@triggers << {:from=>Array(from).map(&:to_s), :to=>Array(to).map(&:to_s),
|
72
73
|
:trigger=>Array(trigger), :type=>:trigger, :deferred=>!!deferred}
|
data/test/can_has_state_test.rb
CHANGED
@@ -61,6 +61,14 @@ class UserPreState
|
|
61
61
|
include ActiveModel::Validations::Callbacks
|
62
62
|
include CanHasState::Machine
|
63
63
|
end
|
64
|
+
class UserPreState2
|
65
|
+
include ActiveModel::Validations
|
66
|
+
include ActiveModel::Validations::Callbacks
|
67
|
+
include CanHasState::Machine
|
68
|
+
def self.after_save(*_)
|
69
|
+
# dummy to allow deferred triggers
|
70
|
+
end
|
71
|
+
end
|
64
72
|
|
65
73
|
class CanHasStateTest < MiniTest::Unit::TestCase #Minitest::Test
|
66
74
|
|
@@ -123,6 +131,27 @@ class CanHasStateTest < MiniTest::Unit::TestCase #Minitest::Test
|
|
123
131
|
end
|
124
132
|
end
|
125
133
|
|
134
|
+
def test_deferred_available
|
135
|
+
UserPreState2.class_eval do
|
136
|
+
state_machine :state_one do
|
137
|
+
state :one, on_enter_deferred: ->{ puts 'Hello' }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
UserPreState2.class_eval do
|
142
|
+
state_machine :state_two do
|
143
|
+
state :two, on_exit_deferred: ->{ puts 'Hello' }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
UserPreState2.class_eval do
|
148
|
+
state_machine :state_three do
|
149
|
+
state :three
|
150
|
+
on :* => :*, trigger: ->{ puts 'Hello' }, deferred: true
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
126
155
|
def test_builder_complex
|
127
156
|
assert_equal 1, Account.state_machines.size
|
128
157
|
sm = Account.state_machines[0][1]
|