hal-client 3.10.1 → 3.11.1

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: dd21eca3e5655cbafec1a435e8ab0db5dd1d7ed4
4
- data.tar.gz: 23316a22b875539acb51f469217f64d110d91e7e
3
+ metadata.gz: 253c1dbaeef9a44aa3d64d9f6a440cdcd04567ad
4
+ data.tar.gz: 74898c74f70a37334b50b8ce1284759c0043e4be
5
5
  SHA512:
6
- metadata.gz: 5c782a2300c1882a259268b2bd225c973197d62a62416385adacb18e96dc666015ccf5d76dc2470a4e04ec295afbb0542f163fc897cc686d7de258d273750ea6
7
- data.tar.gz: bf553bc160d420a291a94628a9724ac7054faf9b119470405b2328eda199eee096cf55ee5b2765baf0420214ab186530d0904dba9c84e6f9f6acbcfd7ddb89d5
6
+ metadata.gz: 5b8bece5e9c60060a29711057b029d768c6661cdf654f3d3ff507f1894ceebfbd92111d7675bfa310d20037c0d9b4719191b445e058f5d08eb253d8752f1e9f4
7
+ data.tar.gz: f72e017752ebbcf1a3274cc798a68ae9b8724f5bd78c850abceb941632b3649d3c14bf48476d37153186a7df8c23ea5d7e57efa05dfc6585f7634d5d71233e74
data/README.md CHANGED
@@ -14,11 +14,16 @@ The first step in using a HAL based API is getting a representation of one of it
14
14
  blog = HalClient.get("http://blog.me/")
15
15
  # => #<Representation: http://blog.me/>
16
16
 
17
- `HalClient::Representation`s expose a `#property` method to retrieve properties from the HAL document.
17
+ `HalClient::Representation`s expose a `#property` method to retrieve a single property from the HAL document.
18
18
 
19
19
  blog.property('title')
20
20
  #=> "Some Person's Blog"
21
21
 
22
+ They also expose a `#properties` method to retrieve all the properties from the document, as a `Hash`.
23
+
24
+ blog.properties
25
+ #=> {"title"=>"Some Person's Blog", "description"=>"Some description"}
26
+
22
27
  ### Link navigation
23
28
 
24
29
  Once we have a representation we will want to navigate its links. This can be accomplished using the `#related` method.
@@ -79,12 +84,12 @@ All `HalClient::Representation`s exposed an `#href` attribute which is its ident
79
84
 
