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 && !respond_to?(:after_save)
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}
@@ -5,7 +5,7 @@ module CanHasState
5
5
  module ClassMethods
6
6
 
7
7
  def state_machine(column, &block)
8
- d = Definition.new(column, &block)
8
+ d = Definition.new(column, self, &block)
9
9
 
10
10
  define_method "allow_#{column}?" do |to|
11
11
  state_machine_allow?(column.to_sym, to.to_s)
@@ -1,3 +1,3 @@
1
1
  module CanHasState
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -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]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: can_has_state
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: