faraday 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +347 -18
  4. data/lib/faraday/adapter/em_http.rb +99 -142
  5. data/lib/faraday/adapter/em_http_ssl_patch.rb +17 -23
  6. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +15 -18
  7. data/lib/faraday/adapter/em_synchrony.rb +60 -104
  8. data/lib/faraday/adapter/excon.rb +55 -100
  9. data/lib/faraday/adapter/httpclient.rb +39 -61
  10. data/lib/faraday/adapter/net_http.rb +51 -104
  11. data/lib/faraday/adapter/net_http_persistent.rb +27 -48
  12. data/lib/faraday/adapter/patron.rb +35 -54
  13. data/lib/faraday/adapter/rack.rb +12 -28
  14. data/lib/faraday/adapter/test.rb +53 -86
  15. data/lib/faraday/adapter/typhoeus.rb +1 -4
  16. data/lib/faraday/adapter.rb +22 -36
  17. data/lib/faraday/autoload.rb +36 -47
  18. data/lib/faraday/connection.rb +179 -321
  19. data/lib/faraday/error.rb +33 -67
  20. data/lib/faraday/middleware.rb +28 -4
  21. data/lib/faraday/options.rb +186 -35
  22. data/lib/faraday/parameters.rb +197 -4
  23. data/lib/faraday/rack_builder.rb +56 -67
  24. data/lib/faraday/request/authorization.rb +30 -42
  25. data/lib/faraday/request/basic_authentication.rb +7 -14
  26. data/lib/faraday/request/instrumentation.rb +27 -45
  27. data/lib/faraday/request/multipart.rb +48 -79
  28. data/lib/faraday/request/retry.rb +170 -197
  29. data/lib/faraday/request/token_authentication.rb +10 -15
  30. data/lib/faraday/request/url_encoded.rb +23 -41
  31. data/lib/faraday/request.rb +36 -68
  32. data/lib/faraday/response/logger.rb +69 -22
  33. data/lib/faraday/response/raise_error.rb +14 -36
  34. data/lib/faraday/response.rb +16 -23
  35. data/lib/faraday/upload_io.rb +67 -0
  36. data/lib/faraday/utils.rb +245 -28
  37. data/lib/faraday.rb +175 -93
  38. metadata +5 -22
  39. data/lib/faraday/adapter_registry.rb +0 -28
  40. data/lib/faraday/dependency_loader.rb +0 -37
  41. data/lib/faraday/encoders/flat_params_encoder.rb +0 -94
  42. data/lib/faraday/encoders/nested_params_encoder.rb +0 -171
  43. data/lib/faraday/file_part.rb +0 -128
  44. data/lib/faraday/logging/formatter.rb +0 -92
  45. data/lib/faraday/middleware_registry.rb +0 -129
  46. data/lib/faraday/options/connection_options.rb +0 -22
  47. data/lib/faraday/options/env.rb +0 -181
  48. data/lib/faraday/options/proxy_options.rb +0 -28
  49. data/lib/faraday/options/request_options.rb +0 -21
  50. data/lib/faraday/options/ssl_options.rb +0 -59
  51. data/lib/faraday/param_part.rb +0 -53
  52. data/lib/faraday/utils/headers.rb +0 -139
  53. data/lib/faraday/utils/params_hash.rb +0 -61
  54. data/spec/external_adapters/faraday_specs_setup.rb +0 -14
@@ -1,20 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- require 'faraday/adapter_registry'
4
-
5
1
  module Faraday
6
2
  # A Builder that processes requests into responses by passing through an inner
7
3
  # middleware stack (heavily inspired by Rack).
8
4
  #
9
- # @example
10
- # Faraday::Connection.new(url: 'http://sushi.com') do |builder|
5
+ # Faraday::Connection.new(:url => 'http://sushi.com') do |builder|
11
6
  # builder.request :url_encoded # Faraday::Request::UrlEncoded
12
7
  # builder.adapter :net_http # Faraday::Adapter::NetHttp
13
8
  # end
14
9
  class RackBuilder
15
- # Used to detect missing arguments
16
- NO_ARGUMENT = Object.new
17
-
18
10
  attr_accessor :handlers
19
11
 
20
12
  # Error raised when trying to modify the stack after calling `lock!`
