hyperclient 0.6.1 → 0.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 743f6bc67f84cca3d8e2994ad47a38d7e031a300
4
- data.tar.gz: 689b06b2eb057ca7bd28e74071ecca60ba954344
3
+ metadata.gz: 0fef7b6957e239321aff88f157c57b669cdaa388
4
+ data.tar.gz: 5e1fc8350dbd97205743d716146a4b148202034e
5
5
  SHA512:
6
- metadata.gz: 17ea7ceb37ecc125395b13d37caf7e134b7b9ef1e21ee258a1d92309f2cc3fadbe398916c3642b50cda8ccd62260b57d5eea3b38f786c4c03a2fea5a97f6e1f2
7
- data.tar.gz: 1f5b27c757676834dfb1aaa33741b7be19ce09e9822c869f4ecabcaceeaac868799eb96a92e0b4ecdc0290e807a0fc6fff6cba924f2270ef0e01204cb8e08e77
6
+ metadata.gz: 8f005fb328d44e78d11d443184361a8709422977c10a574ef98d8a21694acb72930058ca05075d06baa5290be17502060f5efe09b9d604264f2d9f8a26ec9171
7
+ data.tar.gz: 7c587f7c4abfc82e571b3dc8a3b571521d13c077a84d12aca7497777b894630b648adf87e296e2f3f2d4806c3ed31a91152d8ced262f0dc9305a8f6814485da0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
- ### Next
1
+ ### 0.7.0 (February 23, 2015)
2
2
 
