AS::Callbacks: rip out per_key option.
This commit is contained in:
parent
b41ef0a448
commit
4f53091dd1
|
@ -1,5 +1,7 @@
|
||||||
## Rails 4.0.0 (unreleased) ##
|
## Rails 4.0.0 (unreleased) ##
|
||||||
|
|
||||||
|
* AS::Callbacks: `:per_key` option is no longer supported
|
||||||
|
|
||||||
* `AS::Callbacks#define_callbacks`: add `:skip_after_callbacks_if_terminated` option.
|
* `AS::Callbacks#define_callbacks`: add `:skip_after_callbacks_if_terminated` option.
|
||||||
|
|
||||||
* Add html_escape_once to ERB::Util, and delegate escape_once tag helper to it. *Carlos Antonio da Silva*
|
* Add html_escape_once to ERB::Util, and delegate escape_once tag helper to it. *Carlos Antonio da Silva*
|
||||||
|
|
|
@ -95,6 +95,7 @@ module ActiveSupport
|
||||||
|
|
||||||
def initialize(chain, filter, kind, options, klass)
|
def initialize(chain, filter, kind, options, klass)
|
||||||
@chain, @kind, @klass = chain, kind, klass
|
@chain, @kind, @klass = chain, kind, klass
|
||||||
|
deprecate_per_key_option(options)
|
||||||
normalize_options!(options)
|
normalize_options!(options)
|
||||||
|
|
||||||
@raw_filter, @options = filter, options
|
@raw_filter, @options = filter, options
|
||||||
|
@ -103,6 +104,12 @@ module ActiveSupport
|
||||||
@callback_id = next_id
|
@callback_id = next_id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def deprecate_per_key_option(options)
|
||||||
|
if options[:per_key]
|
||||||
|
raise NotImplementedError, ":per_key option is no longer supported. Use generic :if and :unless options instead."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def clone(chain, klass)
|
def clone(chain, klass)
|
||||||
obj = super()
|
obj = super()
|
||||||
obj.chain = chain
|
obj.chain = chain
|
||||||
|
@ -116,11 +123,6 @@ module ActiveSupport
|
||||||
def normalize_options!(options)
|
def normalize_options!(options)
|
||||||
options[:if] = Array(options[:if])
|
options[:if] = Array(options[:if])
|
||||||
options[:unless] = Array(options[:unless])
|
options[:unless] = Array(options[:unless])
|
||||||
|
|
||||||
options[:per_key] ||= {}
|
|
||||||
|
|
||||||
options[:if] += Array(options[:per_key][:if])
|
|
||||||
options[:unless] += Array(options[:per_key][:unless])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
|
@ -140,9 +142,9 @@ module ActiveSupport
|
||||||
filter_options[:unless].concat(Array(new_options[:if])) if new_options.key?(:if)
|
filter_options[:unless].concat(Array(new_options[:if])) if new_options.key?(:if)
|
||||||
end
|
end
|
||||||
|
|
||||||
def recompile!(_options, _per_key)
|
def recompile!(_options)
|
||||||
|
deprecate_per_key_option(_options)
|
||||||
_update_filter(self.options, _options)
|
_update_filter(self.options, _options)
|
||||||
_update_filter(self.options, _per_key)
|
|
||||||
|
|
||||||
@callback_id = next_id
|
@callback_id = next_id
|
||||||
@filter = _compile_filter(@raw_filter)
|
@filter = _compile_filter(@raw_filter)
|
||||||
|
@ -352,9 +354,9 @@ module ActiveSupport
|
||||||
|
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
|
|
||||||
# This method calls the callback method for the given key.
|
# This method runs callback chain for the given key.
|
||||||
# If this called first time it creates a new callback method for the key,
|
# If this called first time it creates a new callback method for the key.
|
||||||
# calculating which callbacks can be omitted because of per_key conditions.
|
# This generated method plays caching role.
|
||||||
#
|
#
|
||||||
def __run_callbacks(key, kind, object, &blk) #:nodoc:
|
def __run_callbacks(key, kind, object, &blk) #:nodoc:
|
||||||
name = __callback_runner_name(kind)
|
name = __callback_runner_name(kind)
|
||||||
|
@ -427,29 +429,6 @@ module ActiveSupport
|
||||||
# will be called only when it returns a false value.
|
# will be called only when it returns a false value.
|
||||||
# * <tt>:prepend</tt> - If true, the callback will be prepended to the existing
|
# * <tt>:prepend</tt> - If true, the callback will be prepended to the existing
|
||||||
# chain rather than appended.
|
# chain rather than appended.
|
||||||
# * <tt>:per_key</tt> - A hash with <tt>:if</tt> and <tt>:unless</tt> options;
|
|
||||||
# see "Per-key conditions" below.
|
|
||||||
#
|
|
||||||
# ===== Per-key conditions
|
|
||||||
#
|
|
||||||
# When creating or skipping callbacks, you can specify conditions that
|
|
||||||
# are always the same for a given key. For instance, in Action Pack,
|
|
||||||
# we convert :only and :except conditions into per-key conditions.
|
|
||||||
#
|
|
||||||
# before_filter :authenticate, :except => "index"
|
|
||||||
#
|
|
||||||
# becomes
|
|
||||||
#
|
|
||||||
# set_callback :process_action, :before, :authenticate, :per_key => {:unless => proc {|c| c.action_name == "index"}}
|
|
||||||
#
|
|
||||||
# Per-key conditions are evaluated only once per use of a given key.
|
|
||||||
# In the case of the above example, you would do:
|
|
||||||
#
|
|
||||||
# run_callbacks(:process_action, action_name) { ... dispatch stuff ... }
|
|
||||||
#
|
|
||||||
# In that case, each action_name would get its own compiled callback
|
|
||||||
# method that took into consideration the per_key conditions. This
|
|
||||||
# is a speed improvement for ActionPack.
|
|
||||||
#
|
#
|
||||||
def set_callback(name, *filter_list, &block)
|
def set_callback(name, *filter_list, &block)
|
||||||
mapped = nil
|
mapped = nil
|
||||||
|
@ -484,7 +463,7 @@ module ActiveSupport
|
||||||
if filter && options.any?
|
if filter && options.any?
|
||||||
new_filter = filter.clone(chain, self)
|
new_filter = filter.clone(chain, self)
|
||||||
chain.insert(chain.index(filter), new_filter)
|
chain.insert(chain.index(filter), new_filter)
|
||||||
new_filter.recompile!(options, options[:per_key] || {})
|
new_filter.recompile!(options)
|
||||||
end
|
end
|
||||||
|
|
||||||
chain.delete(filter)
|
chain.delete(filter)
|
||||||
|
|
|
@ -9,8 +9,8 @@ class GrandParent
|
||||||
end
|
end
|
||||||
|
|
||||||
define_callbacks :dispatch
|
define_callbacks :dispatch
|
||||||
set_callback :dispatch, :before, :before1, :before2, :per_key => {:if => proc {|c| c.action_name == "index" || c.action_name == "update" }}
|
set_callback :dispatch, :before, :before1, :before2, :if => proc {|c| c.action_name == "index" || c.action_name == "update" }
|
||||||
set_callback :dispatch, :after, :after1, :after2, :per_key => {:if => proc {|c| c.action_name == "update" || c.action_name == "delete" }}
|
set_callback :dispatch, :after, :after1, :after2, :if => proc {|c| c.action_name == "update" || c.action_name == "delete" }
|
||||||
|
|
||||||
def before1
|
def before1
|
||||||
@log << "before1"
|
@log << "before1"
|
||||||
|
@ -37,12 +37,12 @@ class GrandParent
|
||||||
end
|
end
|
||||||
|
|
||||||
class Parent < GrandParent
|
class Parent < GrandParent
|
||||||
skip_callback :dispatch, :before, :before2, :per_key => {:unless => proc {|c| c.action_name == "update" }}
|
skip_callback :dispatch, :before, :before2, :unless => proc {|c| c.action_name == "update" }
|
||||||
skip_callback :dispatch, :after, :after2, :per_key => {:unless => proc {|c| c.action_name == "delete" }}
|
skip_callback :dispatch, :after, :after2, :unless => proc {|c| c.action_name == "delete" }
|
||||||
end
|
end
|
||||||
|
|
||||||
class Child < GrandParent
|
class Child < GrandParent
|
||||||
skip_callback :dispatch, :before, :before2, :per_key => {:unless => proc {|c| c.action_name == "update" }}, :if => :state_open?
|
skip_callback :dispatch, :before, :before2, :unless => proc {|c| c.action_name == "update" }, :if => :state_open?
|
||||||
|
|
||||||
def state_open?
|
def state_open?
|
||||||
@state == :open
|
@state == :open
|
||||||
|
@ -112,15 +112,15 @@ class BasicCallbacksTest < ActiveSupport::TestCase
|
||||||
@unknown = GrandParent.new("unknown").dispatch
|
@unknown = GrandParent.new("unknown").dispatch
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_basic_per_key1
|
def test_basic_conditional_callback1
|
||||||
assert_equal %w(before1 before2 index), @index.log
|
assert_equal %w(before1 before2 index), @index.log
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_basic_per_key2
|
def test_basic_conditional_callback2
|
||||||
assert_equal %w(before1 before2 update after2 after1), @update.log
|
assert_equal %w(before1 before2 update after2 after1), @update.log
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_basic_per_key3
|
def test_basic_conditional_callback3
|
||||||
assert_equal %w(delete after2 after1), @delete.log
|
assert_equal %w(delete after2 after1), @delete.log
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -95,7 +95,7 @@ module CallbacksTest
|
||||||
|
|
||||||
define_callbacks :dispatch
|
define_callbacks :dispatch
|
||||||
|
|
||||||
set_callback :dispatch, :before, :log, :per_key => {:unless => proc {|c| c.action_name == :index || c.action_name == :show }}
|
set_callback :dispatch, :before, :log, :unless => proc {|c| c.action_name == :index || c.action_name == :show }
|
||||||
set_callback :dispatch, :after, :log2
|
set_callback :dispatch, :after, :log2
|
||||||
|
|
||||||
attr_reader :action_name, :logger
|
attr_reader :action_name, :logger
|
||||||
|
@ -120,7 +120,7 @@ module CallbacksTest
|
||||||
end
|
end
|
||||||
|
|
||||||
class Child < ParentController
|
class Child < ParentController
|
||||||
skip_callback :dispatch, :before, :log, :per_key => {:if => proc {|c| c.action_name == :update} }
|
skip_callback :dispatch, :before, :log, :if => proc {|c| c.action_name == :update}
|
||||||
skip_callback :dispatch, :after, :log2
|
skip_callback :dispatch, :after, :log2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -131,10 +131,10 @@ module CallbacksTest
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
before_save Proc.new {|r| r.history << [:before_save, :starts_true, :if] }, :per_key => {:if => :starts_true}
|
before_save Proc.new {|r| r.history << [:before_save, :starts_true, :if] }, :if => :starts_true
|
||||||
before_save Proc.new {|r| r.history << [:before_save, :starts_false, :if] }, :per_key => {:if => :starts_false}
|
before_save Proc.new {|r| r.history << [:before_save, :starts_false, :if] }, :if => :starts_false
|
||||||
before_save Proc.new {|r| r.history << [:before_save, :starts_true, :unless] }, :per_key => {:unless => :starts_true}
|
before_save Proc.new {|r| r.history << [:before_save, :starts_true, :unless] }, :unless => :starts_true
|
||||||
before_save Proc.new {|r| r.history << [:before_save, :starts_false, :unless] }, :per_key => {:unless => :starts_false}
|
before_save Proc.new {|r| r.history << [:before_save, :starts_false, :unless] }, :unless => :starts_false
|
||||||
|
|
||||||
def starts_true
|
def starts_true
|
||||||
if @@starts_true
|
if @@starts_true
|
||||||
|
@ -329,7 +329,7 @@ module CallbacksTest
|
||||||
define_callbacks :save
|
define_callbacks :save
|
||||||
attr_reader :stuff
|
attr_reader :stuff
|
||||||
|
|
||||||
set_callback :save, :before, :action, :per_key => {:if => :yes}
|
set_callback :save, :before, :action, :if => :yes
|
||||||
|
|
||||||
def yes() true end
|
def yes() true end
|
||||||
|
|
||||||
|
@ -701,4 +701,20 @@ module CallbacksTest
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class PerKeyOptionDeprecationTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
|
def test_per_key_option_deprecaton
|
||||||
|
assert_raise NotImplementedError do
|
||||||
|
Phone.class_eval do
|
||||||
|
set_callback :save, :before, :before_save1, :per_key => {:if => "true"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_raise NotImplementedError do
|
||||||
|
Phone.class_eval do
|
||||||
|
skip_callback :save, :before, :before_save1, :per_key => {:if => "true"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue