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.rb CHANGED
@@ -1,268 +1,157 @@
1
- require 'thread'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'cgi'
4
+ require 'date'
3
5
  require 'set'
4
6
  require 'forwardable'
5
-
6
- # Public: This is the main namespace for Faraday. You can either use it to
7
- # create Faraday::Connection objects, or access it directly.
7
+ require 'faraday/version'
8
+ require 'faraday/methods'
9
+ require 'faraday/error'
10
+ require 'faraday/middleware_registry'
11
+ require 'faraday/utils'
12
+ require 'faraday/options'
13
+ require 'faraday/connection'
14
+ require 'faraday/rack_builder'
15
+ require 'faraday/parameters'
16
+ require 'faraday/middleware'
17
+ require 'faraday/adapter'
18
+ require 'faraday/request'
19
+ require 'faraday/response'
20
+ require 'faraday/net_http'
21
+ # This is the main namespace for Faraday.
8
22
  #
9
- # Examples
23
+ # It provides methods to create {Connection} objects, and HTTP-related
24
+ # methods to use directly.
10
25
  #
26
+ # @example Helpful class methods for easy usage
11
27
  # Faraday.get "http://faraday.com"
12
28
  #
29
+ # @example Helpful class method `.new` to create {Connection} objects.
13
30
  # conn = Faraday.new "http://faraday.com"
14
31
  # conn.get '/'
15
32
  #
16
33
  module Faraday
17
- VERSION = "0.9.1"
34
+ CONTENT_TYPE = 'Content-Type'
18
35
 
19
36
  class << self
20
- # Public: Gets or sets the root path that Faraday is being loaded from.
21
- # This is the root from where the libraries are auto-loaded from.
37
+ # The root path that Faraday is being loaded from.
38
+ #
39
+ # This is the root from where the libraries are auto-loaded.
40
+ #
41
+ # @return [String]
22
42
  attr_accessor :root_path
23
43
 
24
- # Public: Gets or sets the path that the Faraday libs are loaded from.
44
+ # Gets or sets the path that the Faraday libs are loaded from.
45
+ # @return [String]
25
46
  attr_accessor :lib_path
26
47
 
27
- # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
- # for the default Faraday::Connection.
48
+ # @overload default_adapter
49
+ # Gets the Symbol key identifying a default Adapter to use
50
+ # for the default {Faraday::Connection}. Defaults to `:net_http`.
51
+ # @return [Symbol] the default adapter
52
+ # @overload default_adapter=(adapter)
53
+ # Updates default adapter while resetting {.default_connection}.
54
+ # @return [Symbol] the new default_adapter.
29
55
  attr_reader :default_adapter
30
56
 
31
- # Public: Sets the default Faraday::Connection for simple scripts that
32
- # access the Faraday constant directly.
33
- #
34
- # Faraday.get "https://faraday.com"
35
- attr_writer :default_connection
57
+ # Option for the default_adapter
58
+ # @return [Hash] default_adapter options
59
+ attr_accessor :default_adapter_options
36
60
 
37
- # Public: Sets the default options used when calling Faraday#new.
38
- attr_writer :default_connection_options
61
+ # Documented below, see default_connection
62
+ attr_writer :default_connection
39
63
 
40
- # Public: Initializes a new Faraday::Connection.
41
- #
42
- # url - The optional String base URL to use as a prefix for all
43
- # requests. Can also be the options Hash.
44
- # options - The optional Hash used to configure this Faraday::Connection.
45
- # Any of these values will be set on every request made, unless
46
- # overridden for a specific request.
47
- # :url - String base URL.
48
- # :params - Hash of URI query unencoded key/value pairs.
49
- # :headers - Hash of unencoded HTTP header key/value pairs.
50
- # :request - Hash of request options.
51
- # :ssl - Hash of SSL options.
52
- # :proxy - Hash of Proxy options.
53
- #
54
- # Examples
55
- #
64
+ # Tells Faraday to ignore the environment proxy (http_proxy).
65
+ # Defaults to `false`.
66
+ # @return [Boolean]
67
+ attr_accessor :ignore_env_proxy
68
+
69
+ # Initializes a new {Connection}.
70
+ #
71
+ # @param url [String,Hash] The optional String base URL to use as a prefix
72
+ # for all requests. Can also be the options Hash. Any of these
73
+ # values will be set on every request made, unless overridden
74
+ # for a specific request.
75
+ # @param options [Hash]
76
+ # @option options [String] :url Base URL
77
+ # @option options [Hash] :params Hash of unencoded URI query params.
78
+ # @option options [Hash] :headers Hash of unencoded HTTP headers.
79
+ # @option options [Hash] :request Hash of request options.
80
+ # @option options [Hash] :ssl Hash of SSL options.
81
+ # @option options [Hash] :proxy Hash of Proxy options.
82
+ # @return [Faraday::Connection]
83
+ #
84
+ # @example With an URL argument
56
85
  # Faraday.new 'http://faraday.com'
57
- #
58
- # # http://faraday.com?page=1
59
- # Faraday.new 'http://faraday.com', :params => {:page => 1}
60
- #
61
- # # same
62
- #
63
- # Faraday.new :url => 'http://faraday.com',
64
- # :params => {:page => 1}
65
- #
66
- # Returns a Faraday::Connection.
67
- def new(url = nil, options = nil)
68
- block = block_given? ? Proc.new : nil
69
- options = options ? default_connection_options.merge(options) : default_connection_options.dup
86
+ # # => Faraday::Connection to http://faraday.com
87
+ #
88
+ # @example With an URL argument and an options hash
89
+ # Faraday.new 'http://faraday.com', params: { page: 1 }
90
+ # # => Faraday::Connection to http://faraday.com?page=1
91
+ #
92
+ # @example With everything in an options hash
93
+ # Faraday.new url: 'http://faraday.com',
94
+ # params: { page: 1 }
95
+ # # => Faraday::Connection to http://faraday.com?page=1
96
+ def new(url = nil, options = {}, &block)
97
+ options = Utils.deep_merge(default_connection_options, options)
70
98
  Faraday::Connection.new(url, options, &block)
71
99
  end
72
100
 
73
- # Internal: Requires internal Faraday libraries.
74
- #
75
- # *libs - One or more relative String names to Faraday classes.
76
- #
77
- # Returns nothing.
78
- def require_libs(*libs)
79
- libs.each do |lib|
80
- require "#{lib_path}/#{lib}"
81
- end
82
- end
83
-
84
- # Public: Updates default adapter while resetting
85
- # #default_connection.
86
- #
87
- # Returns the new default_adapter.
101
+ # Documented elsewhere, see default_adapter reader
88
102
  def default_adapter=(adapter)
89
103
  @default_connection = nil
90
104
  @default_adapter = adapter
91
105
  end
92
106
 
93
- alias require_lib require_libs
94
-
95
- private
96
- # Internal: Proxies method calls on the Faraday constant to
97
- # #default_connection.
98
- def method_missing(name, *args, &block)
99
- default_connection.send(name, *args, &block)
107
+ def respond_to_missing?(symbol, include_private = false)
108
+ default_connection.respond_to?(symbol, include_private) || super
100
109
  end
101
- end
102
-
103
- self.root_path = File.expand_path "..", __FILE__
104
- self.lib_path = File.expand_path "../faraday", __FILE__
105
- self.default_adapter = :net_http
106
-
107
- # Gets the default connection used for simple scripts.
108
- #
109
- # Returns a Faraday::Connection, configured with the #default_adapter.
110
- def self.default_connection
111
- @default_connection ||= Connection.new
112
- end
113
-
114
- # Gets the default connection options used when calling Faraday#new.
115
- #
116
- # Returns a Faraday::ConnectionOptions.
117
- def self.default_connection_options
118
- @default_connection_options ||= ConnectionOptions.new
119
- end
120
110
 
121
- if (!defined?(RUBY_ENGINE) || "ruby" == RUBY_ENGINE) && RUBY_VERSION < '1.9'
122
- begin
123
- require 'system_timer'
124
- Timer = SystemTimer
125
- rescue LoadError
126
- warn "Faraday: you may want to install system_timer for reliable timeouts"
111
+ # @overload default_connection
112
+ # Gets the default connection used for simple scripts.
113
+ # @return [Faraday::Connection] a connection configured with
114
+ # the default_adapter.
115
+ # @overload default_connection=(connection)
116
+ # @param connection [Faraday::Connection]
117
+ # Sets the default {Faraday::Connection} for simple scripts that
118
+ # access the Faraday constant directly, such as
119
+ # <code>Faraday.get "https://faraday.com"</code>.
120
+ def default_connection
121
+ @default_connection ||= Connection.new(default_connection_options)
127
122
  end
128
- end
129
-
130
- unless const_defined? :Timer
131
- require 'timeout'
132
- Timer = Timeout
133
- end
134
123
 
135
- # Public: Adds the ability for other modules to register and lookup
136
- # middleware classes.
137
- module MiddlewareRegistry
138
- # Public: Register middleware class(es) on the current module.
139
- #
140
- # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
141
- # as fully qualified constant, or a Proc that will be lazily
142
- # called to return the former.
143
- #
144
- # Examples
145
- #
146
- # module Faraday
147
- # class Whatever
148
- # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
149
- # register_middleware :foo => Foo
150
- #
151
- # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
152
- # register_middleware :bar => :Bar
153
- #
154
- # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
155
- # register_middleware :baz => [:Baz, 'baz']
156
- # end
157
- # end
124
+ # Gets the default connection options used when calling {Faraday#new}.
158
125
  #
