hyperclient 0.3.1 → 0.3.2

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: ca91418e4cc3c00e7b395bb10fe72199ede4921e
4
- data.tar.gz: 6bd818aaf9d3198503a400427cb531dbf3cf5211
3
+ metadata.gz: e2f8dcf578c3841e548076c5a1433d0fa7eb47f1
4
+ data.tar.gz: b347af17c5a9d7d00ac5a5e92605eb95b4c35842
5
5
  SHA512:
6
- metadata.gz: cb9da634649232d9712dfcec8d1590b42e54fd3fed3f39b013ebce5327cdd92317ecd22b054069e7d0fb26f7879b0ba9f8361da34b52621d663fc88ff403271d
7
- data.tar.gz: 002971bb90ff267effa042925ab314f864a040e070158810c3ba7e329ca47a7e2e659cab90ab72310202d660886acf6913dcbc0889e0c7582ad5cead89aea38e
6
+ metadata.gz: d3f7074ba0269e8145fc748952afdb8f4749bb5ae8b1fca2ffe9382c7505056feba1aec934a0dccd297d6743bbddb726c3fa4afa381d640a0374be81aece1187
7
+ data.tar.gz: 70db877e65d8807d6d6872e48d43034f0e5ca3cce60fc1859688ad214f4e39e2cddd89e3ce8270a565eb40b82642f969475f3874991015c95c4ff621db9107e0
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- hyperclient (0.3.1)
12
+ hyperclient (0.3.2)
13
13
  faraday (~> 0.8)
14
14
  faraday_middleware (~> 0.9)
15
15
  net-http-digest_auth (~> 1.2)
@@ -23,8 +23,8 @@ GEM
23
23
  coderay (1.0.6)
24
24
  colorize (0.5.8)
25
25
  crack (0.3.1)
26
- faraday (0.8.4)
27
- multipart-post (~> 1.1)
26
+ faraday (0.8.8)
27
+ multipart-post (~> 1.2.0)
28
28
  faraday_middleware (0.9.0)
29
29
  faraday (>= 0.7.4, < 0.9)
30
30
  ffi (1.0.11)
@@ -44,7 +44,7 @@ GEM
44
44
  mocha (0.13.1)
45
45
  metaclass (~> 0.0.1)
46
46
  multi_json (1.3.6)
47
- multipart-post (1.1.5)
47
+ multipart-post (1.2.0)
48
48
  net-http-digest_auth (1.2.1)
49
49
  pry (0.9.9.6)
50
50
  coderay (~> 1.0.5)
data/Readme.md CHANGED
@@ -13,12 +13,12 @@ Hyperclient is a Ruby Hypermedia API client written in Ruby.
13
13
 
14
14
  Example API client:
15
15
 
16
- ````ruby
16
+ ```ruby
17
17
  api = Hyperclient.new('http://myapp.com/api').tap do |api|
18
18
  api.digest_auth('user', 'password')
19
19
  api.headers.merge({'accept-encoding' => 'deflate, gzip'})
20
20
  end
21
- ````
21
+ ```
22
22
 
23
23
  By default, Hyperclient adds `application/json` as `Content-Type` and `Accept`
24
24
  headers. It will also sent requests as JSON and parse JSON responses.
@@ -37,60 +37,73 @@ Hyperclient will try to fetch and discover the resources from your API.
37
37
 
38
38
  Accessing the links for a given resource is quite straightforward:
39
39
 
40
- ````ruby
40
+ ```ruby
41
41
  api.links.posts_categories
42
42
  # => #<Resource ...>
43
- ````
43
+ ```
44
44
 
45
45
  You can also iterate between all the links:
46
46
 
47
- ````ruby
47
+ ```ruby
48
48
  api.links.each do |name, link|
49
49
  puts name, link.url
50
50
  end
51
- ````
51
+ ```
52
52
 
53
53
  Actually, you can call any [Enumerable][enumerable] method :D
54
54
 
55
55
  If a Resource doesn't have friendly name you can always access it as a Hash:
56
56
 
