api_bee 0.1.4 → 0.1.7
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.mkd +82 -61
- data/lib/api_bee/adapters/hash.rb +6 -3
- data/lib/api_bee/node.rb +4 -0
- data/lib/api_bee/version.rb +1 -1
- data/spec/hash_adapter_spec.rb +13 -0
- data/spec/node_spec.rb +14 -0
- metadata +2 -2
data/README.mkd
CHANGED
@@ -9,33 +9,36 @@ These APIs must
|
|
9
9
|
|
10
10
|
A single resource might look like:
|
11
11
|
|
12
|
+
```javascript
|
13
|
+
{
|
14
|
+
'name': 'Foo',
|
15
|
+
'description': 'foo resoruce',
|
16
|
+
'href': 'http://api.myservice.com/resources/foo'
|
17
|
+
}
|
18
|
+
```
|
19
|
+
A resource collection looks like:
|
20
|
+
|
21
|
+
```javascript
|
22
|
+
{
|
23
|
+
'href': 'http://api.myservice.com/resources',
|
24
|
+
'total_entries': 100,
|
25
|
+
'page': 1,
|
26
|
+
'per_page': 10,
|
27
|
+
'entries': [
|
12
28
|
{
|
13
29
|
'name': 'Foo',
|
14
30
|
'description': 'foo resoruce',
|
15
|
-
'href':
|
16
|
-
}
|
17
|
-
|
18
|
-
A resource collection looks like:
|
19
|
-
|
31
|
+
'href': 'http://api.myservice.com/resources/foo'
|
32
|
+
},
|
20
33
|
{
|
21
|
-
'
|
22
|
-
'
|
23
|
-
'
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
'href': 'http://api.myservice.com/resources/foo'
|
30
|
-
},
|
31
|
-
{
|
32
|
-
'name': 'Bar',
|
33
|
-
'description': 'bar resoruce',
|
34
|
-
'href': 'http://api.myservice.com/resources/bar'
|
35
|
-
},
|
36
|
-
...
|
37
|
-
]
|
38
|
-
}
|
34
|
+
'name': 'Bar',
|
35
|
+
'description': 'bar resoruce',
|
36
|
+
'href': 'http://api.myservice.com/resources/bar'
|
37
|
+
},
|
38
|
+
...
|
39
|
+
]
|
40
|
+
}
|
41
|
+
```
|
39
42
|
|
40
43
|
Collection resources must include the fields 'href', 'total_entries', 'page', 'per_page' and 'entries'. This allows clients to paginate and fetch more pages.
|
41
44
|
|
@@ -71,14 +74,16 @@ end
|
|
71
74
|
|
72
75
|
If an object in a response has a 'href' attribute, it will be used to fetch more data if you ask for an attribute currently not in the object.
|
73
76
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
```javascript
|
78
|
+
/* JSON Dataset */
|
79
|
+
{
|
80
|
+
'user': {
|
81
|
+
'name': 'Ismael',
|
82
|
+
'href': 'http://api.com/users/ismael'
|
83
|
+
}
|
84
|
+
}
|
85
|
+
```
|
86
|
+
|
82
87
|
```ruby
|
83
88
|
# Instantiate object
|
84
89
|
user = api.get('/user')
|
@@ -90,26 +95,27 @@ user[:last_name]
|
|
90
95
|
|
91
96
|
This works for objects in collections too.
|
92
97
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
]
|
98
|
+
```javascript
|
99
|
+
/* JSON collection */
|
100
|
+
{
|
101
|
+
'users': {
|
102
|
+
'total_entries': 100,
|
103
|
+
'page': 1,
|
104
|
+
'per_page': 2,
|
105
|
+
'href': 'http://api.com/users',
|
106
|
+
'entries': [
|
107
|
+
{
|
108
|
+
'name': 'Ismael',
|
109
|
+
'href': 'http://api.com/users/ismael'
|
110
|
+
},
|
111
|
+
{
|
112
|
+
'name': 'John',
|
113
|
+
'href': 'http://api.com/users/john'
|
110
114
|
}
|
111
|
-
|
112
|
-
|
115
|
+
]
|
116
|
+
}
|
117
|
+
}
|
118
|
+
```
|
113
119
|
|
114
120
|
```ruby
|
115
121
|
# Instantiate collection
|
@@ -197,27 +203,42 @@ end
|
|
197
203
|
|
198
204
|
ApiBee ships with an in-memory Hash adapter so it can be use with test/local data (for example a YAML file).
|
199
205
|
|
200
|
-
|
201
206
|
```ruby
|
202
|
-
api = ApiBee.setup(:hash, YAML.load_file('./my_data.yml'))
|
203
|
-
|
207
|
+
api = ApiBee.setup(:hash, YAML.load_file('./my_data.yml'))
|
208
|
+
|
204
209
|
products = api.get('/products') # => ApiBee::Node::List
|
205
|
-
|
206
|
-
products.first # => ApiBee::Node::Single
|
207
|
-
|
210
|
+
|
211
|
+
products.first # => ApiBee::Node::Single
|
208
212
|
products.each() # iterate current page
|
209
|
-
|
210
213
|
products.current_page # => 1
|
211
|
-
|
212
214
|
products.paginate(:page => 2, :per_page => 4) # => ApiBee::Node::List # Next page
|
213
|
-
|
214
215
|
products.has_next_page? # => false
|
215
|
-
|
216
216
|
products.has_prev_page? # => true
|
217
|
-
|
218
217
|
products.prev_page # => 1
|
219
218
|
```
|
220
219
|
|
221
220
|
## Examples
|
222
221
|
|
223
222
|
See [examples/github_api.rb](https://github.com/ismasan/ApiBee/blob/master/examples/github_api.rb) for an adapter that paginates Github's API by decorating it's results with ApiBee's required pagination properties
|
223
|
+
|
224
|
+
# LICENSE
|
225
|
+
|
226
|
+
Copyright (C) 2011 Ismael Celis
|
227
|
+
|
228
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
229
|
+
this software and associated documentation files (the "Software"), to deal in
|
230
|
+
the Software without restriction, including without limitation the rights to
|
231
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
232
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
233
|
+
so, subject to the following conditions:
|
234
|
+
|
235
|
+
The above copyright notice and this permission notice shall be included in all
|
236
|
+
copies or substantial portions of the Software.
|
237
|
+
|
238
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
239
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
240
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
241
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
242
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
243
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
244
|
+
SOFTWARE.
|
@@ -6,8 +6,11 @@ module ApiBee
|
|
6
6
|
|
7
7
|
attr_reader :data
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@data =
|
9
|
+
def initialize(data, args = {})
|
10
|
+
@data = data
|
11
|
+
@config = {
|
12
|
+
:uid_field => :id
|
13
|
+
}.merge(args)
|
11
14
|
end
|
12
15
|
|
13
16
|
def get(href, opts = {})
|
@@ -49,7 +52,7 @@ module ApiBee
|
|
49
52
|
|
50
53
|
def handle_array_data(array, key)
|
51
54
|
if array[0].kind_of?(::Hash)
|
52
|
-
array.find {|e| e[:
|
55
|
+
array.find {|e| e[@config[:uid_field]].to_s == key}
|
53
56
|
else
|
54
57
|
array
|
55
58
|
end
|
data/lib/api_bee/node.rb
CHANGED
data/lib/api_bee/version.rb
CHANGED
data/spec/hash_adapter_spec.rb
CHANGED
@@ -56,6 +56,19 @@ describe ApiBee::Adapters::Hash do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
+
context 'custom item identifier' do
|
60
|
+
before do
|
61
|
+
@data[:collections].first[:uid] = 'xxx123'
|
62
|
+
@uid_adapter = ApiBee::Adapters::Hash.new(@data, :uid_field => :uid)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should find by custom field name' do
|
66
|
+
collection = @uid_adapter.get('/collections/xxx123')
|
67
|
+
collection[:title].should == 'Catalog'
|
68
|
+
collection[:id].should == 'catalog'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
59
72
|
context 'accessing single nodes' do
|
60
73
|
|
61
74
|
before do
|
data/spec/node_spec.rb
CHANGED
@@ -117,6 +117,20 @@ describe ApiBee do
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
+
describe '#[]=' do
|
121
|
+
|
122
|
+
before do
|
123
|
+
@adapter = mock('Adapter')
|
124
|
+
@config = ApiBee.new_config
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should set attributes in nodes' do
|
128
|
+
node = ApiBee::Node.resolve(@adapter, @config, {:title => 'Blah', :total_entries => 4, :href => '/products'})
|
129
|
+
node[:foo] = 11
|
130
|
+
node[:foo].should == 11
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
120
134
|
context 'lazy loading' do
|
121
135
|
before do
|
122
136
|
require 'api_bee/adapters/hash'
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: api_bee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ismael Celis
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-01-
|
13
|
+
date: 2012-01-18 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Small Ruby client for discoverable, lazily-loaded, paginated JSON APIs
|