haipa 0.0.3 → 0.0.4
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/README.md +5 -7
- data/haipa.gemspec +1 -1
- data/lib/haipa.rb +1 -0
- data/lib/haipa/api.rb +9 -7
- data/lib/haipa/embedded.rb +12 -12
- data/lib/haipa/links.rb +8 -2
- data/lib/haipa/resource.rb +3 -25
- data/lib/haipa/version.rb +1 -1
- data/spec/haipa/api_spec.rb +2 -2
- data/spec/haipa/resource_spec.rb +5 -0
- data/spec/haipa_spec.rb +1 -1
- metadata +20 -4
data/README.md
CHANGED
@@ -60,22 +60,19 @@ and a thing index resource
|
|
60
60
|
Then Haipa can consume this API with
|
61
61
|
|
62
62
|
api = Haipa.api(url:'http://localhost:3000/api/v1')
|
63
|
+
api.description # the root as a hash
|
63
64
|
api.resource # the root as a Haipa::Resource
|
64
|
-
api.description # alias of api.resource
|
65
65
|
api.links # the root links as a Haipa::Links
|
66
66
|
api.href # the uri of the root
|
67
67
|
api.embedded # the embedded resource array Haipa::Embedded
|
68
68
|
api.resources # alias of api.embedded
|
69
|
-
api.to_hash # the api root as a hash
|
70
69
|
|
71
|
-
|
70
|
+
link = api.links
|
72
71
|
links.things # the things Haipa::Resource
|
73
|
-
links.to_hash # the links as a hash
|
74
72
|
|
75
|
-
things = links.things
|
73
|
+
things = links.things
|
76
74
|
things.links # the things index Haipa::Links
|
77
75
|
things.embedded # the things index Haipa::Embedded
|
78
|
-
things.to_hash # the things resource as a hash
|
79
76
|
|
80
77
|
embedded = things.embedded
|
81
78
|
embedded.things # array of Haipa::Resource
|
@@ -83,7 +80,8 @@ Then Haipa can consume this API with
|
|
83
80
|
embedded.things.first.name # the first embedded thing Haipa::Resource name
|
84
81
|
embedded.things[1] # the second embedded thing Haipa::Resource
|
85
82
|
embedded.things.first.clear.other_attribute
|
86
|
-
|
83
|
+
|
84
|
+
|
87
85
|
|
88
86
|
## Contributing
|
89
87
|
|
data/haipa.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_runtime_dependency 'faraday', '~> 0.8'
|
22
22
|
spec.add_runtime_dependency 'hashie', '~> 2.0.0'
|
23
|
-
|
23
|
+
spec.add_runtime_dependency 'addressable', '~> 2.3.0'
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
25
|
spec.add_development_dependency 'rake'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 2.13.0'
|
data/lib/haipa.rb
CHANGED
data/lib/haipa/api.rb
CHANGED
@@ -3,10 +3,9 @@ module Haipa
|
|
3
3
|
extend Forwardable
|
4
4
|
|
5
5
|
attr_reader :conn, :resource, :uri
|
6
|
-
def_delegators :@conn, :get
|
7
|
-
def_delegators :@resource, :links, :embedded, :href, :resources
|
6
|
+
def_delegators :@conn, :get
|
7
|
+
def_delegators :@resource, :links, :embedded, :href, :resources
|
8
8
|
alias :connection :conn
|
9
|
-
alias :description :resource
|
10
9
|
|
11
10
|
def initialize(params={})
|
12
11
|
@uri = URI(params[:url].to_s).path
|
@@ -20,16 +19,19 @@ module Haipa
|
|
20
19
|
{
|
21
20
|
:headers =>
|
22
21
|
{
|
23
|
-
|
24
|
-
|
25
|
-
'Content-Type' => 'application/hal+json'
|
22
|
+
:accept => 'application/hal+json',
|
23
|
+
:user_agent => 'Haipa'
|
26
24
|
}
|
27
25
|
}.extend(Hashie::Extensions::DeepMerge)
|
28
26
|
end
|
29
27
|
|
30
28
|
def clear
|
31
|
-
resource.clear
|
29
|
+
@resource.clear
|
32
30
|
self
|
33
31
|
end
|
32
|
+
|
33
|
+
def description
|
34
|
+
resource.get
|
35
|
+
end
|
34
36
|
end
|
35
37
|
end
|
data/lib/haipa/embedded.rb
CHANGED
@@ -2,33 +2,33 @@ module Haipa
|
|
2
2
|
class Embedded
|
3
3
|
extend Forwardable
|
4
4
|
|
5
|
-
attr_reader :resource
|
6
|
-
def_delegators :@data, :empty?, :has_key
|
5
|
+
attr_reader :data, :resource
|
6
|
+
def_delegators :@data, :empty?, :has_key?
|
7
7
|
|
8
8
|
def initialize(resource, data)
|
9
9
|
@data = data
|
10
10
|
@resource = resource
|
11
11
|
end
|
12
12
|
|
13
|
+
def to_hash
|
14
|
+
@data
|
15
|
+
end
|
16
|
+
|
13
17
|
def method_missing(name, *args, &block)
|
14
|
-
if
|
15
|
-
from_array(
|
18
|
+
if data.has_key?(name)
|
19
|
+
from_array(data[name])
|
16
20
|
else
|
17
21
|
super
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
|
-
def to_hash
|
22
|
-
@data
|
23
|
-
end
|
24
|
-
|
25
25
|
private
|
26
26
|
|
27
|
-
def from_array(
|
28
|
-
if
|
29
|
-
|
27
|
+
def from_array(array)
|
28
|
+
if array.kind_of?(Array)
|
29
|
+
array.map{ |e| from_hash(e) }
|
30
30
|
else
|
31
|
-
from_hash(
|
31
|
+
from_hash(array)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
data/lib/haipa/links.rb
CHANGED
@@ -2,7 +2,7 @@ module Haipa
|
|
2
2
|
class Links
|
3
3
|
extend Forwardable
|
4
4
|
|
5
|
-
attr_reader :resource
|
5
|
+
attr_reader :data, :resource
|
6
6
|
def_delegators :@data, :empty?, :has_key?
|
7
7
|
|
8
8
|
def initialize(resource, data)
|
@@ -16,7 +16,13 @@ module Haipa
|
|
16
16
|
|
17
17
|
def method_missing(name, *args, &block)
|
18
18
|
if @data.has_key?(name)
|
19
|
-
|
19
|
+
href = @data[name]['href']
|
20
|
+
if @data[name]['template'] == true
|
21
|
+
template = Addressable::Template.new(href)
|
22
|
+
options = args.last.is_a?(::Hash) ? args.pop : {}
|
23
|
+
href = template.expand(options).to_s
|
24
|
+
end
|
25
|
+
Resource.new(resource.api, href)
|
20
26
|
else
|
21
27
|
super
|
22
28
|
end
|
data/lib/haipa/resource.rb
CHANGED
@@ -5,11 +5,7 @@ module Haipa
|
|
5
5
|
def initialize(api, uri, data=nil)
|
6
6
|
@api = api
|
7
7
|
@uri = uri
|
8
|
-
@data =
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_hash
|
12
|
-
get
|
8
|
+
@data = data
|
13
9
|
end
|
14
10
|
|
15
11
|
def clear
|
@@ -22,31 +18,13 @@ module Haipa
|
|
22
18
|
@data ||= ::Hashie::Mash.new(JSON.parse(api.get(uri).body))
|
23
19
|
end
|
24
20
|
|
25
|
-
def post(params={})
|
26
|
-
api.post(uri, params) do |req|
|
27
|
-
yield req if block_given?
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def put(params={})
|
32
|
-
api.put(uri, params) do |req|
|
33
|
-
yield req if block_given?
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def delete(params={})
|
38
|
-
api.delete(uri, params) do |req|
|
39
|
-
yield req if block_given?
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
21
|
def embedded
|
44
|
-
|
22
|
+
Embedded.new(self, get.fetch('_embedded', {}))
|
45
23
|
end
|
46
24
|
alias :resources :embedded
|
47
25
|
|
48
26
|
def links
|
49
|
-
|
27
|
+
Links.new(self, get.fetch('_links', {}))
|
50
28
|
end
|
51
29
|
|
52
30
|
def href
|
data/lib/haipa/version.rb
CHANGED
data/spec/haipa/api_spec.rb
CHANGED
@@ -8,9 +8,9 @@ describe Haipa::Api do
|
|
8
8
|
stub.get('/') { [200, {}, description.to_json] }
|
9
9
|
end
|
10
10
|
end
|
11
|
-
subject { Haipa.api { |
|
11
|
+
subject { Haipa.api { |builder| builder.adapter :test, stubs } }
|
12
12
|
|
13
|
-
specify { subject.description.
|
13
|
+
specify { subject.description.should == description }
|
14
14
|
specify { subject.links.to_hash.should == description['_links'] }
|
15
15
|
specify { subject.embedded.to_hash.should == description['_embedded'] }
|
16
16
|
specify { subject.href.should == description['_links']['self']['href'] }
|
data/spec/haipa/resource_spec.rb
CHANGED
@@ -14,6 +14,11 @@ describe Haipa::Resource do
|
|
14
14
|
specify { subject.links.self.should be }
|
15
15
|
end
|
16
16
|
|
17
|
+
it 'works' do
|
18
|
+
# template = Addressable::Template.new('/api{?q1,q2}')
|
19
|
+
# ap template.expand({'q1' => 'hello', 'q2' => 'bye'}).to_s
|
20
|
+
end
|
21
|
+
|
17
22
|
context "with embedded resources" do
|
18
23
|
let(:body) do
|
19
24
|
{
|
data/spec/haipa_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haipa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
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: 2013-03-
|
12
|
+
date: 2013-03-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -43,6 +43,22 @@ dependencies:
|
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 2.0.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: addressable
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.3.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.3.0
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: bundler
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
146
|
version: '0'
|
131
147
|
segments:
|
132
148
|
- 0
|
133
|
-
hash: -
|
149
|
+
hash: -2216550637168734427
|
134
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
151
|
none: false
|
136
152
|
requirements:
|
@@ -139,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
155
|
version: '0'
|
140
156
|
segments:
|
141
157
|
- 0
|
142
|
-
hash: -
|
158
|
+
hash: -2216550637168734427
|
143
159
|
requirements: []
|
144
160
|
rubyforge_project:
|
145
161
|
rubygems_version: 1.8.23
|