faraday 0.9.1 → 1.8.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 (146) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +360 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +28 -195
  5. data/Rakefile +4 -68
  6. data/examples/client_spec.rb +97 -0
  7. data/examples/client_test.rb +118 -0
  8. data/lib/faraday/adapter/test.rb +158 -58
  9. data/lib/faraday/adapter/typhoeus.rb +7 -115
  10. data/lib/faraday/adapter.rb +79 -20
  11. data/lib/faraday/adapter_registry.rb +30 -0
  12. data/lib/faraday/autoload.rb +39 -36
  13. data/lib/faraday/connection.rb +378 -168
  14. data/lib/faraday/dependency_loader.rb +37 -0
  15. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  16. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  17. data/lib/faraday/error.rb +128 -29
  18. data/lib/faraday/file_part.rb +128 -0
  19. data/lib/faraday/logging/formatter.rb +105 -0
  20. data/lib/faraday/methods.rb +6 -0
  21. data/lib/faraday/middleware.rb +19 -25
  22. data/lib/faraday/middleware_registry.rb +129 -0
  23. data/lib/faraday/options/connection_options.rb +22 -0
  24. data/lib/faraday/options/env.rb +181 -0
  25. data/lib/faraday/options/proxy_options.rb +32 -0
  26. data/lib/faraday/options/request_options.rb +22 -0
  27. data/lib/faraday/options/ssl_options.rb +59 -0
  28. data/lib/faraday/options.rb +61 -193
  29. data/lib/faraday/param_part.rb +53 -0
  30. data/lib/faraday/parameters.rb +4 -180
  31. data/lib/faraday/rack_builder.rb +84 -47
  32. data/lib/faraday/request/authorization.rb +51 -31
  33. data/lib/faraday/request/basic_authentication.rb +14 -7
  34. data/lib/faraday/request/instrumentation.rb +45 -27
  35. data/lib/faraday/request/multipart.rb +88 -45
  36. data/lib/faraday/request/retry.rb +212 -121
  37. data/lib/faraday/request/token_authentication.rb +15 -10
  38. data/lib/faraday/request/url_encoded.rb +43 -23
  39. data/lib/faraday/request.rb +96 -32
  40. data/lib/faraday/response/logger.rb +22 -48
  41. data/lib/faraday/response/raise_error.rb +49 -14
  42. data/lib/faraday/response.rb +33 -25
  43. data/lib/faraday/utils/headers.rb +139 -0
  44. data/lib/faraday/utils/params_hash.rb +61 -0
  45. data/lib/faraday/utils.rb +38 -218
  46. data/lib/faraday/version.rb +5 -0
  47. data/lib/faraday.rb +130 -213
  48. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  49. data/spec/faraday/adapter/em_http_spec.rb +49 -0
  50. data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
  51. data/spec/faraday/adapter/excon_spec.rb +49 -0
  52. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  53. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  54. data/spec/faraday/adapter/patron_spec.rb +18 -0
  55. data/spec/faraday/adapter/rack_spec.rb +8 -0
  56. data/spec/faraday/adapter/test_spec.rb +377 -0
  57. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  58. data/spec/faraday/adapter_registry_spec.rb +28 -0
  59. data/spec/faraday/adapter_spec.rb +55 -0
  60. data/spec/faraday/composite_read_io_spec.rb +80 -0
  61. data/spec/faraday/connection_spec.rb +736 -0
  62. data/spec/faraday/error_spec.rb +60 -0
  63. data/spec/faraday/middleware_spec.rb +52 -0
  64. data/spec/faraday/options/env_spec.rb +70 -0
  65. data/spec/faraday/options/options_spec.rb +297 -0
  66. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  67. data/spec/faraday/options/request_options_spec.rb +19 -0
  68. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  69. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  70. data/spec/faraday/rack_builder_spec.rb +345 -0
  71. data/spec/faraday/request/authorization_spec.rb +96 -0
  72. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  73. data/spec/faraday/request/multipart_spec.rb +302 -0
  74. data/spec/faraday/request/retry_spec.rb +242 -0
  75. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  76. data/spec/faraday/request_spec.rb +120 -0
  77. data/spec/faraday/response/logger_spec.rb +220 -0
  78. data/spec/faraday/response/middleware_spec.rb +68 -0
  79. data/spec/faraday/response/raise_error_spec.rb +169 -0
  80. data/spec/faraday/response_spec.rb +75 -0
  81. data/spec/faraday/utils/headers_spec.rb +82 -0
  82. data/spec/faraday/utils_spec.rb +56 -0
  83. data/spec/faraday_spec.rb +37 -0
  84. data/spec/spec_helper.rb +132 -0
  85. data/spec/support/disabling_stub.rb +14 -0
  86. data/spec/support/fake_safe_buffer.rb +15 -0
  87. data/spec/support/helper_methods.rb +133 -0
  88. data/spec/support/shared_examples/adapter.rb +105 -0
  89. data/spec/support/shared_examples/params_encoder.rb +18 -0
  90. data/spec/support/shared_examples/request_method.rb +262 -0
  91. data/spec/support/streaming_response_checker.rb +35 -0
  92. data/spec/support/webmock_rack_app.rb +68 -0
  93. metadata +199 -98
  94. data/.document +0 -6
  95. data/CONTRIBUTING.md +0 -36
  96. data/Gemfile +0 -25
  97. data/faraday.gemspec +0 -34
  98. data/lib/faraday/adapter/em_http.rb +0 -237
  99. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  100. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  101. data/lib/faraday/adapter/em_synchrony.rb +0 -92
  102. data/lib/faraday/adapter/excon.rb +0 -80
  103. data/lib/faraday/adapter/httpclient.rb +0 -106
  104. data/lib/faraday/adapter/net_http.rb +0 -130
  105. data/lib/faraday/adapter/net_http_persistent.rb +0 -48
  106. data/lib/faraday/adapter/patron.rb +0 -72
  107. data/lib/faraday/adapter/rack.rb +0 -58
  108. data/lib/faraday/upload_io.rb +0 -67
  109. data/script/cached-bundle +0 -46
  110. data/script/console +0 -7
  111. data/script/generate_certs +0 -42
  112. data/script/package +0 -7
  113. data/script/proxy-server +0 -42
  114. data/script/release +0 -17
  115. data/script/s3-put +0 -71
  116. data/script/server +0 -36
  117. data/script/test +0 -172
  118. data/test/adapters/default_test.rb +0 -14
  119. data/test/adapters/em_http_test.rb +0 -20
  120. data/test/adapters/em_synchrony_test.rb +0 -20
  121. data/test/adapters/excon_test.rb +0 -20
  122. data/test/adapters/httpclient_test.rb +0 -21
  123. data/test/adapters/integration.rb +0 -254
  124. data/test/adapters/logger_test.rb +0 -82
  125. data/test/adapters/net_http_persistent_test.rb +0 -20
  126. data/test/adapters/net_http_test.rb +0 -14
  127. data/test/adapters/patron_test.rb +0 -20
  128. data/test/adapters/rack_test.rb +0 -31
  129. data/test/adapters/test_middleware_test.rb +0 -114
  130. data/test/adapters/typhoeus_test.rb +0 -28
  131. data/test/authentication_middleware_test.rb +0 -65
  132. data/test/composite_read_io_test.rb +0 -111
  133. data/test/connection_test.rb +0 -522
  134. data/test/env_test.rb +0 -218
  135. data/test/helper.rb +0 -81
  136. data/test/live_server.rb +0 -67
  137. data/test/middleware/instrumentation_test.rb +0 -88
  138. data/test/middleware/retry_test.rb +0 -177
  139. data/test/middleware_stack_test.rb +0 -173
  140. data/test/multibyte.txt +0 -1
  141. data/test/options_test.rb +0 -252
  142. data/test/parameters_test.rb +0 -64
  143. data/test/request_middleware_test.rb +0 -142
  144. data/test/response_middleware_test.rb +0 -72
  145. data/test/strawberry.rb +0 -2
  146. data/test/utils_test.rb +0 -58
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
2
4
  # Subclasses Struct with some special helpers for converting from a Hash to
3
5
  # a Struct.
@@ -10,6 +12,7 @@ module Faraday
10
12
  # Public
11
13
  def each
12
14
  return to_enum(:each) unless block_given?
15
+
13
16
  members.each do |key|
14
17
  yield(key.to_sym, send(key))
15
18
  end
@@ -18,23 +21,20 @@ module Faraday
18
21
  # Public
19
22
  def update(obj)
20
23
  obj.each do |key, value|
21
- if sub_options = self.class.options_for(key)
22
- value = sub_options.from(value) if value
23
- elsif Hash === value
24
- hash = {}
25
- value.each do |hash_key, hash_value|
26
- hash[hash_key] = hash_value
27
- end
28
- value = hash
24
+ sub_options = self.class.options_for(key)
25
+ if sub_options
26
+ new_value = sub_options.from(value) if value
27
+ elsif value.is_a?(Hash)
28
+ new_value = value.dup
29
+ else
30
+ new_value = value
29
31
  end
30
32
 
31
- self.send("#{key}=", value) unless value.nil?
33
+ send("#{key}=", new_value) unless new_value.nil?
32
34
  end
33
35
  self
34
36
  end
35
37
 
36
- alias merge! update
37
-
38
38
  # Public
39
39
  def delete(key)
40
40
  value = send(key)
@@ -48,18 +48,38 @@ module Faraday
48
48
  end
49
49
 
50
50
  # Public
51
- def merge(value)
52
- dup.update(value)
51
+ def merge!(other)
52
+ other.each do |key, other_value|
53
+ self_value = send(key)
54
+ sub_options = self.class.options_for(key)
55
+ new_value = if self_value && sub_options && other_value
56
+ self_value.merge(other_value)
57
+ else
58
+ other_value
59
+ end
60
+ send("#{key}=", new_value) unless new_value.nil?
61
+ end
62
+ self
63
+ end
64
+
65
+ # Public
66
+ def merge(other)
67
+ dup.merge!(other)
68
+ end
69
+
70
+ # Public
71
+ def deep_dup
72
+ self.class.from(self)
53
73
  end
54
74
 
55
75
  # Public
56
76
  def fetch(key, *args)
57
77
  unless symbolized_key_set.include?(key.to_sym)
58
78
  key_setter = "#{key}="
59
- if args.size > 0
79
+ if !args.empty?
60
80
  send(key_setter, args.first)
61
81
  elsif block_given?
62
- send(key_setter, Proc.new.call(key))
82
+ send(key_setter, yield(key))
63
83
  else
64
84
  raise self.class.fetch_error_class, "key not found: #{key.inspect}"
65
85
  end
@@ -83,11 +103,10 @@ module Faraday
83
103
  end
84
104
 
85
105
  # Public
86
- def each_key
106
+ def each_key(&block)
87
107
  return to_enum(:each_key) unless block_given?
88
- keys.each do |key|
89
- yield(key)
90
- end
108
+
109
+ keys.each(&block)
91
110
  end
92
111
 
93
112
  # Public
@@ -98,11 +117,10 @@ module Faraday
98
117
  alias has_key? key?
99
118
 
100
119
  # Public
101
- def each_value
120
+ def each_value(&block)
102
121
  return to_enum(:each_value) unless block_given?
103
- values.each do |value|
104
- yield(value)
105
- end
122
+
123
+ values.each(&block)
106
124
  end
107
125
 
108
126
  # Public
@@ -129,9 +147,9 @@ module Faraday
129
147
  value = send(member)
130
148
  values << "#{member}=#{value.inspect}" if value
131
149
  end
132
- values = values.empty? ? ' (empty)' : (' ' << values.join(", "))
150
+ values = values.empty? ? '(empty)' : values.join(', ')
133
151
 
134
- %(#<#{self.class}#{values}>)
152
+ %(#<#{self.class} #{values}>)
135
153
  end
136
154
 
137
155
  # Internal
@@ -149,8 +167,12 @@ module Faraday
149
167
  @attribute_options ||= {}
150
168
  end
151
169
 
152
- def self.memoized(key)
153
- memoized_attributes[key.to_sym] = Proc.new
170
+ def self.memoized(key, &block)
171
+ unless block_given?
172
+ raise ArgumentError, '#memoized must be called with a block'
173
+ end
174
+
175
+ memoized_attributes[key.to_sym] = block
154
176
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
155
177
  def #{key}() self[:#{key}]; end
156
178
  RUBY
@@ -162,7 +184,7 @@ module Faraday
162
184
 
163
185
  def [](key)
164
186
  key = key.to_sym
165
- if method = self.class.memoized_attributes[key]
187
+ if (method = self.class.memoized_attributes[key])
166
188
  super(key) || (self[key] = instance_eval(&method))
167
189
  else
168
190
  super
@@ -170,7 +192,7 @@ module Faraday
170
192
  end
171
193
 
172
194
  def symbolized_key_set
173
- @symbolized_key_set ||= Set.new(keys.map { |k| k.to_sym })
195
+ @symbolized_key_set ||= Set.new(keys.map(&:to_sym))
174
196
  end
175
197
 
176
198
  def self.inherited(subclass)
@@ -181,170 +203,16 @@ module Faraday
181
203
 
182
204
  def self.fetch_error_class
183
205
  @fetch_error_class ||= if Object.const_defined?(:KeyError)
184
- ::KeyError
185
- else
186
- ::IndexError
187
- end
188
- end
189
- end
190
-
191
- class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
192
- :timeout, :open_timeout, :boundary,
193
- :oauth)
194
-
195
- def []=(key, value)
196
- if key && key.to_sym == :proxy
197
- super(key, value ? ProxyOptions.from(value) : nil)
198
- else
199
- super(key, value)
200
- end
201
- end
202
- end
203
-
204
- class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode,
205
- :cert_store, :client_cert, :client_key, :certificate, :private_key, :verify_depth, :version)
206
-
207
- def verify?
208
- verify != false
209
- end
210
-
211
- def disable?
212
- !verify?
213
- end
214
- end
215
-
216
- class ProxyOptions < Options.new(:uri, :user, :password)
217
- extend Forwardable
218
- def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, :path, :path=
219
-
220
- def self.from(value)
221
- case value
222
- when String
223
- value = {:uri => Utils.URI(value)}
224
- when URI
225
- value = {:uri => value}
226
- when Hash, Options
227
- if uri = value.delete(:uri)
228
- value[:uri] = Utils.URI(uri)
229
- end
230
- end
231
- super(value)
232
- end
233
-
234
- memoized(:user) { uri.user && Utils.unescape(uri.user) }
235
- memoized(:password) { uri.password && Utils.unescape(uri.password) }
236
- end
237
-
238
- class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
239
- :parallel_manager, :params, :headers, :builder_class)
240
-
241
- options :request => RequestOptions, :ssl => SSLOptions
242
-
243
- memoized(:request) { self.class.options_for(:request).new }
244
-
245
- memoized(:ssl) { self.class.options_for(:ssl).new }
246
-
247
- memoized(:builder_class) { RackBuilder }
248
-
249
- def new_builder(block)
250
- builder_class.new(&block)
251
- end
252
- end
253
-
254
- class Env < Options.new(:method, :body, :url, :request, :request_headers,
255
- :ssl, :parallel_manager, :params, :response, :response_headers, :status)
256
-
257
- ContentLength = 'Content-Length'.freeze
258
- StatusesWithoutBody = Set.new [204, 304]
259
- SuccessfulStatuses = 200..299
260
-
261
- # A Set of HTTP verbs that typically send a body. If no body is set for
262
- # these requests, the Content-Length header is set to 0.
263
- MethodsWithBodies = Set.new [:post, :put, :patch, :options]
264
-
265
- options :request => RequestOptions,
266
- :request_headers => Utils::Headers, :response_headers => Utils::Headers
267
-
268
- extend Forwardable
269
-
270
- def_delegators :request, :params_encoder
271
-
272
- # Public
273
- def [](key)
274
- if in_member_set?(key)
275
- super(key)
276
- else
277
- custom_members[key]
278
- end
279
- end
280
-
281
- # Public
282
- def []=(key, value)
283
- if in_member_set?(key)
284
- super(key, value)
285
- else
286
- custom_members[key] = value
287
- end
288
- end
289
-
290
- # Public
291
- def success?
292
- SuccessfulStatuses.include?(status)
293
- end
294
-
295
- # Public
296
- def needs_body?
297
- !body && MethodsWithBodies.include?(method)
298
- end
299
-
300
- # Public
301
- def clear_body
302
- request_headers[ContentLength] = '0'
303
- self.body = ''
304
- end
305
-
306
- # Public
307
- def parse_body?
308
- !StatusesWithoutBody.include?(status)
309
- end
310
-
311
- # Public
312
- def parallel?
313
- !!parallel_manager
314
- end
315
-
316
- def inspect
317
- attrs = [nil]
318
- members.each do |mem|
319
- if value = send(mem)
320
- attrs << "@#{mem}=#{value.inspect}"
321
- end
322
- end
323
- if !custom_members.empty?
324
- attrs << "@custom=#{custom_members.inspect}"
325
- end
326
- %(#<#{self.class}#{attrs.join(" ")}>)
327
- end
328
-
329
- # Internal
330
- def custom_members
331
- @custom_members ||= {}
332
- end
333
-
334
- # Internal
335
- if members.first.is_a?(Symbol)
336
- def in_member_set?(key)
337
- self.class.member_set.include?(key.to_sym)
338
- end
339
- else
340
- def in_member_set?(key)
341
- self.class.member_set.include?(key.to_s)
342
- end
343
- end
344
-
345
- # Internal
346
- def self.member_set
347
- @member_set ||= Set.new(members)
206
+ ::KeyError
207
+ else
208
+ ::IndexError
209
+ end
348
210
  end
349
211
  end
350
212
  end
213
+
214
+ require 'faraday/options/request_options'
215
+ require 'faraday/options/ssl_options'
216
+ require 'faraday/options/proxy_options'
217
+ require 'faraday/options/connection_options'
218
+ require 'faraday/options/env'
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # Multipart value used to POST data with a content type.
5
+ class ParamPart
6
+ # @param value [String] Uploaded content as a String.
7
+ # @param content_type [String] String content type of the value.
8
+ # @param content_id [String] Optional String of this value's Content-ID.
9
+ #
10
+ # @return [Faraday::ParamPart]
11
+ def initialize(value, content_type, content_id = nil)
12
+ @value = value
13
+ @content_type = content_type
14
+ @content_id = content_id
15
+ end
16
+
17
+ # Converts this value to a form part.
18
+ #
19
+ # @param boundary [String] String multipart boundary that must not exist in
20
+ # the content exactly.
21
+ # @param key [String] String key name for this value.
22
+ #
23
+ # @return [Faraday::Parts::Part]
24
+ def to_part(boundary, key)
25
+ Faraday::Parts::Part.new(boundary, key, value, headers)
26
+ end
27
+
28
+ # Returns a Hash of String key/value pairs.
29
+ #
30
+ # @return [Hash]
31
+ def headers
32
+ {
33
+ 'Content-Type' => content_type,
34
+ 'Content-ID' => content_id
35
+ }
36
+ end
37
+
38
+ # The content to upload.
39
+ #
40
+ # @return [String]
41
+ attr_reader :value
42
+
43
+ # The value's content type.
44
+ #
45
+ # @return [String]
46
+ attr_reader :content_type
47
+
48
+ # The value's content ID, if given.
49
+ #
50
+ # @return [String, nil]
51
+ attr_reader :content_id
52
+ end
53
+ end
@@ -1,181 +1,5 @@
1
- require "forwardable"
1
+ # frozen_string_literal: true
2
2
 
3
- module Faraday
4
- module NestedParamsEncoder
5
- class << self
6
- extend Forwardable
7
- def_delegators :'Faraday::Utils', :escape, :unescape
8
- end
9
-
10
- def self.encode(params)
11
- return nil if params == nil
12
-
13
- if !params.is_a?(Array)
14
- if !params.respond_to?(:to_hash)
15
- raise TypeError,
16
- "Can't convert #{params.class} into Hash."
17
- end
18
- params = params.to_hash
19
- params = params.map do |key, value|
20
- key = key.to_s if key.kind_of?(Symbol)
21
- [key, value]
22
- end
23
- # Useful default for OAuth and caching.
24
- # Only to be used for non-Array inputs. Arrays should preserve order.
25
- params.sort!
26
- end
27
-
28
- # Helper lambda
29
- to_query = lambda do |parent, value|
30
- if value.is_a?(Hash)
31
- value = value.map do |key, val|
32
- key = escape(key)
33
- [key, val]
34
- end
35
- value.sort!
36
- buffer = ""
37
- value.each do |key, val|
38
- new_parent = "#{parent}%5B#{key}%5D"
39
- buffer << "#{to_query.call(new_parent, val)}&"
40
- end
41
- return buffer.chop
42
- elsif value.is_a?(Array)
43
- buffer = ""
44
- value.each_with_index do |val, i|
45
- new_parent = "#{parent}%5B%5D"
46
- buffer << "#{to_query.call(new_parent, val)}&"
47
- end
48
- return buffer.chop
49
- else
50
- encoded_value = escape(value)
51
- return "#{parent}=#{encoded_value}"
52
- end
53
- end
54
-
55
- # The params have form [['key1', 'value1'], ['key2', 'value2']].
56
- buffer = ''
57
- params.each do |parent, value|
58
- encoded_parent = escape(parent)
59
- buffer << "#{to_query.call(encoded_parent, value)}&"
60
- end
61
- return buffer.chop
62
- end
63
-
64
- def self.decode(query)
65
- return nil if query == nil
66
- # Recursive helper lambda
67
- dehash = lambda do |hash|
68
- hash.each do |(key, value)|
69
- if value.kind_of?(Hash)
70
- hash[key] = dehash.call(value)
71
- end
72
- end
73
- # Numeric keys implies an array
74
- if hash != {} && hash.keys.all? { |key| key =~ /^\d+$/ }
75
- hash.sort.inject([]) do |accu, (_, value)|
76
- accu << value; accu
77
- end
78
- else
79
- hash
80
- end
81
- end
82
-
83
- empty_accumulator = {}
84
- return ((query.split('&').map do |pair|
85
- pair.split('=', 2) if pair && !pair.empty?
86
- end).compact.inject(empty_accumulator.dup) do |accu, (key, value)|
87
- key = unescape(key)
88
- if value.kind_of?(String)
89
- value = unescape(value.gsub(/\+/, ' '))
90
- end
91
-
92
- array_notation = !!(key =~ /\[\]$/)
93
- subkeys = key.split(/[\[\]]+/)
94
- current_hash = accu
95
- for i in 0...(subkeys.size - 1)
96
- subkey = subkeys[i]
97
- current_hash[subkey] = {} unless current_hash[subkey]
98
- current_hash = current_hash[subkey]
99
- end
100
- if array_notation
101
- current_hash[subkeys.last] = [] unless current_hash[subkeys.last]
102
- current_hash[subkeys.last] << value
103
- else
104
- current_hash[subkeys.last] = value
105
- end
106
- accu
107
- end).inject(empty_accumulator.dup) do |accu, (key, value)|
108
- accu[key] = value.kind_of?(Hash) ? dehash.call(value) : value
109
- accu
110
- end
111
- end
112
- end
113
-
114
- module FlatParamsEncoder
115
- class << self
116
- extend Forwardable
117
- def_delegators :'Faraday::Utils', :escape, :unescape
118
- end
119
-
120
- def self.encode(params)
121
- return nil if params == nil
122
-
123
- if !params.is_a?(Array)
124
- if !params.respond_to?(:to_hash)
125
- raise TypeError,
126
- "Can't convert #{params.class} into Hash."
127
- end
128
- params = params.to_hash
129
- params = params.map do |key, value|
130
- key = key.to_s if key.kind_of?(Symbol)
131
- [key, value]
132
- end
133
- # Useful default for OAuth and caching.
134
- # Only to be used for non-Array inputs. Arrays should preserve order.
135
- params.sort!
136
- end
137
-
138
- # The params have form [['key1', 'value1'], ['key2', 'value2']].
139
- buffer = ''
140
- params.each do |key, value|
141
- encoded_key = escape(key)
142
- value = value.to_s if value == true || value == false
143
- if value == nil
144
- buffer << "#{encoded_key}&"
145
- elsif value.kind_of?(Array)
146
- value.each do |sub_value|
147
- encoded_value = escape(sub_value)
148
- buffer << "#{encoded_key}=#{encoded_value}&"
149
- end
150
- else
151
- encoded_value = escape(value)
152
- buffer << "#{encoded_key}=#{encoded_value}&"
153
- end
154
- end
155
- return buffer.chop
156
- end
157
-
158
- def self.decode(query)
159
- empty_accumulator = {}
160
- return nil if query == nil
161
- split_query = (query.split('&').map do |pair|
162
- pair.split('=', 2) if pair && !pair.empty?
163
- end).compact
164
- return split_query.inject(empty_accumulator.dup) do |accu, pair|
165
- pair[0] = unescape(pair[0])
166
- pair[1] = true if pair[1].nil?
167
- if pair[1].respond_to?(:to_str)
168
- pair[1] = unescape(pair[1].to_str.gsub(/\+/, " "))
169
- end
170
- if accu[pair[0]].kind_of?(Array)
171
- accu[pair[0]] << pair[1]
172
- elsif accu[pair[0]]
173
- accu[pair[0]] = [accu[pair[0]], pair[1]]
174
- else
175
- accu[pair[0]] = pair[1]
176
- end
177
- accu
178
- end
179
- end
180
- end
181
- end
3
+ require 'forwardable'
4
+ require 'faraday/encoders/nested_params_encoder'
5
+ require 'faraday/encoders/flat_params_encoder'