@@ -23,28 +15,28 @@ module Faraday
23
15
  # borrowed from ActiveSupport::Dependencies::Reference &
24
16
  # ActionDispatch::MiddlewareStack::Middleware
25
17
  class Handler
26
- REGISTRY = Faraday::AdapterRegistry.new
18
+ @@constants_mutex = Mutex.new
19
+ @@constants = Hash.new { |h, k|
20
+ value = k.respond_to?(:constantize) ? k.constantize : Object.const_get(k)
21
+ @@constants_mutex.synchronize { h[k] = value }
22
+ }
27
23
 
28
24
  attr_reader :name
29
25
 
30
26
  def initialize(klass, *args, &block)
31
27
  @name = klass.to_s
32
- REGISTRY.set(klass) if klass.respond_to?(:name)
33
- @args = args
34
- @block = block
35
- end
36
-
37
- def klass
38
- REGISTRY.get(@name)
28
+ if klass.respond_to?(:name)
29
+ @@constants_mutex.synchronize { @@constants[@name] = klass }
30
+ end
31
+ @args, @block = args, block
39
32
  end
40
33
 
41
- def inspect
42
- @name
43
- end
34
+ def klass() @@constants[@name] end
35
+ def inspect() @name end
44
36
 
45
37
  def ==(other)
46
38
  if other.is_a? Handler
47
- name == other.name
39
+ self.name == other.name
48
40
  elsif other.respond_to? :name
49
41
  klass == other
50
42
  else
@@ -52,19 +44,18 @@ module Faraday
52
44
  end
53
45
  end
54
46
 
55
- def build(app = nil)
47
+ def build(app)
56
48
  klass.new(app, *@args, &@block)
57
49
  end
58
50
  end
59
51
 
60
- def initialize(handlers = [], adapter = nil, &block)
61
- @adapter = adapter
52
+ def initialize(handlers = [])
62
53
  @handlers = handlers
63
54
  if block_given?
64
- build(&block)
55
+ build(&Proc.new)
65
56
  elsif @handlers.empty?
66
57
  # default stack, if nothing else is configured
67
- request :url_encoded
58
+ self.request :url_encoded
68
59
  self.adapter Faraday.default_adapter
69
60
  end
70
61
  end
@@ -73,14 +64,13 @@ module Faraday
73
64
  raise_if_locked
74
65
  @handlers.clear unless options[:keep]
75
66
  yield(self) if block_given?
76
- adapter(Faraday.default_adapter) unless @adapter
77
67
  end
78
68
 
79
69
  def [](idx)
80
70
  @handlers[idx]
81
71
  end
82
72
 
83
- # Locks the middleware stack to ensure no further modifications are made.
73
+ # Locks the middleware stack to ensure no further modifications are possible.
84
74
  def lock!
85
75
  @handlers.freeze
86
76
  end
@@ -94,7 +84,7 @@ module Faraday
94
84
  use_symbol(Faraday::Middleware, klass, *args, &block)
95
85
  else
96
86
  raise_if_locked
97
- raise_if_adapter(klass)
87
+ warn_middleware_after_adapter if adapter_set?
98
88
  @handlers << self.class::Handler.new(klass, *args, &block)
99
89
  end
100
90
  end
@@ -107,11 +97,8 @@ module Faraday
107
97
  use_symbol(Faraday::Response, key, *args, &block)
108
98
  end
109
99
 
110
- def adapter(klass = NO_ARGUMENT, *args, &block)
111
- return @adapter if klass == NO_ARGUMENT
112
-
113
- klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
114
- @adapter = self.class::Handler.new(klass, *args, &block)
100
+ def adapter(key, *args, &block)
101
+ use_symbol(Faraday::Adapter, key, *args, &block)
115
102
  end
116
103
 
117
104
  ## methods to push onto the various positions in the stack:
@@ -119,11 +106,12 @@ module Faraday
119
106
  def insert(index, *args, &block)
120
107
  raise_if_locked
121
108
  index = assert_index(index)
109
+ warn_middleware_after_adapter if inserting_after_adapter?(index)
122
110
  handler = self.class::Handler.new(*args, &block)
123
111
  @handlers.insert(index, handler)
124
112
  end
