faraday 0.9.1 → 2.5.2

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 (135) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +32 -197
  5. data/Rakefile +4 -68
  6. data/examples/client_spec.rb +119 -0
  7. data/examples/client_test.rb +144 -0
  8. data/lib/faraday/adapter/test.rb +194 -58
  9. data/lib/faraday/adapter.rb +76 -20
  10. data/lib/faraday/adapter_registry.rb +30 -0
  11. data/lib/faraday/connection.rb +341 -212
  12. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  13. data/lib/faraday/encoders/nested_params_encoder.rb +183 -0
  14. data/lib/faraday/error.rb +123 -29
  15. data/lib/faraday/logging/formatter.rb +106 -0
  16. data/lib/faraday/methods.rb +6 -0
  17. data/lib/faraday/middleware.rb +18 -25
  18. data/lib/faraday/middleware_registry.rb +83 -0
  19. data/lib/faraday/options/connection_options.rb +22 -0
  20. data/lib/faraday/options/env.rb +199 -0
  21. data/lib/faraday/options/proxy_options.rb +32 -0
  22. data/lib/faraday/options/request_options.rb +22 -0
  23. data/lib/faraday/options/ssl_options.rb +69 -0
  24. data/lib/faraday/options.rb +63 -195
  25. data/lib/faraday/parameters.rb +4 -180
  26. data/lib/faraday/rack_builder.rb +99 -59
  27. data/lib/faraday/request/authorization.rb +37 -30
  28. data/lib/faraday/request/instrumentation.rb +47 -27
  29. data/lib/faraday/request/json.rb +55 -0
  30. data/lib/faraday/request/url_encoded.rb +48 -24
  31. data/lib/faraday/request.rb +76 -32
  32. data/lib/faraday/response/json.rb +54 -0
  33. data/lib/faraday/response/logger.rb +22 -48
  34. data/lib/faraday/response/raise_error.rb +57 -14
  35. data/lib/faraday/response.rb +32 -35
  36. data/lib/faraday/utils/headers.rb +139 -0
  37. data/lib/faraday/utils/params_hash.rb +61 -0
  38. data/lib/faraday/utils.rb +47 -222
  39. data/lib/faraday/version.rb +5 -0
  40. data/lib/faraday.rb +111 -222
  41. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  42. data/spec/faraday/adapter/test_spec.rb +413 -0
  43. data/spec/faraday/adapter_registry_spec.rb +28 -0
  44. data/spec/faraday/adapter_spec.rb +55 -0
  45. data/spec/faraday/connection_spec.rb +793 -0
  46. data/spec/faraday/error_spec.rb +60 -0
  47. data/spec/faraday/middleware_registry_spec.rb +31 -0
  48. data/spec/faraday/middleware_spec.rb +52 -0
  49. data/spec/faraday/options/env_spec.rb +76 -0
  50. data/spec/faraday/options/options_spec.rb +297 -0
  51. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  52. data/spec/faraday/options/request_options_spec.rb +19 -0
  53. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  54. data/spec/faraday/params_encoders/nested_spec.rb +150 -0
  55. data/spec/faraday/rack_builder_spec.rb +317 -0
  56. data/spec/faraday/request/authorization_spec.rb +83 -0
  57. data/spec/faraday/request/instrumentation_spec.rb +74 -0
  58. data/spec/faraday/request/json_spec.rb +111 -0
  59. data/spec/faraday/request/url_encoded_spec.rb +93 -0
  60. data/spec/faraday/request_spec.rb +110 -0
  61. data/spec/faraday/response/json_spec.rb +117 -0
  62. data/spec/faraday/response/logger_spec.rb +220 -0
  63. data/spec/faraday/response/raise_error_spec.rb +172 -0
  64. data/spec/faraday/response_spec.rb +75 -0
  65. data/spec/faraday/utils/headers_spec.rb +82 -0
  66. data/spec/faraday/utils_spec.rb +118 -0
  67. data/spec/faraday_spec.rb +37 -0
  68. data/spec/spec_helper.rb +132 -0
  69. data/spec/support/disabling_stub.rb +14 -0
  70. data/spec/support/fake_safe_buffer.rb +15 -0
  71. data/spec/support/helper_methods.rb +96 -0
  72. data/spec/support/shared_examples/adapter.rb +105 -0
  73. data/spec/support/shared_examples/params_encoder.rb +18 -0
  74. data/spec/support/shared_examples/request_method.rb +263 -0
  75. data/spec/support/streaming_response_checker.rb +35 -0
  76. metadata +81 -109
  77. data/.document +0 -6
  78. data/CONTRIBUTING.md +0 -36
  79. data/Gemfile +0 -25
  80. data/faraday.gemspec +0 -34
  81. data/lib/faraday/adapter/em_http.rb +0 -237
  82. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  83. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  84. data/lib/faraday/adapter/em_synchrony.rb +0 -92
  85. data/lib/faraday/adapter/excon.rb +0 -80
  86. data/lib/faraday/adapter/httpclient.rb +0 -106
  87. data/lib/faraday/adapter/net_http.rb +0 -130
  88. data/lib/faraday/adapter/net_http_persistent.rb +0 -48
  89. data/lib/faraday/adapter/patron.rb +0 -72
  90. data/lib/faraday/adapter/rack.rb +0 -58
  91. data/lib/faraday/adapter/typhoeus.rb +0 -123
  92. data/lib/faraday/autoload.rb +0 -84
  93. data/lib/faraday/request/basic_authentication.rb +0 -13
  94. data/lib/faraday/request/multipart.rb +0 -63
  95. data/lib/faraday/request/retry.rb +0 -148
  96. data/lib/faraday/request/token_authentication.rb +0 -15
  97. data/lib/faraday/upload_io.rb +0 -67
  98. data/script/cached-bundle +0 -46
  99. data/script/console +0 -7
  100. data/script/generate_certs +0 -42
  101. data/script/package +0 -7
  102. data/script/proxy-server +0 -42
  103. data/script/release +0 -17
  104. data/script/s3-put +0 -71
  105. data/script/server +0 -36
  106. data/script/test +0 -172
  107. data/test/adapters/default_test.rb +0 -14
  108. data/test/adapters/em_http_test.rb +0 -20
  109. data/test/adapters/em_synchrony_test.rb +0 -20
  110. data/test/adapters/excon_test.rb +0 -20
  111. data/test/adapters/httpclient_test.rb +0 -21
  112. data/test/adapters/integration.rb +0 -254
  113. data/test/adapters/logger_test.rb +0 -82
  114. data/test/adapters/net_http_persistent_test.rb +0 -20
  115. data/test/adapters/net_http_test.rb +0 -14
  116. data/test/adapters/patron_test.rb +0 -20
  117. data/test/adapters/rack_test.rb +0 -31
  118. data/test/adapters/test_middleware_test.rb +0 -114
  119. data/test/adapters/typhoeus_test.rb +0 -28
  120. data/test/authentication_middleware_test.rb +0 -65
  121. data/test/composite_read_io_test.rb +0 -111
  122. data/test/connection_test.rb +0 -522
  123. data/test/env_test.rb +0 -218
  124. data/test/helper.rb +0 -81
  125. data/test/live_server.rb +0 -67
  126. data/test/middleware/instrumentation_test.rb +0 -88
  127. data/test/middleware/retry_test.rb +0 -177
  128. data/test/middleware_stack_test.rb +0 -173
  129. data/test/multibyte.txt +0 -1
  130. data/test/options_test.rb +0 -252
  131. data/test/parameters_test.rb +0 -64
  132. data/test/request_middleware_test.rb +0 -142
  133. data/test/response_middleware_test.rb +0 -72
  134. data/test/strawberry.rb +0 -2
  135. data/test/utils_test.rb +0 -58
