rack-backend-api 0.0.5 → 0.1.0
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 +34 -0
- data/lib/backend_api.rb +7 -3
- data/lib/sequel_rack_backend_api_adapter.rb +5 -0
- data/rack-backend-api.gemspec +1 -1
- data/test/db.rb +16 -0
- data/test/spec_backend_api.rb +5 -0
- data/test/spec_sequel_adapter.rb +5 -0
- metadata +4 -4
data/README.md
CHANGED
@@ -153,6 +153,30 @@ 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
|
+
SORTING
|
157
|
+
=======
|
158
|
+
|
159
|
+
The way I implemented it for the moment might be a bit awkward, but I needed that option.
|
160
|
+
Basically when you use a PUT request without an ID, the API assumes that you want to sort the entries of the class.
|
161
|
+
For instance:
|
162
|
+
|
163
|
+
PUT /admin/TopFive
|
164
|
+
|
165
|
+
Then it will look for the parameter that has the name of the class which should be a list of ids.
|
166
|
+
And it will update each entry with its position field set to the position in the array.
|
167
|
+
That is more or less what people are used to do when sorting via javascript.
|
168
|
+
|
169
|
+
TopFive[]=4&TopFive[]=2&TopFive[]=1&TopFive[]=3
|
170
|
+
|
171
|
+
This is an example of a query string for the order: 4,2,1,3. But this is just an example, it has to be a PUT request
|
172
|
+
or a POST request with method override.
|
173
|
+
|
174
|
+
The position field is obviously known by the ORM.
|
175
|
+
For Sequel (which adapter is included) it assumes that you use the `:list` plugin.
|
176
|
+
It is shipped with Sequel.
|
177
|
+
|
178
|
+
Still a work in progress but it satisfies the tests so far.
|
179
|
+
|
156
180
|
A LITTLE BIT OF JAVASCRIPT
|
157
181
|
==========================
|
158
182
|
|
@@ -235,6 +259,14 @@ Others are slightly more sophisticated:
|
|
235
259
|
- `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.
|
236
260
|
- `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.
|
237
261
|
- `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.
|
262
|
+
- `Model::sort( array-of-ids )` It is used to do a bulk update of the position field, hence: re-order
|
263
|
+
|
264
|
+
CAN I HELP ?
|
265
|
+
============
|
266
|
+
|
267
|
+
Of course you can. This project is still in heavy development and it definitely lacks some error checking and stuff.
|
268
|
+
So do not hesitate to fork the project on Github and request a `pull`. If you don't use Github, you still can send a patch.
|
269
|
+
But that's less fun isn't it?
|
238
270
|
|
239
271
|
THANX
|
240
272
|
=====
|
@@ -251,6 +283,8 @@ CHANGE LOG
|
|
251
283
|
0.0.2 Accept CamelCased class names
|
252
284
|
0.0.3 Fix Form mockup
|
253
285
|
0.0.4 Partial available not only via XHR but also via `_no_wrap` param
|
286
|
+
0.0.5 Ordered list of fields to keep before validation
|
287
|
+
0.1.0 Introduce sorting functionality
|
254
288
|
|
255
289
|
COPYRIGHT
|
256
290
|
=========
|
data/lib/backend_api.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class BackendAPI
|
2
|
-
VERSION = [0,0
|
2
|
+
VERSION = [0,1,0]
|
3
3
|
WRAP = <<-EOT
|
4
4
|
<!doctype html>
|
5
5
|
<html>
|
@@ -57,8 +57,12 @@ class BackendAPI
|
|
57
57
|
|
58
58
|
# Update
|
59
59
|
def put
|
60
|
-
@
|
61
|
-
|
60
|
+
if @id.nil? && @req[@model_class_name]
|
61
|
+
@model_class.sort(@req[@model_class_name])
|
62
|
+
else
|
63
|
+
@model_instance.backend_put @req['model']
|
64
|
+
save_and_respond
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
# Delete
|
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.0
|
3
|
+
s.version = "0.1.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
@@ -49,6 +49,16 @@ class CamelCasedClass < ::Sequel::Model
|
|
49
49
|
create_table unless table_exists?
|
50
50
|
end
|
51
51
|
|
52
|
+
class TopFive < ::Sequel::Model
|
53
|
+
set_schema do
|
54
|
+
primary_key :id
|
55
|
+
Fixnum :position
|
56
|
+
String :flavour
|
57
|
+
end
|
58
|
+
create_table unless table_exists?
|
59
|
+
plugin :list
|
60
|
+
end
|
61
|
+
|
52
62
|
Haiku.create( :title=>'Autumn', :body=>"Rust the ground\nFlush the branches\nReveal the trees" )
|
53
63
|
Haiku.create( :title=>'Winter', :body=>"There is snow\nIt covers you\nBut you are still the most beautiful" )
|
54
64
|
Haiku.create( :title=>'Spring', :body=>"No inspiration" )
|
@@ -56,3 +66,9 @@ Haiku.create( :title=>'Spring', :body=>"No inspiration" )
|
|
56
66
|
Author.create(:name=>'Ray',:surname=>'Bradbury')
|
57
67
|
Author.create(:name=>'Jorge Luis',:surname=>'Borges')
|
58
68
|
Author.create(:name=>'Yasunari', :surname=>'Kawabata')
|
69
|
+
|
70
|
+
TopFive.create(:flavour=>'Strawberry')
|
71
|
+
TopFive.create(:flavour=>'Vanilla')
|
72
|
+
TopFive.create(:flavour=>'Chocolate')
|
73
|
+
TopFive.create(:flavour=>'Coconut')
|
74
|
+
TopFive.create(:flavour=>'Apricot')
|
data/test/spec_backend_api.rb
CHANGED
@@ -227,6 +227,11 @@ describe 'API Put' do
|
|
227
227
|
res.body.should==('<!-- '+compared.backend_form('/haiku/3',['title'], {:no_wrap=>'true'})+' -->')
|
228
228
|
res.body.should.match(/name='_no_wrap'.*value='true'/)
|
229
229
|
end
|
230
|
+
|
231
|
+
should "Consider that a PUT request without an ID is a bulk update of position field (re-order)" do
|
232
|
+
req_lint(BackendAPI.new).put('/TopFive', :params => {'TopFive'=>['2','3','1','5','4']})
|
233
|
+
TopFive.order(:position).map(:flavour).should==['Vanilla','Chocolate','Strawberry','Apricot','Coconut']
|
234
|
+
end
|
230
235
|
end
|
231
236
|
|
232
237
|
describe 'API Delete' do
|
data/test/spec_sequel_adapter.rb
CHANGED
@@ -82,4 +82,9 @@ describe 'Sequel Adapter' do
|
|
82
82
|
form.scan(/input/).size.should==4
|
83
83
|
end
|
84
84
|
|
85
|
+
should "Be able to sort entries with a list of IDs" do
|
86
|
+
TopFive.sort([2,3,1,5,4])
|
87
|
+
TopFive.order(:position).map(:flavour).should==['Vanilla','Chocolate','Strawberry','Apricot','Coconut']
|
88
|
+
end
|
89
|
+
|
85
90
|
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: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.5
|
10
|
+
version: 0.1.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-25 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|