From 1d854b7c8a321f40ad098f74dc62cf18f8f4c5d6 Mon Sep 17 00:00:00 2001 From: Andrew Blake Date: Fri, 19 Mar 2021 17:12:56 +0000 Subject: [PATCH 1/3] Fix Delegator to pass keyword arguments for Ruby 3.0 --- lib/sinatra/base.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 4b5fbb0ce2..d3a7e2c9da 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1943,9 +1943,9 @@ def self.register(*extensions, &block) #:nodoc: module Delegator #:nodoc: def self.delegate(*methods) methods.each do |method_name| - define_method(method_name) do |*args, &block| - return super(*args, &block) if respond_to? method_name - Delegator.target.send(method_name, *args, &block) + define_method(method_name) do |*args, **options, &block| + return super(*args, **options, &block) if respond_to? method_name + Delegator.target.send(method_name, *args, **options, &block) end private method_name end From 24fd287d845f5292ad2a62dfa0395df455fe106f Mon Sep 17 00:00:00 2001 From: Andrew Blake Date: Sat, 20 Mar 2021 20:22:36 +0000 Subject: [PATCH 2/3] Add test for delegation of keyword arguments in `before` method - passes on Ruby < 2.7 - passes with warning on Ruby >= 2.7, < 3.0 - fails on Ruby 3.0 --- test/delegator_test.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/delegator_test.rb b/test/delegator_test.rb index bd4425eb63..daf2c46d17 100644 --- a/test/delegator_test.rb +++ b/test/delegator_test.rb @@ -88,6 +88,17 @@ def target assert_equal '', response.body end + it "delegates before with keyword arguments correctly" do + delegation_app do + set(:foo) do |something| + something + end + before(foo: 'bar') do + :nothing + end + end + end + it "registers extensions with the delegation target" do app, mixin = mirror, Module.new Sinatra.register mixin From e767648e060673cacbf3dc03844986fbf36283dc Mon Sep 17 00:00:00 2001 From: Andrew Blake Date: Thu, 25 Mar 2021 12:43:28 +0000 Subject: [PATCH 3/3] Use ruby2_keywords to pass keyword arguments correctly in delegation Relocate ruby2_keywords gem dependency and `require` line Condition use of ruby2_keywords to avoid introducing gem dependency Drop superfluous newline --- lib/sinatra/base.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index d3a7e2c9da..20ff0b418d 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1943,10 +1943,12 @@ def self.register(*extensions, &block) #:nodoc: module Delegator #:nodoc: def self.delegate(*methods) methods.each do |method_name| - define_method(method_name) do |*args, **options, &block| - return super(*args, **options, &block) if respond_to? method_name - Delegator.target.send(method_name, *args, **options, &block) + define_method(method_name) do |*args, &block| + return super(*args, &block) if respond_to? method_name + Delegator.target.send(method_name, *args, &block) end + # ensure keyword argument passing is compatible with ruby >= 2.7 + ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true) private method_name end end