data/lib/faraday/utils.rb CHANGED
@@ -1,164 +1,14 @@
1
- require 'thread'
2
- Faraday.require_libs 'parameters'
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'uri'
5
+ require 'faraday/utils/headers'
6
+ require 'faraday/utils/params_hash'
3
7
 
4
8
  module Faraday
9
+ # Utils contains various static helper methods.
5
10
  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
11
+ module_function
162
12
 
163
13
  def build_query(params)
164
14
  FlatParamsEncoder.encode(params)
@@ -168,17 +18,27 @@ module Faraday
168
18
  NestedParamsEncoder.encode(params)
169
19
  end
170
20
 
171
- ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/
21
+ def default_space_encoding
22
+ @default_space_encoding ||= '+'
23
+ end
172
24
 
173
- def escape(s)
174
- s.to_s.gsub(ESCAPE_RE) {|match|
175
- '%' + match.unpack('H2' * match.bytesize).join('%').upcase
176
- }.tr(' ', '+')
25
+ class << self
26
+ attr_writer :default_space_encoding
177
27
  end
178
28
 
179
- def unescape(s) CGI.unescape s.to_s end
29
+ ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze
180
30
 
181
- DEFAULT_SEP = /[&;] */n
31
+ def escape(str)
32
+ str.to_s.gsub(ESCAPE_RE) do |match|
33
+ "%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
34
+ end.gsub(' ', default_space_encoding)
35
+ end
36
+
37
+ def unescape(str)
38
+ CGI.unescape str.to_s
39
+ end
40
+
41
+ DEFAULT_SEP = /[&;] */n.freeze
182
42
 
