rack-backend-api 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +7 -0
- data/lib/backend_api.rb +7 -7
- data/lib/sequel_rack_backend_api_adapter.rb +1 -0
- data/rack-backend-api.gemspec +1 -1
- data/test/db.rb +1 -0
- data/test/spec_backend_api.rb +20 -0
- data/test/spec_sequel_adapter.rb +4 -0
- metadata +4 -4
data/README.md
CHANGED
@@ -153,6 +153,11 @@ The option `:submit_text` is also available through the API as `_submit_text`.
|
|
153
153
|
It says "SAVE" by default but you might want it to say "CREATE" and "UPDATE" in appropriate cases,
|
154
154
|
like we did in the example.
|
155
155
|
|
156
|
+
Another thing to note is that you don't have to use a destination for when something is created or updated.
|
157
|
+
If you do not use destination, the API will call the instance method `Model#backend_show` on the entry.
|
158
|
+
By default it just says `'OK'` but you can override the method in order to send whatever you want.
|
159
|
+
This comes handy when you use ajax and want a representation of the entry once it's created.
|
160
|
+
|
156
161
|
SORTING
|
157
162
|
=======
|
158
163
|
|
@@ -259,6 +264,7 @@ Others are slightly more sophisticated:
|
|
259
264
|
- `Model#backend_form( action_url, columns=nil, options={} )` It is only the wrapping of the form without the actual fields. Try to implement it like the Sequel one.
|
260
265
|
- `Model#backend_fields( columns )` These are the actual fields. There is a default behaviour that basically puts a `textarea` for everything. That works in most cases but this is meant to be overridden for a better solution. We recommend [Crushyform](https://rubygems.org/gems/sequel-crushyform) for Sequel because we did it so we know it plays well with BackendAPI, and also because you don't have anything more to do. BackendAPI knows you have [Crushyform](https://rubygems.org/gems/sequel-crushyform) and use it to create the fields.
|
261
266
|
- `Model#backend_delete_form( action_url, options={})` Basically sugar for Model#backend_form but with an empty array for columns, and these options `{:submit_text=>'X', :method=>'DELETE'}` predefined which you can override. We've seen before that it is for creating DELETE forms.
|
267
|
+
- `Model#backend_show` What is sent when PUT or POST is successful and there is no `_destination`. Default is `'OK'`
|
262
268
|
- `Model::sort( array-of-ids )` It is used to do a bulk update of the position field, hence: re-order
|
263
269
|
|
264
270
|
CAN I HELP ?
|
@@ -285,6 +291,7 @@ CHANGE LOG
|
|
285
291
|
0.0.4 Partial available not only via XHR but also via `_no_wrap` param
|
286
292
|
0.0.5 Ordered list of fields to keep before validation
|
287
293
|
0.1.0 Introduce sorting functionality
|
294
|
+
0.2.0 Control what you send on 201 responses
|
288
295
|
|
289
296
|
COPYRIGHT
|
290
297
|
=========
|
data/lib/backend_api.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class BackendAPI
|
2
|
-
VERSION = [0,
|
2
|
+
VERSION = [0,2,0]
|
3
3
|
WRAP = <<-EOT
|
4
4
|
<!doctype html>
|
5
5
|
<html>
|
@@ -52,7 +52,7 @@ class BackendAPI
|
|
52
52
|
@model_instance ||= @model_class.backend_post
|
53
53
|
@model_instance.backend_put @req['model']
|
54
54
|
form = @model_instance.backend_form(@req.path, @req['fields'], :destination => @req['_destination'], :submit_text => @req['_submit_text'], :no_wrap => @req['_no_wrap'])
|
55
|
-
@res.write(
|
55
|
+
@res.write(wrap_response(form))
|
56
56
|
end
|
57
57
|
|
58
58
|
# Update
|
@@ -100,23 +100,23 @@ class BackendAPI
|
|
100
100
|
def save_and_respond
|
101
101
|
if @model_instance.backend_save?
|
102
102
|
if @req['_destination'].nil?
|
103
|
-
@res.write
|
103
|
+
@res.write(wrap_response(@model_instance.backend_show))
|
104
104
|
@res.status=201 # Created
|
105
105
|
else
|
106
106
|
@res.redirect(::Rack::Utils::unescape(@req['_destination']))
|
107
107
|
end
|
108
108
|
else
|
109
109
|
form = @model_instance.backend_form(@req.path, @req['fields']||@req['model'].keys, :destination => @req['_destination'], :submit_text => @req['_submit_text'], :no_wrap => @req['_no_wrap'])
|
110
|
-
@res.write(
|
110
|
+
@res.write(wrap_response(form))
|
111
111
|
@res.status=400 # Bad Request
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
def
|
115
|
+
def wrap_response(content)
|
116
116
|
if @req['_no_wrap'] || @req.xhr?
|
117
|
-
|
117
|
+
content
|
118
118
|
else
|
119
|
-
WRAP % [@model_class_name,
|
119
|
+
WRAP % [@model_class_name, content]
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
data/rack-backend-api.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rack-backend-api'
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.2.0"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.summary = "A Rack middleware that provides a simple API for your Admin section"
|
6
6
|
s.description = "The purpose of this Rack Middleware is to provide an API that interfaces with database actions in order to build a CMS."
|
data/test/db.rb
CHANGED
data/test/spec_backend_api.rb
CHANGED
@@ -95,6 +95,16 @@ describe 'API Post' do
|
|
95
95
|
res.status.should==201
|
96
96
|
end
|
97
97
|
|
98
|
+
should "Send the Model#backend_show on success" do
|
99
|
+
res = req_lint(BackendAPI.new).post('/haiku', :params => {'model' => {'body' => "..."}})
|
100
|
+
res.status.should==201
|
101
|
+
res.body.should.match(/Me, the Haiku/)
|
102
|
+
res.body.should.match(/doctype/)
|
103
|
+
res = req_lint(BackendAPI.new).post('/haiku', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", :params => {'model' => {'body' => "///"}})
|
104
|
+
res.status.should==201
|
105
|
+
res.body.should=='Me, the Haiku'
|
106
|
+
end
|
107
|
+
|
98
108
|
should "Send back the appropriate form when the creation is not valid" do
|
99
109
|
|
100
110
|
res = req_lint(BackendAPI.new).post('/haiku', :params => {'model' => {'title' => '13'}})
|
@@ -186,6 +196,16 @@ describe 'API Put' do
|
|
186
196
|
res.status.should==201
|
187
197
|
end
|
188
198
|
|
199
|
+
should "Send the Model#backend_show on success" do
|
200
|
+
res = req_lint(BackendAPI.new).put('/haiku/3', :params => {'model' => {'body' => "..."}})
|
201
|
+
res.status.should==201
|
202
|
+
res.body.should.match(/Me, the Haiku/)
|
203
|
+
res.body.should.match(/doctype/)
|
204
|
+
res = req_lint(BackendAPI.new).put('/haiku/3', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", :params => {'model' => {'body' => "///"}})
|
205
|
+
res.status.should==201
|
206
|
+
res.body.should=='Me, the Haiku'
|
207
|
+
end
|
208
|
+
|
189
209
|
should "Send back the appropriate form when the creation is not valid" do
|
190
210
|
|
191
211
|
res = req_lint(BackendAPI.new).put('/haiku/3', :params => {'model' => {'title' => '13'}})
|
data/test/spec_sequel_adapter.rb
CHANGED
@@ -87,4 +87,8 @@ describe 'Sequel Adapter' do
|
|
87
87
|
TopFive.order(:position).map(:flavour).should==['Vanilla','Chocolate','Strawberry','Apricot','Coconut']
|
88
88
|
end
|
89
89
|
|
90
|
+
should "Have an instance method called backend_show that says 'OK' by default" do
|
91
|
+
Haiku[1].backend_show.should=='OK'
|
92
|
+
end
|
93
|
+
|
90
94
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-backend-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mickael Riga
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-27 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|