57
- ````ruby
57
+ ```ruby
58
58
  api.links['http://myapi.org/rels/post_categories']
59
- ````
59
+ ```
60
60
 
61
61
  ### Embedded resources
62
62
 
63
63
  Accessing embedded resources is similar to accessing links:
64
64
 
65
- ````ruby
65
+ ```ruby
66
66
  api.embedded.posts
67
- ````
67
+ ```
68
68
 
69
69
  And you can also iterate between them:
70
70
 
71
- ````ruby
71
+ ```ruby
72
72
  api.embedded.each do |name, resource|
73
73
  puts name, resource.attributes
74
74
  end
75
- ````
75
+ ```
76
76
 
77
77
  You can even chain different calls (this also applies for links):
78
78
 
79
- ````ruby
79
+ ```ruby
80
80
  api.embedded.posts.first.links.author
81
- ````
81
+ ```
82
82
 
83
83
  ### Attributes
84
84
 
85
85
  Not only you might have links and embedded resources in a Resource, but also
86
86
  its attributes:
87
87
 
88
- ````ruby
88
+ ```ruby
89
89
  api.embedded.posts.first.attributes
90
90
  # => {title: 'Linting the hell out of your Ruby classes with Pelusa',
91
91
  teaser: 'Gain new insights about your code thanks to static analysis',
92
92
  body: '...' }
93
- ````
93
+ ```
94
+
95
+ You can access the attribute values via attribute methods, or as a hash:
96
+
97
+ ```ruby
98
+ api.embedded.posts.first.attributes.title
99
+ # => 'Linting the hell out of your Ruby classes with Pelusa'
100
+
101
+ api.embedded.posts.first.attributes['title']
102
+ # => 'Linting the hell out of your Ruby classes with Pelusa'
103
+
104
+ api.embedded.posts.first.attributes.fetch('title')
105
+ # => 'Linting the hell out of your Ruby classes with Pelusa'
106
+ ```
94
107
 
95
108
  ### HTTP
96
109
 
@@ -100,7 +113,7 @@ with it, right?
100
113
  Hyperclient uses [Faraday][faraday] under the hood to perform HTTP calls. You can
101
114
  call any valid HTTP method on any Resource:
102
115
 
103
- ````ruby
116
+ ```ruby
104
117
  post = api.embedded.posts.first
105
118
  post.get
106
119
  post.head
@@ -111,22 +124,22 @@ post.options
111
124
 
112
125
  posts = api.links.posts
113
126
  posts.post({title: "I'm a blogger!", body: 'Wohoo!!'})
114
- ````
127
+ ```
115
128
 
116
129
  If you have a templated link you can expand it like so:
117
130
 
118
- ````ruby
131
+ ```ruby
119
132
  api.links.post.expand(:id => 3).first
120
133
  # => #<Resource ...>
121
- ````
134
+ ```
122
135
 
123
136
  You can access the Faraday connection (to add middlewares or do whatever
124
137
  you want) by calling `connection` on the entry point. As an example, you could use the [faraday-http-cache-middleware](https://github.com/plataformatec/faraday-http-cache)
125
138
  :
126
139
 
127
- ````ruby
140
+ ```ruby
128
141
  api.connection.use :http_cache
129
- ````
142
+ ```
130
143
 
131
144
  ## Other
132
145
 
@@ -9,13 +9,15 @@ module Hyperclient
9
9
  # resource.attributes.title
10
10
  #
11
11
  class Attributes < Collection
12
+ RESERVED_PROPERTIES = [/^_links$/, /^_embedded$/] # http://tools.ietf.org/html/draft-kelly-json-hal#section-4.1
13
+
12
14
  # Public: Initializes the Attributes of a Resource.
13
15
  #
14
16
  # representation - The hash with the HAL representation of the Resource.
15
17
  #
16
18
  def initialize(representation)
17
19
  @collection = if representation.is_a?(Hash)
18
- representation.delete_if {|key, value| key =~ /^_/}
20
+ representation.delete_if {|key, value| RESERVED_PROPERTIES.any? {|p| p.match(key) } }
19
21
  else
20
22
  representation
21
23
  end
@@ -25,6 +25,23 @@ module Hyperclient
25
25
  @collection.each(&block)
26
26
  end
27
27
 
28
+ def include?(obj)
29
+ @collection.include?(obj)
30
+ end
31
+
32
+ # Public: Returns a value from the collection for the given key.
33
+ # If the key can’t be found, there are several options:
34
+ # With no other arguments, it will raise an KeyError exception;
35
+ # if default is given, then that will be returned;
36
+ #
37
+ # key - A String or Symbol of the value to get from the collection.
38
+ # default - An optional value to be returned if the key is not found.
39
+ #
40
+ # Returns an Object.
41
+ def fetch(*args)
42
+ @collection.fetch(*args)
43
+ end
44
+
28
45
  # Public: Provides Hash-like access to the collection.
29
46
  #
30
47
  # name - A String or Symbol of the value to get from the collection.
@@ -37,9 +54,10 @@ module Hyperclient
37
54
  # Public: Returns the wrapped collection as a hash.
38
55
  #
39
56
  # Returns a Hash.
40
- def to_hash
57
+ def to_h
41
58
  @collection.to_hash
42
59
  end
60
+ alias_method :to_hash, :to_h
43
61
 
44
62
  def to_s
45
63
  to_hash
@@ -42,12 +42,57 @@ module Hyperclient
42
42
  return @link['href'] unless templated?
43
43
  raise MissingURITemplateVariablesException if @uri_variables == nil
44
44
 
45
- @url ||= URITemplate.new(@link['href']).expand(@uri_variables)
45
+ @url ||= uri_template.expand(@uri_variables)
46
+ end
47
+
48
+ # Public: Returns an array of variables from the URITemplate.
49
+ #
50
+ # Returns an empty array for regular URIs.
51
+ def variables
52
+ uri_template.variables
53
+ end
54
+
55
+ # Public: Returns the type property of the Link
56
+ def type
57
+ @link['type']
58
+ end
59
+
60
+ # Public: Returns the name property of the Link
61
+ def name
62
+ @link['name']
63
+ end
64
+
65
+ # Public: Returns the deprecation property of the Link
66
+ def deprecation
67
+ @link['deprecation']
68
+ end
69
+
70
+ # Public: Returns the profile property of the Link
71
+ def profile
72
+ @link['profile']
73
+ end
74
+
75
+ # Public: Returns the title property of the Link
76
+ def title
77
+ @link['title']
78
+ end
79
+
80
+ # Public: Returns the hreflang property of the Link
81
+ def hreflang
82
+ @link['hreflang']
46
83
  end
47
84
 
48
85
  # Public: Returns the Resource which the Link is pointing to.
49
86
  def resource
50
- @resource ||=Resource.new(get.body, @entry_point)
87
+ @resource ||= begin
88
+ response = get
89
+
90
+ if response.success?
91
+ Resource.new(response.body, @entry_point, response)
92
+ else
93
+ Resource.new(nil, @entry_point, response)
94
+ end
95
+ end
51
96
  end
52
97
 
53
98
  def connection
@@ -70,15 +115,15 @@ module Hyperclient
70
115
  connection.delete(url)
71
116
  end
72
117
 
73
- def post(params)
118
+ def post(params = {})
74
119
  connection.post(url, params)
75
120
  end
76
121
 
77
- def put(params)
122
+ def put(params = {})
78
123
  connection.put(url, params)
79
124
  end
80
125
 
81
- def patch(params)
126
+ def patch(params = {})
82
127
  connection.patch(url, params)
83
128
  end
84
129
 
@@ -104,6 +149,19 @@ module Hyperclient
104
149
  def respond_to_missing?(method, include_private = false)
105
150
  resource.respond_to?(method.to_s)
106
151
  end
152
+
153
+ # Internal: avoid delegating to resource
154
+ #
155
+ # #to_ary is called for implicit array coersion (such as parallel assignment
156
+ # or Array#flatten). Returning nil tells Ruby that this record is not Array-like.
157
+ def to_ary
158
+ nil
159
+ end
160
+
161
+ # Internal: Memoization for a URITemplate instance
162
+ def uri_template
163
+ @uri_template ||= URITemplate.new(@link['href'])
164
+ end
107
165
  end
108
166
 
109
167
  # Public: Exception that is raised when building a templated Link without uri
@@ -30,6 +30,7 @@ module Hyperclient
30
30
  #
31
31
  # Returns a Link or an array of Links when given an Array.
32
32
  def build_link(link_or_links, entry_point)
33
+ return unless link_or_links
33
34
  return Link.new(link_or_links, entry_point) unless link_or_links.respond_to?(:to_ary)
34
35
 
35
36
  link_or_links.collect do |link|
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  require 'hyperclient/attributes'
2
3
  require 'hyperclient/link_collection'
3
4
  require 'hyperclient/resource_collection'
@@ -18,6 +19,10 @@ module Hyperclient
18
19
  # ResourceCollection.
19
20
  attr_reader :embedded
20
21
 
22
+ # Public: Returns the response object for the HTTP request that created this
23
+ # resource, if one exists.
24
+ attr_reader :response
25
+
21
26
  # Public: Delegate all HTTP methods (get, post, put, delete, options and
22
27
  # head) to its self link.
23
28
  def_delegators :self_link, :get, :post, :put, :delete, :options, :head
@@ -26,17 +31,27 @@ module Hyperclient
26
31
  #
27
32
  # representation - The hash with the HAL representation of the Resource.
28
33
  # entry_point - The EntryPoint object to inject the configutation.
29
- def initialize(representation, entry_point)
34
+ def initialize(representation, entry_point, response=nil)
35
+ representation = representation ? representation.dup : {}
30
36
  @links = LinkCollection.new(representation['_links'], entry_point)
31
37
  @embedded = ResourceCollection.new(representation['_embedded'], entry_point)
32
38
  @attributes = Attributes.new(representation)
33
39
  @entry_point = entry_point
40
+ @response = response
34
41
  end
35
42
 
36
43
  def inspect
37
44
  "#<#{self.class.name} self_link:#{self_link.inspect} attributes:#{@attributes.inspect}>"
38
45
  end
39
46
 
47
+ def success?
48
+ response && response.success?
49
+ end
50
+
51
+ def status
52
+ response && response.status
53
+ end
54
+
40
55
  private
41
56
  # Internal: Returns the self Link of the Resource. Used to handle the HTTP
42
57
  # methods.
@@ -1,3 +1,3 @@
1
1
  module Hyperclient
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
@@ -14,11 +14,13 @@
14
14
  {
15
15
  "href": "/gizmos/2"
16
16
  }
17
- ]
17
+ ],
18
+ "null_link": null
18
19
  },
