scaffolding_extensions 1.4.1 → 1.4.2
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 +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
|