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 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 2009.06.12
26
- * Camping 1.5
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
@@ -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[:id] || @scaffold_request_id
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 'cgi'
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
- CGI.escape(s.to_s)
16
+ Rack::Utils.escape(s.to_s)
17
17
  end
18
18
 
19
19
  def h(s)
20
- CGI.escapeHTML(s.to_s)
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, scaffold_fix_template(render_options[:inline]), :layout=>false)
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 = scaffold_fix_template(File.read(scaffold_path(se_name)))
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
- scaffold_render_template(:manage, scaffold_options)
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
- scaffold_render_template(:list, scaffold_options)
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
- scaffold_render_template(:show, scaffold_options)
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
- scaffold_render_template(:edit, scaffold_options)
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
- scaffold_render_template(:edit, scaffold_options)
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
- scaffold_render_template(:new, scaffold_options)
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
- scaffold_render_template(:new, scaffold_options)
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
- scaffold_render_template(:search, scaffold_options)
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
- scaffold_render_template(:listtable, scaffold_options)
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
- scaffold_render_template(:merge, scaffold_options)
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
- scaffold_render_template(:listtable, scaffold_options)
185
+ send(render_meth, :listtable)
180
186
  end
181
187
  end
182
188
  end
@@ -1,6 +1,6 @@
1
1
  <% @scaffold_title = 'Manage Models' %>
2
2
  <ul>
3
- <% @links.each do |link, human_name| -%>
3
+ <% @links.each do |link, human_name| %>
4
4
  <li><a href="<%= scaffold_url(link) %>"><%= human_name %></a></li>
5
5
  <% end %>
6
6
  </ul>
@@ -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 %>
@@ -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.1
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-03-30 00:00:00 -07:00
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