19
20
  "title": "Real World ASP.NET MVC3",
20
21
  "description": "In this advanced, somewhat-opinionated production you'll get your very own startup off the ground using ASP.NET MVC 3...",
21
22
  "permitted": true,
23
+ "_hidden_attribute": "useful value",
22
24
  "_embedded": {
23
25
  "author": {
24
26
  "_links": {
@@ -59,4 +61,4 @@
59
61
  }
60
62
  ]
61
63
  }
62
- }
64
+ }
@@ -19,6 +19,20 @@ module Hyperclient
19
19
  attributes.wont_respond_to :_embedded
20
20
  end
21
21
 
22
+ it 'sets normal attributes' do
23
+ attributes.must_respond_to :permitted
24
+ attributes.permitted.must_equal true
25
+
26
+ attributes.must_respond_to :title
27
+ attributes.title.must_equal "Real World ASP.NET MVC3"
28
+ end
29
+
30
+ # Underscores should be allowed per http://tools.ietf.org/html/draft-kelly-json-hal#appendix-B.4
31
+ it 'sets _hidden_attribute as an attribute' do
32
+ attributes.must_respond_to :_hidden_attribute
33
+ attributes._hidden_attribute.must_equal 'useful value'
34
+ end
35
+
22
36
  it 'is a collection' do