183
43
  # Adapted from Rack
184
44
  def parse_query(query)
@@ -193,45 +53,14 @@ module Faraday
193
53
  @default_params_encoder ||= NestedParamsEncoder
194
54
  end
195
55
 
196
- class << self
197
- attr_writer :default_params_encoder
56
+ def basic_header_from(login, pass)
57
+ value = Base64.encode64("#{login}:#{pass}")
58
+ value.delete!("\n")
59
+ "Basic #{value}"
198
60
  end
199
61
 
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
62
+ class << self
63
+ attr_writer :default_params_encoder
235
64
  end
236
65
 
237
66
  # Normalize URI() behavior across Ruby versions
@@ -239,46 +68,44 @@ module Faraday
239
68
  # url - A String or URI.
240
69
  #
241
70
  # Returns a parsed URI.
242
- def URI(url)
71
+ def URI(url) # rubocop:disable Naming/MethodName
243
72
  if url.respond_to?(:host)
244
73
  url
245
74
  elsif url.respond_to?(:to_str)
246
75
  default_uri_parser.call(url)
247
76
  else
248
- raise ArgumentError, "bad argument (expected URI object or URI string)"
77
+ raise ArgumentError, 'bad argument (expected URI object or URI string)'
249
78
  end
250
79
  end
251
80
 
252
81
  def default_uri_parser
253
- @default_uri_parser ||= begin
254
- require 'uri'
255
- Kernel.method(:URI)
256
- end
82
+ @default_uri_parser ||= Kernel.method(:URI)
257
83
  end
258
84
 
259
85
  def default_uri_parser=(parser)
260
86
  @default_uri_parser = if parser.respond_to?(:call) || parser.nil?
261
- parser
262
- else
263
- parser.method(:parse)
264
- end
87
+ parser
88
+ else
89
+ parser.method(:parse)
90
+ end
265
91
  end
266
92
 
267
- # Receives a String or URI and returns just the path with the query string sorted.
93
+ # Receives a String or URI and returns just
94
+ # the path with the query string sorted.
268
95
  def normalize_path(url)
269
96
  url = URI(url)
270
- (url.path.start_with?('/') ? url.path : '/' + url.path) +
271
- (url.query ? "?#{sort_query_params(url.query)}" : "")
97
+ (url.path.start_with?('/') ? url.path : "/#{url.path}") +
98
+ (url.query ? "?#{sort_query_params(url.query)}" : '')
272
99
  end
273
100
 
274
101
  # Recursive hash update
275
102
  def deep_merge!(target, hash)
276
103
  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
104
+ target[key] = if value.is_a?(Hash) && (target[key].is_a?(Hash) || target[key].is_a?(Options))
105
+ deep_merge(target[key], value)
106
+ else
107
+ value
108
+ end
282
109
  end
283
110
  target
284
111
  end
@@ -288,8 +115,6 @@ module Faraday
288
115
  deep_merge!(source.dup, hash)
289
116
  end
290
117
 
291
- protected
292
-
293
118
  def sort_query_params(query)
294
119
  query.split('&').sort.join('&')
295
120
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ VERSION = '2.5.2'
5
+ end