Skip to content

Commit

Permalink
Merge pull request #1662 from sinatra/revert-1214-prepend-helpers
Browse files Browse the repository at this point in the history
Revert "Use prepend instead of include for helpers. Fixes #1213"
  • Loading branch information
namusyaka committed Nov 11, 2020
2 parents 91f1500 + ce25d56 commit a9649b4
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/sinatra/base.rb
Expand Up @@ -1441,7 +1441,7 @@ def unlink(path, opts = {}, &bk) route 'UNLINK', path, opts, &bk end
# in `extensions` available to the handlers and templates
def helpers(*extensions, &block)
class_eval(&block) if block_given?
prepend(*extensions) if extensions.any?
include(*extensions) if extensions.any?
end

# Register an extension. Alternatively take a block from which an
Expand Down
2 changes: 1 addition & 1 deletion sinatra-contrib/lib/sinatra/namespace.rb
Expand Up @@ -238,7 +238,7 @@ def self.prefixed(*names)

def helpers(*extensions, &block)
class_eval(&block) if block_given?
prepend(*extensions) if extensions.any?
include(*extensions) if extensions.any?
end

def register(*extensions, &block)
Expand Down
52 changes: 52 additions & 0 deletions test/helpers_test.rb
Expand Up @@ -1949,6 +1949,10 @@ def foo
end

it 'prepends modules so previously-defined methods can be overridden consistently' do
skip <<-EOS
This test will be helpful after switching #helpers's code from Module#include to Module#prepend
See more details: https://github.com/sinatra/sinatra/pull/1214
EOS
mock_app do
helpers do
def one; nil end
Expand All @@ -1969,5 +1973,53 @@ def two; '2' end
get '/two'
assert_equal '2', body
end

module HelpersOverloadingBaseHelper
def my_test
'BaseHelper#test'
end
end

class HelpersOverloadingIncludeAndOverride < Sinatra::Base
helpers HelpersOverloadingBaseHelper

get '/' do
my_test
end

helpers do
def my_test
'InlineHelper#test'
end
end
end

it 'uses overloaded inline helper' do
mock_app(HelpersOverloadingIncludeAndOverride)
get '/'
assert ok?
assert_equal 'InlineHelper#test', body
end

module HelperWithIncluded
def self.included(base)
base.extend(ClassMethods)
end

module ClassMethods
def nickname(name)
# do something.
end
end
end

class ServerApp < Sinatra::Base
helpers HelperWithIncluded
# `nickname` method should be available.
end

it 'calls included method of helpers' do
assert ServerApp.respond_to?(:nickname)
end
end
end

0 comments on commit a9649b4

Please sign in to comment.