23
37
  Attributes.ancestors.must_include Collection
24
38
  end
@@ -32,7 +32,7 @@ module Hyperclient
32
32
  name
33
33
  end
34
34
 
35
- names.must_equal ['_links', 'title', 'description', 'permitted', '_embedded']
35
+ names.must_equal ['_links', 'title', 'description', 'permitted', '_hidden_attribute', '_embedded']
36
36
  end
37
37
 
38
38
  describe '#to_hash' do
@@ -40,6 +40,37 @@ module Hyperclient
40
40
  collection.to_hash.must_be_kind_of Hash
41
41
  end
42
42
  end
43
+
44
+ describe 'include?' do
45
+ it 'returns true for keys that exist' do
46
+ collection.include?('_links').must_equal true
47
+ end
48
+
49
+ it 'returns false for missing keys' do
50
+ collection.include?('missing key').must_equal false
51
+ end
52
+ end
53
+
54
+ describe '#fetch' do
55
+ it 'returns the value for keys that exist' do
56
+ collection.fetch('title').must_equal "Real World ASP.NET MVC3"
57
+ end
58
+
59
+ it 'raises an error for missing keys' do
60
+ Proc.new { collection.fetch('missing key') }.must_raise KeyError
61
+ end
62
+
63
+ describe 'with a default value' do
64
+ it 'returns the value for keys that exist' do
65
+ collection.fetch('title', 'default').must_equal "Real World ASP.NET MVC3"
66
+ end
67
+
68
+ it 'returns the default value for missing keys' do
69
+ collection.fetch('missing key', 'default').must_equal 'default'
70
+ end
71
+ end
72
+ end
73
+
43
74
  end
44
75
  end
45
76
 
@@ -43,5 +43,12 @@ module Hyperclient
43
43
  end
44
44
  end
45
45
  end
46
+
47
+ describe "null link value" do
48
+ let(:null_link) { links.null_link }
49
+ it 'must be nil' do
50
+ null_link.must_be_nil
51
+ end
52
+ end
46
53
  end
47
54
  end
@@ -8,6 +8,20 @@ module Hyperclient
8
8
  EntryPoint.new('http://api.example.org/')
9
9
  end
10
10
 
11
+ %w(type deprecation name profile title hreflang).each do |prop|
12
+ describe prop do
13
+ it "returns the property value" do
14
+ link = Link.new({prop => 'value'}, entry_point)
15
+ link.send(prop).must_equal 'value'
16
+ end
17
+
18
+ it 'returns nil if the property is not present' do
19
+ link = Link.new({}, entry_point)
20
+ link.send(prop).must_equal nil
21
+ end
22
+ end
23
+ end
24
+
11
25
  describe 'templated?' do
12
26
  it 'returns true if the link is templated' do
13
27
  link = Link.new({'templated' => true}, entry_point)
@@ -22,6 +36,20 @@ module Hyperclient
22
36
  end
23
37
  end
24
38
 
39
+ describe 'variables' do
40
+ it 'returns a list of required variables' do
41
+ link = Link.new({'href' => '/orders{?id,owner}', 'templated' => true}, entry_point)
42
+
43
+ link.variables.must_equal ['id', 'owner']
44
+ end
45
+
46
+ it 'returns an empty array for untemplated links' do
47
+ link = Link.new({'href' => '/orders'}, entry_point)
48
+
49
+ link.variables.must_equal []
50
+ end
51
+ end
52
+
25
53
  describe 'expand' do
26
54
  it 'buils a Link with the templated URI representation' do
27
55
  link = Link.new({'href' => '/orders{?id}', 'templated' => true}, entry_point)
@@ -58,10 +86,23 @@ module Hyperclient
58
86
 
59
87
  describe 'resource' do
60
88
  it 'builds a resource with the link href representation' do
