scaffolding_extensions 1.4.1 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +3 -2
- data/doc/rack.txt +22 -0
- data/lib/scaffolding_extensions/controller/camping.rb +2 -2
- data/lib/scaffolding_extensions/controller/rack.rb +141 -0
- data/lib/scaffolding_extensions/controller/sinatra.rb +5 -10
- data/lib/scaffolding_extensions/meta_controller.rb +17 -11
- data/scaffolds/index.rhtml +1 -1
- data/scaffolds/listtable.rhtml +4 -4
- data/scaffolds/manage.rhtml +1 -1
- metadata +5 -2
data/README
CHANGED
@@ -22,10 +22,11 @@ Scaffolding Extensions currently supports:
|
|
22
22
|
|
23
23
|
* Web Frameworks
|
24
24
|
* Rails 2.3.5 (with or without RailsXss plugin)
|
25
|
-
* Ramaze
|
26
|
-
* Camping
|
25
|
+
* Ramaze 2010.04.04
|
26
|
+
* Camping 2.0
|
27
27
|
* Sinatra 1.0
|
28
28
|
* Merb 1.0.4
|
29
|
+
* Rack 1.1.0
|
29
30
|
* Object Relational Mappers
|
30
31
|
* ActiveRecord 2.3.5
|
31
32
|
* Sequel 3.10.0
|
data/doc/rack.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Scaffolding Extensions includes a native rack adapter that can run
|
2
|
+
directly on top of rack with no framework in between. However, this
|
3
|
+
mode does not support custom layouts or views.
|
4
|
+
|
5
|
+
Here's an simple example of use:
|
6
|
+
|
7
|
+
require 'sequel'
|
8
|
+
require 'models/employee'
|
9
|
+
require 'scaffolding_extensions'
|
10
|
+
require 'scaffolding_extensions/controller/rack'
|
11
|
+
|
12
|
+
class SequelRack < ScaffoldingExtensions::RackController
|
13
|
+
scaffold Employee
|
14
|
+
end
|
15
|
+
|
16
|
+
puts "ScaffoldingExtensions::Rack started on port 7974"
|
17
|
+
Rack::Handler.get('mongrel').run(app, :Host=>'0.0.0.0', :Port=>7974) do |server|
|
18
|
+
trap(:INT) do
|
19
|
+
server.stop
|
20
|
+
puts "\nScaffoldingExtensions::Rack shutdown"
|
21
|
+
end
|
22
|
+
end
|
@@ -78,7 +78,7 @@ module ScaffoldingExtensions
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def scaffold_request_id
|
81
|
-
@input[
|
81
|
+
@input['id'] || @scaffold_request_id
|
82
82
|
end
|
83
83
|
|
84
84
|
def scaffold_request_method
|
@@ -86,7 +86,7 @@ module ScaffoldingExtensions
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def scaffold_request_param(v)
|
89
|
-
@input[v]
|
89
|
+
@input[v.to_s]
|
90
90
|
end
|
91
91
|
|
92
92
|
# You need to enable Camping's session support for this to work,
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'rack'
|
3
|
+
|
4
|
+
module ScaffoldingExtensions
|
5
|
+
class << self
|
6
|
+
private
|
7
|
+
# Sinatra doesn't have a default location for models, so assume none
|
8
|
+
def model_files
|
9
|
+
@model_files ||= []
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class RackController
|
14
|
+
extend ScaffoldingExtensions::MetaController
|
15
|
+
|
16
|
+
include ScaffoldingExtensions::Controller
|
17
|
+
include ScaffoldingExtensions::Helper
|
18
|
+
include ScaffoldingExtensions::PrototypeHelper
|
19
|
+
include Rack::Utils
|
20
|
+
|
21
|
+
class Redirect < StandardError
|
22
|
+
end
|
23
|
+
|
24
|
+
alias u escape
|
25
|
+
alias h escape_html
|
26
|
+
|
27
|
+
def self.scaffold_setup_helper
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.call(env)
|
31
|
+
new.call(env)
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :request
|
35
|
+
attr_reader :response
|
36
|
+
attr_reader :params
|
37
|
+
|
38
|
+
def call(env)
|
39
|
+
s = 200
|
40
|
+
h = {'Content-Type'=>'text/html'}
|
41
|
+
b = ''
|
42
|
+
@params = Hash.new{|hash, k| hash[k.to_s] if k.is_a?(Symbol)}
|
43
|
+
params.merge!(parse_nested_query(env["QUERY_STRING"]))
|
44
|
+
params.merge!(parse_nested_query(env["rack.input"].read)) if env["REQUEST_METHOD"] == 'POST'
|
45
|
+
|
46
|
+
@scaffold_method = meth = if ['', '/'].include?(env["PATH_INFO"])
|
47
|
+
'index'
|
48
|
+
elsif captures = %r{\A/(\w+)(?:/(\w+))?\z}.match(env["PATH_INFO"])
|
49
|
+
params['id'] ||= captures[2]
|
50
|
+
captures[1]
|
51
|
+
end
|
52
|
+
|
53
|
+
if !['GET', 'POST'].include?(env["REQUEST_METHOD"]) || (env["REQUEST_METHOD"] == "GET" && scaffolded_nonidempotent_method?(meth))
|
54
|
+
return [403, h, 'Method Not Allowed']
|
55
|
+
end
|
56
|
+
|
57
|
+
if scaffolded_method?(meth)
|
58
|
+
@scaffold_path = env['SCRIPT_NAME']
|
59
|
+
@request = env
|
60
|
+
@response = h
|
61
|
+
begin
|
62
|
+
b = send(meth)
|
63
|
+
rescue Redirect => e
|
64
|
+
s = 302
|
65
|
+
h['Location'] = e.message
|
66
|
+
end
|
67
|
+
else
|
68
|
+
s = 404
|
69
|
+
b = 'Not Found'
|
70
|
+
end
|
71
|
+
|
72
|
+
[s, h, b]
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
# Sinatra doesn't provide a suitable flash. You can hack one together using
|
77
|
+
# session if you really need it.
|
78
|
+
def scaffold_flash
|
79
|
+
{}
|
80
|
+
end
|
81
|
+
|
82
|
+
def scaffold_redirect_to(url)
|
83
|
+
raise ScaffoldingExtensions::RackController::Redirect, url
|
84
|
+
end
|
85
|
+
|
86
|
+
# Render's the scaffolded template. A user can override both the template and the layout.
|
87
|
+
def scaffold_render_template(action, options = {}, render_options = {})
|
88
|
+
suffix = options[:suffix]
|
89
|
+
suffix_action = "#{action}#{suffix}"
|
90
|
+
@scaffold_options ||= options
|
91
|
+
@scaffold_suffix ||= suffix
|
92
|
+
@scaffold_class ||= @scaffold_options[:class]
|
93
|
+
if render_options.include?(:inline)
|
94
|
+
response['Content-Type'] = 'text/javascript' if @scaffold_javascript
|
95
|
+
ERB.new(render_options[:inline]).result(binding)
|
96
|
+
else
|
97
|
+
@content = ERB.new(File.read(scaffold_path(action))).result(binding)
|
98
|
+
ERB.new(File.read(scaffold_path(:layout))).result(binding)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def scaffold_request_action
|
103
|
+
@scaffold_method
|
104
|
+
end
|
105
|
+
|
106
|
+
def scaffold_request_env
|
107
|
+
request
|
108
|
+
end
|
109
|
+
|
110
|
+
def scaffold_request_id
|
111
|
+
params[:id]
|
112
|
+
end
|
113
|
+
|
114
|
+
def scaffold_request_method
|
115
|
+
request['REQUEST_METHOD']
|
116
|
+
end
|
117
|
+
|
118
|
+
def scaffold_request_param(v)
|
119
|
+
params[v]
|
120
|
+
end
|
121
|
+
|
122
|
+
# You need to enable Sinatra's session support for this to work,
|
123
|
+
# otherwise, this will always be the empty hash. The session data
|
124
|
+
# is only used for access control, so if you aren't using
|
125
|
+
# scaffold_session_value, it shouldn't matter.
|
126
|
+
def scaffold_session
|
127
|
+
{}
|
128
|
+
end
|
129
|
+
|
130
|
+
# Treats the id option as special, appending it to the path.
|
131
|
+
# Uses the rest of the options as query string parameters.
|
132
|
+
def scaffold_url(action, options = {})
|
133
|
+
escaped_options = {}
|
134
|
+
options.each{|k,v| escaped_options[u(k.to_s)] = u(v.to_s)}
|
135
|
+
id = escaped_options.delete('id')
|
136
|
+
id = id ? "/#{id}" : ''
|
137
|
+
id << "?#{escaped_options.to_a.collect{|k,v| "#{k}=#{v}"}.join('&')}" unless escaped_options.empty?
|
138
|
+
"#{@scaffold_path}/#{action}#{id}"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'erb'
|
2
|
-
require '
|
2
|
+
require 'rack'
|
3
3
|
|
4
4
|
module ScaffoldingExtensions
|
5
5
|
class << self
|
@@ -13,11 +13,11 @@ module ScaffoldingExtensions
|
|
13
13
|
module SinatraHelper
|
14
14
|
private
|
15
15
|
def u(s)
|
16
|
-
|
16
|
+
Rack::Utils.escape(s.to_s)
|
17
17
|
end
|
18
18
|
|
19
19
|
def h(s)
|
20
|
-
|
20
|
+
Rack::Utils.escape_html(s.to_s)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -30,11 +30,6 @@ module ScaffoldingExtensions
|
|
30
30
|
{}
|
31
31
|
end
|
32
32
|
|
33
|
-
# Sinatra's ERB renderer doesn't like "-%>"
|
34
|
-
def scaffold_fix_template(text)
|
35
|
-
text.gsub('-%>', '%>')
|
36
|
-
end
|
37
|
-
|
38
33
|
def scaffold_redirect_to(url)
|
39
34
|
redirect(url)
|
40
35
|
end
|
@@ -49,7 +44,7 @@ module ScaffoldingExtensions
|
|
49
44
|
if render_options.include?(:inline)
|
50
45
|
use_js = @scaffold_javascript
|
51
46
|
response['Content-Type'] = 'text/javascript' if use_js
|
52
|
-
render(:erb,
|
47
|
+
render(:erb, render_options[:inline], :layout=>false)
|
53
48
|
else
|
54
49
|
views_path = render_options.delete(:views) || self.class.views || "./views"
|
55
50
|
views_dir = Dir.new(views_path) rescue nil
|
@@ -91,7 +86,7 @@ module ScaffoldingExtensions
|
|
91
86
|
if views_dir && views_dir.member?("#{sin_name}.erb")
|
92
87
|
sin_name.to_sym
|
93
88
|
else
|
94
|
-
code =
|
89
|
+
code = File.read(scaffold_path(se_name))
|
95
90
|
code = yield code if block_given?
|
96
91
|
code
|
97
92
|
end
|
@@ -45,6 +45,7 @@ module ScaffoldingExtensions
|
|
45
45
|
plural_name = singular_name.pluralize
|
46
46
|
plural_human_name = singular_human_name.pluralize
|
47
47
|
suffix = "_#{singular_name}"
|
48
|
+
render_meth = :"render#{suffix}"
|
48
49
|
add_methods = options[:only] ? Array(options[:only]) : scaffold_default_methods
|
49
50
|
add_methods -= Array(options[:except])
|
50
51
|
scaffold_options = {:singular_name=>singular_name, :plural_name=>plural_name, :singular_human_name=>singular_human_name, :plural_human_name=>plural_human_name, :class=>klass, :suffix=>suffix, :singular_lc_human_name=>singular_human_name.downcase, :plural_lc_human_name=>plural_human_name.downcase}
|
@@ -52,16 +53,21 @@ module ScaffoldingExtensions
|
|
52
53
|
scaffold_auto_complete_for(klass) if klass.scaffold_use_auto_complete
|
53
54
|
klass.scaffold_auto_complete_associations.each{|association| scaffold_auto_complete_for(klass, association)}
|
54
55
|
|
56
|
+
define_method(render_meth) do |t|
|
57
|
+
scaffold_render_template(t, scaffold_options)
|
58
|
+
end
|
59
|
+
private render_meth
|
60
|
+
|
55
61
|
if add_methods.include?(:manage)
|
56
62
|
scaffold_define_method("manage#{suffix}") do
|
57
|
-
|
63
|
+
send(render_meth, :manage)
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
61
67
|
if add_methods.include?(:show) or add_methods.include?(:destroy) or add_methods.include?(:edit)
|
62
68
|
scaffold_define_method("list#{suffix}") do
|
63
69
|
@scaffold_objects ||= klass.scaffold_find_objects(@scaffold_action, :session=>scaffold_session) unless klass.scaffold_use_auto_complete
|
64
|
-
|
70
|
+
send(render_meth, :list)
|
65
71
|
end
|
66
72
|
end
|
67
73
|
|
@@ -70,7 +76,7 @@ module ScaffoldingExtensions
|
|
70
76
|
if scaffold_request_id
|
71
77
|
@scaffold_object ||= klass.scaffold_find_object(:show, scaffold_request_id, :session=>scaffold_session)
|
72
78
|
@scaffold_associations_readonly = true
|
73
|
-
|
79
|
+
send(render_meth, :show)
|
74
80
|
else
|
75
81
|
@scaffold_action = :show
|
76
82
|
send("list#{suffix}")
|
@@ -98,7 +104,7 @@ module ScaffoldingExtensions
|
|
98
104
|
if scaffold_request_id
|
99
105
|
@scaffold_show_associations = true if scaffold_request_param(:associations) == 'show'
|
100
106
|
@scaffold_object ||= klass.scaffold_find_object(:edit, scaffold_request_id, :session=>scaffold_session)
|
101
|
-
|
107
|
+
send(render_meth, :edit)
|
102
108
|
else
|
103
109
|
@scaffold_action = :edit
|
104
110
|
send("list#{suffix}")
|
@@ -111,7 +117,7 @@ module ScaffoldingExtensions
|
|
111
117
|
if klass.scaffold_save(:edit, @scaffold_object)
|
112
118
|
scaffold_redirect(:edit, suffix, "#{singular_human_name} was successfully updated")
|
113
119
|
else
|
114
|
-
|
120
|
+
send(render_meth, :edit)
|
115
121
|
end
|
116
122
|
end
|
117
123
|
|
@@ -126,7 +132,7 @@ module ScaffoldingExtensions
|
|
126
132
|
if add_methods.include?(:new)
|
127
133
|
scaffold_define_method("new#{suffix}") do
|
128
134
|
@scaffold_object ||= klass.scaffold_new_object(scaffold_request_param(singular_name), :session=>scaffold_session)
|
129
|
-
|
135
|
+
send(render_meth, :new)
|
130
136
|
end
|
131
137
|
|
132
138
|
scaffold_define_nonidempotent_method("create#{suffix}") do
|
@@ -134,7 +140,7 @@ module ScaffoldingExtensions
|
|
134
140
|
if klass.scaffold_save(:new, @scaffold_object)
|
135
141
|
scaffold_redirect(:new, suffix, "#{singular_human_name} was successfully created")
|
136
142
|
else
|
137
|
-
|
143
|
+
send(render_meth, :new)
|
138
144
|
end
|
139
145
|
end
|
140
146
|
end
|
@@ -142,7 +148,7 @@ module ScaffoldingExtensions
|
|
142
148
|
if add_methods.include?(:search)
|
143
149
|
scaffold_define_method("search#{suffix}") do
|
144
150
|
@scaffold_object ||= klass.scaffold_search_object
|
145
|
-
|
151
|
+
send(render_meth, :search)
|
146
152
|
end
|
147
153
|
|
148
154
|
scaffold_define_method("results#{suffix}") do
|
@@ -151,14 +157,14 @@ module ScaffoldingExtensions
|
|
151
157
|
page += 1 if scaffold_request_param(:page_next)
|
152
158
|
@scaffold_search_results_form_params, @scaffold_objects = klass.scaffold_search(:model=>scaffold_request_param(singular_name), :notnull=>Array(scaffold_request_param(:notnull)), :null=>Array(scaffold_request_param(:null)), :page=>page, :session=>scaffold_session)
|
153
159
|
@scaffold_listtable_type = :search
|
154
|
-
|
160
|
+
send(render_meth, :listtable)
|
155
161
|
end
|
156
162
|
end
|
157
163
|
|
158
164
|
if add_methods.include?(:merge)
|
159
165
|
scaffold_define_method("merge#{suffix}") do
|
160
166
|
@scaffold_objects ||= klass.scaffold_find_objects(:merge, :session=>scaffold_session) unless klass.scaffold_use_auto_complete
|
161
|
-
|
167
|
+
send(render_meth, :merge)
|
162
168
|
end
|
163
169
|
|
164
170
|
scaffold_define_nonidempotent_method("merge_update#{suffix}") do
|
@@ -176,7 +182,7 @@ module ScaffoldingExtensions
|
|
176
182
|
@page ||= scaffold_request_param(:page).to_i > 1 ? scaffold_request_param(:page).to_i : 1
|
177
183
|
@next_page, @scaffold_objects = klass.scaffold_browse_find_objects(:session=>scaffold_session, :page=>@page)
|
178
184
|
@scaffold_listtable_type = :browse
|
179
|
-
|
185
|
+
send(render_meth, :listtable)
|
180
186
|
end
|
181
187
|
end
|
182
188
|
end
|
data/scaffolds/index.rhtml
CHANGED
data/scaffolds/listtable.rhtml
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<table id="scaffolded" class="<%= @scaffold_class.scaffold_table_class(:list) %>">
|
4
4
|
<thead><tr>
|
5
|
-
<% @scaffold_class.scaffold_fields(@scaffold_listtable_type).each do |column|
|
5
|
+
<% @scaffold_class.scaffold_fields(@scaffold_listtable_type).each do |column| %>
|
6
6
|
<th><%=h @scaffold_class.scaffold_column_name(column) %></th>
|
7
7
|
<% end %>
|
8
8
|
<% if show = scaffolded_method?(ss = "show#{@scaffold_suffix}") %>
|
@@ -45,13 +45,13 @@
|
|
45
45
|
<% if @scaffold_listtable_type == :search && @scaffold_search_results_form_params && (@scaffold_search_results_form_params[:page] > 1 || @scaffold_search_results_form_params[:next_page]) %>
|
46
46
|
<%= scaffold_form(scaffold_url("results#{@scaffold_suffix}")) %>
|
47
47
|
<%= scaffold_field_tag(:hidden, :value=>@scaffold_search_results_form_params[:page], :id=>'page') %>
|
48
|
-
<% @scaffold_search_results_form_params[:model].each do |key, value|
|
48
|
+
<% @scaffold_search_results_form_params[:model].each do |key, value| %>
|
49
49
|
<%= scaffold_field_tag(:hidden, :value=>value, :id=>"#{@scaffold_options[:singular_name]}_#{key}", :name=>"#{@scaffold_options[:singular_name]}[#{key}]") %>
|
50
50
|
<% end %>
|
51
|
-
<% @scaffold_search_results_form_params[:notnull].each do |field|
|
51
|
+
<% @scaffold_search_results_form_params[:notnull].each do |field| %>
|
52
52
|
<%= scaffold_field_tag(:hidden, :value=>field, :name=>"notnull#{scaffold_param_list_suffix}") %>
|
53
53
|
<% end %>
|
54
|
-
<% @scaffold_search_results_form_params[:null].each do |field|
|
54
|
+
<% @scaffold_search_results_form_params[:null].each do |field| %>
|
55
55
|
<%= scaffold_field_tag(:hidden, :value=>field, :name=>"null#{scaffold_param_list_suffix}") %>
|
56
56
|
<% end %>
|
57
57
|
<% if @scaffold_search_results_form_params[:page] > 1 %>
|
data/scaffolds/manage.rhtml
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
["Edit #{singular_name}", :edit],
|
7
7
|
["Merge #{plural_name}", :merge],
|
8
8
|
["Search #{plural_name}", :search],
|
9
|
-
["Show #{singular_name}", :show]].each do |text, action|
|
9
|
+
["Show #{singular_name}", :show]].each do |text, action| %>
|
10
10
|
<% link = scaffold_check_link(text, true, "#{action}#{@scaffold_suffix}")
|
11
11
|
unless link == '' %>
|
12
12
|
<li><%= link %></li>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffolding_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-04-14 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- lib/scaffolding_extensions/controller/ramaze.rb
|
33
33
|
- lib/scaffolding_extensions/controller/sinatra.rb
|
34
34
|
- lib/scaffolding_extensions/controller/merb.rb
|
35
|
+
- lib/scaffolding_extensions/controller/rack.rb
|
35
36
|
- lib/scaffolding_extensions/jquery_helper.rb
|
36
37
|
- lib/scaffolding_extensions/meta_controller.rb
|
37
38
|
- lib/scaffolding_extensions/meta_model.rb
|
@@ -52,6 +53,7 @@ files:
|
|
52
53
|
- doc/testing.txt
|
53
54
|
- doc/advanced.txt
|
54
55
|
- doc/datamapper.txt
|
56
|
+
- doc/rack.txt
|
55
57
|
- contrib/scaffold_associations_tree/README
|
56
58
|
- contrib/scaffold_associations_tree/bullet.gif
|
57
59
|
- contrib/scaffold_associations_tree/minus.gif
|
@@ -97,6 +99,7 @@ rdoc_options:
|
|
97
99
|
- doc/testing.txt
|
98
100
|
- doc/advanced.txt
|
99
101
|
- doc/datamapper.txt
|
102
|
+
- doc/rack.txt
|
100
103
|
require_paths:
|
101
104
|
- lib
|
102
105
|
required_ruby_version: !ruby/object:Gem::Requirement
|