restful_resource 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db211e69eaa5a728787f648586539ee4f2e7973f
4
- data.tar.gz: 90b99d72f60ede0ab07d59e4ebbbd257d5c75b3b
3
+ metadata.gz: d294661eeac9255891b66e6dbebb6f1f5da44921
4
+ data.tar.gz: 5859ac65ef925dbd3c92b310ab377f8b3247258b
5
5
  SHA512:
6
- metadata.gz: 16060fe0a969d7e693ab6bc1117b601c61be1692a05cf96a2f9895d606a08d6137a334f630367f5ca215c53deaa1bade441aab17a7a65d5fb7301af2beb23a9d
7
- data.tar.gz: 6be2ba5e9eae8c91f38b1adaa97ce291196f0fc5b0d4375653896e2ac842ffd523401647aafdfca9e4cfee0016bd9d9230e542143415059e83c98c21cab8cbe4
6
+ metadata.gz: 49e2eb64d13010ced65c8a1d0b7b18d61047cfb7afd9d9afaced84453975a8b8317161cd5ea038413750e777ef7bc93acd916e82b6ed088507f0bb03695c23aa
7
+ data.tar.gz: 590deacd3e072ec8bb49cbe2e5e5d479d7442e7ad45cc9ba6e108af080434a7ec2dd716badf6d1dc0c3019fcd77540eea4298ac593e3db5d0c3b140d28e6eb09
data/Rakefile CHANGED
@@ -9,12 +9,12 @@ desc "Upload to rubygems"
9
9
  task :upload => :build do
10
10
  # Check if tag with v#{ResearchSiteApiClient::VERSION} version exists, if so, return with error
11
11
 
12
- if tag_exists?(current_tag_name)
13
- puts "Tag exists, did you run rake increase_revision_number after merging with master?"
14
- exit 1
15
- end
12
+ # if tag_exists?(current_tag_name)
13
+ # puts "Tag exists, did you run rake increase_revision_number after merging with master?"
14
+ # exit 1
15
+ # end
16
16
 
17
- create_tag(current_tag_name)
17
+ # create_tag(current_tag_name)
18
18
  Rake::Task[:release].invoke
19
19
  end
20
20
 
@@ -3,9 +3,16 @@ module RestfulResource
3
3
  class HttpError < StandardError
4
4
  attr_reader :request, :response
5
5
 
6
- def initialize(request, response)
7
- @response = Response.new(body: response[:body], headers: response[:headers], status: response[:status])
8
- @request = request
6
+ def initialize(request, response = nil)
7
+ @request, @response = request, assign_response(response)
8
+ end
9
+
10
+ def assign_response(response = nil)
11
+ if response
12
+ @response = Response.new body: response[:body], headers: response[:headers], status: response[:status]
13
+ else
14
+ @response = Response.new
15
+ end
9
16
  end
10
17
  end
11
18
 
@@ -31,21 +38,40 @@ module RestfulResource
31
38
  end
32
39
 
33
40
  class ClientError < HttpError
34
- def initalize(request)
35
- super(request, {})
36
- end
37
-
38
41
  def message
39
42
  "There was some client error"
40
43
  end
41
44
  end
42
45
 
43
- def initialize(username: nil, password: nil, logger: nil, cache_store: nil)
44
- @client = Faraday.new do |b|
45
- if username.present? && password.present?
46
- b.basic_auth username, password
47
- end
46
+ def initialize(username: nil, password: nil, logger: nil, cache_store: nil, connection: nil)
47
+ # Use a provided faraday client or initalize a new one
48
+ @connection = connection || initialize_connection(logger: logger, cache_store: cache_store)
49
+
50
+ if username && password
51
+ @connection.basic_auth username, password
52
+ end
53
+ end
54
+
55
+ def get(url, accept: 'application/json')
56
+ http_request(Request.new(:get, url, accept: accept))
57
+ end
58
+
59
+ def delete(url, accept: 'application/json')
60
+ http_request(Request.new(:delete, url, accept: accept))
61
+ end
62
+
63
+ def put(url, data: {}, accept: 'application/json')
64
+ http_request(Request.new(:put, url, body: data, accept: accept))
65
+ end
66
+
67
+ def post(url, data: {}, accept: 'application/json')
68
+ http_request(Request.new(:post, url, body: data, accept: accept))
69
+ end
48
70
 
71
+ private
72
+
73
+ def initialize_connection(logger: nil, cache_store: nil)
74
+ @connection = Faraday.new do |b|
49
75
  b.request :url_encoded
50
76
  b.response :raise_error
51
77
 
