faraday 0.6.0 → 0.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 (58) hide show
  1. data/Gemfile +22 -15
  2. data/{LICENSE → LICENSE.md} +1 -1
  3. data/README.md +216 -146
  4. data/Rakefile +14 -58
  5. data/config.ru +6 -0
  6. data/faraday.gemspec +31 -38
  7. data/lib/faraday/adapter/em_http.rb +204 -0
  8. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +66 -0
  9. data/lib/faraday/adapter/em_synchrony.rb +67 -16
  10. data/lib/faraday/adapter/excon.rb +1 -2
  11. data/lib/faraday/adapter/net_http.rb +82 -39
  12. data/lib/faraday/adapter/net_http_persistent.rb +37 -0
  13. data/lib/faraday/adapter/patron.rb +42 -8
  14. data/lib/faraday/adapter/rack.rb +59 -0
  15. data/lib/faraday/adapter/test.rb +49 -9
  16. data/lib/faraday/adapter/typhoeus.rb +70 -15
  17. data/lib/faraday/adapter.rb +41 -18
  18. data/lib/faraday/builder.rb +34 -16
  19. data/lib/faraday/connection.rb +177 -115
  20. data/lib/faraday/error.rb +4 -2
  21. data/lib/faraday/middleware.rb +18 -10
  22. data/lib/faraday/request/authorization.rb +40 -0
  23. data/lib/faraday/request/basic_authentication.rb +13 -0
  24. data/lib/faraday/request/multipart.rb +5 -6
  25. data/lib/faraday/request/retry.rb +21 -0
  26. data/lib/faraday/request/token_authentication.rb +15 -0
  27. data/lib/faraday/request/url_encoded.rb +1 -3
  28. data/lib/faraday/request.rb +48 -38
  29. data/lib/faraday/response/raise_error.rb +1 -1
  30. data/lib/faraday/response.rb +6 -5
  31. data/lib/faraday/upload_io.rb +1 -1
  32. data/lib/faraday/utils.rb +196 -29
  33. data/lib/faraday.rb +69 -13
  34. data/test/adapters/default_test.rb +14 -0
  35. data/test/adapters/em_http_test.rb +14 -0
  36. data/test/adapters/em_synchrony_test.rb +14 -0
  37. data/test/adapters/excon_test.rb +23 -0
  38. data/test/adapters/integration.rb +190 -0
  39. data/test/adapters/logger_test.rb +2 -2
  40. data/test/adapters/net_http_persistent_test.rb +11 -0
  41. data/test/adapters/net_http_test.rb +37 -21
  42. data/test/adapters/patron_test.rb +17 -0
  43. data/test/adapters/rack_test.rb +26 -0
  44. data/test/adapters/test_middleware_test.rb +28 -1
  45. data/test/adapters/typhoeus_test.rb +14 -0
  46. data/test/authentication_middleware_test.rb +65 -0
  47. data/test/connection_test.rb +211 -81
  48. data/test/env_test.rb +80 -31
  49. data/test/helper.rb +23 -13
  50. data/test/live_server.rb +38 -29
  51. data/test/middleware/retry_test.rb +25 -0
  52. data/test/middleware_stack_test.rb +85 -4
  53. data/test/request_middleware_test.rb +42 -19
  54. data/test/response_middleware_test.rb +30 -3
  55. metadata +104 -110
  56. data/lib/faraday/adapter/action_dispatch.rb +0 -30
  57. data/lib/faraday/request/json.rb +0 -31
  58. data/test/adapters/live_test.rb +0 -186
