hal-client 2.3.1 → 2.4.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.
data/hal-client.gemspec CHANGED
@@ -18,12 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "rest-client", "~> 1.6", '>= 1.6.0'
22
- spec.add_dependency "addressable", "~> 2.3", '>= 2.3.0'
23
- spec.add_dependency "multi_json", "~> 1.9", '>= 1.9.0'
21
+ spec.add_dependency "rest-client", "~> 1.6"
22
+ spec.add_dependency "addressable", "~> 2.3"
23
+ spec.add_dependency "multi_json", "~> 1.9"
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.5"
26
- spec.add_development_dependency "rake", "~> 10.1", '>= 10.1.0'
27
- spec.add_development_dependency "rspec", "~> 2.14", '>= 2.14.0'
28
- spec.add_development_dependency "webmock", "~> 1.16", '>= 1.16.0'
26
+ spec.add_development_dependency "rake", "~> 10.1"
27
+ spec.add_development_dependency "rspec", "~> 3.0.0.beta"
28
+ spec.add_development_dependency "webmock", "~> 1.16"
29
+ spec.add_development_dependency "rspec-collection_matchers"
29
30
  end
@@ -52,6 +52,15 @@ class HalClient
52
52
  end
53
53
  end
54
54
 
55
+ # Returns one or more randomly selected item from the first page
56
+ # of the collection.
57
+ #
58
+ # count - number of items to return. If specified return type will
59
+ # an collection. Default: return a single item
60
+ def sample(*arg)
61
+ first_page.related("item").sample(*arg)
62
+ end
63
+
55
64
  protected
56
65
 
57
66
  attr_reader :first_page
@@ -0,0 +1,67 @@
1
+ class HalClient
2
+
3
+ # Encapsulates a "_links" section.
4
+ class LinksSection
5
+ UNSET = Object.new
6
+
7
+ def initialize(section, namespaces=nil)
8
+ @namespaces = namespaces || CurieResolver.new(section.fetch("curies"){[]})
9
+
10
+ @section = fully_qualified section
11
+ end
12
+
13
+ attr_reader :namespaces
14
+
15
+ # Returns the URLs or URL templates of each link with the
16
+ # specified rel in this section.
17
+ #
18
+ # link_rel - The fully qualified link relation
19
+ # default_proc - (optional) A proc to execute to create a
20
+ # default value if the specified link_rel does not exist
21
+ #
22
+ # Yields the link_rel to the default_proc if the specified
23
+ # link_rel is not present and returns the return value of the
24
+ # default_proc.
25
+ #
26
+ # Raises KeyError if the specified link_rel is not present and no
27
+ # default_value or default_proc are provided.
28
+ def hrefs(link_rel, &default_proc)
29
+ default_proc ||= ->(link_rel){
30
+ raise KeyError, "No resources are related via `#{link_rel}`"
31
+ }
32
+
33
+ return default_proc.call(link_rel) unless section.key? link_rel
34
+
35
+ [section.fetch(link_rel)]
36
+ .flatten
37
+ .map{|link| resolve_to_url(link)}
38
+ end
39
+
40
+ protected
41
+
42
+ attr_reader :section
43
+
44
+ def resolve_to_url(link)
45
+ (fail HalClient::InvalidRepresentationError) unless link.respond_to? :fetch
46
+
47
+ url = link.fetch("href")
48
+ is_templated = link.fetch("templated", false)
49
+
50
+ if is_templated
51
+ Addressable::Template.new(url)
52
+ else
53
+ url
54
+ end
55
+
56
+ rescue KeyError
57
+ fail HalClient::InvalidRepresentationError
58
+ end
59
+
60
+ def fully_qualified(relations_section)
61
+ Hash[relations_section.map {|rel, link_info|
62
+ [(namespaces.resolve rel), link_info]
63
+ }]
64
+ end
65
+
66
+ end
67
+ end
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  require 'addressable/template'
2
3
 
3
4
  require 'hal_client'
@@ -8,6 +9,7 @@ class HalClient
8
9
  # HAL representation of a single resource. Provides access to
9
10
  # properties, links and embedded representations.
10
11
  class Representation
12
+ extend Forwardable
11
13
 
12
14
  # Create a new Representation
13
15
  #
@@ -65,7 +67,7 @@ class HalClient
65
67
 
66
68
  # Returns the URL of the resource this representation represents.
67
69
  def href
68
- @href ||= link_section.fetch("self").fetch("href")
70
+ @href ||= links.hrefs('self').first
69
71
  end