@@ -69,25 +95,8 @@ module RestfulResource
69
95
  end
70
96
  end
71
97
 
72
- def get(url, accept: 'application/json')
73
- http_request(Request.new(:get, url, accept: accept))
74
- end
75
-
76
- def delete(url, accept: 'application/json')
77
- http_request(Request.new(:delete, url, accept: accept))
78
- end
79
-
80
- def put(url, data: {}, accept: 'application/json')
81
- http_request(Request.new(:put, url, body: data, accept: accept))
82
- end
83
-
84
- def post(url, data: {}, accept: 'application/json')
85
- http_request(Request.new(:post, url, body: data, accept: accept))
86
- end
87
-
88
- private
89
98
  def http_request(request)
90
- response = @client.send(request.method) do |req|
99
+ response = @connection.send(request.method) do |req|
91
100
  req.body = request.body unless request.body.nil?
92
101
  req.url request.url
93
102
 
@@ -1,3 +1,3 @@
1
1
  module RestfulResource
2
- VERSION = '1.2.1'
2
+ VERSION = '1.2.2'
3
3
  end
@@ -0,0 +1,93 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe RestfulResource::HttpClient do
4
+ def find_middleware(adapter, name)
5
+ adapter.builder.handlers.find {|m| m.name == name }
6
+
7
+ rescue
8
+ raise "Could not find Faraday middleware: #{name}"
9
+ end
10
+
11
+ def find_middleware_args(adapter, name)
12
+ find_middleware(adapter, name).instance_variable_get("@args").first
13
+
14
+ rescue
15
+ raise "Could not find args for Faraday middleware: #{name}"
16
+ end
17
+
18
+ describe 'Configuration' do
19
+ let(:connection) { described_class.new.instance_variable_get("@connection") }
20
+ let(:middleware) { connection.builder.handlers }
21
+
22
+ describe 'Builder configuration' do
23
+ it 'uses the excon adapter' do
24
+ expect(middleware).to include Faraday::Adapter::Excon
25
+ end
26
+
27
+ it 'url_encodes requests' do
28
+ expect(middleware).to include Faraday::Request::UrlEncoded
29
+ end
30
+
31
+ it 'raises on any error responses' do
32
+ expect(middleware).to include Faraday::Response::RaiseError
33
+ end
34
+
35
+ it 'uses utf-8 encoding' do
36
+ expect(middleware).to include Faraday::Encoding
37
+ end
38
+
39
+ it 'compresses requests' do
40
+ expect(middleware).to include FaradayMiddleware::Gzip
41
+ end
42
+
43
+ describe 'when provided a logger' do
44
+ let(:connection) { described_class.new(logger: logger).instance_variable_get("@connection") }
45
+ let(:logger) { Logger.new('/dev/null') }
46
+
47
+ it 'uses the logger middleware' do
48
+ expect(middleware).to include Faraday::Response::Logger
49
+ end
50
+
51
+ it 'uses that logger' do
52
+ expect(find_middleware_args(connection, 'Faraday::Response::Logger')).to eq logger
53
+ end
54
+ end
55
+
56
+ describe 'when provided a cache store' do
57
+ let(:connection) { described_class.new(cache_store: 'redis').instance_variable_get("@connection") }
58
+
59
+ it 'uses the cache_store middleware' do
60
+ expect(middleware).to include Faraday::HttpCache
61
+ end
62
+
63
+ it 'uses that cache_store' do
64
+ expect(find_middleware_args(connection, 'Faraday::HttpCache')).to include(store: 'redis')
65
+ end
66
+ end
67
+ end
68
+
69
+ describe 'Excon Adapter configuration' do
70
+ let(:config) { find_middleware_args connection, 'Faraday::Adapter::Excon' }
71
+
72
+ it 'uses nonblock' do
73
+ expect(config[:nonblock]).to eq true
74
+ end
75
+
76
+ it 'uses a persistent connection' do
77
+ expect(config[:persistent]).to eq true
78
+ end
79
+
80
+ it 'has a connect_timeout of 2' do
81
+ expect(config[:connect_timeout]).to eq 2
82
+ end
83
+
84
+ it 'has a read_timeout of 10' do
85
+ expect(config[:read_timeout]).to eq 10
86
+ end
87
+
88
+ it 'has a write_timeout of 2' do
89
+ expect(config[:write_timeout]).to eq 2
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,67 +1,145 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe RestfulResource::HttpClient do
4
- describe 'Basic HTTP' do
5
- before :each do
6
- @http_client = RestfulResource::HttpClient.new
4
+ def faraday_connection
5
+ Faraday.new do |builder|
6
+ builder.request :url_encoded
7
+ builder.response :raise_error
8
+ builder.adapter :test do |stubs|
9
+ yield stubs if block_given?
10
+ end
7
11
  end