@@ -1,30 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class ActionDispatch < Faraday::Adapter
4
- attr_reader :session
5
-
6
- # Initializes a new middleware instance for each request. Instead of
7
- # initiating an HTTP request with a web server, this adapter calls
8
- # a Rails 3 app using integration tests.
9
- #
10
- # app - The current Faraday request.
11
- # session - An ActionDispatch::Integration::Session instance.
12
- #
13
- # Returns nothing.
14
- def initialize(app, session)
15
- super(app)
16
- @session = session
17
- @session.reset!
18
- end
19
-
20
- def call(env)
21
- super
22
- @session.__send__(env[:method], env[:url].request_uri, env[:body], env[:request_headers])
23
- resp = @session.response
24
- env.update :status => resp.status, :body => resp.body
25
- response_headers(env).update resp.headers
26
- @app.call env
27
- end
28
- end
29
- end
30
- end
@@ -1,31 +0,0 @@
1
- module Faraday
2
- class Request::JSON < Request::UrlEncoded
3
- self.mime_type = 'application/json'.freeze
4
-
5
- class << self
6
- attr_accessor :adapter
7
- end
8
-
9
- # loads the JSON encoder either from yajl-ruby or activesupport
10
- dependency do
11
- begin
12
- require 'yajl'
13
- self.adapter = Yajl::Encoder
14
- rescue LoadError, NameError
15
- require 'active_support/core_ext/module/attribute_accessors' # AS 2.3.11
16
- require 'active_support/core_ext/kernel/reporting' # AS 2.3.11
17
- require 'active_support/json/encoding'
18
- require 'active_support/ordered_hash' # AS 3.0.4
19
- self.adapter = ActiveSupport::JSON
20
- end
21
- end
22
-
23
- def call(env)
24
- match_content_type(env) do |data|
25
- # encode with the first successfully loaded adapter
26
- env[:body] = self.class.adapter.encode data
27
- end
28
- @app.call env
29
- end
30
- end
31
- end
@@ -1,186 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- if !Faraday::TestCase::LIVE_SERVER
4
- warn "warning: test server is not up; skipping live server tests"
5
- else
6
- module Adapters
7
- class LiveTest < Faraday::TestCase
8
- adapters = if ENV['ADAPTER']
9
- ENV['ADAPTER'].split(':').map { |name| Faraday::Adapter.lookup_module name.to_sym }
10
- else
11
- loaded_adapters = Faraday::Adapter.all_loaded_constants
12
- loaded_adapters -= [Faraday::Adapter::ActionDispatch]
13
- loaded_adapters << :default
14
- end
15
-
16
- adapters.each do |adapter|
17
- define_method "test_#{adapter}_GET_retrieves_the_response_body" do
18
- assert_equal 'hello world', create_connection(adapter).get('hello_world').body
19
- end
20
-
21
- define_method "test_#{adapter}_GET_send_url_encoded_params" do
22
- resp = create_connection(adapter).get do |req|
23
- req.url 'hello', 'name' => 'zack'
24
- end
25
- assert_equal('hello zack', resp.body)
26
- end
27
-
28
- define_method "test_#{adapter}_GET_retrieves_the_response_headers" do
29
- response = create_connection(adapter).get('hello_world')
30
- assert_match /text\/html/, response.headers['Content-Type'], 'original case fail'
31
- assert_match /text\/html/, response.headers['content-type'], 'lowercase fail'
32
- end
33
-
34
- # https://github.com/geemus/excon/issues/10
35
- unless %[Faraday::Adapter::Excon] == adapter.to_s
36
- define_method "test_#{adapter}_GET_handles_headers_with_multiple_values" do
37
- response = create_connection(adapter).get('multi')
38
- assert_equal 'one, two', response.headers['set-cookie']
39
- end
40
- end
41
-
42
- define_method "test_#{adapter}_POST_send_url_encoded_params" do
43
- resp = create_connection(adapter).post do |req|
44
- req.url 'echo_name'
45
- req.body = {'name' => 'zack'}
46
- end
47
- assert_equal %("zack"), resp.body
48
- end
49
-
50
- define_method "test_#{adapter}_POST_send_url_encoded_nested_params" do
51
- resp = create_connection(adapter).post do |req|
52
- req.url 'echo_name'
53
- req.body = {'name' => {'first' => 'zack'}}
54
- end
55
- assert_equal %({"first"=>"zack"}), resp.body
56
- end
57
-
58
- define_method "test_#{adapter}_POST_retrieves_the_response_headers" do
59
- assert_match /text\/html/, create_connection(adapter).post('echo_name').headers['content-type']
60
- end
61
-
62
- define_method "test_#{adapter}_POST_sends_files" do
63
- resp = create_connection(adapter).post do |req|
64
- req.url 'file'
65
- req.body = {'uploaded_file' => Faraday::UploadIO.new(__FILE__, 'text/x-ruby')}
66
- end
67
- assert_equal "file live_test.rb text/x-ruby", resp.body
68
- end unless :default == adapter # isn't configured for multipart
69
-
70
- # http://github.com/toland/patron/issues/#issue/9
71
- if ENV['FORCE'] || adapter != Faraday::Adapter::Patron
72
- define_method "test_#{adapter}_PUT_send_url_encoded_params" do
73
- resp = create_connection(adapter).put do |req|
74
- req.url 'echo_name'
75
- req.body = {'name' => 'zack'}
76
- end
77
- assert_equal %("zack"), resp.body
78
- end
79
-
80
- define_method "test_#{adapter}_PUT_send_url_encoded_nested_params" do
81
- resp = create_connection(adapter).put do |req|
82
- req.url 'echo_name'
83
- req.body = {'name' => {'first' => 'zack'}}
84
- end
85
- assert_equal %({"first"=>"zack"}), resp.body
86
- end
87
-
88
- define_method "test_#{adapter}_PUT_retrieves_the_response_headers" do
89
- assert_match /text\/html/, create_connection(adapter).put('echo_name').headers['content-type']
90
- end
91
- end
92
-
93
- define_method "test_#{adapter}_HEAD_send_url_encoded_params" do
94
- resp = create_connection(adapter).head do |req|
95
- req.url 'hello', 'name' => 'zack'
96
- end
97
- assert_match /text\/html/, resp.headers['content-type']
98
- end
99
-
100
- define_method "test_#{adapter}_HEAD_retrieves_no_response_body" do
101
- assert_equal '', create_connection(adapter).head('hello_world').body.to_s
102
- end
103
-
104
- define_method "test_#{adapter}_HEAD_retrieves_the_response_headers" do
105
- assert_match /text\/html/, create_connection(adapter).head('hello_world').headers['content-type']
106
- end
107
-
108
- define_method "test_#{adapter}_DELETE_retrieves_the_response_headers" do
109
- assert_match /text\/html/, create_connection(adapter).delete('delete_with_json').headers['content-type']
110
- end
111
-
112
- define_method "test_#{adapter}_DELETE_retrieves_the_body" do
113
- assert_match /deleted/, create_connection(adapter).delete('delete_with_json').body
114
- end
115
-
116
- define_method "test_#{adapter}_async_requests_clear_parallel_manager_after_running_a_single_request" do
117
- connection = create_connection(adapter)
118
- assert !connection.in_parallel?
119
- resp = connection.get('hello_world')
120
- assert !connection.in_parallel?
121
- assert_equal 'hello world', connection.get('hello_world').body
122
- end
123
-
124
- define_method "test_#{adapter}_async_requests_uses_parallel_manager_to_run_multiple_json_requests" do
125
- resp1, resp2 = nil, nil
126
-
127
- connection = create_connection(adapter)
128
- adapter = real_adapter_for(adapter)
129
-
130
- connection.in_parallel(adapter.setup_parallel_manager) do
131
- resp1 = connection.get('json')
132
- resp2 = connection.get('json')
133
- if adapter.supports_parallel_requests?
134
- assert connection.in_parallel?
135
- assert_nil resp1.body
136
- assert_nil resp2.body
137
- end
138
- end
139
- assert !connection.in_parallel?
140
- assert_equal '[1,2,3]', resp1.body
141
- assert_equal '[1,2,3]', resp2.body
142
- end
143
-
144
- if adapter.to_s == "Faraday::Adapter::EMSynchrony"
145
- instance_methods.grep(%r{Faraday::Adapter::EMSynchrony}).each do |method|
146
- em = method.to_s.sub %r{^test_}, "test_under_em_"
147
- define_method em do
148
- EM.run do
149
- Fiber.new do
150
- self.send method
151
- EM.stop
152
- end.resume
153
- end
154
- end
155
- end
156
- end
157
- end
158
-
159
- def create_connection(adapter)
160
- if adapter == :default
161
- Faraday.default_connection.tap do |conn|
162
- conn.url_prefix = LIVE_SERVER
163
- conn.headers['X-Faraday-Adapter'] = adapter.to_s
164
- end
165
- else
166
- Faraday::Connection.new LIVE_SERVER, :headers => {'X-Faraday-Adapter' => adapter.to_s} do |b|
167
- b.request :multipart
168
- b.request :url_encoded
169
- b.use adapter
170
- end
171
- end.tap do |conn|
172
- target = conn.builder.handlers.last
173
- conn.builder.insert_before target, Faraday::Response::RaiseError
174
- end
175
- end
176
-
177
- def real_adapter_for(adapter)
178
- if adapter == :default
179
- Faraday::Adapter.lookup_module(Faraday.default_adapter)
180
- else
181
- adapter
182
- end
183
- end
184
- end
185
- end
186
- end