70
72
 
71
73
  # Returns the value of the specified property or representations
@@ -129,14 +131,11 @@ class HalClient
129
131
  raise KeyError, "No resources are related via `#{link_rel}`"
130
132
  }
131
133
 
132
- embedded = embedded_or_nil(link_rel)
133
- linked = linked_or_nil(link_rel, options)
134
+ embedded = embedded(link_rel) { nil }
135
+ linked = linked(link_rel, options) { nil }
136
+ return default_proc.call(link_rel) if embedded.nil? and linked.nil?
134
137
 
135
- if !embedded.nil? or !linked.nil?
136
- RepresentationSet.new (Array(embedded) + Array(linked))
137
- else
138
- default_proc.call link_rel
139
- end
138
+ RepresentationSet.new (Array(embedded) + Array(linked))
140
139
  end
141
140
 
142
141
  # Returns urls of resources related via the specified
@@ -156,6 +155,32 @@ class HalClient
156
155
  map(&:href)
157
156
  end
158
157
 
158
+ # Returns values of the `href` member of links and the URL of
159
+ # embedded representations related via the specified link rel. The
160
+ # only difference between this and `#related_hrefs` is that this
161
+ # method makes no attempt to expand templated links. For templated
162
+ # links the returned collection will include the template pattern
163
+ # as encoded in the HAL document.
164
+ #
165
+ # link_rel - The link rel of interest
166
+ # default_proc - an option proc that will be called with `name`
167
+ # to produce default value if the specified property or link does not
168
+ # exist
169
+ #
170
+ # Raises KeyError if the specified link does not exist
171
+ # and no default_proc is provided.
172
+ def raw_related_hrefs(link_rel, &default_proc)
173
+ default_proc ||= ->(link_rel){
174
+ raise KeyError, "No resources are related via `#{link_rel}`"
175
+ }
176
+
177
+ embedded = embedded(link_rel) { nil }
178
+ linked = links.hrefs(link_rel) { nil }
179
+ return default_proc.call(link_rel) if embedded.nil? and linked.nil?
180
+
181
+ Array(linked) + Array(embedded).map(&:href)
182
+ end
183
+
159
184
  # Returns a short human readable description of this
160
185
  # representation.
161
186
  def to_s
@@ -181,36 +206,44 @@ class HalClient
181
206
  @raw
182
207
  end
183
208
 
184
- def link_section
185
- @link_section ||= fully_qualified raw.fetch("_links", {})
209
+ def links
210
+ @links ||= LinksSection.new raw.fetch("_links"){{}}
186
211
  end
187
212
 
188
213
  def embedded_section
189
214
  @embedded_section ||= fully_qualified raw.fetch("_embedded", {})
190
215
  end
191
216
 
192
- def embedded(link_rel)
193
- relations = boxed embedded_section.fetch(link_rel)
217
+ def embedded(link_rel, &default_proc)
218
+ default_proc ||= ->(link_rel) {
219
+ fail KeyError, "#{link_rel} embed not found"
220
+ }
221
+
222
+ relations = embedded_section.fetch(link_rel) { MISSING }
223
+ return default_proc.call(link_rel) if relations == MISSING
194
224
 
195
- relations.map{|it| Representation.new hal_client: hal_client, parsed_json: it}
225
+ (boxed relations).map{|it| Representation.new hal_client: hal_client, parsed_json: it}
196
226
 
197
227
  rescue InvalidRepresentationError => err
198
228
  fail InvalidRepresentationError, "/_embedded/#{jpointer_esc(link_rel)} is not a valid representation"
199
229
  end
200
230
 
201
- def embedded_or_nil(link_rel)
202
- embedded link_rel
203
-
204
- rescue KeyError
205
- nil
206
- end
231
+ def linked(link_rel, options, &default_proc)
232
+ default_proc ||= ->(link_rel,_options) {
233
+ fail KeyError, "#{link_rel} link not found"
234
+ }
207
235
 
208
- def linked(link_rel, options)
209
- relations = boxed link_section.fetch(link_rel)
236
+ relations = links.hrefs(link_rel) { MISSING }
237
+ return default_proc.call(link_rel, options) if relations == MISSING
210
238
 
211
- relations.
212
- map {|link| href_from link, options }.
213
- map {|href| Representation.new href: href, hal_client: hal_client }
239
+ relations
240
+ .map {|url_or_tmpl|
241
+ if url_or_tmpl.respond_to? :expand
242
+ url_or_tmpl.expand(options).to_s
243
+ else
244
+ url_or_tmpl
245
+ end }
246
+ .map {|href| Representation.new href: href, hal_client: hal_client }
214
247
 