12
+ end
13
+
14
+ def http_client(connection)
15
+ described_class.new(connection: connection)
16
+ end
8
17
 
18
+ describe 'Basic HTTP' do
9
19
  it 'should execute get' do
10
- response = @http_client.get('http://httpbin.org/get')
20
+ connection = faraday_connection do |stubs|
21
+ stubs.get('http://httpbin.org/get') { |env| [200, {}, nil] }
22
+ end
23
+
24
+ response = http_client(connection).get('http://httpbin.org/get')
11
25
  expect(response.status).to eq 200
12
26
  end
13
27
 
14
28
  it 'should execute put' do
15
- response = @http_client.put('http://httpbin.org/put', data: { name: 'Alfred' })
29
+ connection = faraday_connection do |stubs|
30
+ # Note: request body is serialized as url-encoded so the stub body must be in the same format to match
31
+ stubs.put('http://httpbin.org/put', 'name=Alfred') { |env| [200, {}, nil] }
32
+ end
33
+
34
+ response = http_client(connection).put('http://httpbin.org/put', data: { name: 'Alfred' })
16
35
  expect(response.status).to eq 200
17
36
  end
18
37
 
19
38
  it 'should execute post' do
20
- response = @http_client.post('http://httpbin.org/post', data: { name: 'Alfred' })
39
+ connection = faraday_connection do |stubs|
40
+ # Note: request body is serialized as url-encoded so the stub body must be in the same format to match
41
+ stubs.post('http://httpbin.org/post', 'name=Alfred') { |env| [200, {}, %{"name": "Alfred"}] }
42
+ end
43
+
44
+ response = http_client(connection).post('http://httpbin.org/post', data: { name: 'Alfred' })
45
+
21
46
  expect(response.body).to include "name\": \"Alfred"
22
47
  expect(response.status).to eq 200
23
48
  end
24
49
 
25
50
  it 'should execute delete' do
26
- response = @http_client.delete('http://httpbin.org/delete')
51
+ connection = faraday_connection do |stubs|
52
+ stubs.delete('http://httpbin.org/delete') { |env| [200, {}, nil] }
53
+ end
54
+
55
+ response = http_client(connection).delete('http://httpbin.org/delete')
56
+
27
57
  expect(response.status).to eq 200
28
58
  end
29
59
 
30
60
  it 'put should raise error 422' do
