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
data/lib/faraday/utils.rb CHANGED
@@ -1,164 +1,12 @@
1
- require 'thread'
2
- Faraday.require_libs 'parameters'
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday/utils/headers'
4
+ require 'faraday/utils/params_hash'
3
5
 
4
6
  module Faraday
7
+ # Utils contains various static helper methods.
5
8
  module Utils
6
- extend self
7
-
8
- # Adapted from Rack::Utils::HeaderHash
9
- class Headers < ::Hash
10
- def self.from(value)
11
- new(value)
12
- end
13
-
14
- def initialize(hash = nil)
15
- super()
16
- @names = {}
17
- self.update(hash || {})
18
- end
19
-
20
- # need to synchronize concurrent writes to the shared KeyMap
21
- keymap_mutex = Mutex.new
22
-
23
- # symbol -> string mapper + cache
24
- KeyMap = Hash.new do |map, key|
25
- value = if key.respond_to?(:to_str)
26
- key
27
- else
28
- key.to_s.split('_'). # :user_agent => %w(user agent)
29
- each { |w| w.capitalize! }. # => %w(User Agent)
30
- join('-') # => "User-Agent"
31
- end
32
- keymap_mutex.synchronize { map[key] = value }
33
- end
34
- KeyMap[:etag] = "ETag"
35
-
36
- def [](k)
37
- k = KeyMap[k]
38
- super(k) || super(@names[k.downcase])
39
- end
40
-
41
- def []=(k, v)
42
- k = KeyMap[k]
43
- k = (@names[k.downcase] ||= k)
44
- # join multiple values with a comma
45
- v = v.to_ary.join(', ') if v.respond_to? :to_ary
46
- super(k, v)
47
- end
48
-
49
- def fetch(k, *args, &block)
50
- k = KeyMap[k]
51
- key = @names.fetch(k.downcase, k)
52
- super(key, *args, &block)
53
- end
54
-
55
- def delete(k)
56
- k = KeyMap[k]
57
- if k = @names[k.downcase]
58
- @names.delete k.downcase
59
- super(k)
60
- end
61
- end
62
-
63
- def include?(k)
64
- @names.include? k.downcase
65
- end
66
-
67
- alias_method :has_key?, :include?
68
- alias_method :member?, :include?
69
- alias_method :key?, :include?
70
-
71
- def merge!(other)
72
- other.each { |k, v| self[k] = v }
73
- self
74
- end
75
- alias_method :update, :merge!
76
-
77
- def merge(other)
78
- hash = dup
79
- hash.merge! other
80
- end
81
-
82
- def replace(other)
83
- clear
84
- self.update other
85
- self
86
- end
87
-
88
- def to_hash() ::Hash.new.update(self) end
89
-
90
- def parse(header_string)
91
- return unless header_string && !header_string.empty?
92
- header_string.split(/\r\n/).
93
- tap { |a| a.shift if a.first.index('HTTP/') == 0 }. # drop the HTTP status line
94
- map { |h| h.split(/:\s+/, 2) }.reject { |p| p[0].nil? }. # split key and value, ignore blank lines
95
- each { |key, value|
96
- # join multiple values with a comma
97
- if self[key]
98
- self[key] << ', ' << value
99
- else
100
- self[key] = value
101
- end
102
- }
103
- end
104
- end
105
-
106
- # hash with stringified keys
107
- class ParamsHash < Hash
108
- def [](key)
109
- super(convert_key(key))
110
- end
111
-
112
- def []=(key, value)
113
- super(convert_key(key), value)
114
- end
115
-
116
- def delete(key)
117
- super(convert_key(key))
118
- end
119
-
120
- def include?(key)
121
- super(convert_key(key))
122
- end
123
-
124
- alias_method :has_key?, :include?
125
- alias_method :member?, :include?
126
- alias_method :key?, :include?
127
-
128
- def update(params)
129
- params.each do |key, value|
130
- self[key] = value
131
- end
132
- self
133
- end
134
- alias_method :merge!, :update
135
-
136
- def merge(params)
137
- dup.update(params)
138
- end
139
-
140
- def replace(other)
141
- clear
142
- update(other)
143
- end
144
-
145
- def merge_query(query, encoder = nil)
146
- if query && !query.empty?
147
- update((encoder || Utils.default_params_encoder).decode(query))
148
- end
149
- self
150
- end
151
-
152
- def to_query(encoder = nil)
153
- (encoder || Utils.default_params_encoder).encode(self)
154
- end
155
-
156
- private
157
-
158
- def convert_key(key)
159
- key.to_s
160
- end
161
- end
9
+ module_function
162
10
 
163
11
  def build_query(params)
164
12
  FlatParamsEncoder.encode(params)
@@ -168,17 +16,27 @@ module Faraday
168
16
  NestedParamsEncoder.encode(params)
169
17
  end
170
18
 
171
- ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/
19
+ def default_space_encoding
20
+ @default_space_encoding ||= '+'
21
+ end
172
22
 
173
- def escape(s)
174
- s.to_s.gsub(ESCAPE_RE) {|match|
175
- '%' + match.unpack('H2' * match.bytesize).join('%').upcase
176
- }.tr(' ', '+')
23
+ class << self
24
+ attr_writer :default_space_encoding
177
25
  end
178
26
 
179
- def unescape(s) CGI.unescape s.to_s end
27
+ ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze
180
28
 
181
- DEFAULT_SEP = /[&;] */n
29
+ def escape(str)
30
+ str.to_s.gsub(ESCAPE_RE) do |match|
31
+ "%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
32
+ end.gsub(' ', default_space_encoding)
33
+ end
34
+
35
+ def unescape(str)
36
+ CGI.unescape str.to_s
37
+ end
38
+
39
+ DEFAULT_SEP = /[&;] */n.freeze
182
40
 
183
41
  # Adapted from Rack
184
42
  def parse_query(query)
@@ -197,55 +55,18 @@ module Faraday
197
55
  attr_writer :default_params_encoder
198
56
  end
199
57
 
200
- # Stolen from Rack
201
- def normalize_params(params, name, v = nil)
202
- name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
203
- k = $1 || ''
204
- after = $' || ''
205
-
206
- return if k.empty?
207
-
208
- if after == ""
209
- if params[k]
210
- params[k] = Array[params[k]] unless params[k].kind_of?(Array)
211
- params[k] << v
212
- else
213
- params[k] = v
214
- end
215
- elsif after == "[]"
216
- params[k] ||= []
217
- raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
218
- params[k] << v
219
- elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
220
- child_key = $1
221
- params[k] ||= []
222
- raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
223
- if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key)
224
- normalize_params(params[k].last, child_key, v)
225
- else
226
- params[k] << normalize_params({}, child_key, v)
227
- end
228
- else
229
- params[k] ||= {}
230
- raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash)
231
- params[k] = normalize_params(params[k], after, v)
232
- end
233
-
234
- return params
235
- end
236
-
237
58
  # Normalize URI() behavior across Ruby versions
238
59
  #
239
60
  # url - A String or URI.
240
61
  #
241
62
  # Returns a parsed URI.
242
- def URI(url)
63
+ def URI(url) # rubocop:disable Naming/MethodName
243
64
  if url.respond_to?(:host)
244
65
  url
245
66
  elsif url.respond_to?(:to_str)
246
67
  default_uri_parser.call(url)
247
68
  else
248
- raise ArgumentError, "bad argument (expected URI object or URI string)"
69
+ raise ArgumentError, 'bad argument (expected URI object or URI string)'
249
70
  end
250
71
  end
251
72
 
@@ -258,27 +79,28 @@ module Faraday
258
79
 
259
80
  def default_uri_parser=(parser)
260
81
  @default_uri_parser = if parser.respond_to?(:call) || parser.nil?
261
- parser
262
- else
263
- parser.method(:parse)
264
- end
82
+ parser
83
+ else
84
+ parser.method(:parse)
85
+ end
265
86
  end
266
87
 
267
- # Receives a String or URI and returns just the path with the query string sorted.
88
+ # Receives a String or URI and returns just
89
+ # the path with the query string sorted.
268
90
  def normalize_path(url)
269
91
  url = URI(url)
270
- (url.path.start_with?('/') ? url.path : '/' + url.path) +
271
- (url.query ? "?#{sort_query_params(url.query)}" : "")
92
+ (url.path.start_with?('/') ? url.path : "/#{url.path}") +
93
+ (url.query ? "?#{sort_query_params(url.query)}" : '')
272
94
  end
273
95
 
274
96
  # Recursive hash update
275
97
  def deep_merge!(target, hash)
276
98
  hash.each do |key, value|
277
- if Hash === value and Hash === target[key]
278
- target[key] = deep_merge(target[key], value)
279
- else
280
- target[key] = value
281
- end
99
+ target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash)
100
+ deep_merge(target[key], value)
101
+ else
102
+ value
103
+ end
282
104
  end
283
105
  target
284
106
  end
@@ -288,8 +110,6 @@ module Faraday
288
110
  deep_merge!(source.dup, hash)
289
111
  end
290
112
 
291
- protected
292
-
293
113
  def sort_query_params(query)
294
114
  query.split('&').sort.join('&')
295
115
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ VERSION = '1.8.0'
5
+ end