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 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