Add ruby2_keywords to delegating methods (#62)
* Add ruby2_keywords to delegating methods * Fix unit tests for Ruby 1.9
This commit is contained in:
parent
5f0e1df3b9
commit
5001479f54
|
@ -44,6 +44,8 @@ module Docile
|
||||||
exec_in_proxy_context(dsl, FallbackContextProxy, *args, &block)
|
exec_in_proxy_context(dsl, FallbackContextProxy, *args, &block)
|
||||||
dsl
|
dsl
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby2_keywords :dsl_eval if respond_to?(:ruby2_keywords, true)
|
||||||
module_function :dsl_eval
|
module_function :dsl_eval
|
||||||
|
|
||||||
# Execute a block in the context of an object whose methods represent the
|
# Execute a block in the context of an object whose methods represent the
|
||||||
|
@ -83,6 +85,8 @@ module Docile
|
||||||
def dsl_eval_with_block_return(dsl, *args, &block)
|
def dsl_eval_with_block_return(dsl, *args, &block)
|
||||||
exec_in_proxy_context(dsl, FallbackContextProxy, *args, &block)
|
exec_in_proxy_context(dsl, FallbackContextProxy, *args, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby2_keywords :dsl_eval_with_block_return if respond_to?(:ruby2_keywords, true)
|
||||||
module_function :dsl_eval_with_block_return
|
module_function :dsl_eval_with_block_return
|
||||||
|
|
||||||
# Execute a block in the context of an immutable object whose methods,
|
# Execute a block in the context of an immutable object whose methods,
|
||||||
|
@ -120,5 +124,7 @@ module Docile
|
||||||
def dsl_eval_immutable(dsl, *args, &block)
|
def dsl_eval_immutable(dsl, *args, &block)
|
||||||
exec_in_proxy_context(dsl, ChainingFallbackContextProxy, *args, &block)
|
exec_in_proxy_context(dsl, ChainingFallbackContextProxy, *args, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby2_keywords :dsl_eval_immutable if respond_to?(:ruby2_keywords, true)
|
||||||
module_function :dsl_eval_immutable
|
module_function :dsl_eval_immutable
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,5 +16,7 @@ module Docile
|
||||||
def method_missing(method, *args, &block)
|
def method_missing(method, *args, &block)
|
||||||
@__receiver__ = super(method, *args, &block)
|
@__receiver__ = super(method, *args, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,6 +36,8 @@ module Docile
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby2_keywords :exec_in_proxy_context if respond_to?(:ruby2_keywords, true)
|
||||||
module_function :exec_in_proxy_context
|
module_function :exec_in_proxy_context
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -61,6 +61,8 @@ module Docile
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
singleton_class.send(:ruby2_keywords, :method_missing) if singleton_class.respond_to?(:ruby2_keywords, true)
|
||||||
|
|
||||||
# instrument a helper method to remove the above instrumentation
|
# instrument a helper method to remove the above instrumentation
|
||||||
singleton_class.
|
singleton_class.
|
||||||
send(:define_method, :__docile_undo_fallback__) do
|
send(:define_method, :__docile_undo_fallback__) do
|
||||||
|
@ -94,6 +96,7 @@ module Docile
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -465,6 +465,47 @@ describe Docile do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if RUBY_VERSION >= "2.0.0"
|
||||||
|
context "when a DSL method has a double splat" do
|
||||||
|
class DSLMethodWithDoubleSplat
|
||||||
|
attr_reader :arguments, :options
|
||||||
|
|
||||||
|
# Use class_eval because Ruby 1.x does not support double splat
|
||||||
|
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
||||||
|
def configure(*arguments, **options)
|
||||||
|
@arguments = arguments.dup
|
||||||
|
@options = options.dup
|
||||||
|
end
|
||||||
|
METHOD
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:dsl) { DSLMethodWithDoubleSplat.new }
|
||||||
|
|
||||||
|
it "correctly passes keyword arguments" do
|
||||||
|
Docile.dsl_eval(dsl) { configure(1, a: 1) }
|
||||||
|
|
||||||
|
expect(dsl.arguments).to eq [1]
|
||||||
|
expect(dsl.options).to eq({ a: 1 })
|
||||||
|
end
|
||||||
|
|
||||||
|
if RUBY_VERSION >= "3.0.0"
|
||||||
|
it "correctly passes hash arguments on Ruby 3+" do
|
||||||
|
Docile.dsl_eval(dsl) { configure(1, { a: 1 }) }
|
||||||
|
|
||||||
|
expect(dsl.arguments).to eq [1, { a: 1 }]
|
||||||
|
expect(dsl.options).to eq({})
|
||||||
|
end
|
||||||
|
elsif RUBY_VERSION >= "2.0.0"
|
||||||
|
it "correctly passes hash arguments on Ruby 2" do
|
||||||
|
Docile.dsl_eval(dsl) { configure(1, { a: 1 }) }
|
||||||
|
|
||||||
|
expect(dsl.arguments).to eq [1]
|
||||||
|
expect(dsl.options).to eq({ a: 1 })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".dsl_eval_with_block_return" do
|
describe ".dsl_eval_with_block_return" do
|
||||||
|
|
Loading…
Reference in New Issue