215
248
  rescue InvalidRepresentationError => err
216
249
  fail InvalidRepresentationError, "/_links/#{jpointer_esc(link_rel)} is not a valid link"
@@ -220,14 +253,6 @@ end
220
253
  str.gsub "/", "~1"
221
254
  end
222
255
 
223
- def linked_or_nil(link_rel, options)
224
- linked link_rel, options
225
-
226
- rescue KeyError
227
- nil
228
- end
229
-
230
-
231
256
  def boxed(list_hash_or_nil)
232
257
  if hashish? list_hash_or_nil
233
258
  [list_hash_or_nil]
@@ -241,29 +266,17 @@ end
241
266
  end
242
267
  end
243
268
 
244
- def href_from(link, options)
245
- raw_href = link.fetch('href')
246
-
247
- if link.fetch('templated', false)
248
- Addressable::Template.new(raw_href).expand(options).to_s
249
- else
250
- raw_href
251
- end
252
- end
253
-
254
269
  def fully_qualified(relations_section)
255
270
  Hash[relations_section.map {|rel, link_info|
256
271
  [(namespaces.resolve rel), link_info]
257
272
  }]
258
273
  end
259
274
 
260
- def namespaces
261
- @namespaces ||= CurieResolver.new raw.fetch("_links", {}).fetch("curies", [])
262
- end
263
-
264
275
  def hashish?(thing)
265
276
  thing.respond_to?(:fetch) && thing.respond_to?(:key?)
266
277
  end
267
278
 
279
+ def_delegators :links, :namespaces
280
+
268
281
  end
269
282
  end
@@ -1,3 +1,3 @@
1
1
  class HalClient
2
- VERSION = "2.3.1"
2
+ VERSION = "2.4.0"
3
3
  end
data/lib/hal_client.rb CHANGED
@@ -7,6 +7,7 @@ class HalClient
7
7
  autoload :Representation, 'hal_client/representation'
8
8
  autoload :RepresentationSet, 'hal_client/representation_set'
9
9
  autoload :CurieResolver, 'hal_client/curie_resolver'
10
+ autoload :LinksSection, 'hal_client/links_section'
10
11
  autoload :Collection, 'hal_client/collection'
11
12
  autoload :InvalidRepresentationError, 'hal_client/errors'
12
13
  autoload :NotACollectionError, 'hal_client/errors'
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+ require 'hal-client'
3
+
4
+ describe HalClient::LinksSection, "namespaces embedded" do
5
+ subject(:section) { described_class.new(raw_section) }
6
+
7
+ specify { expect(section.hrefs("up"))
8
+ .to contain_exactly "http://example.com/parent" }
9
+
10
+ specify { expect(section.hrefs(fully_qualified_first_rel))
11
+ .to contain_exactly "http://example.com/foo" }
12
+
13
+ specify { expect(section.hrefs(fully_qualified_second_rel))
14
+ .to contain_exactly "http://example.com/bar", "http://example.com/baz" }
15
+
16
+ specify { expect(section.hrefs("search"))
17
+ .to all match respond_to(:pattern).and respond_to(:expand) }
18
+ specify { expect(section.hrefs("search").first.pattern).to eq "http://example.com/s{?q}" }
19
+
20
+ specify { expect{section.hrefs("nonexistent")}.to raise_error KeyError }
21
+
22
+ let(:fully_qualified_first_rel) { "http://rels.example.com/first" }
23
+ let(:fully_qualified_second_rel) { "http://rels.example.com/2/second" }
24
+
25
+ let(:raw_section) {
26
+ { "curies" => [{ "name" => "ns1",
27
+ "href" => "http://rels.example.com/{rel}",
28
+ "templated" => true},
29
+ { "name" => "ns2",
30
+ "href" => "http://rels.example.com/2/{rel}",
31
+ "templated" => true}],
32
+ "up" => {"href" => "http://example.com/parent"},
33
+ "search" => {"href" => "http://example.com/s{?q}", "templated" => true },
34
+ "ns1:first" => {"href" => "http://example.com/foo"},
35
+ "ns2:second" => [{"href" => "http://example.com/bar"},
36
+ {"href" => "http://example.com/baz"}]
37
+ } }
38
+
39
+ matcher :all do |expected|
40
+ match do |actual|
41
+ actual.all?{|it| expected === it}
42
+ end
43
+ end
44
+ end
45
+
46
+ describe HalClient::LinksSection, "invalid" do
47
+ subject(:section) { described_class.new(raw_section) }
48
+
49
+ specify { expect{section.hrefs("bareurl")}
50
+ .to raise_error HalClient::InvalidRepresentationError }
51
+
52
+ let(:raw_section) {
53
+ { "bareurl" => "http://example.com/boom" }
54
+ }
55
+
56
+ end
@@ -21,16 +21,20 @@ describe HalClient::RepresentationSet do
21
21
  end
