mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-12-16 00:01:10 -05:00
allow definition of options via OptionsMethods module; using .extra_options for setting defaults
This commit is contained in:
parent
ec0f3cd163
commit
5c2ad6b588
@ -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|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user