can_has_state 0.3.0 → 0.3.1
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.
@@ -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]
|