125
113
 
126
- alias insert_before insert
114
+ alias_method :insert_before, :insert
127
115
 
128
116
  def insert_after(index, *args, &block)
129
117
  index = assert_index(index)
@@ -145,11 +133,13 @@ module Faraday
145
133
  # Processes a Request into a Response by passing it through this Builder's
146
134
  # middleware stack.
147
135
  #
148
- # @param connection [Faraday::Connection]
149
- # @param request [Faraday::Request]
136
+ # connection - Faraday::Connection
137
+ # request - Faraday::Request
150
138
  #
151
- # @return [Faraday::Response]
139
+ # Returns a Faraday::Response.
152
140
  def build_response(connection, request)
141
+ warn 'WARNING: No adapter was configured for this request' unless adapter_set?
142
+
153
143
  app.call(build_env(connection, request))
154
144
  end
155
145
 
@@ -163,26 +153,26 @@ module Faraday
163
153
  def app
164
154
  @app ||= begin
165
155
  lock!
166
- to_app
156
+ to_app(lambda { |env|
157
+ response = Response.new
158
+ env.response = response
159
+ response.finish(env) unless env.parallel?
160
+ response
161
+ })
167
162
  end
168
163
  end
169
164
 
170
- def to_app
165
+ def to_app(inner_app)
171
166
  # last added handler is the deepest and thus closest to the inner app
172
- # adapter is always the last one
173
- @handlers.reverse.inject(@adapter.build) do |app, handler|
174
- handler.build(app)
175
- end
167
+ @handlers.reverse.inject(inner_app) { |app, handler| handler.build(app) }
176
168
  end
177
169
 
178
170
  def ==(other)
179
- other.is_a?(self.class) &&
180
- @handlers == other.handlers &&
181
- @adapter == other.adapter
171
+ other.is_a?(self.class) && @handlers == other.handlers
182
172
  end
183
173
 
184
174
  def dup
185
- self.class.new(@handlers.dup, @adapter.dup)
175
+ self.class.new(@handlers.dup)
186
176
  end
187
177
 
188
178
  # ENV Keys
@@ -202,36 +192,36 @@ module Faraday
202
192
  # :password - Proxy server password
203
193
  # :ssl - Hash of options for configuring SSL requests.
204
194
  def build_env(connection, request)
205
- exclusive_url = connection.build_exclusive_url(
206
- request.path, request.params,
207
- request.options.params_encoder
208
- )
209
-
210
- Env.new(request.method, request.body, exclusive_url,
211
- request.options, request.headers, connection.ssl,
212
- connection.parallel_manager)
195
+ Env.new(request.method, request.body,
196
+ connection.build_exclusive_url(request.path, request.params, request.options.params_encoder),
197
+ request.options, request.headers, connection.ssl,
198
+ connection.parallel_manager)
213
199
  end
214
200
 
215
201
  private
216
202
 
217
- LOCK_ERR = "can't modify middleware stack after making a request"
218
-
219
203
  def raise_if_locked
220
- raise StackLocked, LOCK_ERR if locked?
204
+ raise StackLocked, "can't modify middleware stack after making a request" if locked?
221
205
  end
222
206
 
223
- def raise_if_adapter(klass)
224
- return unless is_adapter?(klass)
225
-
226
- raise 'Adapter should be set using the `adapter` method, not `use`'
207
+ def warn_middleware_after_adapter
208
+ warn "WARNING: Unexpected middleware set after the adapter. " \
209
+ "This won't be supported from Faraday 1.0."
227
210
  end
228
211
 
229
212
  def adapter_set?
230
- !@adapter.nil?
213
+ @handlers.any? { |handler| is_adapter?(handler) }
231
214
  end
232
215
 
233
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
234
- klass.ancestors.include?(Faraday::Adapter)
216
+ def inserting_after_adapter?(index)
217
+ adapter_index = @handlers.find_index { |handler| is_adapter?(handler) }
218
+ return false if adapter_index.nil?
219
+
220
+ index > adapter_index
221
+ end
222
+
223
+ def is_adapter?(handler)
224
+ handler.klass.ancestors.include? Faraday::Adapter
235
225
  end
236
226
 
237
227
  def use_symbol(mod, key, *args, &block)
