plugin: allow to extend options as well

This commit is contained in:
HoneyryderChuck 2017-12-07 16:45:37 +00:00
parent f5e6b38d47
commit 0458ee2016
3 changed files with 34 additions and 3 deletions

View File

@ -47,11 +47,17 @@ module HTTPX
pl.load_dependencies(self, *args, &block) if pl.respond_to?(:load_dependencies)
include(pl::InstanceMethods) if defined?(pl::InstanceMethods)
extend(pl::ClassMethods) if defined?(pl::ClassMethods)
default_options.request_class.send(:include, pl::RequestMethods) if defined?(pl::RequestMethods)
if defined?(pl::OptionsMethods) || defined?(pl::OptionsClassMethods)
options_klass = Class.new(@default_options.class)
options_klass.extend(pl::OptionsClassMethods) if defined?(pl::OptionsClassMethods)
options_klass.__send__(:include, pl::OptionsMethods) if defined?(pl::OptionsMethods)
@default_options = options_klass.new(default_options)
end
default_options.request_class.__send__(:include, pl::RequestMethods) if defined?(pl::RequestMethods)
default_options.request_class.extend(pl::RequestClassMethods) if defined?(pl::RequestClassMethods)
default_options.response_class.send(:include, pl::ResponseMethods) if defined?(pl::ResponseMethods)
default_options.response_class.__send__(:include, pl::ResponseMethods) if defined?(pl::ResponseMethods)
default_options.response_class.extend(pl::ResponseClassMethods) if defined?(pl::ResponseClassMethods)
default_options.headers_class.send(:include, pl::HeadersMethods) if defined?(pl::HeadersMethods)
default_options.headers_class.__send__(:include, pl::HeadersMethods) if defined?(pl::HeadersMethods)
default_options.headers_class.extend(pl::HeadersClassMethods) if defined?(pl::HeadersClassMethods)
pl.configure(self, *args, &block) if pl.respond_to?(:configure)
nil

View File

@ -6,7 +6,14 @@ module HTTPX
MAX_RETRIES = 3
class << self
def inherited(klass)
super
klass.instance_variable_set(:@defined_options, @defined_options.dup)
end
def new(options = {})
# let enhanced options go through
return options if self == Options && options.class > self
return options if options.is_a?(self)
super
end

View File

@ -27,6 +27,10 @@ class ClientTest < Minitest::Test
assert client.foo == "client-foo", "instance method is unexpected"
assert client.respond_to?(:bar), "load and configure didn't work"
assert client.bar == "config-load-bar", "load and configure didn't work"
assert client.respond_to?(:options), "instance methods weren't added"
assert client.options.respond_to?(:foo), "options methods weren't added"
assert client.options.foo == "options-foo", "option method is unexpected"
request = client.request(:get, "/")
assert request.respond_to?(:foo), "request methods haven't been added"
assert request.foo == "request-foo", "request method is unexpected"
@ -51,10 +55,24 @@ class ClientTest < Minitest::Test
self.class.foo
end
def options
@default_options
end
def response(*args)
@default_options.response_class.new(*args)
end
end
self::OptionsClassMethods = Module.new do
def foo
"options-foo"
end
end
self::OptionsMethods = Module.new do
def foo
self.class.foo
end
end
self::RequestClassMethods = Module.new do
def foo
'request-foo'