faraday 0.9.1 → 2.5.2

Sign up to get free protection for your applications and to get access to all the features.
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