Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

detect whether a second argument was passed to #set correctly

  • Loading branch information...
commit 5432f570f7f7024cac59f33429f40c2d65b3ef24 1 parent 696acf2
@rkh rkh authored
Showing with 22 additions and 3 deletions.
  1. +4 −3 lib/sinatra/base.rb
  2. +18 −0 test/settings_test.rb
View
7 lib/sinatra/base.rb
@@ -949,14 +949,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
18 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',
Please sign in to comment.
Something went wrong with that request. Please try again.