mirror of
https://github.com/lostisland/faraday.git
synced 2025-10-06 00:03:36 -04:00
enable automatic parallel manager detection
This enables the use of `#in_parallel` without manually passing in a parallel manager instance. If the adapter you're using has a parallel manager, it will work as expected. If it doesn't, it'll work as normal sequential requests.
This commit is contained in:
parent
085ee735dc
commit
32ecd07c27
@ -1,5 +1,16 @@
|
||||
module Faraday
|
||||
class Adapter < Middleware
|
||||
class << self
|
||||
attr_accessor :supports_parallel_requests
|
||||
alias supports_parallel_requests? supports_parallel_requests
|
||||
|
||||
# valid parallel managers should respond to #run with no parameters.
|
||||
# otherwise, return a short wrapper around it.
|
||||
def setup_parallel_manager(options = {})
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
CONTENT_LENGTH = 'Content-Length'.freeze
|
||||
|
||||
extend AutoloadHelper
|
||||
|
@ -10,6 +10,8 @@ module Faraday
|
||||
require 'fiber'
|
||||
end
|
||||
|
||||
self.supports_parallel_requests = true
|
||||
|
||||
def self.setup_parallel_manager(options = {})
|
||||
ParallelManager.new
|
||||
end
|
||||
|
@ -11,8 +11,8 @@ module Faraday
|
||||
METHODS = Set.new [:get, :post, :put, :delete, :head, :patch, :options]
|
||||
METHODS_WITH_BODIES = Set.new [:post, :put, :patch, :options]
|
||||
|
||||
attr_accessor :parallel_manager
|
||||
attr_reader :params, :headers, :url_prefix, :builder, :options, :ssl
|
||||
attr_reader :params, :headers, :url_prefix, :builder, :options, :ssl, :parallel_manager
|
||||
attr_writer :default_parallel_manager
|
||||
|
||||
# :url
|
||||
# :params
|
||||
@ -24,11 +24,11 @@ module Faraday
|
||||
options = url
|
||||
url = options[:url]
|
||||
end
|
||||
@headers = Utils::Headers.new
|
||||
@params = Utils::ParamsHash.new
|
||||
@options = options[:request] || {}
|
||||
@ssl = options[:ssl] || {}
|
||||
@parallel_manager = options[:parallel]
|
||||
@headers = Utils::Headers.new
|
||||
@params = Utils::ParamsHash.new
|
||||
@options = options[:request] || {}
|
||||
@ssl = options[:ssl] || {}
|
||||
@default_parallel_manager = options[:parallel_manager]
|
||||
|
||||
@builder = options[:builder] || begin
|
||||
# pass an empty block to Builder so it doesn't assume default middleware
|
||||
@ -108,12 +108,24 @@ module Faraday
|
||||
@builder.insert(0, Faraday::Request::TokenAuthentication, token, options)
|
||||
end
|
||||
|
||||
def default_parallel_manager
|
||||
return @default_parallel_manager if @default_parallel_manager
|
||||
|
||||
adapter = @builder.handlers.select { |h|
|
||||
h.klass.respond_to?(:setup_parallel_manager)
|
||||
}.first
|
||||
|
||||
if adapter
|
||||
@default_parallel_manager = adapter.klass.setup_parallel_manager
|
||||
end
|
||||
end
|
||||
|
||||
def in_parallel?
|
||||
!!@parallel_manager
|
||||
end
|
||||
|
||||
def in_parallel(manager)
|
||||
@parallel_manager = manager
|
||||
def in_parallel(manager = nil)
|
||||
@parallel_manager = manager || default_parallel_manager
|
||||
yield
|
||||
@parallel_manager && @parallel_manager.run
|
||||
ensure
|
||||
|
@ -3,15 +3,8 @@ module Faraday
|
||||
extend MiddlewareRegistry
|
||||
|
||||
class << self
|
||||
attr_accessor :load_error, :supports_parallel_requests
|
||||
attr_accessor :load_error
|
||||
private :load_error=
|
||||
alias supports_parallel_requests? supports_parallel_requests
|
||||
|
||||
# valid parallel managers should respond to #run with no parameters.
|
||||
# otherwise, return a short wrapper around it.
|
||||
def setup_parallel_manager(options = {})
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
self.load_error = nil
|
||||
|
@ -159,7 +159,7 @@ else
|
||||
connection = create_connection(adapter)
|
||||
adapter = real_adapter_for(adapter)
|
||||
|
||||
connection.in_parallel(adapter.setup_parallel_manager) do
|
||||
connection.in_parallel do
|
||||
resp1 = connection.get('json')
|
||||
resp2 = connection.get('json')
|
||||
if adapter.supports_parallel_requests?
|
||||
|
Loading…
x
Reference in New Issue
Block a user