detect whether a second argument was passed to #set correctly

This commit is contained in:
Konstantin Haase 2011-04-15 15:08:25 +02:00
parent afe9ddf7f3
commit 1632f24b7d
2 changed files with 22 additions and 3 deletions

View File

@ -944,14 +944,15 @@ module Sinatra
# Sets an option to the given value. If the value is a proc,
# the proc will be called every time the option is accessed.
def set(option, value=self, &block)
raise ArgumentError if block && value != self
def set(option, value = (not_set = true), &block)
raise ArgumentError if block and !not_set
value = block if block
if value.kind_of?(Proc)
metadef(option, &value)
metadef("#{option}?") { !!__send__(option) }
metadef("#{option}=") { |val| metadef(option, &Proc.new{val}) }
elsif value == self && option.respond_to?(:each)
elsif not_set
raise ArgumentError unless option.respond_to?(:each)
option.each { |k,v| set(k, v) }
elsif respond_to?("#{option}=")
__send__ "#{option}=", value

View File

@ -34,6 +34,24 @@ class SettingsTest < Test::Unit::TestCase
assert !@base.respond_to?(:fiz)
end
it 'raises an error without value and block' do
assert_raise(ArgumentError) { @base.set(:fiz) }
assert !@base.respond_to?(:fiz)
end
it 'allows setting a value to the app class' do
@base.set :base, @base
assert @base.respond_to?(:base)
assert_equal @base, @base.base
end
it 'raises an error with the app class as value and a block' do
assert_raise ArgumentError do
@base.set(:fiz, @base) { 'baz' }
end
assert !@base.respond_to?(:fiz)
end
it "sets multiple settings with a Hash" do
@base.set :foo => 1234,
:bar => 'Hello World',