80
85
  HalClient provides a high level abstraction for paged collections encoded using [standard `item`, `next` and `prev` link relations](http://tools.ietf.org/html/rfc6573).
81
86
 
82
- articles = blog.as_enum
87
+ articles = blog.to_enum
83
88
  articles.each do |an_article|
84
89
  # do something with each article representation
85
90
  end
86
91
 
87
- If the collection is paged this will navigate to the next page after yielding all the items on the current page. `HalClient::Collection` is `Enumerable` so all your favorite collection methods are available.
92
+ If the collection is paged this will navigate to the next page after yielding all the items on the current page. The return is an `Enumerable` so all your favorite collection methods are available.
88
93
 
89
94
  ### PUT/POST/PATCH requests
90
95
 
@@ -52,7 +52,7 @@ class HalClient
52
52
  end
53
53
  end
54
54
 
55
- # Returns one or more randomly selected item from the first page
55
+ # Returns one or more randomly selected items from the first page
56
56
  # of the collection.
57
57
  #
58
58
  # count - number of items to return. If specified return type will
@@ -11,6 +11,10 @@ class HalClient
11
11
  class Representation
12
12
  extend Forwardable
13
13
 
14
+ # Collection of reserved properties
15
+ # https://tools.ietf.org/html/draft-kelly-json-hal-07#section-4.1
16
+ RESERVED_PROPERTIES = ['_links', '_embedded'].freeze
17
+
14
18
  # Create a new Representation
15
19
  #
16
20
  # options - name parameters
@@ -90,6 +94,13 @@ class HalClient
90
94
  raw.fetch(name.to_s, &default_proc)
91
95
  end
92
96
 
97
+ # Returns a Hash including the key-value pairs of all the properties
98
+ # in the resource. It does not include HAL's reserved
99
+ # properties (`_links` and `_embedded`).
100
+ def properties
101
+ raw.reject { |k, _| RESERVED_PROPERTIES.include? k }
102
+ end
103
+
93
104
  # Returns the URL of the resource this representation represents.
94
105
  def href
95
106
  @href ||= if has_related? "self"
@@ -219,6 +230,15 @@ class HalClient
219
230
  Collection.new(self)
220
231
  end
221
232
 
233
+ # Returns an Enumerator of the items in the collection resource
234
+ # if this is an rfc 6573 collection.
235
+ #
236
+ # Raises HalClient::NotACollectionError if this is not a
237
+ # collection resource.
238
+ def to_enum(method=:each, *args, &blk)
239
+ as_enum.to_enum(method, *args, &blk)
240
+ end
241
+
222
242
  # Resets this representation such that it will be requested from
223
243
  # the upstream on it's next use.
224
244
  def reset
@@ -11,7 +11,7 @@ class HalClient
11
11
  @reprs = reprs
12
12
  end
13
13
 
14
- def_delegators :reprs, :each, :count, :empty?, :any?
14
+ def_delegators :reprs, :each, :count, :empty?, :any?, :sample
15
15
 
16
16
  # Returns representations of resources related via the specified
17
17
  # link rel or the specified default value.
@@ -1,3 +1,3 @@
1
1
  class HalClient
2
- VERSION = "3.10.1"
2
+ VERSION = "3.11.1"
3
3
  end
@@ -3,6 +3,34 @@ require_relative "../spec_helper"
3
3
  require 'hal_client/collection'
4
4
 
5
5
  describe HalClient::Collection do
6
+ # BACKGROUND
7
+
8
+ shared_context "multi-item, multi-page" do
9
+ subject(:collection) { described_class.new(first_page) }
10
+ let!(:second_page_req) { stub_request(:get, second_page.href)
11
+ .to_return body: second_page.to_json }
12
+
13
+ let(:first_page_href) { "http://example.com/p1" }
14
+ let(:first_page) { collection_page(next_href: second_page_href,
15
+ self_href: first_page_href,
16
+ items: ["foo", "bar"]) }
17
+
18
+ let(:second_page_href) { "http://example.com/p2" }
19
+ let(:second_page) { collection_page(items: ["baz"],
20
+ self_href: second_page_href,
21
+ prev_href: first_page_href) }
22
+
23
+ end
24
+
25
+ shared_context "multi-item, single page" do
26
+ subject(:collection) { described_class.new(only_page) }
27
+
28
+ let(:only_page) { collection_page(self_href: "http://example.com/p1",
29
+ items: ["foo", "bar"]) }
30
+ end
31
+
32
+ # END OF BACKGROUND
33
+
6
34
  describe "creation" do
7
35
  subject { described_class }
8
36
 
@@ -25,45 +53,47 @@ describe HalClient::Collection do
25
53
  let(:non_first_page) { collection_page(prev_href: "http://example.com/p1") }
26
54
  end
27
55
 
28
- describe "multi-item, multi-page" do
29
- subject(:collection) { described_class.new(first_page) }
30
- let!(:second_page_req) { stub_request(:get, second_page.href)
31
- .to_return body: second_page.to_json }
56
+ describe "#each" do
57
+ context do
58
+ include_context "multi-item, multi-page"
32
59
 
33
- it "fetches all the pages when iterating" do
34
- collection.each do |it| end
60
+ it "fetches all the pages when iterating" do
61
+ collection.each do |it| end
35
62
 
36
- expect(a_request(:get, second_page.href)).to have_been_made
37
- end
63
+ expect(a_request(:get, second_page.href)).to have_been_made
64
+ end
65
+
66
+ it "yields all the items" do
67
+ yielded = collection.map { |it| it.href }
68
+ expect(yielded).to eq ["foo", "bar", "baz"]
69
+ end
38
70
 
39
- it "iteration yields all the items" do
40
- yielded = collection.map { |it| it.href }
41
- expect(yielded).to eq ["foo", "bar", "baz"]
42
71
  end
72
+ end
43
73
 
44
- specify { expect { collection.count }.to raise_exception }
74
+ describe "#count" do
75
+ context do
76
+ include_context "multi-item, single page"
45
77
 
78
+ specify { expect(collection.count).to eq 2 }
79
+ end
46
80
 
47
- let(:first_page_href) { "http://example.com/p1" }
48
- let(:first_page) { collection_page(next_href: second_page_href,
49
- self_href: first_page_href,
50
- items: ["foo", "bar"]) }
81
+ context do
82
+ include_context "multi-item, multi-page"
51
83
 
52
- let(:second_page_href) { "http://example.com/p2" }
53
- let(:second_page) { collection_page(items: ["baz"],
54
- self_href: second_page_href,
55
- prev_href: first_page_href) }
84
+ specify { expect { collection.count }.to raise_exception }
85
+ end
56
86
  end
57
87
 
58
- describe "multi-item, single page" do
59
- subject(:collection) { described_class.new(only_page) }
60
-
61
- specify { expect(collection.count).to eq 2 }
88
+ describe "#sample" do
89
+ include_context "multi-item, multi-page"
62
90
 
63
- let(:only_page) { collection_page(self_href: "http://example.com/p1",
64
- items: ["foo", "bar"]) }
91
+ specify { expect( collection.sample ).to be }
92
+ specify { expect( collection.sample ).to be_kind_of HalClient::Representation }
65
93
  end
66
94
 
95
+ # BACKGROUND
96
+
67
97
  let(:hal_client) { HalClient.new }
68
98
 
69
99
  def collection_page(opts={})
@@ -5,6 +5,7 @@ require "hal_client/representation"
5
5
  describe HalClient::Representation do
6
6
  let(:raw_repr) { <<-HAL }
7
7
  { "prop1": 1
8
+ ,"prop2": 2
8
9
  ,"_links": {
9
10
  "self": { "href": "http://example.com/foo" }
10
11
  ,"link1": { "href": "http://example.com/bar" }
@@ -161,6 +162,9 @@ HAL
161
162
  specify { expect(repr.property? "nonexistent-prop").to be false }
162
163
  specify { expect(repr.has_property? "nonexistent-prop").to be false }
163
164
 
165
+ specify { expect(repr.properties).to include("prop1" => 1, "prop2" => 2) }
166
+ specify { expect(repr.properties).to_not include("_links" => 1,
167
+ "_embedded" => 2) }
164
168
 
165
169
  specify { expect(subject.href).to eq "http://example.com/foo" }
166
170
 
@@ -361,6 +365,7 @@ HAL
361
365
  end
362
366
 
363
367
  specify { expect(repr).to respond_to :as_enum }
368
+ specify { expect(repr).to respond_to :to_enum }
364
369
 
365
370
  context "collection" do
366
371
  let(:raw_repr) { <<-HAL }
@@ -378,10 +383,15 @@ HAL
378
383
 
379
384
  specify { expect(repr.as_enum).to a_kind_of Enumerable }
380
385
  specify { expect(repr.as_enum).to have(2).items }
386
+
387
+ specify { expect( repr.to_enum ).to be_kind_of Enumerator }
388
+ specify { expect( repr.to_enum(:each) ).to be_kind_of Enumerator }
389
+ specify { expect( repr.to_enum ).to have(2).items }
381
390
  end
382
391
 
383
392
  context "non-collection" do
384
393
  specify { expect{repr.as_enum}.to raise_error }
394
+ specify { expect{repr.to_enum}.to raise_error }
385
395
  end
386
396
 
387
397
  # Background
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hal-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.1
4
+ version: 3.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-04 00:00:00.000000000 Z
11
+ date: 2015-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
181
  version: '0'
182
182
  requirements: []
183
183
  rubyforge_project:
184
- rubygems_version: 2.2.2
184
+ rubygems_version: 2.2.5
185
185
  signing_key:
186
186
  specification_version: 4
187
187
  summary: Use HAL APIs easily
@@ -195,4 +195,3 @@ test_files:
195
195
  - spec/hal_client_spec.rb
196
196
  - spec/spec_helper.rb
197
197
  - spec/support/custom_matchers.rb
198
- has_rdoc: