faraday 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/LICENSE +1 -1
  2. data/README.rdoc +48 -61
  3. data/Rakefile +3 -1
  4. data/VERSION +1 -1
  5. data/faraday.gemspec +31 -14
  6. data/lib/faraday.rb +33 -26
  7. data/lib/faraday/adapter/net_http.rb +17 -31
  8. data/lib/faraday/adapter/patron.rb +33 -0
  9. data/lib/faraday/adapter/test.rb +96 -0
  10. data/lib/faraday/adapter/typhoeus.rb +43 -59
  11. data/lib/faraday/builder.rb +57 -0
  12. data/lib/faraday/connection.rb +112 -105
  13. data/lib/faraday/middleware.rb +54 -0
  14. data/lib/faraday/request.rb +77 -0
  15. data/lib/faraday/request/active_support_json.rb +20 -0
  16. data/lib/faraday/request/yajl.rb +18 -0
  17. data/lib/faraday/response.rb +41 -26
  18. data/lib/faraday/response/active_support_json.rb +22 -0
  19. data/lib/faraday/response/yajl.rb +20 -0
  20. data/test/adapters/live_test.rb +157 -0
  21. data/test/adapters/test_middleware_test.rb +28 -0
  22. data/test/adapters/typhoeus_test.rb +28 -0
  23. data/test/connection_app_test.rb +49 -0
  24. data/test/connection_test.rb +47 -18
  25. data/test/env_test.rb +35 -0
  26. data/test/helper.rb +5 -2
  27. data/test/live_server.rb +2 -15
  28. data/test/request_middleware_test.rb +19 -0
  29. data/test/response_middleware_test.rb +21 -0
  30. metadata +46 -16
  31. data/lib/faraday/adapter/mock_request.rb +0 -120
  32. data/lib/faraday/loadable.rb +0 -13
  33. data/lib/faraday/request/post_request.rb +0 -30
  34. data/lib/faraday/request/yajl_request.rb +0 -27
  35. data/lib/faraday/response/yajl_response.rb +0 -35
  36. data/lib/faraday/test_connection.rb +0 -5
  37. data/test/adapter/typhoeus_test.rb +0 -26
  38. data/test/adapter_test.rb +0 -118
  39. data/test/response_test.rb +0 -34
@@ -1,120 +0,0 @@
1
- module Faraday
2
- module Adapter
3
- module MockRequest
4
- extend Faraday::Connection::Options
5
- def self.loaded?() false end
6
-
7
- include Faraday::Error # ConnectionFailed
8
-
9
- class Stubs
10
- def initialize
11
- # {:get => [Stub, Stub]}
12
- @stack = {}
13
- yield self if block_given?
14
- end
15
-
16
- def empty?
17
- @stack.empty?
18
- end
19
-
20
- def match(request_method, path, data, request_headers)
21
- return false if !@stack.key?(request_method)
22
- stub = @stack[request_method].detect { |stub| stub.matches?(path, data, request_headers) }
23
- @stack[request_method].delete(stub) if stub
24
- end
25
-
26
- def get(path, request_headers = {}, &block)
27
- (@stack[:get] ||= []) << new_stub(path, {}, request_headers, block)
28
- end
29
-
30
- def delete(path, request_headers = {}, &block)
31
- (@stack[:delete] ||= []) << new_stub(path, {}, request_headers, block)
32
- end
33
-
34
- def post(path, data, request_headers = {}, &block)
35
- (@stack[:post] ||= []) << new_stub(path, data, request_headers, block)
36
- end
37
-
38
- def put(path, data, request_headers = {}, &block)
39
- (@stack[:put] ||= []) << new_stub(path, data, request_headers, block)
40
- end
41
-
42
- def new_stub(path, data, request_headers, block)
43
- status, response_headers, body = block.call
44
- Stub.new(path, request_headers, status, response_headers, body, data)
45
- end
46
- end
47
-
48
- class Stub < Struct.new(:path, :request_headers, :status, :response_headers, :body, :data)
49
- def matches?(request_path, params, headers)
50
- return false if request_path != path
51
- return false if params != data
52
- return true if request_headers.empty?
53
- request_headers.each do |key, value|
54
- return false if headers[key] != value
55
- end
56
- true
57
- end
58
- end
59
-
60
- def initialize &block
61
- super
62
- configure(&block) if block
63
- end
64
-
65
- def configure
66
- yield stubs
67
- end
68
-
69
- def stubs
70
- @stubs ||= Stubs.new
71
- end
72
-
73
- def _get(uri, headers)
74
- raise ConnectionFailed, "no stubbed requests" if stubs.empty?
75
- if stub = @stubs.match(:get, uri.path, {}, headers)
76
- response_class.new do |resp|
77
- resp.headers = stub.response_headers
78
- resp.process stub.body
79
- end
80
- else
81
- nil
82
- end
83
- end
84
-
85
- def _delete(uri, headers)
86
- raise ConnectionFailed, "no stubbed requests" if stubs.empty?
87
- if stub = @stubs.match(:delete, uri.path, {}, headers)
88
- response_class.new do |resp|
89
- resp.headers = stub.response_headers
90
- resp.process stub.body
91
- end
92
- else
93
- nil
94
- end
95
- end
96
- def _post(uri, data, headers)
97
- raise ConnectionFailed, "no stubbed requests" if stubs.empty?
98
- if stub = @stubs.match(:post, uri.path, data, headers)
99
- response_class.new do |resp|
100
- resp.headers = stub.response_headers
101
- resp.process stub.body
102
- end
103
- else
104
- nil
105
- end
106
- end
107
- def _put(uri, data, headers)
108
- raise ConnectionFailed, "no stubbed requests" if stubs.empty?
109
- if stub = @stubs.match(:put, uri.path, data, headers)
110
- response_class.new do |resp|
111
- resp.headers = stub.response_headers
112
- resp.process stub.body
113
- end
114
- else
115
- nil
116
- end
117
- end
118
- end
119
- end
120
- end
@@ -1,13 +0,0 @@
1
- module Faraday
2
- module Loadable
3
- def self.extended mod
4
- class << mod
5
- attr_accessor :load_error
6
- end
7
- end
8
-
9
- def self.loaded?
10
- load_error.nil?
11
- end
12
- end
13
- end
@@ -1,30 +0,0 @@
1
- module Faraday
2
- module Request
3
- class PostRequest
4
- extend Loadable
5
-
6
- def initialize params, headers={}
7
- @params = params
8
- @headers = headers
9
- end
10
-
11
- def headers
12
- @headers.merge('Content-Type' => 'application/x-www-form-urlencoded')
13
- end
14
-
15
- def body
16
- create_post_params @params
17
- end
18
-
19
- private
20
- def create_post_params(params, base = "")
21
- [].tap do |toreturn|
22
- params.each_key do |key|
23
- keystring = base == '' ? key : "#{base}[#{key}]"
24
- toreturn << (params[key].kind_of?(Hash) ? create_post_params(params[key], keystring) : "#{keystring}=#{CGI.escape(params[key].to_s)}")
25
- end
26
- end.join('&')
27
- end
28
- end
29
- end
30
- end
@@ -1,27 +0,0 @@
1
- module Faraday
2
- module Request
3
- class YajlRequest
4
- extend Loadable
5
-
6
- begin
7
- require 'yajl'
8
-
9
- def initialize params, headers={}
10
- @params = params
11
- @headers = headers
12
- end
13
-
14
- def headers
15
- @headers.merge('Content-Type' => 'application/json')
16
- end
17
-
18
- # TODO streaming
19
- def body
20
- Yajl::Encoder.encode @params
21
- end
22
- rescue LoadError => e
23
- self.load_error = e
24
- end
25
- end
26
- end
27
- end
@@ -1,35 +0,0 @@
1
- module Faraday
2
- class Response
3
- class YajlResponse < Response
4
- attr_reader :body
5
-
6
- begin
7
- require 'yajl'
8
-
9
- def initialize(headers = nil, body = nil)
10
- super
11
- @parser = nil
12
- end
13
-
14
- def process(chunk)
15
- if !@parser
16
- @parser = Yajl::Parser.new
17
- @parser.on_parse_complete = method(:object_parsed)
18
- end
19
- @parser << chunk
20
- end
21
-
22
- def processed!
23
- @parser = nil
24
- end
25
-
26
- def object_parsed(obj)
27
- @body = obj
28
- end
29
-
30
- rescue LoadError => e
31
- self.load_error = e
32
- end
33
- end
34
- end
35
- end
@@ -1,5 +0,0 @@
1
- module Faraday
2
- class TestConnection < Connection
3
- include Faraday::Adapter::MockRequest
4
- end
5
- end
@@ -1,26 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- if Faraday::Adapter::Typhoeus.loaded?
4
- class TyphoeusTest < Faraday::TestCase
5
- describe "#parse_response_headers" do
6
- before do
7
- @conn = Object.new.extend(Faraday::Adapter::Typhoeus)
8
- end
9
-
10
- it "leaves http status line out" do
11
- headers = @conn.parse_response_headers("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n")
12
- assert_equal %w(content-type), headers.keys
13
- end
14
-
15
- it "parses lower-cased header name and value" do
16
- headers = @conn.parse_response_headers("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n")
17
- assert_equal 'text/html', headers['content-type']
18
- end
19
-
20
- it "parses lower-cased header name and value with colon" do
21
- headers = @conn.parse_response_headers("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nLocation: http://sushi.com/\r\n\r\n")
22
- assert_equal 'http://sushi.com/', headers['location']
23
- end
24
- end
25
- end
26
- end
data/test/adapter_test.rb DELETED
@@ -1,118 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
-
3
- class AdapterTest < Faraday::TestCase
4
- before do
5
- @connection = Faraday::Connection.new(LIVE_SERVER)
6
- end
7
-
8
- Faraday::Adapter.loaded_adapters.each do |adapter|
9
- describe "with #{adapter} adapter" do
10
- before do
11
- @connection.extend adapter
12
- end
13
-
14
- describe "#delete" do
15
- it "retrieves the response body with YajlResponse" do
16
- @connection.response_class = Faraday::Response::YajlResponse
17
- assert_equal({'deleted' => true},
18
- @connection.delete('delete_with_json').body)
19
- end
20
-
21
- it "send url-encoded params" do
22
- assert_equal('foobar', @connection.delete('delete_with_params', 'deleted' => 'foobar').body)
23
- end
24
- end
25
-
26
- it "passes params" do
27
- @connection.params = {:a => 1}
28
- assert_equal "params[:a] == 1", @connection.get('params').body
29
- end
30
-
31
- it "passes headers" do
32
- @connection.headers = {"X-Test" => 1}
33
- assert_equal "env[HTTP_X_TEST] == 1", @connection.get('headers').body
34
- end
35
-
36
- it "retrieves the response body" do
37
- assert_equal 'hello world', @connection.get('hello_world').body
38
- end
39
-
40
- describe "#put" do
41
- it "sends params" do
42
- assert_equal 'hello zack', @connection.put('hello', 'name' => 'zack').body
43
- end
44
-
45
- it "retrieves the response body with YajlResponse" do
46
- @connection.response_class = Faraday::Response::YajlResponse
47
- assert_equal({'name' => 'zack'},
48
- @connection.put('echo_name', 'name' => 'zack').body)
49
- end
50
- end
51
-
52
- describe "#post" do
53
- it "sends params" do
54
- assert_equal 'hello zack', @connection.post('hello', 'name' => 'zack').body
55
- end
56
-
57
- it "retrieves the response body with YajlResponse" do
58
- @connection.response_class = Faraday::Response::YajlResponse
59
- assert_equal({'name' => 'zack'},
60
- @connection.post('echo_name', 'name' => 'zack').body)
61
- end
62
- end
63
-
64
- describe "#get" do
65
- it "raises on 404" do
66
- assert_raise(Faraday::Error::ResourceNotFound) { @connection.get('/nothing') }
67
- end
68
- it "retrieves the response body" do
69
- assert_equal 'hello world', @connection.get('hello_world').body
70
- end
71
-
72
- it "send url-encoded params" do
73
- assert_equal('hello zack', @connection.get('hello', 'name' => 'zack').body)
74
- end
75
-
76
- it "retrieves the response body with YajlResponse" do
77
- @connection.response_class = Faraday::Response::YajlResponse
78
- assert_equal [1,2,3], @connection.get('json').body
79
- end
80
-
81
- it "retrieves the response headers" do
82
- assert_equal 'text/html', @connection.get('hello_world').headers['content-type']
83
- end
84
- end
85
- end
86
-
87
- describe "async requests" do
88
- before do
89
- @connection.extend adapter
90
- end
91
-
92
- it "clears parallel manager after running a single request" do
93
- assert !@connection.in_parallel?
94
- resp = @connection.get('hello_world')
95
- assert !@connection.in_parallel?
96
- assert_equal 'hello world', @connection.get('hello_world').body
97
- end
98
-
99
- it "uses parallel manager to run multiple json requests" do
100
- resp1, resp2 = nil, nil
101
-
102
- @connection.response_class = Faraday::Response::YajlResponse
103
- @connection.in_parallel do
104
- resp1 = @connection.get('json')
105
- resp2 = @connection.get('json')
106
- assert @connection.in_parallel?
107
- if adapter.supports_async?
108
- assert_nil resp1.body
109
- assert_nil resp2.body
110
- end
111
- end
112
- assert !@connection.in_parallel?
113
- assert_equal [1,2,3], resp1.body
114
- assert_equal [1,2,3], resp2.body
115
- end
116
- end
117
- end
118
- end
@@ -1,34 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
-
3
- class ResponseTest < Faraday::TestCase
4
- describe "unloaded response class" do
5
- it "is not allowed to be set" do
6
- resp_class = Object.new
7
- def resp_class.loaded?() false end
8
- conn = Faraday::Connection.new
9
- assert_raises ArgumentError do
10
- conn.response_class = resp_class
11
- end
12
- end
13
- end
14
-
15
- describe "TestConnection#get with default Faraday::Response class" do
16
- it "returns Faraday::Response" do
17
- conn = Faraday::TestConnection.new do |stub|
18
- stub.get('/hello') { [200, {}, 'hello world']}
19
- end
20
- resp = conn.get('/hello')
21
- assert_equal 'hello world', resp.body
22
- end
23
- end
24
-
25
- describe "TestConnection#get with Faraday::YajlResponse class" do
26
- it "returns string body" do
27
- conn = Faraday::TestConnection.new do |stub|
28
- stub.get('/hello') { [200, {}, '[1,2,3]']}
29
- end
30
- conn.response_class = Faraday::Response::YajlResponse
31
- assert_equal [1,2,3], conn.get('/hello').body
32
- end
33
- end
34
- end