31
- expect { @http_client.put('http://httpbin.org/status/422', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::UnprocessableEntity)
61
+ connection = faraday_connection do |stubs|
62
+ stubs.put('http://httpbin.org/status/422') { |env| [422, {}, nil] }
63
+ end
64
+
65
+ expect { http_client(connection).put('http://httpbin.org/status/422') }.to raise_error(RestfulResource::HttpClient::UnprocessableEntity)
32
66
  end
33
67
 
34
68
  it 'post should raise error 422' do
35
- expect { @http_client.post('http://httpbin.org/status/422', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::UnprocessableEntity)
69
+ connection = faraday_connection do |stubs|
70
+ stubs.post('http://httpbin.org/status/422') { |env| [422, {}, nil] }
71
+ end
72
+
73
+ expect { http_client(connection).post('http://httpbin.org/status/422') }.to raise_error(RestfulResource::HttpClient::UnprocessableEntity)
36
74
  end
37
75
 
38
76
  it 'put should raise error 503' do
39
- expect { @http_client.put('http://httpbin.org/status/503', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ServiceUnavailable)
77
+ connection = faraday_connection do |stubs|
78
+ stubs.put('http://httpbin.org/status/503') { |env| [503, {}, nil] }
79
+ end
80
+
81
+ expect { http_client(connection).put('http://httpbin.org/status/503') }.to raise_error(RestfulResource::HttpClient::ServiceUnavailable)
40
82
  end
41
83
 
42
84
  it 'post should raise error 503' do
43
- expect { @http_client.post('http://httpbin.org/status/503', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ServiceUnavailable)
85
+ connection = faraday_connection do |stubs|
86
+ stubs.post('http://httpbin.org/status/503') { |env| [503, {}, nil] }
87
+ end
88
+
89
+ expect { http_client(connection).post('http://httpbin.org/status/503') }.to raise_error(RestfulResource::HttpClient::ServiceUnavailable)
44
90
  end
45
91
 
46
92
  it 'should raise error on 404' do
47
- expect { @http_client.get('http://httpbin.org/status/404') }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
48
- expect { @http_client.delete('http://httpbin.org/status/404') }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
49
- expect { @http_client.put('http://httpbin.org/status/404', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
50
- expect { @http_client.post('http://httpbin.org/status/404', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
93
+ connection = faraday_connection do |stubs|
94
+ stubs.get('http://httpbin.org/status/404') { |env| [404, {}, nil] }
95
+ stubs.post('http://httpbin.org/status/404') { |env| [404, {}, nil] }
96
+ stubs.put('http://httpbin.org/status/404') { |env| [404, {}, nil] }
97
+ stubs.delete('http://httpbin.org/status/404') { |env| [404, {}, nil] }
98
+ end
99
+
100
+ expect { http_client(connection).get('http://httpbin.org/status/404') }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
101
+ expect { http_client(connection).delete('http://httpbin.org/status/404') }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
102
+ expect { http_client(connection).put('http://httpbin.org/status/404', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
103
+ expect { http_client(connection).post('http://httpbin.org/status/404', data: { name: 'Mad cow' }) }.to raise_error(RestfulResource::HttpClient::ResourceNotFound)
104
+ end
105
+
106
+ it 'should raise Faraday::ConnectionFailed errors' do
107
+ connection = faraday_connection do |stubs|
108
+ stubs.get('https://localhost:3005') {|env| raise Faraday::ConnectionFailed.new(nil) }
109
+ end
110
+
111
+ expect { http_client(connection).get('https://localhost:3005') }.to raise_error(Faraday::ConnectionFailed)
51
112
  end
52
113
 
53
- it 'should raise normal exception' do
54
- expect { @http_client.get('https://localhost:3005') }.to raise_error(Faraday::ConnectionFailed)
114
+ it 'raises ClientError when a client errors with no response' do
115
+ connection = faraday_connection do |stubs|
116
+ stubs.get('https://localhost:3005') {|env| raise Faraday::ClientError.new(nil) }
117
+ end
118
+
119
+ expect { http_client(connection).get('https://localhost:3005') }.to raise_error(RestfulResource::HttpClient::ClientError)
120
+ end
121
+
122
+ it 'raises OtherHttpError for other status response codes' do
123
+ connection = faraday_connection do |stubs|
124
+ stubs.get('http://httpbin.org/status/418') { |env| [418, {}, nil] }
125
+ end
126
+
127
+ expect { http_client(connection).get('http://httpbin.org/status/418') }.to raise_error(RestfulResource::HttpClient::OtherHttpError)
55
128
  end
56
129
  end
57
130
 
58
131
  describe 'Authentication' do
59
- before :each do
60
- @http_client = RestfulResource::HttpClient.new(username: 'user', password: 'passwd')
132
+ def http_client(connection)
133
+ described_class.new(connection: connection, username: 'user', password: 'passwd')
61
134
  end
62
135
 
63
136
  it 'should execute authenticated get' do
64
- response = @http_client.get('http://httpbin.org/basic-auth/user/passwd')
137
+ connection = faraday_connection do |stubs|
138
+ stubs.get('http://httpbin.org/basic-auth/user/passwd', { "Authorization"=>"Basic dXNlcjpwYXNzd2Q=" }) { |env| [200, {}, nil] }
139
+ end
140
+
141
+ response = http_client(connection).get('http://httpbin.org/basic-auth/user/passwd')
142
+
65
143
  expect(response.status).to eq 200
66
144
  end
67
145
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Santoro
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-18 00:00:00.000000000 Z
12
+ date: 2016-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -199,6 +199,7 @@ files:
199
199
  - spec/restful_resource/associations_spec.rb
200
200
  - spec/restful_resource/base_authorization_spec.rb
201
201
  - spec/restful_resource/base_spec.rb
202
+ - spec/restful_resource/http_client_configuration_spec.rb
202
203
  - spec/restful_resource/http_client_spec.rb
203
204
  - spec/restful_resource/open_object_spec.rb
204
205
  - spec/restful_resource/rails_validations_spec.rb
@@ -234,6 +235,7 @@ test_files:
234
235
  - spec/restful_resource/associations_spec.rb
235
236
  - spec/restful_resource/base_authorization_spec.rb
236
237
  - spec/restful_resource/base_spec.rb
238
+ - spec/restful_resource/http_client_configuration_spec.rb
237
239
  - spec/restful_resource/http_client_spec.rb
238
240
  - spec/restful_resource/open_object_spec.rb
239
241
  - spec/restful_resource/rails_validations_spec.rb