@@ -241,7 +231,6 @@ module Faraday
241
231
  def assert_index(index)
242
232
  idx = index.is_a?(Integer) ? index : @handlers.index(index)
243
233
  raise "No such handler: #{index.inspect}" unless idx
244
-
245
234
  idx
246
235
  end
247
236
  end
@@ -1,53 +1,41 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Faraday
4
- class Request
5
- # Request middleware for the Authorization HTTP header
6
- class Authorization < Faraday::Middleware
7
- KEY = 'Authorization' unless defined? KEY
2
+ class Request::Authorization < Faraday::Middleware
3
+ KEY = "Authorization".freeze unless defined? KEY
8
4
 
9
- # @param type [String, Symbol]
10
- # @param token [String, Symbol, Hash]
11
- # @return [String] a header value
12
- def self.header(type, token)
13
- case token
14
- when String, Symbol
15
- "#{type} #{token}"
16
- when Hash
17
- build_hash(type.to_s, token)
18
- else
19
- raise ArgumentError,
20
- "Can't build an Authorization #{type}" \
21
- "header from #{token.inspect}"
22
- end
5
+ # Public
6
+ def self.header(type, token)
7
+ case token
8
+ when String, Symbol
9
+ "#{type} #{token}"
10
+ when Hash
11
+ build_hash(type.to_s, token)
12
+ else
13
+ raise ArgumentError, "Can't build an Authorization #{type} header from #{token.inspect}"
23
14
  end
15
+ end
24
16
 
25
- # @param type [String]
26
- # @param hash [Hash]
27
- # @return [String] type followed by comma-separated key=value pairs
28
- # @api private
29
- def self.build_hash(type, hash)
30
- comma = ', '
31
- values = []
32
- hash.each do |key, value|
33
- values << "#{key}=#{value.to_s.inspect}"
34
- end
35
- "#{type} #{values * comma}"
17
+ # Internal
18
+ def self.build_hash(type, hash)
19
+ comma = ", "
20
+ values = []
21
+ hash.each do |key, value|
22
+ values << "#{key}=#{value.to_s.inspect}"
36
23
  end
24
+ "#{type} #{values * comma}"
25
+ end
37
26
 
38
- # @param app [#call]
39
- # @param type [String, Symbol] Type of Authorization
40
- # @param token [String, Symbol, Hash] Token value for the Authorization
41
- def initialize(app, type, token)
42
- @header_value = self.class.header(type, token)
43
- super(app)
44
- end
27
+ def initialize(app, type, token)
28
+ @header_value = self.class.header(type, token)
29
+ super(app)
30
+ end
45
31
 
46
- # @param env [Faraday::Env]
47
- def call(env)
48
- env.request_headers[KEY] = @header_value unless env.request_headers[KEY]
49
- @app.call(env)
32
+ # Public
33
+ def call(env)
34
+ unless env.request_headers[KEY]
35
+ env.request_headers[KEY] = @header_value
50
36
  end
37
+ @app.call(env)
51
38
  end
52
39
  end
53
40
  end
41
+
@@ -1,20 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'base64'
4
2
 
5
3
  module Faraday
6
- class Request
7
- # Authorization middleware for Basic Authentication.
8
- class BasicAuthentication < load_middleware(:authorization)
9
- # @param login [String]
10
- # @param pass [String]
11
- #
12
- # @return [String] a Basic Authentication header line
13
- def self.header(login, pass)
14
- value = Base64.encode64([login, pass].join(':'))
15
- value.delete!("\n")
16
- super(:Basic, value)
17
- end
4
+ class Request::BasicAuthentication < Request.load_middleware(:authorization)
5
+ # Public
6
+ def self.header(login, pass)
7
+ value = Base64.encode64([login, pass].join(':'))
8
+ value.gsub!("\n", '')
9
+ super(:Basic, value)
18
10
  end
19
11
  end
20
12
  end
