hyperclient 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ examples/william.rb
data/Readme.md CHANGED
@@ -121,6 +121,8 @@ posts.post({title: "I'm a blogger!", body: 'Wohoo!!'})
121
121
 
122
122
  * Resource permissions: Using the `Allow` header Hyperclient should be able to
123
123
  restrict the allowed method on a given `Resource`.
124
+ * Curie syntax support for links (see http://tools.ietf.org/html/draft-kelly-json-hal-03#section-8.2)
125
+ * Profile support for links
124
126
 
125
127
 
126
128
  ## Contributing
@@ -6,15 +6,15 @@ class Cyberscore
6
6
  entry_point 'http://cs-api.heroku.com/api/'
7
7
 
8
8
  def news
9
- links.feeds.links.submissions.resources.news
9
+ links.feeds.links.submissions.embedded.news
10
10
  end
11
11
 
12
12
  def submissions
13
- links.feeds.links.submissions.resources.submissions
13
+ links.feeds.links.submissions.embedded.submissions
14
14
  end
15
15
 
16
16
  def games
17
- links.feeds.links.games.resources.games
17
+ links.feeds.links.games.embedded.games
18
18
  end
19
19
 
20
20
  def add_game(name)
data/examples/hal_shop.rb CHANGED
@@ -35,11 +35,11 @@ print_resources(api.links)
35
35
 
36
36
  puts
37
37
  puts 'Resources at the entry point:'
38
- print_resources(api.resources)
38
+ print_resources(api.embedded)
39
39
 
40
40
  puts
41
41
  puts "Let's see what stats we have:"
42
- print_attributes(api.resources.stats.attributes)
42
+ print_attributes(api.embedded.stats.attributes)
43
43
 
44
44
  products = api.links["http://hal-shop.heroku.com/rels/products"].reload
45
45
 
@@ -49,7 +49,7 @@ puts products.attributes['inventory_size']
49
49
 
50
50
  puts
51
51
  puts 'What resources does products have?'
52
- print_resources(products.resources.products)
52
+ print_resources(products.embedded.products)
53
53
 
54
54
  puts
55
55
  puts 'And links?'
@@ -57,4 +57,4 @@ print_resources(products.links)
57
57
 
58
58
  puts
59
59
  puts 'Attributes of the first product?'
60
- print_attributes(products.resources.products.first.attributes)
60
+ print_attributes(products.embedded.products.first.attributes)
@@ -44,7 +44,7 @@ module Hyperclient
44
44
 
45
45
  @resources ||= @representation.inject({}) do |memo, (name, representation)|
46
46
  next memo if name == 'self'
47
- memo.update(name => build_resource(representation, name))
47
+ memo.update(name => build_resource(representation, name))
48
48
  end
49
49
  end
50
50
 
@@ -55,19 +55,27 @@ module Hyperclient
55
55
  def build_resource(representation, name = nil)
56
56
  return representation.map(&method(:build_resource)) if representation.is_a?(Array)
57
57
 
58
- url = extract_url(representation)
58
+ url = URLExtractor.new(representation).url
59
59
  ResourceFactory.resource(url, {representation: representation, name: name})
60
60
  end
61
61
 
62
- # Internal: Returns a String with the resource URL
63
- #
64
- # representation - The JSON representation of the resource.
65
- def extract_url(representation)
66
- return representation['href'] if representation.include?('href')
62
+ # Internal: Extract the url from a HAL representation.
63
+ class URLExtractor
64
+ # Public: Initializes a URLExtractor.
65
+ #
66
+ # representation - A Hash with the representation of a Resource.
67
+ def initialize(representation)
68
+ @representation = representation
69
+ end
70
+
71
+ # Public: Returns a String with the resource URL
72
+ def url
73
+ return @representation.delete('href') if @representation.include?('href')
67
74
 
68
- if representation && representation['_links'] && representation['_links']['self'] &&
69
- (url = representation['_links']['self']['href'])
70
- return url
75
+ if @representation && @representation['_links'] && @representation['_links']['self'] &&
76
+ (url = @representation['_links']['self']['href'])
77
+ return url
78
+ end
71
79
  end
72
80
  end
73
81
  end
@@ -29,7 +29,7 @@ module Hyperclient
29
29
 
30
30
  # Public: Returns a Discoverer for the _embedded section of the representation.
31
31
  # It can be used later to use the resources from this section.
32
- def resources
32
+ def embedded
33
33
  @embedded ||= Discoverer.new(@representation['_embedded'])
34
34
  end
35
35
 
@@ -8,7 +8,7 @@ module Hyperclient
8
8
  class Resource
9
9
  extend Forwardable
10
10
  # Public: Delegate attributes and resources to the representation.
11
- def_delegators :representation, :attributes, :resources, :links
11
+ def_delegators :representation, :attributes, :embedded, :links
12
12
 
13
13
  # Public: Delegate all HTTP methods (get, post, put, delete, options and
14
14
  # head) to Hyperclient::HTTP.
@@ -1,3 +1,3 @@
1
1
  module Hyperclient
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -72,5 +72,30 @@ module Hyperclient
72
72
  discoverer.filter.name.wont_be_empty
73
73
  end
74
74
  end
75
+
76
+ describe Discoverer::URLExtractor do
77
+ describe 'url' do
78
+ it 'extracts the url from embedded resources' do
79
+ hal = {'_links' => {'self' => {'href' => '/path/to/resource'}}}
80
+ extractor = Discoverer::URLExtractor.new(hal)
81
+
82
+ extractor.url.must_equal '/path/to/resource'
83
+ end
84
+
85
+ it 'extracts the url from linked resources' do
86
+ hal = {'href' => '/path/to/resource'}
87
+ extractor = Discoverer::URLExtractor.new(hal)
88
+
89
+ extractor.url.must_equal '/path/to/resource'
90
+ end
91
+
92
+ it 'deletes the url from linked resources to prevent empty representations' do
93
+ hal = {'href' => '/path/to/resource'}
94
+ Discoverer::URLExtractor.new(hal).url
95
+
96
+ hal.include?('href').must_equal false
97
+ end
98
+ end
99
+ end
75
100
  end
76
101
  end
@@ -41,11 +41,11 @@ module Hyperclient
41
41
  end
42
42
  end
43
43
 
44
- describe 'resources' do
44
+ describe 'embedded' do
45
45
  it 'returns resources included in the _embedded section' do
46
- representation.resources.author.must_be_kind_of Resource
47
- representation.resources.episodes.first.must_be_kind_of Resource
48
- representation.resources.episodes.last.must_be_kind_of Resource
46
+ representation.embedded.author.must_be_kind_of Resource
47
+ representation.embedded.episodes.first.must_be_kind_of Resource
48
+ representation.embedded.episodes.last.must_be_kind_of Resource
49
49
  end
50
50
  end
51
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
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: 2012-06-30 00:00:00.000000000 Z
12
+ date: 2012-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
126
  version: '0'
127
127
  segments:
128
128
  - 0
129
- hash: -2196933980159133374
129
+ hash: -1844692704935824375
130
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  none: false
132
132
  requirements:
@@ -135,10 +135,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  version: '0'
136
136
  segments:
137
137
  - 0
138
- hash: -2196933980159133374
138
+ hash: -1844692704935824375
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 1.8.23
141
+ rubygems_version: 1.8.19
142
142
  signing_key:
143
143
  specification_version: 3
144
144
  summary: ''