From 5f32cd25fd6d2ccdff18c2a525c28fc0bc1b996e Mon Sep 17 00:00:00 2001 From: Ross Kaffenberger Date: Tue, 15 Apr 2014 17:20:21 -0400 Subject: [PATCH] support multiple warden configuration blocks Changes the behavior of `Devise.warden` such that calling it multiple times with different blocks will result in a call to each block on `Devise.configure_warden!` rather than "last block wins". This is especially used for plugins that wish to extend warden functionality without clobbering base app configuration or vice versa. --- lib/devise.rb | 6 +++--- test/devise_test.rb | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/devise.rb b/lib/devise.rb index 75bd40f2..b7b68951 100644 --- a/lib/devise.rb +++ b/lib/devise.rb @@ -272,7 +272,7 @@ module Devise # Private methods to interface with Warden. mattr_accessor :warden_config @@warden_config = nil - @@warden_config_block = nil + @@warden_config_blocks = [] # When true, enter in paranoid mode to avoid user enumeration. mattr_accessor :paranoid @@ -413,7 +413,7 @@ module Devise # end # end def self.warden(&block) - @@warden_config_block = block + @@warden_config_blocks << block end # Specify an omniauth provider. @@ -467,7 +467,7 @@ module Devise end end - @@warden_config_block.try :call, Devise.warden_config + @@warden_config_blocks.map { |block| block.call Devise.warden_config } true end end diff --git a/test/devise_test.rb b/test/devise_test.rb index 2ee39a99..ec726b83 100644 --- a/test/devise_test.rb +++ b/test/devise_test.rb @@ -3,10 +3,10 @@ require 'test_helper' module Devise def self.yield_and_restore @@warden_configured = nil - c, b = @@warden_config, @@warden_config_block + c, b = @@warden_config, @@warden_config_blocks yield ensure - @@warden_config, @@warden_config_block = c, b + @@warden_config, @@warden_config_blocks = c, b end end @@ -53,6 +53,23 @@ class DeviseTest < ActiveSupport::TestCase end end + test 'warden manager user configuration through multiple blocks' do + Devise.yield_and_restore do + @first_executed = false + @second_executed = false + Devise.warden do |config| + @first_executed = true + end + Devise.warden do |config| + @second_executed = true + end + + Devise.configure_warden! + assert @first_executed + assert @second_executed + end + end + test 'add new module using the helper method' do assert_nothing_raised(Exception) { Devise.add_module(:coconut) } assert_equal 1, Devise::ALL.select { |v| v == :coconut }.size