Merge pull request #129 from yabawock/multiple-allows
Allow multiple allows / inherit allows
This commit is contained in:
commit
36a6e5d1f4
|
@ -5,6 +5,7 @@ module Draper
|
||||||
attr_accessor :model, :options
|
attr_accessor :model, :options
|
||||||
|
|
||||||
DEFAULT_DENIED = Object.new.methods << :method_missing
|
DEFAULT_DENIED = Object.new.methods << :method_missing
|
||||||
|
DEFAULT_ALLOWED = []
|
||||||
FORCED_PROXY = [:to_param, :id]
|
FORCED_PROXY = [:to_param, :id]
|
||||||
FORCED_PROXY.each do |method|
|
FORCED_PROXY.each do |method|
|
||||||
define_method method do |*args, &block|
|
define_method method do |*args, &block|
|
||||||
|
@ -12,6 +13,7 @@ module Draper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.denied = DEFAULT_DENIED
|
self.denied = DEFAULT_DENIED
|
||||||
|
self.allowed = DEFAULT_ALLOWED
|
||||||
|
|
||||||
# Initialize a new decorator instance by passing in
|
# Initialize a new decorator instance by passing in
|
||||||
# an instance of the source class. Pass in an optional
|
# an instance of the source class. Pass in an optional
|
||||||
|
@ -89,7 +91,7 @@ module Draper
|
||||||
# @param [Symbols*] methods to deny like `:find, :find_by_name`
|
# @param [Symbols*] methods to deny like `:find, :find_by_name`
|
||||||
def self.denies(*input_denied)
|
def self.denies(*input_denied)
|
||||||
raise ArgumentError, "Specify at least one method (as a symbol) to exclude when using denies" if input_denied.empty?
|
raise ArgumentError, "Specify at least one method (as a symbol) to exclude when using denies" if input_denied.empty?
|
||||||
raise ArgumentError, "Use either 'allows' or 'denies', but not both." if self.allowed?
|
raise ArgumentError, "Use either 'allows' or 'denies', but not both." unless (self.allowed == DEFAULT_ALLOWED)
|
||||||
self.denied += input_denied
|
self.denied += input_denied
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,7 +107,7 @@ module Draper
|
||||||
def self.allows(*input_allows)
|
def self.allows(*input_allows)
|
||||||
raise ArgumentError, "Specify at least one method (as a symbol) to allow when using allows" if input_allows.empty?
|
raise ArgumentError, "Specify at least one method (as a symbol) to allow when using allows" if input_allows.empty?
|
||||||
raise ArgumentError, "Use either 'allows' or 'denies', but not both." unless (self.denied == DEFAULT_DENIED)
|
raise ArgumentError, "Use either 'allows' or 'denies', but not both." unless (self.denied == DEFAULT_DENIED)
|
||||||
self.allowed = input_allows
|
self.allowed += input_allows
|
||||||
end
|
end
|
||||||
|
|
||||||
# Initialize a new decorator instance by passing in
|
# Initialize a new decorator instance by passing in
|
||||||
|
@ -235,7 +237,7 @@ module Draper
|
||||||
private
|
private
|
||||||
|
|
||||||
def allow?(method)
|
def allow?(method)
|
||||||
(!allowed? || allowed.include?(method) || FORCED_PROXY.include?(method)) && !denied.include?(method)
|
(allowed.empty? || allowed.include?(method) || FORCED_PROXY.include?(method)) && !denied.include?(method)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -515,6 +515,8 @@ describe Draper::Base do
|
||||||
describe "a sample usage with allows" do
|
describe "a sample usage with allows" do
|
||||||
let(:subject_with_allows){ DecoratorWithAllows.new(source) }
|
let(:subject_with_allows){ DecoratorWithAllows.new(source) }
|
||||||
|
|
||||||
|
let(:subject_with_multiple_allows){ DecoratorWithMultipleAllows.new(source) }
|
||||||
|
|
||||||
it "should echo the allowed method" do
|
it "should echo the allowed method" do
|
||||||
subject_with_allows.should respond_to(:goodnight_moon)
|
subject_with_allows.should respond_to(:goodnight_moon)
|
||||||
end
|
end
|
||||||
|
@ -522,6 +524,15 @@ describe Draper::Base do
|
||||||
it "should echo _only_ the allowed method" do
|
it "should echo _only_ the allowed method" do
|
||||||
subject_with_allows.should_not respond_to(:hello_world)
|
subject_with_allows.should_not respond_to(:hello_world)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should echo the combined allowed methods" do
|
||||||
|
subject_with_multiple_allows.should respond_to(:goodnight_moon)
|
||||||
|
subject_with_multiple_allows.should respond_to(:hello_world)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should echo _only_ the combined allowed methods" do
|
||||||
|
subject_with_multiple_allows.should_not respond_to(:title)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "invalid usages of allows and denies" do
|
describe "invalid usages of allows and denies" do
|
||||||
|
|
|
@ -7,6 +7,7 @@ require './spec/support/samples/application_controller.rb'
|
||||||
require './spec/support/samples/application_helper.rb'
|
require './spec/support/samples/application_helper.rb'
|
||||||
require './spec/support/samples/decorator.rb'
|
require './spec/support/samples/decorator.rb'
|
||||||
require './spec/support/samples/decorator_with_allows.rb'
|
require './spec/support/samples/decorator_with_allows.rb'
|
||||||
|
require './spec/support/samples/decorator_with_multiple_allows.rb'
|
||||||
require './spec/support/samples/decorator_with_application_helper.rb'
|
require './spec/support/samples/decorator_with_application_helper.rb'
|
||||||
require './spec/support/samples/decorator_with_denies.rb'
|
require './spec/support/samples/decorator_with_denies.rb'
|
||||||
require './spec/support/samples/namespaced_product.rb'
|
require './spec/support/samples/namespaced_product.rb'
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
class DecoratorWithMultipleAllows < Draper::Base
|
||||||
|
allows :goodnight_moon
|
||||||
|
allows :hello_world
|
||||||
|
end
|
Loading…
Reference in New Issue