159
- # Returns nothing.
160
- def register_middleware(autoload_path = nil, mapping = nil)
161
- if mapping.nil?
162
- mapping = autoload_path
163
- autoload_path = nil
164
- end
165
- middleware_mutex do
166
- @middleware_autoload_path = autoload_path if autoload_path
167
- (@registered_middleware ||= {}).update(mapping)
168
- end
126
+ # @return [Faraday::ConnectionOptions]
127
+ def default_connection_options
128
+ @default_connection_options ||= ConnectionOptions.new
169
129
  end
170
130
 
171
- # Public: Lookup middleware class with a registered Symbol shortcut.
172
- #
173
- # key - The Symbol key for the registered middleware.
174
- #
175
- # Examples
131
+ # Sets the default options used when calling {Faraday#new}.
176
132
  #
177
- # module Faraday
178
- # class Whatever
179
- # register_middleware :foo => Foo
180
- # end
181
- # end
182
- #
183
- # Faraday::Whatever.lookup_middleware(:foo)
184
- # # => Faraday::Whatever::Foo
185
- #
186
- # Returns a middleware Class.
187
- def lookup_middleware(key)
188
- load_middleware(key) ||
189
- raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
190
- end
191
-
192
- def middleware_mutex(&block)
193
- @middleware_mutex ||= begin
194
- require 'monitor'
195
- Monitor.new
196
- end
197
- @middleware_mutex.synchronize(&block)
133
+ # @param options [Hash, Faraday::ConnectionOptions]
134
+ def default_connection_options=(options)
135
+ @default_connection = nil
136
+ @default_connection_options = ConnectionOptions.from(options)
198
137
  end
199
138
 
200
- def fetch_middleware(key)
201
- defined?(@registered_middleware) && @registered_middleware[key]
202
- end
139
+ private
203
140
 
204
- def load_middleware(key)
205
- value = fetch_middleware(key)
206
- case value
207
- when Module
208
- value
209
- when Symbol, String
210
- middleware_mutex do
211
- @registered_middleware[key] = const_get(value)
212
- end
213
- when Proc
214
- middleware_mutex do
215
- @registered_middleware[key] = value.call
216
- end
217
- when Array
218
- middleware_mutex do
219
- const, path = value
220
- if root = @middleware_autoload_path
221
- path = "#{root}/#{path}"
222
- end
223
- require(path)
224
- @registered_middleware[key] = const
225
- end
226
- load_middleware(key)
141
+ # Internal: Proxies method calls on the Faraday constant to
142
+ # .default_connection.
143
+ def method_missing(name, *args, &block)
144
+ if default_connection.respond_to?(name)
145
+ default_connection.send(name, *args, &block)
146
+ else
147
+ super
227
148
  end
228
149
  end
229
150
  end
230
151
 
231
- def self.const_missing(name)
232
- if name.to_sym == :Builder
233
- warn "Faraday::Builder is now Faraday::RackBuilder."
234
- const_set name, RackBuilder
235
- else
236
- super
237
- end
238
- end
239
-
240
- require_libs "utils", "options", "connection", "rack_builder", "parameters",
241
- "middleware", "adapter", "request", "response", "upload_io", "error"
242
-
243
- if !ENV["FARADAY_NO_AUTOLOAD"]
244
- require_lib 'autoload'
245
- end
246
- end
247
-
248
- # not pulling in active-support JUST for this method. And I love this method.
249
- class Object
250
- # The primary purpose of this method is to "tap into" a method chain,
251
- # in order to perform operations on intermediate results within the chain.
252
- #
253
- # Examples
254
- #
255
- # (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a.
256
- # tap { |x| puts "array: #{x.inspect}" }.
257
- # select { |x| x%2 == 0 }.
258
- # tap { |x| puts "evens: #{x.inspect}" }.
259
- # map { |x| x*x }.
260
- # tap { |x| puts "squares: #{x.inspect}" }
261
- #
262
- # Yields self.
263
- # Returns self.
264
- def tap
265
- yield(self)
266
- self
267
- end unless Object.respond_to?(:tap)
152
+ self.ignore_env_proxy = false
153
+ self.root_path = File.expand_path __dir__
154
+ self.lib_path = File.expand_path 'faraday', __dir__
155
+ self.default_adapter = :net_http
156
+ self.default_adapter_options = {}
268
157
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'webmock/rspec'
4
+ WebMock.disable_net_connect!(allow_localhost: true)
5
+
6
+ require_relative '../support/helper_methods'
7
+ require_relative '../support/disabling_stub'
8
+ require_relative '../support/streaming_response_checker'
9
+ require_relative '../support/shared_examples/adapter'
10
+ require_relative '../support/shared_examples/request_method'
11
+
12
+ RSpec.configure do |config|
13
+ config.include Faraday::HelperMethods
14
+ end