61
- Resource.expects(:new).with({}, entry_point)
89
+ mock_response = mock(body: {}, success?: true)
90
+
91
+ Resource.expects(:new).with({}, entry_point, mock_response)
92
+
93
+ link = Link.new({'href' => '/'}, entry_point)
94
+ link.expects(:get).returns(mock_response)
95
+
96
+ link.resource
97
+ end
98
+
99
+ it "has an empty body when the response fails" do
100
+ mock_response = mock(success?: false)
101
+
102
+ Resource.expects(:new).with(nil, entry_point, mock_response)
62
103
 
63
104
  link = Link.new({'href' => '/'}, entry_point)
64
- link.expects(:get).returns(mock(body: {}))
105
+ link.expects(:get).returns(mock_response)
65
106
 
66
107
  link.resource
67
108
  end
@@ -110,30 +151,45 @@ module Hyperclient
110
151
  end
111
152
 
112
153
  describe 'post' do
113
- it 'sends a POST request with the link url and params' do
114
- link = Link.new({'href' => '/productions/1'}, entry_point)
154
+ let(:link) { Link.new({'href' => '/productions/1'}, entry_point) }
115
155
 
156
+ it 'sends a POST request with the link url and params' do
116
157
  entry_point.connection.expects(:post).with('/productions/1', {'foo' => 'bar'})
117
158
  link.post({'foo' => 'bar'})
118
159
  end
160
+
161
+ it 'defaults params to an empty hash' do
162
+ entry_point.connection.expects(:post).with('/productions/1', {})
163
+ link.post
164
+ end
119
165
  end
120
166
 
121
167
  describe 'put' do
122
- it 'sends a PUT request with the link url and params' do
123
- link = Link.new({'href' => '/productions/1'}, entry_point)
168
+ let(:link) { Link.new({'href' => '/productions/1'}, entry_point) }
124
169
 
170
+ it 'sends a PUT request with the link url and params' do
125
171
  entry_point.connection.expects(:put).with('/productions/1', {'foo' => 'bar'})
126
172
  link.put({'foo' => 'bar'})
127
173
  end
174
+
175
+ it 'defaults params to an empty hash' do
176
+ entry_point.connection.expects(:put).with('/productions/1', {})
177
+ link.put
178
+ end
128
179
  end
129
180
 
130
181
  describe 'patch' do
131
- it 'sends a PATCH request with the link url and params' do
132
- link = Link.new({'href' => '/productions/1'}, entry_point)
182
+ let(:link) { Link.new({'href' => '/productions/1'}, entry_point) }
133
183
 
184
+ it 'sends a PATCH request with the link url and params' do
134
185
  entry_point.connection.expects(:patch).with('/productions/1', {'foo' => 'bar'})
135
186
  link.patch({'foo' => 'bar'})
136
187
  end
188
+
189
+ it 'defaults params to an empty hash' do
190
+ entry_point.connection.expects(:patch).with('/productions/1', {})
191
+ link.patch
192
+ end
137
193
  end
138
194
 
139
195
  describe 'inspect' do
@@ -149,13 +205,14 @@ module Hyperclient
149
205
  before do
150
206
  stub_request(:get, "http://myapi.org/orders").
151
207
  to_return(body: '{"resource": "This is the resource"}')
152
- Resource.expects(:new).returns(resource).at_least_once
208
+ Resource.stubs(:new).returns(resource)
153
209
  end
154
210
 
155
211
  let(:link) { Link.new({'href' => 'http://myapi.org/orders'}, entry_point) }
156
212
  let(:resource) { mock('Resource') }
157
213
 
158
214
  it 'delegates unkown methods to the resource' do
215
+ Resource.expects(:new).returns(resource).at_least_once
159
216
  resource.expects(:embedded)
160
217
 
161
218
  link.embedded
@@ -169,6 +226,11 @@ module Hyperclient
169
226
  resource.expects(:respond_to?).with('embedded').returns(true)
170
227
  link.respond_to?(:embedded).must_equal true
171
228
  end
229
+
230
+ it 'does not delegate to_ary to resource' do
231
+ resource.expects(:to_ary).never
232
+ [[link, link]].flatten.must_equal [link, link]
233
+ end
172
234
  end
173
235
  end
174
236
  end