13
+
@@ -1,53 +1,35 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Faraday
4
- class Request
5
- # Middleware for instrumenting Requests.
6
- class Instrumentation < Faraday::Middleware
7
- # Options class used in Request::Instrumentation class.
8
- class Options < Faraday::Options.new(:name, :instrumenter)
9
- # @return [String]
10
- def name
11
- self[:name] ||= 'request.faraday'
12
- end
13
-
14
- # @return [Class]
15
- def instrumenter
16
- self[:instrumenter] ||= ActiveSupport::Notifications
17
- end
2
+ class Request::Instrumentation < Faraday::Middleware
3
+ class Options < Faraday::Options.new(:name, :instrumenter)
4
+ def name
5
+ self[:name] ||= 'request.faraday'
18
6
  end
19
7
 
20
- # Instruments requests using Active Support.
21
- #
22
- # Measures time spent only for synchronous requests.
23
- #
24
- # @example Using ActiveSupport::Notifications to measure time spent
25
- # for Faraday requests.
26
- # ActiveSupport::Notifications
27
- # .subscribe('request.faraday') do |name, starts, ends, _, env|
28
- # url = env[:url]
29
- # http_method = env[:method].to_s.upcase
30
- # duration = ends - starts
31
- # $stderr.puts '[%s] %s %s (%.3f s)' %
32
- # [url.host, http_method, url.request_uri, duration]
33
- # end
34
- # @param app [#call]
35
- # @param options [nil, Hash] Options hash
36
- # @option options [String] :name ('request.faraday')
37
- # Name of the instrumenter
38
- # @option options [Class] :instrumenter (ActiveSupport::Notifications)
39
- # Active Support instrumenter class.
40
- def initialize(app, options = nil)
41
- super(app)
42
- @name, @instrumenter = Options.from(options)
43
- .values_at(:name, :instrumenter)
8
+ def instrumenter
9
+ self[:instrumenter] ||= ActiveSupport::Notifications
44
10
  end
11
+ end
12
+
13
+ # Public: Instruments requests using Active Support.
14
+ #
15
+ # Measures time spent only for synchronous requests.
16
+ #
17
+ # Examples
18
+ #
19
+ # ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env|
20
+ # url = env[:url]
21
+ # http_method = env[:method].to_s.upcase
22
+ # duration = ends - starts
23
+ # $stderr.puts '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration]
24
+ # end
25
+ def initialize(app, options = nil)
26
+ super(app)
27
+ @name, @instrumenter = Options.from(options).values_at(:name, :instrumenter)
28
+ end
45
29
 
46
- # @param env [Faraday::Env]
47
- def call(env)
48
- @instrumenter.instrument(@name, env) do
49
- @app.call(env)
50
- end
30
+ def call(env)
31
+ @instrumenter.instrument(@name, env) do
32
+ @app.call(env)
51
33
  end
52
34
  end
53
35
  end
@@ -1,97 +1,66 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('url_encoded', __dir__)
1
+ require File.expand_path("../url_encoded", __FILE__)
4
2
  require 'securerandom'
5
3
 
6
4
  module Faraday
7
- class Request
8
- # Middleware for supporting multi-part requests.
9
- class Multipart < UrlEncoded
10
- self.mime_type = 'multipart/form-data'
11
- unless defined? DEFAULT_BOUNDARY_PREFIX
12
- DEFAULT_BOUNDARY_PREFIX = '-----------RubyMultipartPost'
13
- end
5
+ class Request::Multipart < Request::UrlEncoded
6
+ self.mime_type = 'multipart/form-data'.freeze
7
+ DEFAULT_BOUNDARY_PREFIX = "-----------RubyMultipartPost".freeze unless defined? DEFAULT_BOUNDARY_PREFIX
14
8
 
15
- # Checks for files in the payload, otherwise leaves everything untouched.
16
- #
17
- # @param env [Faraday::Env]
18
- def call(env)
19
- match_content_type(env) do |params|
20
- env.request.boundary ||= unique_boundary
21
- env.request_headers[CONTENT_TYPE] +=
22
- "; boundary=#{env.request.boundary}"
23
- env.body = create_multipart(env, params)
24
- end
25
- @app.call env
9
+ def call(env)
10
+ match_content_type(env) do |params|
11
+ env.request.boundary ||= unique_boundary
12
+ env.request_headers[CONTENT_TYPE] += "; boundary=#{env.request.boundary}"
13
+ env.body = create_multipart(env, params)
26
14
  end
15
+ @app.call env
16
+ end
27
17
 
