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:
Jim Myhrberg 2011-12-29 14:48:57 +00:00 committed by Mislav Marohnić
parent 085ee735dc
commit 32ecd07c27
5 changed files with 36 additions and 18 deletions

View File

@ -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

View File

@ -10,6 +10,8 @@ module Faraday
require 'fiber'
end
self.supports_parallel_requests = true
def self.setup_parallel_manager(options = {})
ParallelManager.new
end

View File

@ -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

View File

@ -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

View File

@ -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?