diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 27135dbc..3b17cf76 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -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 diff --git a/test/settings_test.rb b/test/settings_test.rb index b8c9788c..71ceb849 100644 --- a/test/settings_test.rb +++ b/test/settings_test.rb @@ -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',