28
- # @param env [Faraday::Env]
29
- def process_request?(env)
30
- type = request_type(env)
31
- env.body.respond_to?(:each_key) && !env.body.empty? && (
32
- (type.empty? && has_multipart?(env.body)) ||
33
- (type == self.class.mime_type)
34
- )
35
- end
18
+ def process_request?(env)
19
+ type = request_type(env)
20
+ env.body.respond_to?(:each_key) and !env.body.empty? and (
21
+ (type.empty? and has_multipart?(env.body)) or
22
+ type == self.class.mime_type
23
+ )
24
+ end
36
25
 
37
- # Returns true if obj is an enumerable with values that are multipart.
38
- #
39
- # @param obj [Object]
40
- # @return [Boolean]
41
- def has_multipart?(obj) # rubocop:disable Naming/PredicateName
42
- if obj.respond_to?(:each)
43
- (obj.respond_to?(:values) ? obj.values : obj).each do |val|
44
- return true if val.respond_to?(:content_type) || has_multipart?(val)
45
- end
26
+ def has_multipart?(obj)
27
+ # string is an enum in 1.8, returning list of itself
28
+ if obj.respond_to?(:each) && !obj.is_a?(String)
29
+ (obj.respond_to?(:values) ? obj.values : obj).each do |val|
30
+ return true if (val.respond_to?(:content_type) || has_multipart?(val))
46
31
  end
47
- false
48
32
  end
33
+ false
34
+ end
49
35
 
50
- # @param env [Faraday::Env]
51
- # @param params [Hash]
52
- def create_multipart(env, params)
53
- boundary = env.request.boundary
54
- parts = process_params(params) do |key, value|
55
- part(boundary, key, value)
56
- end
57
- parts << Faraday::Parts::EpiloguePart.new(boundary)
58
-
59
- body = Faraday::CompositeReadIO.new(parts)
60
- env.request_headers[Faraday::Env::ContentLength] = body.length.to_s
61
- body
36
+ def create_multipart(env, params)
37
+ boundary = env.request.boundary
38
+ parts = process_params(params) do |key, value|
39
+ Faraday::Parts::Part.new(boundary, key, value)
62
40
  end
41
+ parts << Faraday::Parts::EpiloguePart.new(boundary)
63
42
 
64
- def part(boundary, key, value)
65
- if value.respond_to?(:to_part)
66
- value.to_part(boundary, key)
67
- else
68
- Faraday::Parts::Part.new(boundary, key, value)
69
- end
70
- end
43
+ body = Faraday::CompositeReadIO.new(parts)
44
+ env.request_headers[Faraday::Env::ContentLength] = body.length.to_s
45
+ return body
46
+ end
71
47
 
72
- # @return [String]
73
- def unique_boundary
74
- "#{DEFAULT_BOUNDARY_PREFIX}-#{SecureRandom.hex}"
75
- end
48
+ def unique_boundary
49
+ "#{DEFAULT_BOUNDARY_PREFIX}-#{SecureRandom.hex}"
50
+ end
76
51
 
77
- # @param params [Hash]
78
- # @param prefix [String]
79
- # @param pieces [Array]
80
- def process_params(params, prefix = nil, pieces = nil, &block)
81
- params.inject(pieces || []) do |all, (key, value)|
82
- key = "#{prefix}[#{key}]" if prefix
52
+ def process_params(params, prefix = nil, pieces = nil, &block)
53
+ params.inject(pieces || []) do |all, (key, value)|
54
+ key = "#{prefix}[#{key}]" if prefix
83
55
 
84
- case value
85
- when Array
86
- values = value.inject([]) { |a, v| a << [nil, v] }
87
- process_params(values, key, all, &block)
88
- when Hash
89
- process_params(value, key, all, &block)
90
- else
91
- # rubocop:disable Performance/RedundantBlockCall
92
- all << block.call(key, value)
93
- # rubocop:enable Performance/RedundantBlockCall
94
- end
56
+ case value
57
+ when Array
58
+ values = value.inject([]) { |a,v| a << [nil, v] }
59
+ process_params(values, key, all, &block)
60
+ when Hash
61
+ process_params(value, key, all, &block)
62
+ else
63
+ all << block.call(key, value)
95
64
  end
96
65
  end
97
66
  end