paginater 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d8e835d5abb7ce6c5b68117582cf65b3bfa37f2b
4
+ data.tar.gz: 4c8d9e3b6ec7e9ab5699ac21a46b52ab04e62720
5
+ SHA512:
6
+ metadata.gz: 910c1b0d34981fdd2695e7a737cd80303a83e5538b5e5693a147a7f0fdd3c0b70c95af0dafd4ac66404c3bed7505a5cd913cb8cb96e2b6ef8df871b8f72f3afe
7
+ data.tar.gz: 1cc68b151e62de11e77077a999f9d58b078153240689c943403c513604c2ef3fbaff12d8375e8df3c21e1003b5224d206c8d25809bae626980e0e07b954bb1ab
@@ -0,0 +1,17 @@
1
+ # *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ # Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ # doc/
11
+ lib/bundler/man
12
+ # pkg
13
+ rdoc
14
+ # spec/reports
15
+ # test/tmp
16
+ # test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=documentation
3
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in paginater.gemspec
4
+ gemspec
@@ -0,0 +1,127 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ paginater (0.0.5)
5
+ activerecord
6
+ bundler
7
+ cookiejar
8
+ grape
9
+ kaminari
10
+ rack-test
11
+ rake
12
+ rspec
13
+ rspec-rails
14
+ sqlite3
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ actionpack (3.2.12)
20
+ activemodel (= 3.2.12)
21
+ activesupport (= 3.2.12)
22
+ builder (~> 3.0.0)
23
+ erubis (~> 2.7.0)
24
+ journey (~> 1.0.4)
25
+ rack (~> 1.4.5)
26
+ rack-cache (~> 1.2)
27
+ rack-test (~> 0.6.1)
28
+ sprockets (~> 2.2.1)
29
+ activemodel (3.2.12)
30
+ activesupport (= 3.2.12)
31
+ builder (~> 3.0.0)
32
+ activerecord (3.2.12)
33
+ activemodel (= 3.2.12)
34
+ activesupport (= 3.2.12)
35
+ arel (~> 3.0.2)
36
+ tzinfo (~> 0.3.29)
37
+ activesupport (3.2.12)
38
+ i18n (~> 0.6)
39
+ multi_json (~> 1.0)
40
+ arel (3.0.2)
41
+ backports (2.6.7)
42
+ builder (3.0.4)
43
+ cookiejar (0.3.0)
44
+ daemons (1.1.9)
45
+ descendants_tracker (0.0.1)
46
+ diff-lcs (1.2.1)
47
+ erubis (2.7.0)
48
+ eventmachine (1.0.3)
49
+ grape (0.3.2)
50
+ activesupport
51
+ builder
52
+ hashie (>= 1.2.0)
53
+ multi_json (>= 1.3.2)
54
+ multi_xml (>= 0.5.2)
55
+ rack
56
+ rack-accept
57
+ rack-mount
58
+ virtus
59
+ hashie (2.0.2)
60
+ hike (1.2.1)
61
+ i18n (0.6.4)
62
+ journey (1.0.4)
63
+ json (1.7.7)
64
+ kaminari (0.14.1)
65
+ actionpack (>= 3.0.0)
66
+ activesupport (>= 3.0.0)
67
+ multi_json (1.6.1)
68
+ multi_xml (0.5.3)
69
+ rack (1.4.5)
70
+ rack-accept (0.4.5)
71
+ rack (>= 0.4)
72
+ rack-cache (1.2)
73
+ rack (>= 0.4)
74
+ rack-mount (0.8.3)
75
+ rack (>= 1.0.0)
76
+ rack-ssl (1.3.3)
77
+ rack
78
+ rack-test (0.6.2)
79
+ rack (>= 1.0)
80
+ railties (3.2.12)
81
+ actionpack (= 3.2.12)
82
+ activesupport (= 3.2.12)
83
+ rack-ssl (~> 1.3.2)
84
+ rake (>= 0.8.7)
85
+ rdoc (~> 3.4)
86
+ thor (>= 0.14.6, < 2.0)
87
+ rake (10.0.3)
88
+ rdoc (3.12.2)
89
+ json (~> 1.4)
90
+ rspec (2.13.0)
91
+ rspec-core (~> 2.13.0)
92
+ rspec-expectations (~> 2.13.0)
93
+ rspec-mocks (~> 2.13.0)
94
+ rspec-core (2.13.1)
95
+ rspec-expectations (2.13.0)
96
+ diff-lcs (>= 1.1.3, < 2.0)
97
+ rspec-mocks (2.13.0)
98
+ rspec-rails (2.13.0)
99
+ actionpack (>= 3.0)
100
+ activesupport (>= 3.0)
101
+ railties (>= 3.0)
102
+ rspec-core (~> 2.13.0)
103
+ rspec-expectations (~> 2.13.0)
104
+ rspec-mocks (~> 2.13.0)
105
+ sprockets (2.2.2)
106
+ hike (~> 1.2)
107
+ multi_json (~> 1.0)
108
+ rack (~> 1.0)
109
+ tilt (~> 1.1, != 1.3.0)
110
+ sqlite3 (1.3.7)
111
+ thin (1.5.0)
112
+ daemons (>= 1.0.9)
113
+ eventmachine (>= 0.12.6)
114
+ rack (>= 1.0.0)
115
+ thor (0.17.0)
116
+ tilt (1.3.5)
117
+ tzinfo (0.3.37)
118
+ virtus (0.5.4)
119
+ backports (~> 2.6.1)
120
+ descendants_tracker (~> 0.0.1)
121
+
122
+ PLATFORMS
123
+ ruby
124
+
125
+ DEPENDENCIES
126
+ paginater!
127
+ thin
@@ -0,0 +1,78 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ paginater (0.0.5)
5
+ activerecord
6
+ bundler
7
+ cookiejar
8
+ grape
9
+ kaminari
10
+ rack-test
11
+ rake
12
+ rspec
13
+ rspec-rails
14
+ sqlite3
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ activerecord (1.6.0)
20
+ activesupport (3.2.12)
21
+ i18n (~> 0.6)
22
+ multi_json (~> 1.0)
23
+ backports (2.6.7)
24
+ builder (3.2.0)
25
+ cookiejar (0.3.0)
26
+ daemons (1.1.9)
27
+ descendants_tracker (0.0.1)
28
+ diff-lcs (1.1.3)
29
+ eventmachine (1.0.3)
30
+ grape (0.3.2)
31
+ activesupport
32
+ builder
33
+ hashie (>= 1.2.0)
34
+ multi_json (>= 1.3.2)
35
+ multi_xml (>= 0.5.2)
36
+ rack
37
+ rack-accept
38
+ rack-mount
39
+ virtus
40
+ hashie (2.0.2)
41
+ i18n (0.6.4)
42
+ kaminari (0.11.0)
43
+ kaminari
44
+ multi_json (1.6.1)
45
+ multi_xml (0.5.3)
46
+ rack (1.5.2)
47
+ rack-accept (0.4.5)
48
+ rack (>= 0.4)
49
+ rack-mount (0.8.3)
50
+ rack (>= 1.0.0)
51
+ rack-test (0.6.2)
52
+ rack (>= 1.0)
53
+ rake (10.0.3)
54
+ rspec (2.1.0)
55
+ rspec-core (~> 2.1.0)
56
+ rspec-expectations (~> 2.1.0)
57
+ rspec-mocks (~> 2.1.0)
58
+ rspec-core (2.1.0)
59
+ rspec-expectations (2.1.0)
60
+ diff-lcs (~> 1.1.2)
61
+ rspec-mocks (2.1.0)
62
+ rspec-rails (2.1.0)
63
+ rspec (~> 2.1.0)
64
+ sqlite3 (1.3.7)
65
+ thin (1.5.0)
66
+ daemons (>= 1.0.9)
67
+ eventmachine (>= 0.12.6)
68
+ rack (>= 1.0.0)
69
+ virtus (0.5.4)
70
+ backports (~> 2.6.1)
71
+ descendants_tracker (~> 0.0.1)
72
+
73
+ PLATFORMS
74
+ ruby
75
+
76
+ DEPENDENCIES
77
+ paginater!
78
+ thin
@@ -0,0 +1,127 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ paginater (0.0.5)
5
+ activerecord
6
+ bundler
7
+ cookiejar
8
+ grape
9
+ kaminari
10
+ rack-test
11
+ rake
12
+ rspec
13
+ rspec-rails
14
+ sqlite3
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ actionpack (3.2.12)
20
+ activemodel (= 3.2.12)
21
+ activesupport (= 3.2.12)
22
+ builder (~> 3.0.0)
23
+ erubis (~> 2.7.0)
24
+ journey (~> 1.0.4)
25
+ rack (~> 1.4.5)
26
+ rack-cache (~> 1.2)
27
+ rack-test (~> 0.6.1)
28
+ sprockets (~> 2.2.1)
29
+ activemodel (3.2.12)
30
+ activesupport (= 3.2.12)
31
+ builder (~> 3.0.0)
32
+ activerecord (3.2.12)
33
+ activemodel (= 3.2.12)
34
+ activesupport (= 3.2.12)
35
+ arel (~> 3.0.2)
36
+ tzinfo (~> 0.3.29)
37
+ activesupport (3.2.12)
38
+ i18n (~> 0.6)
39
+ multi_json (~> 1.0)
40
+ arel (3.0.2)
41
+ backports (2.6.7)
42
+ builder (3.0.4)
43
+ cookiejar (0.3.0)
44
+ daemons (1.1.9)
45
+ descendants_tracker (0.0.1)
46
+ diff-lcs (1.2.1)
47
+ erubis (2.7.0)
48
+ eventmachine (1.0.3)
49
+ grape (0.3.2)
50
+ activesupport
51
+ builder
52
+ hashie (>= 1.2.0)
53
+ multi_json (>= 1.3.2)
54
+ multi_xml (>= 0.5.2)
55
+ rack
56
+ rack-accept
57
+ rack-mount
58
+ virtus
59
+ hashie (2.0.2)
60
+ hike (1.2.1)
61
+ i18n (0.6.4)
62
+ journey (1.0.4)
63
+ json (1.7.7)
64
+ kaminari (0.14.1)
65
+ actionpack (>= 3.0.0)
66
+ activesupport (>= 3.0.0)
67
+ multi_json (1.6.1)
68
+ multi_xml (0.5.3)
69
+ rack (1.4.5)
70
+ rack-accept (0.4.5)
71
+ rack (>= 0.4)
72
+ rack-cache (1.2)
73
+ rack (>= 0.4)
74
+ rack-mount (0.8.3)
75
+ rack (>= 1.0.0)
76
+ rack-ssl (1.3.3)
77
+ rack
78
+ rack-test (0.6.2)
79
+ rack (>= 1.0)
80
+ railties (3.2.12)
81
+ actionpack (= 3.2.12)
82
+ activesupport (= 3.2.12)
83
+ rack-ssl (~> 1.3.2)
84
+ rake (>= 0.8.7)
85
+ rdoc (~> 3.4)
86
+ thor (>= 0.14.6, < 2.0)
87
+ rake (10.0.3)
88
+ rdoc (3.12.2)
89
+ json (~> 1.4)
90
+ rspec (2.13.0)
91
+ rspec-core (~> 2.13.0)
92
+ rspec-expectations (~> 2.13.0)
93
+ rspec-mocks (~> 2.13.0)
94
+ rspec-core (2.13.1)
95
+ rspec-expectations (2.13.0)
96
+ diff-lcs (>= 1.1.3, < 2.0)
97
+ rspec-mocks (2.13.0)
98
+ rspec-rails (2.13.0)
99
+ actionpack (>= 3.0)
100
+ activesupport (>= 3.0)
101
+ railties (>= 3.0)
102
+ rspec-core (~> 2.13.0)
103
+ rspec-expectations (~> 2.13.0)
104
+ rspec-mocks (~> 2.13.0)
105
+ sprockets (2.2.2)
106
+ hike (~> 1.2)
107
+ multi_json (~> 1.0)
108
+ rack (~> 1.0)
109
+ tilt (~> 1.1, != 1.3.0)
110
+ sqlite3 (1.3.7)
111
+ thin (1.5.0)
112
+ daemons (>= 1.0.9)
113
+ eventmachine (>= 0.12.6)
114
+ rack (>= 1.0.0)
115
+ thor (0.17.0)
116
+ tilt (1.3.5)
117
+ tzinfo (0.3.37)
118
+ virtus (0.5.4)
119
+ backports (~> 2.6.1)
120
+ descendants_tracker (~> 0.0.1)
121
+
122
+ PLATFORMS
123
+ ruby
124
+
125
+ DEPENDENCIES
126
+ paginater!
127
+ thin
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 zeroed
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,268 @@
1
+ # Paginater
2
+
3
+ A wannabe pagination gem for [Grape](https://github.com/intridea/grape)
4
+
5
+ _YAPG: Yet another pagination gem..._
6
+
7
+ Paginater is a simple (still work in progress) gem that want to be a little utility when your API is dealing with a collection of objects.
8
+
9
+ You can use Paginater in your Grape app to have a simple feature of pagination that understand `page` and `size` parameters in a GET route.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'paginater'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install paginater
24
+
25
+ ## Usage
26
+
27
+ Paginater (actually) supports 3 pagination systems:
28
+
29
+ - `:simple`
30
+ - `:kaminari`
31
+ - `:wrapper`
32
+
33
+ The `:simple` option uses only the core library functions of Ruby; the `:kaminari` option delegates the pagination to the powerful gem [Kaminari](https://github.com/amatsuda/kaminari) and the `:wrapper` gives you the possibility to wrap your content in a convenient object (this feature is work in progress).
34
+ Paginater also provides with each response, headers useful for pagination.
35
+
36
+ Enable Paginater makes the API url aware of the `page` parameter (required) and the `size` parameter (optional).
37
+
38
+ Tell your API to use Paginater:
39
+
40
+ ```ruby
41
+ class API < Grape:API
42
+ format :json
43
+ formatter :json, Grape::Formatter::Paginater
44
+
45
+ # ...
46
+
47
+ get '/stuff', :paginater => :simple do
48
+ # ... your stuff
49
+ end
50
+
51
+ end
52
+ ```
53
+
54
+ And get the content paginated with:
55
+
56
+ `/stuff?page=1` and `/stuff?page=1&size=4`
57
+
58
+ Use Kaminari gem:
59
+
60
+ ```ruby
61
+ class API < Grape:API
62
+ format :json
63
+ formatter :json, Grape::Formatter::Paginater
64
+
65
+ # ...
66
+
67
+ get '/users', :paginater => :kaminari do
68
+ User.where("age > 18")
69
+ end
70
+
71
+ end
72
+ ```
73
+
74
+ Using `:kaminari` gives more flexibilty and don't raise any error when an exceeding page is required.
75
+
76
+ With a `:size` greater than the `total_count` will be returned and diplayed all the items in the resource.
77
+
78
+ Paginater also provide in the headers (see the examples) links useful for pagination.
79
+ Another feature in progress is the possibility to wrap your content in a convenient object; maybe in the future will be possible to associate with this object a specific template...
80
+ Set this option (if you dare) with: `:paginater => :wrapper`
81
+
82
+ ```ruby
83
+ class API < Grape:API
84
+ format :json
85
+ formatter :json, Grape::Formatter::Paginater
86
+
87
+ # ...
88
+
89
+ get '/stuff', :paginater => :wrapper do
90
+ # ... your stuff
91
+ end
92
+
93
+ end
94
+ ```
95
+
96
+ Browse the `spec` directory and `spec/paginater/paginater_spec.rb` or `spec/paginater/paginater_with_kaminari_spec.rb` files for more examples.
97
+
98
+ The last feature in progress is something useful stored in cookies. Actually you can find a value: `#page/#pages/#count` calculated with size=1.
99
+
100
+ ## A Running Test
101
+
102
+ In the `test` directory there is a very simple running test (configured with the `:kaminari` option).
103
+
104
+ ```
105
+ $ cd test
106
+ /test$ bundle exec rackup
107
+ [2013-03-09 16:05:25] INFO WEBrick 1.3.1
108
+ [2013-03-09 16:05:25] INFO ruby 2.0.0 (2013-02-24) [i686-linux]
109
+ [2013-03-09 16:05:25] INFO WEBrick::HTTPServer#start: pid=3776 port=9292
110
+ ...
111
+ ```
112
+
113
+ This expose two resources: `/foo` and `/news` (the last require an internet connection).
114
+ Then try:
115
+
116
+ ```
117
+ http://localhost:9292/foo?page=1
118
+ ["Alpha"]
119
+
120
+ http://localhost:9292/foo?page=4&size=6
121
+ ["Sierra","Tango","Uniform","Victor","Whiskey","X-Ray"]
122
+
123
+ http://localhost:9292/foo?page=2&size=4
124
+ ["Echo","Foxtrot","Golf","Hotel"]
125
+
126
+ http://localhost:9292/foo
127
+ {"error":"missing param"}
128
+
129
+ http://localhost:9292/foo?page=42
130
+ [] #=> with :kaminari
131
+ #=> {"error":"invalid page 42"} # with :simple
132
+
133
+ http://localhost:9292/foo?page=2&size=42
134
+ [] #=> with :kaminari
135
+ #=> {"error":"page 2 out"} # with :simple
136
+
137
+ http://localhost:9292/foo?page=1&size=111
138
+ ["Alpha","Bravo","Charlie", <...> ,"X-Ray","Yankee","Zulu"]
139
+
140
+ http://localhost:9292/foo?page=1&size=0
141
+ #=> no error because default size is 1
142
+ #=> {"error":"divided by 0"} # with :kaminari
143
+ #=> {"error":"invalid size 0"} # with :simple
144
+
145
+ http://localhost:9292/foo?page=0
146
+ {"error":"first page must be 1"}
147
+
148
+ ```
149
+
150
+ ## headers
151
+
152
+ In the response header there are links useful for pagination... maybe more to come...
153
+
154
+ - first page: `{:url=>\"/foo?page=1\", :rel=>\"first\"};{:url=>\"/foo?page=2\", :rel=>\"next\"}\n`
155
+ - last page: `{:url=>\"/foo?page=1\", :rel=>\"first\"};;{:url=>\"/foo?page=9\", :rel=>\"prev\"}`
156
+ - just a page: `{:url=>\"/foo?page=1&size=3\", :rel=>\"first\"};{:url=>\"/foo?page=4&size=3\", :rel=>\"next\"};{:url=>\"/foo?page=2&size=3\", :rel=>\"prev\"}`
157
+
158
+ The first page:
159
+
160
+ ```
161
+ $ curl -I http://localhost:9292/foo?page=1&size=4
162
+ $ HTTP/1.1 200 OK
163
+ Content-Type: application/json
164
+ Link: {:url=>"/foo?page=1", :rel=>"first"};{:url=>"/foo?page=2", :rel=>"next"}
165
+ Content-Length: 9
166
+ Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24)
167
+ Date: Sat, 09 Mar 2013 15:21:10 GMT
168
+ Connection: Keep-Alive
169
+
170
+ ```
171
+
172
+ ```
173
+ $ curl -I http://localhost:9292/news?page=1&size=1
174
+ $ HTTP/1.1 200 OK
175
+ Content-Type: application/json
176
+ Link: {:url=>"/news?page=1", :rel=>"first"};{:url=>"/news?page=2", :rel=>"next"}
177
+ Content-Length: 130
178
+ Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24)
179
+ Date: Sat, 09 Mar 2013 16:56:15 GMT
180
+ Connection: Keep-Alive
181
+
182
+ ```
183
+
184
+ Just a page:
185
+
186
+ ```
187
+ $ curl -I http://localhost:9292/foo?page=2&size=4
188
+ $ HTTP/1.1 200 OK
189
+ Content-Type: application/json
190
+ Set-Cookie: 2/26/26
191
+ Link: {:url=>"/foo?page=1", :rel=>"first"};{:url=>"/foo?page=3", :rel=>"next"};{:url=>"/foo?page=1", :rel=>"prev"}
192
+ Content-Length: 9
193
+ Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24)
194
+ Date: Sat, 09 Mar 2013 15:22:12 GMT
195
+ Connection: Keep-Alive
196
+
197
+ ```
198
+
199
+ The last page:
200
+
201
+ ```
202
+ $ curl -I http://localhost:9292/foo?page=26
203
+ $ HTTP/1.1 200 OK
204
+ Content-Type: application/json
205
+ Set-Cookie: 26/26/26
206
+ Link: {:url=>"/foo?page=1", :rel=>"first"};;{:url=>"/foo?page=25", :rel=>"prev"}
207
+ Content-Length: 8
208
+ Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24)
209
+ Date: Sat, 09 Mar 2013 15:23:03 GMT
210
+ Connection: Keep-Alive
211
+
212
+ ```
213
+
214
+ ```
215
+ $ curl -I http://localhost:9292/news?page=10
216
+ $ HTTP/1.1 200 OK
217
+ Content-Type: application/json
218
+ Set-Cookie: 10/10/10
219
+ Link: {:url=>"/news?page=1", :rel=>"first"};{:url=>"/news?page=9", :rel=>"prev"}
220
+ Content-Length: 127
221
+ Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24)
222
+ Date: Sat, 09 Mar 2013 16:56:47 GMT
223
+ Connection: Keep-Alive
224
+
225
+ ```
226
+
227
+ With `:simple`
228
+
229
+ ```
230
+ $ curl -I http://localhost:9292/news?page=11
231
+ HTTP/1.1 500 Internal Server Error
232
+ Content-Type: application/json
233
+ Content-Length: 27
234
+ Connection: keep-alive
235
+ Server: thin 1.5.0 codename Knife
236
+ ```
237
+
238
+ With `:kaminari`
239
+
240
+ ```
241
+ #=> []
242
+ HTTP/1.1 200 OK
243
+ ```
244
+
245
+ ## Note
246
+
247
+ Unrelated but inspired by this beautiful code:
248
+
249
+ - [grape](https://github.com/intridea/grape)
250
+ - [grape-entity](https://github.com/agileanimal/grape-entity)
251
+ - [grape-rabl](https://github.com/LTe/grape-rabl)
252
+
253
+ ## Discuss
254
+
255
+ There is a thread on the [grape-mailinglist](https://groups.google.com/forum/?fromgroups=#!forum/ruby-grape):
256
+
257
+ - https://groups.google.com/forum/?fromgroups=#!topic/ruby-grape/vH2DP1qsN9I
258
+
259
+ ## Contributing
260
+
261
+ 1. Fork it
262
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
263
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
264
+ 4. Push to the branch (`git push origin my-new-feature`)
265
+ 5. Create new Pull Request
266
+
267
+ _
268
+