allow definition of options via OptionsMethods module; using .extra_options for setting defaults

This commit is contained in:
HoneyryderChuck 2021-07-12 00:59:17 +01:00
parent ec0f3cd163
commit 5c2ad6b588
4 changed files with 31 additions and 18 deletions

View File

@ -30,6 +30,7 @@ module HTTPX
:request_body_class => Class.new(Request::Body), :request_body_class => Class.new(Request::Body),
:response_body_class => Class.new(Response::Body), :response_body_class => Class.new(Response::Body),
:connection_class => Class.new(Connection), :connection_class => Class.new(Connection),
:options_class => Class.new(self),
:transport => nil, :transport => nil,
:transport_options => nil, :transport_options => nil,
:addresses => nil, :addresses => nil,
@ -56,24 +57,20 @@ module HTTPX
attr_reader(optname) attr_reader(optname)
alias_method(:"__set_#{optname}", meth)
class_eval(<<-OUT, __FILE__, __LINE__ + 1) class_eval(<<-OUT, __FILE__, __LINE__ + 1)
def #{optname}=(value) def #{optname}=(value)
return if value.nil? return if value.nil?
value = __set_#{optname}(value) value = #{meth}(value)
@#{optname} = value.freeze @#{optname} = value
end end
protected :#{optname}= protected :#{optname}=
OUT OUT
remove_method(meth)
end end
def def_option(optname, *args, &block) def def_option(optname, *args, &block)
if args.size.zero? if args.size.zero? && !block_given?
class_eval(<<-OUT, __FILE__, __LINE__ + 1) class_eval(<<-OUT, __FILE__, __LINE__ + 1)
def option_#{optname}(v); v; end def option_#{optname}(v); v; end
OUT OUT
@ -84,8 +81,8 @@ module HTTPX
end end
def deprecated_def_option(optname, layout = nil, &interpreter) def deprecated_def_option(optname, layout = nil, &interpreter)
warn "DEPRECATION WARNING: using `#{__method__}` for setting options is deprecated. " \ warn "DEPRECATION WARNING: using `def_option(#{optname})` for setting options is deprecated. " \
"Use `def option_\#{optname}` instead." "Define module OptionsMethods and `def option_#{optname}(val)` instead."
if layout if layout
class_eval(<<-OUT, __FILE__, __LINE__ + 1) class_eval(<<-OUT, __FILE__, __LINE__ + 1)
@ -94,7 +91,7 @@ module HTTPX
end end
OUT OUT
elsif block_given? elsif block_given?
define_method(:"option:#{name}") do |value| define_method(:"option_#{optname}") do |value|
instance_exec(value, &interpreter) instance_exec(value, &interpreter)
end end
end end
@ -171,7 +168,8 @@ module HTTPX
%i[ %i[
params form json body ssl http2_settings params form json body ssl http2_settings
request_class response_class headers_class request_body_class response_body_class connection_class request_class response_class headers_class request_body_class
response_body_class connection_class options_class
io fallback_protocol debug debug_level transport_options resolver_class resolver_options io fallback_protocol debug debug_level transport_options resolver_class resolver_options
persistent persistent
].each do |method_name| ].each do |method_name|

View File

@ -247,9 +247,8 @@ module HTTPX
if !@plugins.include?(pl) if !@plugins.include?(pl)
@plugins << pl @plugins << pl
pl.load_dependencies(self, &block) if pl.respond_to?(:load_dependencies) pl.load_dependencies(self, &block) if pl.respond_to?(:load_dependencies)
@default_options = @default_options.dup @default_options = @default_options.dup
@default_options = pl.extra_options(@default_options, &block) if pl.respond_to?(:extra_options)
@default_options = @default_options.merge(options) if options
include(pl::InstanceMethods) if defined?(pl::InstanceMethods) include(pl::InstanceMethods) if defined?(pl::InstanceMethods)
extend(pl::ClassMethods) if defined?(pl::ClassMethods) extend(pl::ClassMethods) if defined?(pl::ClassMethods)
@ -266,14 +265,26 @@ module HTTPX
opts.response_body_class.__send__(:include, pl::ResponseBodyMethods) if defined?(pl::ResponseBodyMethods) opts.response_body_class.__send__(:include, pl::ResponseBodyMethods) if defined?(pl::ResponseBodyMethods)
opts.response_body_class.extend(pl::ResponseBodyClassMethods) if defined?(pl::ResponseBodyClassMethods) opts.response_body_class.extend(pl::ResponseBodyClassMethods) if defined?(pl::ResponseBodyClassMethods)
opts.connection_class.__send__(:include, pl::ConnectionMethods) if defined?(pl::ConnectionMethods) opts.connection_class.__send__(:include, pl::ConnectionMethods) if defined?(pl::ConnectionMethods)
if defined?(pl::OptionsMethods)
opts.options_class.__send__(:include, pl::OptionsMethods)
(pl::OptionsMethods.instance_methods - Object.instance_methods).each do |meth|
opts.options_class.method_added(meth)
end
@default_options = opts.options_class.new(@default_options)
end
@default_options = pl.extra_options(@default_options) if pl.respond_to?(:extra_options)
@default_options = @default_options.merge(options) if options
pl.configure(self, &block) if pl.respond_to?(:configure) pl.configure(self, &block) if pl.respond_to?(:configure)
@default_options.freeze @default_options.freeze
elsif options elsif options
# this can happen when two plugins are loaded, an one of them calls the other under the hood, # this can happen when two plugins are loaded, an one of them calls the other under the hood,
# albeit changing some default. # albeit changing some default.
@default_options = @default_options.dup @default_options = pl.extra_options(@default_options) if pl.respond_to?(:extra_options)
@default_options = @default_options.merge(options) @default_options = @default_options.merge(options) if options
@default_options.freeze @default_options.freeze
end end

View File

@ -107,6 +107,7 @@ class OptionsTest < Minitest::Test
:request_body_class => bar.request_body_class, :request_body_class => bar.request_body_class,
:response_body_class => bar.response_body_class, :response_body_class => bar.response_body_class,
:connection_class => bar.connection_class, :connection_class => bar.connection_class,
:options_class => bar.options_class,
:transport => nil, :transport => nil,
:transport_options => nil, :transport_options => nil,
:addresses => nil, :addresses => nil,

View File

@ -169,6 +169,11 @@ class SessionTest < Minitest::Test
self.class.foo self.class.foo
end end
end end
self::OptionsMethods = Module.new do
def option_foo(v)
v
end
end
def self.load_dependencies(mod) def self.load_dependencies(mod)
mod.__send__(:include, Module.new do mod.__send__(:include, Module.new do
@ -179,9 +184,7 @@ class SessionTest < Minitest::Test
end end
def self.extra_options(options) def self.extra_options(options)
Class.new(options.class) do options.merge(foo: "options-foo")
def_option(:foo)
end.new(options).merge(foo: "options-foo")
end end
def self.configure(mod) def self.configure(mod)