22
22
  end
23
23
 
24
- its(:count) { should eq 2 }
25
- its(:empty?) { should be_false }
24
+ specify { expect(repr_set.count).to eq 2 }
25
+ specify { expect(repr_set.empty?).to be false }
26
26
 
27
27
  describe "#any?" do
28
- it "returns true if there are any" do
29
- expect(subject.any?{|it| it == foo_repr }).to be_true
28
+ it "returns true if there are any matching" do
29
+ expect(subject.any?{|it| it == foo_repr }).to be true
30
30
  end
31
31
 
32
- it "returns false if there aren't any" do
33
- expect(subject.any?{|it| false }).to be_false
32
+ it "returns true if there are any matchin" do
33
+ expect(subject.any?).to be true
34
+ end
35
+
36
+ it "returns false if there aren't any matching" do
37
+ expect(subject.any?{|it| false }).to be false
34
38
  end
35
39
  end
36
40
 
@@ -126,7 +130,7 @@ describe HalClient::RepresentationSet do
126
130
  match { |repr_set|
127
131
  repr_set.any?{|it| it.href == url}
128
132
  }
129
- failure_message_for_should { |repr_set|
133
+ failure_message { |repr_set|
130
134
  "Expected representation of <#{url}> but found only #{repr_set.map(&:href)}"
131
135
  }
132
136
  end
@@ -8,7 +8,7 @@ describe HalClient::Representation do
8
8
  ,"_links": {
9
9
  "self": { "href": "http://example.com/foo" }
10
10
  ,"link1": { "href": "http://example.com/bar" }
11
- ,"link2": { "href": "http://example.com/people{?name}"
11
+ ,"templated_link": { "href": "http://example.com/people{?name}"
12
12
  ,"templated": true }
13
13
  ,"link3": [{ "href": "http://example.com/link3-a" }
14
14
  ,{ "href": "http://example.com/link3-b" }]
@@ -32,18 +32,17 @@ HAL
32
32
  repr.related("link1").post("abc")
33
33
  end
34
34
 
35
- specify {
36
- expect(
37
- post_request.
38
- with(:body => "abc", :headers => {'Content-Type' => 'application/hal+json'})
39
- ).to have_been_made
35
+ specify("makes request") {
36
+ expect(post_request.with(:body => "abc",
37
+ :headers => {'Content-Type' => 'application/hal+json'}))
38
+ .to have_been_made
40
39
  }
41
40
  end
42
41
 
43
42
  describe "#to_s" do
44
43
  subject(:return_val) { repr.to_s }
45
44
 
46
- it { should eq "#<HalClient::Representation: http://example.com/foo>" }
45
+ it { is_expected.to eq "#<HalClient::Representation: http://example.com/foo>" }
47
46
  end
48
47
 
49
48
  specify { expect(repr.property "prop1").to eq 1 }
@@ -55,7 +54,7 @@ HAL
55
54
  specify { expect(repr.has_property? "nonexistent-prop").to be false }
56
55
 
57
56
 
58
- its(:href) { should eq "http://example.com/foo" }
57
+ specify { expect(subject.href).to eq "http://example.com/foo" }
59
58
 
60
59
  describe "#fetch" do
61
60
  context "for existent property" do
@@ -135,7 +134,7 @@ HAL
135
134
  end
136
135
 
137
136
  context "for existent templated link" do
138
- subject { repr.related "link2", name: "bob" }
137
+ subject { repr.related "templated_link", name: "bob" }
139
138
  it { should have(1).item }
140
139
  it { should include_representation_of "http://example.com/people?name=bob" }
141
140
  end
@@ -153,25 +152,16 @@ HAL
153
152
  end
154
153
  end
155
154
 
156
- describe "#related_hrefs" do
157
- context "for existent link" do
158
- subject { repr.related_hrefs "link1" }
159
- it { should have(1).item }
160
- it { should include "http://example.com/bar" }
161
- end
155
+ specify { expect(repr.related_hrefs "link1")
156
+ .to contain_exactly "http://example.com/bar" }
157
+ specify { expect(repr.related_hrefs "embed1")
158
+ .to contain_exactly "http://example.com/baz" }
159
+ specify { expect { repr.related_hrefs 'wat' }.to raise_exception KeyError }
162
160
 
163
- context "for existent embedded" do
164
- subject { repr.related_hrefs "embed1" }
165
- it { should have(1).item }
166
- it { should include "http://example.com/baz" }
167
- end
168
-
169
- context "non-existent item w/o default" do
170
- it "raises exception" do
171
- expect{repr.related_hrefs 'wat'}.to raise_exception KeyError
172
- end
173
- end
174
- end
161
+ specify { expect(repr.raw_related_hrefs("templated_link").map(&:pattern))
162
+ .to contain_exactly "http://example.com/people{?name}" }
163
+ specify { expect(repr.raw_related_hrefs("link1"))
164
+ .to contain_exactly "http://example.com/bar" }
175
165
 
176
166
  specify { expect(subject.has_related? "link1").to be true }
177
167
  specify { expect(subject.related? "link1").to be true }
@@ -193,17 +183,17 @@ HAL
193
183
  }
194
184
  HAL
195
185
 
196
- describe "#related return value " do
186
+ describe "#related return value" do
197
187
  subject(:return_val) { repr.related("http://example.com/rels/bar") }
198
188
  it { should include_representation_of "http://example.com/bar" }
199
189
  end
200
190
 
201
- describe "#[] return value " do
191
+ describe "#[] return value" do
202
192
  subject(:return_val) { repr["http://example.com/rels/bar"] }
203
193
  it { should include_representation_of "http://example.com/bar" }
204
194
  end
205
195
 
206
- describe "#related_hrefs return value " do
196
+ describe "#related_hrefs return value" do
207
197
  subject(:return_val) { repr.related_hrefs("http://example.com/rels/bar") }
208
198
  it { should include "http://example.com/bar" }
209
199
  end
@@ -276,7 +266,7 @@ HAL
276
266
  match { |repr_set|
277
267
  repr_set.any?{|it| it.href == url}
278
268
  }
279
- failure_message_for_should { |repr_set|
269
+ failure_message { |repr_set|
280
270
  "Expected representation of <#{url}> but found only #{repr_set.map(&:href)}"
281
271
  }
282
272
  end
data/spec/spec_helper.rb CHANGED
@@ -3,3 +3,4 @@ $LOAD_PATH << Pathname(__FILE__).dirname + "../lib"
3
3
  require 'rspec'
4
4
  require 'webmock/rspec'
5
5
  require 'multi_json'
6
+ require 'rspec/collection_matchers'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hal-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-21 00:00:00.000000000 Z
12
+ date: 2014-04-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -19,9 +19,6 @@ dependencies:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: '1.6'
22
- - - ! '>='
23
- - !ruby/object:Gem::Version
24
- version: 1.6.0
25
22
  type: :runtime
26
23
  prerelease: false
27
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,9 +27,6 @@ dependencies:
30
27
  - - ~>
31
28
  - !ruby/object:Gem::Version
32
29
  version: '1.6'
33
- - - ! '>='
34
- - !ruby/object:Gem::Version
35
- version: 1.6.0
36
30
  - !ruby/object:Gem::Dependency
37
31
  name: addressable
38
32
  requirement: !ruby/object:Gem::Requirement
@@ -41,9 +35,6 @@ dependencies:
41
35
  - - ~>
42
36
  - !ruby/object:Gem::Version
43
37
  version: '2.3'
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: 2.3.0
47
38
  type: :runtime
48
39
  prerelease: false
49
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -52,9 +43,6 @@ dependencies:
52
43
  - - ~>
53
44
  - !ruby/object:Gem::Version
54
45
  version: '2.3'
55
- - - ! '>='
56
- - !ruby/object:Gem::Version
57
- version: 2.3.0
58
46
  - !ruby/object:Gem::Dependency
59
47
  name: multi_json
60
48
  requirement: !ruby/object:Gem::Requirement
@@ -63,9 +51,6 @@ dependencies:
63
51
  - - ~>
64
52
  - !ruby/object:Gem::Version
65
53
  version: '1.9'
66
- - - ! '>='
67
- - !ruby/object:Gem::Version
68
- version: 1.9.0
69
54
  type: :runtime
70
55
  prerelease: false
71
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,9 +59,6 @@ dependencies:
74
59
  - - ~>
75
60
  - !ruby/object:Gem::Version
76
61
  version: '1.9'
77
- - - ! '>='
78
- - !ruby/object:Gem::Version
79
- version: 1.9.0
80
62
  - !ruby/object:Gem::Dependency
81
63
  name: bundler
82
64
  requirement: !ruby/object:Gem::Requirement
@@ -101,9 +83,6 @@ dependencies:
101
83
  - - ~>
102
84
  - !ruby/object:Gem::Version
103
85
  version: '10.1'
104
- - - ! '>='
105
- - !ruby/object:Gem::Version
106
- version: 10.1.0
107
86
  type: :development
108
87
  prerelease: false
109
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -112,9 +91,6 @@ dependencies:
112
91
  - - ~>
113
92
  - !ruby/object:Gem::Version
114
93
  version: '10.1'
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: 10.1.0
118
94
  - !ruby/object:Gem::Dependency
119
95
  name: rspec
120
96
  requirement: !ruby/object:Gem::Requirement
@@ -122,10 +98,7 @@ dependencies:
122
98
  requirements:
123
99
  - - ~>
124
100
  - !ruby/object:Gem::Version
125
- version: '2.14'
126
- - - ! '>='
127
- - !ruby/object:Gem::Version
128
- version: 2.14.0
101
+ version: 3.0.0.beta
129
102
  type: :development
130
103
  prerelease: false
131
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -133,10 +106,7 @@ dependencies:
133
106
  requirements:
134
107
  - - ~>
135
108
  - !ruby/object:Gem::Version
136
- version: '2.14'
137
- - - ! '>='
138
- - !ruby/object:Gem::Version
139
- version: 2.14.0
109
+ version: 3.0.0.beta
140
110
  - !ruby/object:Gem::Dependency
141
111
  name: webmock
142
112
  requirement: !ruby/object:Gem::Requirement
@@ -145,9 +115,6 @@ dependencies:
145
115
  - - ~>
146
116
  - !ruby/object:Gem::Version
147
117
  version: '1.16'
148
- - - ! '>='
149
- - !ruby/object:Gem::Version
150
- version: 1.16.0
151
118
  type: :development
152
119
  prerelease: false
153
120
  version_requirements: !ruby/object:Gem::Requirement
@@ -156,9 +123,22 @@ dependencies:
156
123
  - - ~>
157
124
  - !ruby/object:Gem::Version
158
125
  version: '1.16'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rspec-collection_matchers
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
159
139
  - - ! '>='
160
140
  - !ruby/object:Gem::Version
161
- version: 1.16.0
141
+ version: '0'
162
142
  description: An easy to use interface for REST APIs that use HAL.
163
143
  email:
164
144
  - pezra@barelyenough.org
@@ -178,11 +158,13 @@ files:
178
158
  - lib/hal_client/collection.rb
179
159
  - lib/hal_client/curie_resolver.rb
180
160
  - lib/hal_client/errors.rb
161
+ - lib/hal_client/links_section.rb
181
162
  - lib/hal_client/representation.rb
182
163
  - lib/hal_client/representation_set.rb
183
164
  - lib/hal_client/version.rb
184
165
  - spec/hal_client/collection_spec.rb
185
166
  - spec/hal_client/curie_resolver_spec.rb
167
+ - spec/hal_client/links_section_spec.rb
186
168
  - spec/hal_client/representation_set_spec.rb
187
169
  - spec/hal_client/representation_spec.rb
188
170
  - spec/hal_client_spec.rb
@@ -202,7 +184,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
184
  version: '0'
203
185
  segments:
204
186
  - 0
205
- hash: -1374848680285234334
187
+ hash: -1767932783931261453
206
188
  required_rubygems_version: !ruby/object:Gem::Requirement
207
189
  none: false
208
190
  requirements:
@@ -211,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
193
  version: '0'
212
194
  segments:
213
195
  - 0
214
- hash: -1374848680285234334
196
+ hash: -1767932783931261453
215
197
  requirements: []
216
198
  rubyforge_project:
217
199
  rubygems_version: 1.8.23
@@ -221,6 +203,7 @@ summary: Use HAL APIs easily
221
203
  test_files:
222
204
  - spec/hal_client/collection_spec.rb
223
205
  - spec/hal_client/curie_resolver_spec.rb
206
+ - spec/hal_client/links_section_spec.rb
224
207
  - spec/hal_client/representation_set_spec.rb
225
208
  - spec/hal_client/representation_spec.rb
226
209
  - spec/hal_client_spec.rb