@@ -23,6 +23,24 @@ module Hyperclient
23
23
 
24
24
  Resource.new({'_embedded' => {"orders" => [] }}, entry_point)
25
25
  end
26
+
27
+ it "initializes the response" do
28
+ mock_response = mock(body: {})
29
+
30
+ resource = Resource.new(mock_response.body, entry_point, mock_response)
31
+
32
+ resource.response.must_equal mock_response
33
+ end
34
+
35
+ it "does not mutate the response.body" do
36
+ body = { 'foo' => 'bar', '_links' => {}, '_embedded' => {} }
37
+ mock_response = stub(body: body.dup)
38
+
39
+ resource = Resource.new(mock_response.body, entry_point, mock_response)
40
+
41
+ resource.response.body.must_equal body
42
+ end
43
+
26
44
  end
27
45
 
28
46
  describe 'accessors' do
@@ -58,5 +76,57 @@ module Hyperclient
58
76
 
59
77
  resource.get
60
78
  end
79
+
80
+ describe ".success?" do
81
+ describe "with a response object" do
82
+ let(:resource) do
83
+ Resource.new({}, entry_point, mock_response)
84
+ end
85
+
86
+ let(:mock_response) do
87
+ mock(success?: true)
88
+ end
89
+
90
+ it "proxies to the response object" do
91
+ resource.success?.must_equal true
92
+ end
93
+ end
94
+
95
+ describe "without a response object" do
96
+ let(:resource) do
97
+ Resource.new({}, entry_point)
98
+ end
99
+
100
+ it "returns nil" do
101
+ resource.success?.must_be_nil
102
+ end
103
+ end
104
+ end
105
+
106
+ describe ".status" do
107
+ describe "with a response object" do
108
+ let(:resource) do
109
+ Resource.new({}, entry_point, mock_response)
110
+ end
111
+
112
+ let(:mock_response) do
113
+ mock(status: 200)
114
+ end
115
+
116
+ it "proxies to the response object" do
117
+ resource.status.must_equal 200
118
+ end
119
+ end
120
+
121
+ describe "without a response object" do
122
+ let(:resource) do
123
+ Resource.new({}, entry_point)
124
+ end
125
+
126
+ it "returns nil" do
127
+ resource.status.must_be_nil
128
+ end
129
+ end
130
+ end
61
131
  end
62
132
  end
metadata CHANGED
@@ -1,153 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oriol Gual
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-03 00:00:00.000000000 Z
11
+ date: 2013-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faraday_middleware
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0.9'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.9'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: uri_template
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.5'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: net-http-digest_auth
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 3.4.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 3.4.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: turn
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.9'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.8'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.8'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: mocha
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0.13'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.13'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rack-test
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.6'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.6'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: spinach
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  description: HyperClient is a Ruby Hypermedia API client.
@@ -157,10 +157,10 @@ executables: []
157
157
  extensions: []
158
158
  extra_rdoc_files: []
159
159
  files:
160
- - .gitignore
161
- - .rvmrc
162
- - .travis.yml
163
- - .yardopts
160
+ - ".gitignore"
161
+ - ".rvmrc"
162
+ - ".travis.yml"
163
+ - ".yardopts"
164
164
  - CHANGELOG.md
165
165
  - Gemfile
166
166
  - Gemfile.lock
@@ -213,17 +213,17 @@ require_paths:
213
213
  - lib
214
214
  required_ruby_version: !ruby/object:Gem::Requirement
215
215
  requirements:
216
- - - '>='
216
+ - - ">="
217
217
  - !ruby/object:Gem::Version
218
218
  version: '0'
219
219
  required_rubygems_version: !ruby/object:Gem::Requirement
220
220
  requirements:
221
- - - '>='
221
+ - - ">="
222
222
  - !ruby/object:Gem::Version
223
223
  version: '0'
224
224
  requirements: []
225
225
  rubyforge_project:
226
- rubygems_version: 2.0.0
226
+ rubygems_version: 2.2.0
227
227
  signing_key:
228
228
  specification_version: 4
229
229
  summary: ''