From 8607e8ab30528337e745d4f1afc32675a7a358e1 Mon Sep 17 00:00:00 2001 From: Mike Pastore Date: Wed, 7 Dec 2016 14:51:00 -0600 Subject: [PATCH] Use prepend instead of include for helpers. Fixes #1213 --- lib/sinatra/base.rb | 2 +- sinatra-contrib/lib/sinatra/namespace.rb | 2 +- test/helpers_test.rb | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 74260d5029..ed8f37d3ab 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1416,7 +1416,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? - include(*extensions) if extensions.any? + prepend(*extensions) if extensions.any? end # Register an extension. Alternatively take a block from which an diff --git a/sinatra-contrib/lib/sinatra/namespace.rb b/sinatra-contrib/lib/sinatra/namespace.rb index bd88bf03a8..6d0751b0b0 100644 --- a/sinatra-contrib/lib/sinatra/namespace.rb +++ b/sinatra-contrib/lib/sinatra/namespace.rb @@ -233,7 +233,7 @@ def self.prefixed(*names) def helpers(*extensions, &block) class_eval(&block) if block_given? - include(*extensions) if extensions.any? + prepend(*extensions) if extensions.any? end def register(*extensions, &block) diff --git a/test/helpers_test.rb b/test/helpers_test.rb index 3575e945cd..69c37fdcd2 100644 --- a/test/helpers_test.rb +++ b/test/helpers_test.rb @@ -1941,5 +1941,27 @@ def foo assert ok? assert_equal '42 < 43', body end + + it 'prepends modules so previously-defined methods can be overridden consistently' do + mock_app do + helpers do + def one; nil end + def two; nil end + end + + helpers ::HelperOne do + def two; '2' end + end + + get('/one') { one } + get('/two') { two } + end + + get '/one' + assert_equal '1', body + + get '/two' + assert_equal '2', body + end end end