3
- * Your contribution here.
3
+ This version introduces several backwards incompatible changes. See [UPGRADING](UPGRADING.md) for details.
4
+
5
+ * [#80](https://github.com/codegram/hyperclient/pull/80): Faraday options can be passed to the connection on initialization - [@koenpunt](https://github.com/koenpunt).
6
+ * [#81](https://github.com/codegram/hyperclient/pull/81): The default Content-Type is now `application/hal+json` - [@koenpunt](https://github.com/koenpunt).
4
7
 
5
8
  ### 0.6.1 (October 17, 2014)
6
9
 
data/Gemfile CHANGED
@@ -13,4 +13,4 @@ gem 'redcarpet'
13
13
  gem 'yard', '~> 0.8'
14
14
  gem 'yard-tomdoc'
15
15
  gem 'simplecov', require: false
16
- gem 'rubocop', '~> 0.26.0', require: false
16
+ gem 'rubocop', '~> 0.27.0', require: false
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Hyperclient
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/codegram/hyperclient.png)](http://travis-ci.org/codegram/hyperclient)
4
- [![Dependency Status](https://gemnasium.com/codegram/hyperclient.png)](http://gemnasium.com/codegram/hyperclient)
5
- [![Code Climate](https://codeclimate.com/github/codegram/hyperclient.png)](https://codeclimate.com/github/codegram/hyperclient)
3
+ [![Gem Version](http://img.shields.io/gem/v/hyperclient.svg)](http://badge.fury.io/rb/hyperclient)
4
+ [![Build Status](http://img.shields.io/travis/codegram/hyperclient.svg)](https://travis-ci.org/codegram/hyperclient)
5
+ [![Dependency Status](https://gemnasium.com/codegram/hyperclient.svg)](https://gemnasium.com/codegram/hyperclient)
6
+ [![Code Climate](https://codeclimate.com/github/codegram/hyperclient.svg)](https://codeclimate.com/github/codegram/hyperclient)
7
+ [![Coverage Status](https://img.shields.io/coveralls/codegram/hyperclient.svg)](https://coveralls.io/r/codegram/hyperclient?branch=master)
6
8
 
7
9
  Hyperclient is a Hypermedia API client written in Ruby. It fully supports [JSON HAL](http://stateless.co/hal_specification.html).
8
10
 
@@ -20,7 +22,7 @@ require 'hyperclient'
20
22
  api = Hyperclient.new('https://grape-with-roar.herokuapp.com/api')
21
23
  ```
22
24
 
23
- By default, Hyperclient adds `application/json` as `Content-Type` and `Accept` headers. It will also send requests as JSON and parse JSON responses. Specify additional headers or authentication if necessary.
25
+ By default, Hyperclient adds `application/hal+json` as `Content-Type` and `Accept` headers. It will also send requests as JSON and parse JSON responses. Specify additional headers or authentication if necessary.
24
26
 
25
27
  ```ruby
26
28
  api = Hyperclient.new('https://grape-with-roar.herokuapp.com/api') do |client|
@@ -38,6 +40,24 @@ api = Hyperclient.new('https://grape-with-roar.herokuapp.com/api') do |client|
38
40
  end
39
41
  ```
40
42
 
43
+ You can pass options to the Faraday connection block in the `connection` block:
44
+
45
+ ```ruby
46
+ api = Hyperclient.new('https://grape-with-roar.herokuapp.com/api') do |client|
47
+ client.connection(ssl: { verify: false }) do |conn|
48
+ conn.use Faraday::Request::OAuth
49
+ end
50
+ end
51
+ ```
52
+
53
+ Or when using the default connection configuration you can use `faraday_options`:
54
+
55
+ ```ruby
56
+ api = Hyperclient.new('https://grape-with-roar.herokuapp.com/api') do |client|
57
+ client.faraday_options = { ssl: { verify: false } }
58
+ end
59
+ ```
60
+
41
61
  You can build a new Faraday connection block without inheriting default middleware by specifying `default: false` in the `connection` block.
42
62
 
43
63
  ```ruby
@@ -170,6 +190,7 @@ describe Acme::Api do
170
190
  let(:client) do
171
191
  Hyperclient.new('http://example.org/api') do |client|
172
192
  client.connection(default: false) do |conn|
193
+ conn.request :json
173
194
  conn.response :json
174
195
  conn.use Faraday::Adapter::Rack, app
175
196
  end
data/Rakefile CHANGED
File without changes
data/UPGRADING.md CHANGED
@@ -1,6 +1,19 @@
1
1
  Upgrading Hyperclient
2
2
  =====================
3
3
 
4
+ ### Upgrading to >= 0.7.0
5
+
6
+ #### Changes in default headers
7
+
8
+ The default `Content-Type` is now `application/hal+json` and the `Accept` header includes `application/hal+json` as well.
9
+ If your API only accepts `application/json` as Content-Type, you can override the default headers in the client initialization block as such:
10
+
11
+ ```rb
12
+ Hyperclient.new('https://api.example.org/') do |client|
13
+ client.headers = { 'Content-Type' => 'application/json', 'Accept' => 'application/json,application/hal+json' }
14
+ end
15
+ ```
16
+
4
17
  ### Upgrading to >= 0.6.0
5
18
 
6
19
  #### Changes in HTTP Error Handling
@@ -6,7 +6,9 @@ class Spinach::Features::DefaultConfig < Spinach::FeatureSteps
6
6
  end
7
7
 
8
8
  step 'the request should have been sent with the correct JSON headers' do
9
- assert_requested :get, 'api.example.org', headers: { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
9
+ assert_requested :get, 'api.example.org', headers: {
10
+ 'Content-Type' => 'application/hal+json', 'Accept' => 'application/hal+json,application/json'
11
+ }
10
12
  end
11
13
 
12
14
  step 'I send some data to the API' do
@@ -5,9 +5,9 @@ module API
5
5
  include Spinach::Fixtures
6
6
 
7
7
  before do
8
- stub_request(:any, %r{api.example.org*}).to_return(body: root_response, headers: { 'Content-Type' => 'application/json' })
9
- stub_request(:get, 'api.example.org/posts').to_return(body: posts_response, headers: { 'Content-Type' => 'application/json' })
10
- stub_request(:get, 'api.example.org/posts/1').to_return(body: post_response, headers: { 'Content-Type' => 'application/json' })
8
+ stub_request(:any, %r{api.example.org*}).to_return(body: root_response, headers: { 'Content-Type' => 'application/hal+json' })
9
+ stub_request(:get, 'api.example.org/posts').to_return(body: posts_response, headers: { 'Content-Type' => 'application/hal+json' })
10
+ stub_request(:get, 'api.example.org/posts/1').to_return(body: post_response, headers: { 'Content-Type' => 'application/hal+json' })
11
11
  end
12
12
 
13
13
  def api
data/hyperclient.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.add_dependency 'faraday', '~> 0.8'
18
18
  gem.add_dependency 'futuroscope', '>= 0.0.10'
19
19
  gem.add_dependency 'faraday_middleware', '~> 0.9'
20
+ gem.add_dependency 'faraday_hal_middleware', '~> 0.0.1'
20
21
  gem.add_dependency 'uri_template', '~> 0.5'
21
22
  gem.add_dependency 'net-http-digest_auth', '~> 1.2'
22
23
  gem.add_dependency 'faraday-digestauth', '~> 0.2'
@@ -1,5 +1,6 @@
1
1
  require 'hyperclient/link'
2
2
  require 'faraday_middleware'
3
+ require 'faraday_hal_middleware'
3
4
  require_relative '../faraday/connection'
4
5
 
5
6
  module Hyperclient
@@ -20,7 +21,7 @@ module Hyperclient
20
21
  # client = Hyperclient::EntryPoint.new('http://my.api.org')
21
22
  #
22
23
  # client = Hyperclient::EntryPoint.new('http://my.api.org') do |entry_point|
23
- # entry_point.connection(default: true) do |conn|
24
+ # entry_point.connection do |conn|
24
25
  # conn.use Faraday::Request::OAuth
25
26
  # end
26
27
  # entry_point.headers['Access-Token'] = 'token'
@@ -47,22 +48,31 @@ module Hyperclient
47
48
  # default - Set to true to reuse default Faraday connection options.
48
49
  #
49
50
  # Returns a Faraday::Connection.
50
- def connection(options = { default: true }, &block)
51
+ def connection(options = {}, &block)
52
+ @faraday_options ||= options.dup
51
53
  if block_given?
52
54
  fail ConnectionAlreadyInitializedError if @connection
53
- if options[:default]
55
+ if @faraday_options.delete(:default) == false
56
+ @faraday_block = block
57
+ else
54
58
  @faraday_block = lambda do |conn|
55
59
  default_faraday_block.call conn
56
60
  block.call conn
57
61
  end
58
- else
59
- @faraday_block = block
60
62
  end
61
63
  else
62
- @connection ||= Faraday.new(_url, { headers: headers }, &faraday_block)
64
+ @connection ||= Faraday.new(_url, faraday_options, &faraday_block)
63
65
  end
64
66
  end
65
67
 
68
+ # Public: Headers included with every API request.
69
+ #
70
+ # Returns a Hash.
71
+ def headers
72
+ return @connection.headers if @connection
73
+ @headers ||= default_headers
74
+ end
75
+
66
76
  # Public: Set headers.
67
77
  #
68
78
  # value - A Hash containing headers to include with every API request.
@@ -71,12 +81,19 @@ module Hyperclient
71
81
  @headers = value
72
82
  end
73
83
 
74
- # Public: Headers included with every API request.
84
+ # Public: Options passed to Faraday
75
85
  #
76
86
  # Returns a Hash.
77
- def headers
78
- return @connection.headers if @connection
79
- @headers ||= default_headers
87
+ def faraday_options
88
+ (@faraday_options ||= {}).merge(headers: headers)
89
+ end
90
+
91
+ # Public: Set Faraday connection options.
92
+ #
93
+ # value - A Hash containing options to pass to Faraday
94
+ def faraday_options=(value)
95
+ fail ConnectionAlreadyInitializedError if @connection
96
+ @faraday_options = value
80
97
  end
81
98
 
82
99
  # Public: Faraday block used with every API request.
@@ -109,8 +126,8 @@ module Hyperclient
109
126
  lambda do |conn|
110
127
  conn.use Faraday::Response::RaiseError
111
128
  conn.use FaradayMiddleware::FollowRedirects
112
- conn.request :json
113
- conn.response :json, content_type: /\bjson$/
129
+ conn.request :hal_json
130
+ conn.response :hal_json, content_type: /\bjson$/
114
131
  conn.adapter :net_http
115
132
  end
116
133
  end
@@ -120,7 +137,7 @@ module Hyperclient
120
137
  #
121
138
  # Returns a Hash.
122
139
  def default_headers
123
- { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
140
+ { 'Content-Type' => 'application/hal+json', 'Accept' => 'application/hal+json,application/json' }
124
141
  end
125
142
  end
126
143
  end
@@ -1,3 +1,3 @@
1
1
  module Hyperclient
2
- VERSION = '0.6.1'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -14,8 +14,8 @@ module Hyperclient
14
14
  end
15
15
 
16
16
  it 'creates a Faraday connection with the default headers' do
17
- entry_point.headers['Content-Type'].must_equal 'application/json'
18
- entry_point.headers['Accept'].must_equal 'application/json'
17
+ entry_point.headers['Content-Type'].must_equal 'application/hal+json'
18
+ entry_point.headers['Accept'].must_equal 'application/hal+json,application/json'
19
19
  end
20
20
 
21
21
  it 'can update headers after a connection has been constructed' do
@@ -35,8 +35,8 @@ module Hyperclient
35
35
  handlers = entry_point.connection.builder.handlers
36
36
  handlers.must_include Faraday::Response::RaiseError
37
37
  handlers.must_include FaradayMiddleware::FollowRedirects
38
- handlers.must_include FaradayMiddleware::EncodeJson
39
- handlers.must_include FaradayMiddleware::ParseJson
38
+ handlers.must_include FaradayMiddleware::EncodeHalJson
39
+ handlers.must_include FaradayMiddleware::ParseHalJson
40
40
  handlers.must_include Faraday::Adapter::NetHttp
41
41
  end
42
42
 
@@ -57,74 +57,122 @@ module Hyperclient
57
57
  end
58
58
  end
59
59
  end
60
- end
61
60
 
62
- describe 'custom' do
63
- let(:entry_point) do
64
- EntryPoint.new 'http://my.api.org' do |entry_point|
65
- entry_point.connection(default: false) do |conn|
66
- conn.request :json
67
- conn.response :json, content_type: /\bjson$/
68
- conn.adapter :net_http
61
+ describe 'faraday_options' do
62
+ let(:entry_point) do
63
+ EntryPoint.new 'http://my.api.org' do |entry_point|
64
+ entry_point.faraday_options = { proxy: 'http://my.proxy:8080' }
69
65
  end
66
+ end
70
67
 
71
- entry_point.headers = {
72
- 'Content-Type' => 'application/foobar',
73
- 'Accept' => 'application/foobar'
74
- }
68
+ describe 'connection' do
69
+ it 'creates a Faraday connection with the entry point url' do
70
+ entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
71
+ end
72
+
73
+ it 'creates a Faraday connection with the default headers' do
74
+ entry_point.headers['Content-Type'].must_equal 'application/hal+json'
75
+ entry_point.headers['Accept'].must_equal 'application/hal+json,application/json'
76
+ end
77
+
78
+ it 'creates a Faraday connection with options' do
79
+ entry_point.connection.proxy.must_be_kind_of Faraday::ProxyOptions
80
+ entry_point.connection.proxy.uri.to_s.must_equal 'http://my.proxy:8080'
81
+ end
75
82
  end
76
83
  end
77
84
 
78
- describe 'connection' do
79
- it 'creates a Faraday connection with the entry point url' do
80
- entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
85
+ describe 'options' do
86
+ let(:entry_point) do
87
+ EntryPoint.new 'http://my.api.org' do |entry_point|
88
+ entry_point.connection(proxy: 'http://my.proxy:8080')
89
+ end
81
90
  end
82
91
 
83
- it 'creates a Faraday connection with non-default headers' do
84
- entry_point.headers['Content-Type'].must_equal 'application/foobar'
85
- entry_point.headers['Accept'].must_equal 'application/foobar'
86
- end
92
+ describe 'connection' do
93
+ it 'creates a Faraday connection with the entry point url' do
94
+ entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
95
+ end
96
+
97
+ it 'creates a Faraday connection with the default headers' do
98
+ entry_point.headers['Content-Type'].must_equal 'application/hal+json'
99
+ entry_point.headers['Accept'].must_equal 'application/hal+json,application/json'
100
+ end
87
101
 
88
- it 'creates a Faraday connection with the default block' do
89
- handlers = entry_point.connection.builder.handlers
90
- handlers.wont_include Faraday::Response::RaiseError
91
- handlers.wont_include FaradayMiddleware::FollowRedirects
92
- handlers.must_include FaradayMiddleware::EncodeJson
93
- handlers.must_include FaradayMiddleware::ParseJson
94
- handlers.must_include Faraday::Adapter::NetHttp
102
+ it 'creates a Faraday connection with options' do
103
+ entry_point.connection.proxy.must_be_kind_of Faraday::ProxyOptions
104
+ entry_point.connection.proxy.uri.to_s.must_equal 'http://my.proxy:8080'
105
+ end
95
106
  end
96
107
  end
97
- end
98
108
 
99
- describe 'inherited' do
100
- let(:entry_point) do
101
- EntryPoint.new 'http://my.api.org' do |entry_point|
102
- entry_point.connection(default: true) do |conn|
103
- conn.use Faraday::Request::OAuth
109
+ describe 'custom' do
110
+ let(:entry_point) do
111
+ EntryPoint.new 'http://my.api.org' do |entry_point|
112
+ entry_point.connection(default: false) do |conn|
113
+ conn.request :json
114
+ conn.response :json, content_type: /\bjson$/
115
+ conn.adapter :net_http
116
+ end
117
+
118
+ entry_point.headers = {
119
+ 'Content-Type' => 'application/foobar',
120
+ 'Accept' => 'application/foobar'
121
+ }
104
122
  end
105
- entry_point.headers['Access-Token'] = 'token'
106
123
  end
107
- end
108
124
 
109
- describe 'connection' do
110
- it 'creates a Faraday connection with the default and additional headers' do
111
- entry_point.headers['Content-Type'].must_equal 'application/json'
112
- entry_point.headers['Accept'].must_equal 'application/json'
113
- entry_point.headers['Access-Token'].must_equal 'token'
125
+ describe 'connection' do
126
+ it 'creates a Faraday connection with the entry point url' do
127
+ entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
128
+ end
129
+
130
+ it 'creates a Faraday connection with non-default headers' do
131
+ entry_point.headers['Content-Type'].must_equal 'application/foobar'
132
+ entry_point.headers['Accept'].must_equal 'application/foobar'
133
+ end
134
+
135
+ it 'creates a Faraday connection with the default block' do
136
+ handlers = entry_point.connection.builder.handlers
137
+ handlers.wont_include Faraday::Response::RaiseError
138
+ handlers.wont_include FaradayMiddleware::FollowRedirects
139
+ handlers.must_include FaradayMiddleware::EncodeJson
140
+ handlers.must_include FaradayMiddleware::ParseJson
141
+ handlers.must_include Faraday::Adapter::NetHttp
142
+ end
114
143
  end
144
+ end
115
145
 
116
- it 'creates a Faraday connection with the entry point url' do
117
- entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
146
+ describe 'inherited' do
147
+ let(:entry_point) do
148
+ EntryPoint.new 'http://my.api.org' do |entry_point|
149
+ entry_point.connection do |conn|
150
+ conn.use Faraday::Request::OAuth
151
+ end
152
+ entry_point.headers['Access-Token'] = 'token'
153
+ end
118
154
  end
119
155
 
120
- it 'creates a Faraday connection with the default block plus any additional handlers' do
121
- handlers = entry_point.connection.builder.handlers
122
- handlers.must_include Faraday::Request::OAuth
123
- handlers.must_include Faraday::Response::RaiseError
124
- handlers.must_include FaradayMiddleware::FollowRedirects
125
- handlers.must_include FaradayMiddleware::EncodeJson
126
- handlers.must_include FaradayMiddleware::ParseJson
127
- handlers.must_include Faraday::Adapter::NetHttp
156
+ describe 'connection' do
157
+ it 'creates a Faraday connection with the default and additional headers' do
158
+ entry_point.headers['Content-Type'].must_equal 'application/hal+json'
159
+ entry_point.headers['Accept'].must_equal 'application/hal+json,application/json'
160
+ entry_point.headers['Access-Token'].must_equal 'token'
161
+ end
162
+
163
+ it 'creates a Faraday connection with the entry point url' do
164
+ entry_point.connection.url_prefix.to_s.must_equal 'http://my.api.org/'
165
+ end
166
+
167
+ it 'creates a Faraday connection with the default block plus any additional handlers' do
168
+ handlers = entry_point.connection.builder.handlers
169
+ handlers.must_include Faraday::Request::OAuth
170
+ handlers.must_include Faraday::Response::RaiseError
171
+ handlers.must_include FaradayMiddleware::FollowRedirects
172
+ handlers.must_include FaradayMiddleware::EncodeHalJson
173
+ handlers.must_include FaradayMiddleware::ParseHalJson
174
+ handlers.must_include Faraday::Adapter::NetHttp
175
+ end
128
176
  end
129
177
  end
130
178
  end
@@ -108,7 +108,10 @@ module Hyperclient
108
108
  Resource.expects(:new)
109
109
 
110
110
  link = Link.new('key', { 'href' => '/' }, entry_point)
111
- stub_request(:get, 'http://api.example.org/').to_return(body: {})
111
+
112
+ stub_request(entry_point.connection) do |stub|
113
+ stub.get('http://api.example.org/') { [200, {}, nil] }
114
+ end
112
115
 
113
116
  link._resource
114
117
  end
@@ -124,14 +127,20 @@ module Hyperclient
124
127
  it 'sends a GET request with the link url' do
125
128
  link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
126
129
 
127
- stub_request(:get, 'http://api.example.org/productions/1').to_return(body: nil)
130
+ stub_request(entry_point.connection) do |stub|
131
+ stub.get('http://api.example.org/productions/1') { [200, {}, nil] }
132
+ end
133
+
128
134
  link._get.must_be_kind_of Resource
129
135
  end
130
136
 
131
137
  it 'raises exceptions by default' do
132
138
  link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
133
139
 
134
- stub_request(:get, 'http://api.example.org/productions/1').to_return(status: 400)
140
+ stub_request(entry_point.connection) do |stub|
141
+ stub.get('http://api.example.org/productions/1') { [400, {}, nil] }
142
+ end
143
+
135
144
  lambda { link._get }.must_raise Faraday::ClientError
136
145
  end
137
146
  end
@@ -140,7 +149,10 @@ module Hyperclient
140
149
  it 'sends a OPTIONS request with the link url' do
141
150
  link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
142
151
 
143
- stub_request(:options, 'http://api.example.org/productions/1').to_return(body: nil)
152
+ stub_request(entry_point.connection) do |stub|
153
+ stub.options('http://api.example.org/productions/1') { [200, {}, nil] }
154
+ end
155
+
144
156
  link._options.must_be_kind_of Resource
145
157
  end
146
158
  end
@@ -148,7 +160,11 @@ module Hyperclient
148
160
  describe '_head' do
149
161
  it 'sends a HEAD request with the link url' do
150
162
  link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
151
- stub_request(:head, 'http://api.example.org/productions/1').to_return(body: nil)
163
+
164
+ stub_request(entry_point.connection) do |stub|
165
+ stub.head('http://api.example.org/productions/1') { [200, {}, nil] }
166
+ end
167
+
152
168
  link._head.must_be_kind_of Resource
153
169
  end
154
170
  end
@@ -156,7 +172,11 @@ module Hyperclient
156
172
  describe '_delete' do
157
173
  it 'sends a DELETE request with the link url' do
158
174
  link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
159
- stub_request(:delete, 'http://api.example.org/productions/1').to_return(body: nil)
175
+
176
+ stub_request(entry_point.connection) do |stub|
177
+ stub.delete('http://api.example.org/productions/1') { [200, {}, nil] }
178
+ end
179
+
160
180
  link._delete.must_be_kind_of Resource
161
181
  end
162
182
  end
@@ -165,12 +185,20 @@ module Hyperclient
165
185
  let(:link) { Link.new('key', { 'href' => '/productions/1' }, entry_point) }
166
186
 
167
187
  it 'sends a POST request with the link url and params' do
168
- stub_request(:post, 'http://api.example.org/productions/1').to_return(body: nil)
188
+
189
+ stub_request(entry_point.connection) do |stub|
190
+ stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
191
+ end
192
+
169
193
  link._post('foo' => 'bar').must_be_kind_of Resource
170
194
  end
171
195
 
172
196
  it 'defaults params to an empty hash' do
173
- stub_request(:post, 'http://api.example.org/productions/1').to_return(body: nil)
197
+
198
+ stub_request(entry_point.connection) do |stub|
199
+ stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
200
+ end
201
+
174
202
  link._post.must_be_kind_of Resource
175
203
  end
176
204
  end
@@ -179,12 +207,20 @@ module Hyperclient
179
207
  let(:link) { Link.new('key', { 'href' => '/productions/1' }, entry_point) }
180
208
 
181
209
  it 'sends a PUT request with the link url and params' do
182
- stub_request(:put, 'http://api.example.org/productions/1').with(body: '{"foo":"bar"}').to_return(body: nil)
210
+
211
+ stub_request(entry_point.connection) do |stub|
212
+ stub.put('http://api.example.org/productions/1', '{"foo":"bar"}') { [200, {}, nil] }
213
+ end
214
+
183
215
  link._put('foo' => 'bar').must_be_kind_of Resource
184
216
  end
185
217
 
186
218
  it 'defaults params to an empty hash' do
187
- stub_request(:put, 'http://api.example.org/productions/1').to_return(body: nil)
219
+
220
+ stub_request(entry_point.connection) do |stub|
221
+ stub.put('http://api.example.org/productions/1') { [200, {}, nil] }
222
+ end
223
+
188
224
  link._put.must_be_kind_of Resource
189
225
  end
190
226
  end
@@ -193,12 +229,19 @@ module Hyperclient
193
229
  let(:link) { Link.new('key', { 'href' => '/productions/1' }, entry_point) }
194
230
 
195
231
  it 'sends a PATCH request with the link url and params' do
196
- stub_request(:patch, 'http://api.example.org/productions/1').with(body: '{"foo":"bar"}').to_return(body: nil)
232
+
233
+ stub_request(entry_point.connection) do |stub|
234
+ stub.patch('http://api.example.org/productions/1', '{"foo":"bar"}') { [200, {}, nil] }
235
+ end
236
+
197
237
  link._patch('foo' => 'bar').must_be_kind_of Resource
198
238
  end
199
239
 
200
240
  it 'defaults params to an empty hash' do
201
- stub_request(:patch, 'http://api.example.org/productions/1').to_return(body: nil)
241
+ stub_request(entry_point.connection) do |stub|
242
+ stub.patch('http://api.example.org/productions/1') { [200, {}, nil] }
243
+ end
244
+
202
245
  link._patch.must_be_kind_of Resource
203
246
  end
204
247
  end
@@ -216,14 +259,22 @@ module Hyperclient
216
259
  describe 'delegation' do
217
260
  it 'delegates when link key matches' do
218
261
  resource = Resource.new({ '_links' => { 'orders' => { 'href' => '/orders' } } }, entry_point)
219
- stub_request(:get, 'http://api.example.org/orders').to_return(body: { '_embedded' => { 'orders' => [{ 'id' => 1 }] } })
262
+
263
+ stub_request(entry_point.connection) do |stub|
264
+ stub.get('http://api.example.org/orders') { [200, {}, { '_embedded' => { 'orders' => [{ 'id' => 1 }] } }] }
265
+ end
266
+
220
267
  resource.orders._embedded.orders.first.id.must_equal 1
221
268
  resource.orders.first.id.must_equal 1
222
269
  end
223
270
 
224
271
  it "doesn't delegate when link key doesn't match" do
225
272
  resource = Resource.new({ '_links' => { 'foos' => { 'href' => '/orders' } } }, entry_point)
226
- stub_request(:get, 'http://api.example.org/orders').to_return(body: { '_embedded' => { 'orders' => [{ 'id' => 1 }] } })
273
+
274
+ stub_request(entry_point.connection) do |stub|
275
+ stub.get('http://api.example.org/orders') { [200, {}, { '_embedded' => { 'orders' => [{ 'id' => 1 }] } }] }
276
+ end
277
+
227
278
  resource.foos._embedded.orders.first.id.must_equal 1
228
279
  resource.foos.first.must_equal nil
229
280
  end
@@ -231,8 +282,11 @@ module Hyperclient
231
282
 
232
283
  describe 'resource' do
233
284
  before do
234
- stub_request(:get, 'http://myapi.org/orders')
235
- .to_return(body: '{"resource": "This is the resource"}')
285
+
286
+ stub_request(entry_point.connection) do |stub|
287
+ stub.get('http://myapi.org/orders') { [200, {}, '{"resource": "This is the resource"}'] }
288
+ end
289
+
236
290
  Resource.stubs(:new).returns(resource)
237
291
  end
238
292
 
@@ -20,8 +20,8 @@ describe Hyperclient do
20
20
  end
21
21
 
22
22
  it 'creates a Faraday connection with the default and additional headers' do
23
- client.headers['Content-Type'].must_equal 'application/json'
24
- client.headers['Accept'].must_equal 'application/json'
23
+ client.headers['Content-Type'].must_equal 'application/hal+json'
24
+ client.headers['Accept'].must_equal 'application/hal+json,application/json'
25
25
  client.headers['Access-Token'].must_equal 'token'
26
26
  end
27
27
 
@@ -34,8 +34,8 @@ describe Hyperclient do
34
34
  handlers.must_include Faraday::Request::OAuth
35
35
  handlers.must_include Faraday::Response::RaiseError
36
36
  handlers.must_include FaradayMiddleware::FollowRedirects
37
- handlers.must_include FaradayMiddleware::EncodeJson
38
- handlers.must_include FaradayMiddleware::ParseJson
37
+ handlers.must_include FaradayMiddleware::EncodeHalJson
38
+ handlers.must_include FaradayMiddleware::ParseHalJson
39
39
  handlers.must_include Faraday::Adapter::NetHttp
40
40
  end
41
41
  end
data/test/test_helper.rb CHANGED
@@ -5,6 +5,14 @@ require 'minitest/spec'
5
5
  require 'minitest/autorun'
6
6
  require 'mocha/setup'
7
7
  require 'turn'
8
- require 'webmock/minitest'
9
8
  require 'json'
10
9
  require 'pry'
10
+
11
+ MiniTest::Unit::TestCase.class_eval do
12
+
13
+ def stub_request(conn, adapter_class = Faraday::Adapter::Test, &stubs_block)
14
+ adapter_handler = conn.builder.handlers.find { |h| h.klass < Faraday::Adapter }
15
+ conn.builder.swap(adapter_handler, adapter_class, &stubs_block)
16
+ end
17
+
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oriol Gual
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-17 00:00:00.000000000 Z
11
+ date: 2015-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday_hal_middleware
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.1
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: uri_template
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -251,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
265
  version: '0'
252
266
  requirements: []
253
267
  rubyforge_project:
254
- rubygems_version: 2.1.11
268
+ rubygems_version: 2.4.5
255
269
  signing_key:
256
270
  specification_version: 4
257
271
  summary: ''