blindgaenger-sinatra-rest 0.3.0 → 0.3.1
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/Rakefile +1 -1
- data/lib/sinatra/rest/rest.yaml +67 -0
- data/lib/sinatra/rest.rb +86 -29
- metadata +3 -5
- data/lib/sinatra/rest/controller.tpl.rb +0 -65
- data/lib/sinatra/rest/helpers.tpl.rb +0 -49
- data/lib/sinatra/rest/routes.tpl.rb +0 -78
data/Rakefile
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
:index:
|
|
3
|
+
:verb: GET
|
|
4
|
+
:url: /PLURAL
|
|
5
|
+
:control: |-
|
|
6
|
+
@PLURAL = call_model_method(MODEL, :all, mp)
|
|
7
|
+
:render: |-
|
|
8
|
+
RENDERER :'PLURAL/index', options
|
|
9
|
+
|
|
10
|
+
:new:
|
|
11
|
+
:verb: GET
|
|
12
|
+
:url: /PLURAL/new
|
|
13
|
+
:control: |-
|
|
14
|
+
@SINGULAR = call_model_method(MODEL, :new, mp)
|
|
15
|
+
:render: |-
|
|
16
|
+
RENDERER :'PLURAL/new', options
|
|
17
|
+
|
|
18
|
+
:create:
|
|
19
|
+
:verb: POST
|
|
20
|
+
:url: /PLURAL
|
|
21
|
+
:control: |-
|
|
22
|
+
@SINGULAR = call_model_method(MODEL, :new, mp)
|
|
23
|
+
@SINGULAR.save
|
|
24
|
+
:render: |-
|
|
25
|
+
redirect url_for_PLURAL_show(@SINGULAR), 'SINGULAR created'
|
|
26
|
+
|
|
27
|
+
:show:
|
|
28
|
+
:verb: GET
|
|
29
|
+
:url: /PLURAL/:id
|
|
30
|
+
:control: |-
|
|
31
|
+
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
32
|
+
:render: |-
|
|
33
|
+
if @SINGULAR.nil?
|
|
34
|
+
throw :halt, [404, 'SINGULAR not found']
|
|
35
|
+
else
|
|
36
|
+
RENDERER :'PLURAL/show', options
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
:edit:
|
|
40
|
+
:verb: GET
|
|
41
|
+
:url: /PLURAL/:id/edit
|
|
42
|
+
:control: |-
|
|
43
|
+
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
44
|
+
:render: |-
|
|
45
|
+
RENDERER :'PLURAL/edit', options
|
|
46
|
+
|
|
47
|
+
:update:
|
|
48
|
+
:verb: PUT
|
|
49
|
+
:url: /PLURAL/:id
|
|
50
|
+
:control: |-
|
|
51
|
+
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
52
|
+
@SINGULAR.update_attributes(mp) unless @SINGULAR.nil?
|
|
53
|
+
:render: |-
|
|
54
|
+
if @SINGULAR.nil?
|
|
55
|
+
throw :halt, [404, 'SINGULAR not found']
|
|
56
|
+
else
|
|
57
|
+
redirect url_for_PLURAL_show(@SINGULAR), 'SINGULAR updated'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
:destroy:
|
|
61
|
+
:verb: DELETE
|
|
62
|
+
:url: /PLURAL/:id
|
|
63
|
+
:control: |-
|
|
64
|
+
call_model_method(MODEL, :delete, mp[:id])
|
|
65
|
+
:render: |-
|
|
66
|
+
redirect url_for_PLURAL_index, 'SINGULAR destroyed'
|
|
67
|
+
|
data/lib/sinatra/rest.rb
CHANGED
|
@@ -4,6 +4,7 @@ require 'english/inflect'
|
|
|
4
4
|
libdir = File.dirname(__FILE__) + "/rest"
|
|
5
5
|
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
|
6
6
|
require 'adapters'
|
|
7
|
+
require 'yaml'
|
|
7
8
|
|
|
8
9
|
module Sinatra
|
|
9
10
|
|
|
@@ -13,13 +14,14 @@ module Sinatra
|
|
|
13
14
|
# adds restful routes and url helpers for the model
|
|
14
15
|
def rest(model_class, options={}, &block)
|
|
15
16
|
parse_args(model_class, options)
|
|
17
|
+
read_config('rest/rest.yaml')
|
|
16
18
|
|
|
17
19
|
# register model specific helpers
|
|
18
|
-
helpers
|
|
20
|
+
helpers generate_helpers
|
|
19
21
|
|
|
20
22
|
# create an own module, to override the template with custom methods
|
|
21
23
|
# this way, you can still use #super# in the overridden methods
|
|
22
|
-
controller =
|
|
24
|
+
controller = generate_controller
|
|
23
25
|
if block_given?
|
|
24
26
|
custom = CustomController.new(@plural)
|
|
25
27
|
custom.instance_eval &block
|
|
@@ -29,7 +31,7 @@ module Sinatra
|
|
|
29
31
|
helpers controller
|
|
30
32
|
|
|
31
33
|
# register routes as DSL extension
|
|
32
|
-
instance_eval
|
|
34
|
+
instance_eval generate_routes
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
protected
|
|
@@ -48,14 +50,16 @@ module Sinatra
|
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def parse_routes(routes)
|
|
51
|
-
[*routes].map {|route| ROUTES[route] || route}.flatten.uniq
|
|
53
|
+
routes = [*routes].map {|route| ROUTES[route] || route}.flatten.uniq
|
|
54
|
+
# keep the order of :all routes
|
|
55
|
+
ROUTES[:all].select{|route| routes.include? route}
|
|
52
56
|
end
|
|
53
57
|
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
def read_config(filename)
|
|
59
|
+
file = File.read(File.join(File.dirname(__FILE__), filename))
|
|
60
|
+
@config = YAML.load file
|
|
57
61
|
end
|
|
58
|
-
|
|
62
|
+
|
|
59
63
|
#
|
|
60
64
|
# creates the necessary forms of the model name
|
|
61
65
|
# pretty much like ActiveSupport's inflections, but don't like to depend on
|
|
@@ -65,27 +69,80 @@ module Sinatra
|
|
|
65
69
|
return model, singular, singular.pluralize
|
|
66
70
|
end
|
|
67
71
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
def replace_variables(t, route=nil)
|
|
73
|
+
if route
|
|
74
|
+
t.gsub!('NAME', route.to_s)
|
|
75
|
+
t.gsub!('VERB', @config[route][:verb].downcase)
|
|
76
|
+
t.gsub!('URL', @config[route][:url])
|
|
77
|
+
t.gsub!('CONTROL', @config[route][:control])
|
|
78
|
+
t.gsub!('RENDER', @config[route][:render])
|
|
79
|
+
end
|
|
72
80
|
t.gsub!(/PLURAL/, @plural)
|
|
73
81
|
t.gsub!(/SINGULAR/, @singular)
|
|
74
82
|
t.gsub!(/MODEL/, @model)
|
|
75
83
|
t.gsub!(/RENDERER/, @renderer)
|
|
76
|
-
|
|
77
|
-
t
|
|
84
|
+
t
|
|
78
85
|
end
|
|
79
86
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
def generate_routes
|
|
88
|
+
@route_flags.map{|r| route_template(r)}.join("\n\n")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def route_template(route)
|
|
92
|
+
t = <<-RUBY
|
|
93
|
+
VERB 'URL' do
|
|
94
|
+
PLURAL_before :NAME
|
|
95
|
+
PLURAL_NAME
|
|
96
|
+
PLURAL_after :NAME
|
|
97
|
+
RENDER
|
|
98
|
+
end
|
|
99
|
+
RUBY
|
|
100
|
+
replace_variables(t, route)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def generate_helpers
|
|
84
104
|
m = Module.new
|
|
85
|
-
|
|
105
|
+
@route_flags.each {|r|
|
|
106
|
+
m.module_eval helpers_template(r)
|
|
107
|
+
}
|
|
86
108
|
m
|
|
87
109
|
end
|
|
110
|
+
|
|
111
|
+
def helpers_template(route)
|
|
112
|
+
t = <<-RUBY
|
|
113
|
+
def url_for_PLURAL_NAME(model=nil)
|
|
114
|
+
"URL"
|
|
115
|
+
end
|
|
116
|
+
RUBY
|
|
117
|
+
helper_route = @config[route][:url].gsub(':id', '#{escape_model_id(model)}')
|
|
118
|
+
t.gsub!('URL', helper_route)
|
|
119
|
+
replace_variables(t, route)
|
|
120
|
+
end
|
|
88
121
|
|
|
122
|
+
def generate_controller
|
|
123
|
+
m = Module.new
|
|
124
|
+
t = <<-RUBY
|
|
125
|
+
def PLURAL_before(name); end
|
|
126
|
+
def PLURAL_after(name); end
|
|
127
|
+
RUBY
|
|
128
|
+
m.module_eval replace_variables(t)
|
|
129
|
+
|
|
130
|
+
@route_flags.each {|route|
|
|
131
|
+
m.module_eval controller_template(route)
|
|
132
|
+
}
|
|
133
|
+
m
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def controller_template(route)
|
|
137
|
+
t = <<-RUBY
|
|
138
|
+
def PLURAL_NAME(options=params)
|
|
139
|
+
mp = filter_model_params(options)
|
|
140
|
+
CONTROL
|
|
141
|
+
end
|
|
142
|
+
RUBY
|
|
143
|
+
replace_variables(t, route)
|
|
144
|
+
end
|
|
145
|
+
|
|
89
146
|
#
|
|
90
147
|
# model unspecific helpers, will be included once
|
|
91
148
|
module Helpers
|
|
@@ -110,7 +167,7 @@ module Sinatra
|
|
|
110
167
|
|
|
111
168
|
def call_model_method(model_class, name, options={})
|
|
112
169
|
method = model_class.method(name)
|
|
113
|
-
if method.arity == 0
|
|
170
|
+
if options.nil? || method.arity == 0
|
|
114
171
|
Kernel.warn "warning: calling #{model_class.to_s}##{name} with args, although it doesn't take args" if options
|
|
115
172
|
method.call
|
|
116
173
|
else
|
|
@@ -129,15 +186,15 @@ module Sinatra
|
|
|
129
186
|
@module = Module.new
|
|
130
187
|
end
|
|
131
188
|
|
|
132
|
-
def before(&block) prefix :before, █ end
|
|
133
|
-
def after(&block) prefix :after, █ end
|
|
134
|
-
def index(&block) prefix :index, █ end
|
|
135
|
-
def new(&block) prefix :new, █ end
|
|
136
|
-
def create(&block) prefix :create, █ end
|
|
137
|
-
def show(&block) prefix :show, █ end
|
|
138
|
-
def edit(&block) prefix :edit, █ end
|
|
139
|
-
def update(&block) prefix :update, █ end
|
|
140
|
-
def destroy(&block) prefix :destroy, █ end
|
|
189
|
+
def before(options={}, &block) prefix :before, █ end
|
|
190
|
+
def after(options={}, &block) prefix :after, █ end
|
|
191
|
+
def index(options={}, &block) prefix :index, █ end
|
|
192
|
+
def new(options={}, &block) prefix :new, █ end
|
|
193
|
+
def create(options={}, &block) prefix :create, █ end
|
|
194
|
+
def show(options={}, &block) prefix :show, █ end
|
|
195
|
+
def edit(options={}, &block) prefix :edit, █ end
|
|
196
|
+
def update(options={}, &block) prefix :update, █ end
|
|
197
|
+
def destroy(options={}, &block) prefix :destroy, █ end
|
|
141
198
|
|
|
142
199
|
private
|
|
143
200
|
def prefix(name, &block)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: blindgaenger-sinatra-rest
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- blindgaenger
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-04-
|
|
12
|
+
date: 2009-04-26 00:00:00 -07:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -45,9 +45,7 @@ files:
|
|
|
45
45
|
- README.textile
|
|
46
46
|
- lib/sinatra/rest.rb
|
|
47
47
|
- lib/sinatra/rest/adapters.rb
|
|
48
|
-
- lib/sinatra/rest/
|
|
49
|
-
- lib/sinatra/rest/helpers.tpl.rb
|
|
50
|
-
- lib/sinatra/rest/routes.tpl.rb
|
|
48
|
+
- lib/sinatra/rest/rest.yaml
|
|
51
49
|
- test/call_order_spec.rb
|
|
52
50
|
- test/crud_spec.rb
|
|
53
51
|
- test/helper.rb
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
def PLURAL_before(name)
|
|
2
|
-
# override
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
def PLURAL_after(name)
|
|
6
|
-
# override
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
# index GET /models
|
|
10
|
-
if INDEX
|
|
11
|
-
def PLURAL_index(options=nil)
|
|
12
|
-
@PLURAL = call_model_method(MODEL, :all, options)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# new GET /models/new
|
|
17
|
-
if NEW
|
|
18
|
-
def PLURAL_new(options=nil)
|
|
19
|
-
@SINGULAR = call_model_method(MODEL, :new, options)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# create POST /models
|
|
24
|
-
if CREATE
|
|
25
|
-
def PLURAL_create(options=params)
|
|
26
|
-
mp = filter_model_params(options)
|
|
27
|
-
@SINGULAR = call_model_method(MODEL, :new, mp)
|
|
28
|
-
@SINGULAR.save
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# show GET /models/1
|
|
33
|
-
if SHOW
|
|
34
|
-
def PLURAL_show(options=params)
|
|
35
|
-
mp = filter_model_params(options)
|
|
36
|
-
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# edit GET /models/1/edit
|
|
41
|
-
if EDIT
|
|
42
|
-
def PLURAL_edit(options=params)
|
|
43
|
-
mp = filter_model_params(options)
|
|
44
|
-
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# update PUT /models/1
|
|
49
|
-
if UPDATE
|
|
50
|
-
def PLURAL_update(options=params)
|
|
51
|
-
mp = filter_model_params(options)
|
|
52
|
-
@SINGULAR = call_model_method(MODEL, :find_by_id, mp[:id])
|
|
53
|
-
@SINGULAR.update_attributes(mp) unless @SINGULAR.nil?
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# destroy DELETE /models/1
|
|
58
|
-
if DESTROY
|
|
59
|
-
def PLURAL_destroy(options=params)
|
|
60
|
-
mp = filter_model_params(options)
|
|
61
|
-
call_model_method(MODEL, :delete, mp[:id])
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# index GET /models
|
|
2
|
-
if INDEX
|
|
3
|
-
def url_for_PLURAL_index
|
|
4
|
-
'/PLURAL'
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
# new GET /models/new
|
|
9
|
-
if NEW
|
|
10
|
-
def url_for_PLURAL_new
|
|
11
|
-
'/PLURAL/new'
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# create POST /models
|
|
16
|
-
if CREATE
|
|
17
|
-
def url_for_PLURAL_create
|
|
18
|
-
'/PLURAL'
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# show GET /models/1
|
|
23
|
-
if SHOW
|
|
24
|
-
def url_for_PLURAL_show(model)
|
|
25
|
-
"/PLURAL/#{escape_model_id(model)}"
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# edit GET /models/1/edit
|
|
30
|
-
if EDIT
|
|
31
|
-
def url_for_PLURAL_edit(model)
|
|
32
|
-
"/PLURAL/#{escape_model_id(model)}/edit"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# update PUT /models/1
|
|
37
|
-
if UPDATE
|
|
38
|
-
def url_for_PLURAL_update(model)
|
|
39
|
-
"/PLURAL/#{escape_model_id(model)}"
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# destroy DELETE /models/1
|
|
44
|
-
if DESTROY
|
|
45
|
-
def url_for_PLURAL_destroy(model)
|
|
46
|
-
"/PLURAL/#{escape_model_id(model)}"
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# index GET /models
|
|
2
|
-
if INDEX
|
|
3
|
-
get '/PLURAL' do
|
|
4
|
-
PLURAL_before :index
|
|
5
|
-
PLURAL_index
|
|
6
|
-
PLURAL_after :index
|
|
7
|
-
RENDERER :"PLURAL/index", options
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
# new GET /models/new
|
|
12
|
-
if NEW
|
|
13
|
-
get '/PLURAL/new' do
|
|
14
|
-
PLURAL_before :new
|
|
15
|
-
PLURAL_new
|
|
16
|
-
PLURAL_after :new
|
|
17
|
-
RENDERER :"PLURAL/new", options
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# create POST /models
|
|
22
|
-
if CREATE
|
|
23
|
-
post '/PLURAL' do
|
|
24
|
-
PLURAL_before :create
|
|
25
|
-
PLURAL_create
|
|
26
|
-
PLURAL_after :create
|
|
27
|
-
redirect url_for_PLURAL_show(@SINGULAR), 'SINGULAR created'
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# show GET /models/1
|
|
32
|
-
if SHOW
|
|
33
|
-
get '/PLURAL/:id' do
|
|
34
|
-
PLURAL_before :show
|
|
35
|
-
PLURAL_show
|
|
36
|
-
PLURAL_after :show
|
|
37
|
-
if @SINGULAR.nil?
|
|
38
|
-
throw :halt, [404, 'SINGULAR not found']
|
|
39
|
-
else
|
|
40
|
-
RENDERER :"PLURAL/show", options
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# edit GET /models/1/edit
|
|
46
|
-
if EDIT
|
|
47
|
-
get '/PLURAL/:id/edit' do
|
|
48
|
-
PLURAL_before :edit
|
|
49
|
-
PLURAL_edit
|
|
50
|
-
PLURAL_after :edit
|
|
51
|
-
RENDERER :"PLURAL/edit", options
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# update PUT /models/1
|
|
56
|
-
if UPDATE
|
|
57
|
-
put '/PLURAL/:id' do
|
|
58
|
-
PLURAL_before :update
|
|
59
|
-
PLURAL_update
|
|
60
|
-
PLURAL_after :update
|
|
61
|
-
if @SINGULAR.nil?
|
|
62
|
-
throw :halt, [404, 'SINGULAR not found']
|
|
63
|
-
else
|
|
64
|
-
redirect url_for_PLURAL_show(@SINGULAR), 'SINGULAR updated'
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# destroy DELETE /models/1
|
|
70
|
-
if DESTROY
|
|
71
|
-
delete '/PLURAL/:id' do
|
|
72
|
-
PLURAL_before :destroy
|
|
73
|
-
PLURAL_destroy
|
|
74
|
-
PLURAL_after :destroy
|
|
75
|
-
redirect url_for_PLURAL_index, 'SINGULAR destroyed'
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|