Permalink
Browse files

detect whether a second argument was passed to #set correctly

  • Loading branch information...
1 parent afe9ddf commit 1632f24b7d15e846d676dfd93d2cfeeafbaf03fb @rkh rkh committed Apr 15, 2011
Showing with 22 additions and 3 deletions.
  1. +4 −3 lib/sinatra/base.rb
  2. +18 −0 test/settings_test.rb
View
@@ -944,14 +944,15 @@ def middleware
# 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
@@ -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',

0 comments on commit 1632f24

Please sign in to comment.