tap-server 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/History +5 -0
  2. data/cmd/server.rb +36 -8
  3. data/lib/tap/controller/rest_routes.rb +77 -0
  4. data/lib/tap/controller/utils.rb +29 -0
  5. data/lib/tap/controller.rb +244 -145
  6. data/lib/tap/controllers/app.rb +97 -55
  7. data/lib/tap/controllers/data.rb +132 -0
  8. data/lib/tap/controllers/schema.rb +137 -223
  9. data/lib/tap/controllers/server.rb +70 -27
  10. data/lib/tap/server/data.rb +178 -0
  11. data/lib/tap/server/runner.rb +71 -0
  12. data/lib/tap/server/server_error.rb +35 -0
  13. data/lib/tap/server.rb +60 -275
  14. data/lib/tap/tasks/echo.rb +39 -6
  15. data/lib/tap/tasks/render.rb +65 -0
  16. data/public/stylesheets/tap.css +15 -2
  17. data/views/configurable/_config.erb +1 -0
  18. data/views/configurable/_configs.erb +28 -0
  19. data/views/configurable/_flag.erb +2 -0
  20. data/views/configurable/_list_select.erb +8 -0
  21. data/views/configurable/_select.erb +6 -0
  22. data/views/configurable/_switch.erb +2 -0
  23. data/views/layout.erb +1 -1
  24. data/views/object/obj.erb +1 -0
  25. data/views/tap/controllers/app/_action.erb +3 -0
  26. data/views/tap/controllers/app/build.erb +18 -0
  27. data/views/tap/controllers/app/enque.erb +13 -0
  28. data/views/tap/controllers/app/info.erb +20 -7
  29. data/views/tap/controllers/data/_controls.erb +21 -0
  30. data/views/tap/controllers/data/_index_entry.erb +1 -0
  31. data/views/tap/controllers/data/_upload.erb +8 -0
  32. data/views/tap/controllers/data/entry.erb +8 -0
  33. data/views/tap/controllers/data/index.erb +14 -0
  34. data/views/tap/controllers/schema/_build.erb +6 -0
  35. data/views/tap/controllers/schema/_index_entry.erb +6 -0
  36. data/views/tap/controllers/schema/entry.erb +135 -0
  37. data/views/tap/controllers/schema/join.erb +6 -4
  38. data/views/tap/controllers/schema/task.erb +6 -0
  39. data/views/tap/controllers/server/access.erb +4 -0
  40. data/views/tap/controllers/server/admin.erb +21 -0
  41. data/views/tap/controllers/server/help.erb +23 -0
  42. data/views/tap/controllers/server/index.erb +43 -3
  43. data/views/tap/task/input.erb +17 -0
  44. data/views/tap/tasks/load/input.erb +11 -0
  45. metadata +35 -17
  46. data/lib/tap/server_error.rb +0 -34
  47. data/lib/tap/support/persistence.rb +0 -71
  48. data/lib/tap/tasks/server.rb +0 -30
  49. data/views/tap/controllers/app/index.erb +0 -44
  50. data/views/tap/controllers/schema/config/default.erb +0 -4
  51. data/views/tap/controllers/schema/config/flag.erb +0 -3
  52. data/views/tap/controllers/schema/config/switch.erb +0 -6
  53. data/views/tap/controllers/schema/configurations.erb +0 -27
  54. data/views/tap/controllers/schema/node.erb +0 -47
  55. data/views/tap/controllers/schema/preview.erb +0 -3
  56. data/views/tap/controllers/schema/round.erb +0 -30
  57. data/views/tap/controllers/schema/schema.erb +0 -28
  58. data/views/tap/tasks/echo/result.html +0 -1
data/History CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.4.0 / 2009-05-25
2
+
3
+ Significant internal rework to utilize Tap-0.17.0.
4
+ Tap-Server should still be considered experimental.
5
+
1
6
  == 0.3.0 / 2009-03-17
2
7
 
3
8
  Significant updates.
data/cmd/server.rb CHANGED
@@ -1,26 +1,54 @@
1
- # tap server {options}
1
+ # tap server {options}
2
2
  #
3
3
  # Initializes a tap server.
4
+ #
4
5
 
5
6
  require 'tap'
6
7
  require 'tap/server'
7
8
 
8
9
  env = Tap::Env.instance
9
10
  app = Tap::App.instance
10
- parser = ConfigParser.new do |opts|
11
+
12
+ begin
13
+ opts = ConfigParser.new('env' => env, 'app' => app)
14
+ opts.separator ""
15
+ opts.separator "configurations:"
16
+ opts.add(Tap::Server.configurations)
11
17
 
12
18
  opts.separator ""
13
19
  opts.separator "options:"
14
- opts.add(Tap::Server.configurations)
15
-
16
- # add option to print help
20
+
21
+ opts.on('--config FILE', 'Specifies a config file') do |config_file|
22
+ opts.config.merge! Configurable::Utils.load_file(config_file)
23
+ end
24
+
17
25
  opts.on("-h", "--help", "Show this message") do
18
26
  puts Lazydoc.usage(__FILE__)
19
27
  puts opts
20
28
  exit
21
29
  end
30
+
31
+ # (note defaults are not added so they will not
32
+ # conflict with string keys from a config file)
33
+ args = opts.parse!(ARGV, :clear_config => false, :add_defaults => false)
34
+
35
+ if args.empty?
36
+ args << 'server'
37
+ end
38
+
39
+ controller = env[:controller][args.shift]
40
+
41
+ unless args.empty?
42
+ warn "ignoring args: #{args.inspect}"
43
+ end
44
+
45
+ Tap::Server.new(controller, opts.nested_config).run!
46
+ rescue
47
+ raise if $DEBUG
48
+ puts $!.message
49
+ exit(1)
22
50
  end
23
- argv = parser.parse(ARGV)
24
51
 
25
- # launch server
26
- Tap::Server.new(env, app, parser.config).run!
52
+ exit(0)
53
+
54
+
@@ -0,0 +1,77 @@
1
+ module Tap
2
+ class Controller
3
+ # Adds REST routing to a Tap::Controller.
4
+ #
5
+ # class Projects < Tap::Controller
6
+ # include RestRoutes
7
+ #
8
+ # # GET /projects
9
+ # def index...
10
+ #
11
+ # # GET /projects/*args
12
+ # def show(*args)...
13
+ #
14
+ # # POST /projects/*args
15
+ # def create(*args)...
16
+ #
17
+ # # PUT /projects/*args
18
+ # # POST /projects/*args?_method=put
19
+ # def update(*args)...
20
+ #
21
+ # # DELETE /projects/*args
22
+ # # POST /projects/*args?_method=delete
23
+ # def destroy(*args)...
24
+ #
25
+ # # extension...
26
+ #
27
+ # # POST /projects/*args?_method=another
28
+ # def another(*args)...
29
+ # end
30
+ #
31
+ # === Relation to RESTful Rails
32
+ #
33
+ # Unlike the REST syntax in Rails, '/projects/new' is treated like a show
34
+ # where the id is 'new'. Also missing is the routing for urls like
35
+ # '/projects/arg;edit/'. See these resources:
36
+ #
37
+ # * {RESTful Rails Development}[http://www.b-simple.de/download/restful_rails_en.pdf]
38
+ # * {REST cheatsheet}[topfunky.com/clients/peepcode/REST-cheatsheet.pdf]
39
+ #
40
+ module RestRoutes
41
+ def route
42
+ blank, *route = request.path_info.split("/").collect {|arg| unescape(arg) }
43
+ route.unshift rest_action(route)
44
+ route
45
+ end
46
+
47
+ def rest_action(args)
48
+ case request.request_method
49
+ when /GET/i
50
+ if args.empty?
51
+ :index
52
+ else
53
+ :show
54
+ end
55
+ when /POST/i
56
+ case _method = request[:_method]
57
+ when /put/i
58
+ :update
59
+ when /delete/i
60
+ :destroy
61
+ when nil
62
+ :create
63
+ else
64
+ if action?(_method)
65
+ _method
66
+ else
67
+ raise Server::ServerError.new("unknown post method: #{_method}")
68
+ end
69
+ end
70
+ when /PUT/i then :update
71
+ when /DELETE/i then :destroy
72
+ else raise Server::ServerError.new("unknown request method: #{request.request_method}")
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,29 @@
1
+ module Tap
2
+ class Controller
3
+ module Utils
4
+
5
+ def static_file(path)
6
+ content = File.read(path)
7
+ headers = {
8
+ "Last-Modified" => File.mtime(path).httpdate,
9
+ "Content-Type" => Rack::Mime.mime_type(File.extname(path), 'text/plain'),
10
+ "Content-Length" => content.size.to_s
11
+ }
12
+
13
+ [200, headers, [content]]
14
+ end
15
+
16
+ def download(path)
17
+ content = File.read(path)
18
+ headers = {
19
+ "Last-Modified" => File.mtime(path).httpdate,
20
+ "Content-Type" => Rack::Mime.mime_type(File.extname(path), 'text/plain'),
21
+ "Content-Disposition" => "attachment; filename=#{File.basename(path)};",
22
+ "Content-Length" => content.size.to_s
23
+ }
24
+
25
+ [200, headers, [content]]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,10 +1,12 @@
1
+ require 'erb'
1
2
  require 'tap/server'
2
- require 'tap/support/persistence'
3
- autoload(:ERB, 'erb')
3
+ require 'tap/controller/rest_routes'
4
+ require 'tap/controller/utils'
4
5
 
5
6
  module Tap
6
7
 
7
8
  # === Declaring Actions
9
+ #
8
10
  # By default all public methods in subclasses are declared as actions. You
9
11
  # can declare a private or protected method as an action by:
10
12
  #
@@ -17,119 +19,112 @@ module Tap
17
19
  # * define it private or protected then call public(:method)
18
20
  #
19
21
  class Controller
20
-
21
- # Adds REST routing (a-la Rails[http://www.b-simple.de/download/restful_rails_en.pdf])
22
- # to a Tap::Controller.
23
- #
24
- # class Projects < Tap::Controller
25
- # include RestRoutes
26
- #
27
- # # GET /projects
28
- # def index...
29
- #
30
- # # GET /projects/*args
31
- # def show(*args)...
32
- #
33
- # # GET /projects/arg;edit/*args
34
- # def edit(arg, *args)...
35
- #
36
- # # POST /projects/*args
37
- # def create(*args)...
38
- #
39
- # # PUT /projects/*args
40
- # def update(*args)...
41
- #
42
- # # DELETE /projects/*args
43
- # def destroy(*args)...
44
- # end
45
- #
46
- module RestRoutes
47
- def route
48
- blank, *args = request.path_info.split("/").collect {|arg| unescape(arg) }
49
- action = case request.request_method
50
- when /GET/i
51
- case
52
- when args.empty?
53
- :index
54
- when args[0] =~ /(.*);edit$/
55
- args[0] = $1
56
- :edit
57
- else
58
- :show
59
- end
60
- when /POST/i then :create
61
- when /PUT/i then :update
62
- when /DELETE/i then :destroy
63
- else raise ServerError.new("unknown request method: #{request.request_method}")
64
- end
65
-
66
- [action, args]
67
- end
68
- end
69
-
70
22
  class << self
71
-
23
+
72
24
  # Initialize instance variables on the child and inherit as necessary.
73
25
  def inherited(child) # :nodoc:
74
26
  super
27
+
28
+ unless child.instance_variable_defined?(:@source_file)
29
+ caller[0] =~ Lazydoc::CALLER_REGEXP
30
+ child.instance_variable_set(:@source_file, File.expand_path($1))
31
+ end
32
+
33
+ set_variables.each do |variable|
34
+ child.set(variable, get(variable))
35
+ end
36
+
75
37
  child.set(:actions, actions.dup)
76
- child.set(:default_layout, default_layout)
77
38
  child.set(:define_action, true)
78
39
  end
79
-
40
+
80
41
  # An array of methods that can be called as actions. Actions must be
81
42
  # stored as symbols. Actions are inherited.
82
43
  attr_reader :actions
83
-
84
- # The default layout rendered when the render option :layout is true.
85
- attr_reader :default_layout
86
-
87
- # The base path prepended to render paths (ie render(<path>) renders
88
- # <templates_dir/name/path>).
89
- def name
90
- @name ||= to_s.underscore
91
- end
44
+
45
+ # The default action called for the request path '/'
46
+ attr_reader :default_action
92
47
 
93
48
  # Instantiates self and performs call.
94
49
  def call(env)
95
50
  new.call(env)
96
51
  end
97
-
98
- # Sets an instance variable for self, short for:
52
+
53
+ # Sets an instance variable for self (ie the class), short for:
99
54
  #
100
55
  # instance_variable_set(:@attribute, input)
101
56
  #
102
- # Typically only these variables should be set:
57
+ # These variables are meaningful to a default Tap::Controller and will
58
+ # be inherited by subclasses:
103
59
  #
104
60
  # actions:: sets actions
105
- # name:: the name of the controller
106
- # default_layout:: the default layout (used by render)
61
+ # default_action:: the default action (:index)
107
62
  #
108
63
  def set(variable, input)
64
+ set_variables << variable
109
65
  instance_variable_set("@#{variable}", input)
110
66
  end
111
67
 
112
- protected
68
+ # Gets the value of an instance variable set via set. Returns nil for
69
+ # variables that have not been set through set.
70
+ def get(variable)
71
+ return nil unless set_variables.include?(variable)
72
+ instance_variable_get("@#{variable}")
73
+ end
113
74
 
75
+ # An array of variables set via set. set_variables are inherited.
76
+ def set_variables
77
+ @set_variables ||= []
78
+ end
79
+
80
+ def nest(key, controller, &block)
81
+
82
+ # generate a subclass if anything gets overridden
83
+ if block_given?
84
+ controller = Class.new(controller)
85
+ controller.class_eval(&block)
86
+ end
87
+
88
+ # this check prevents a warning in cases where the nesting
89
+ # class defines the nested class
90
+ const_name = key.to_s.camelize
91
+ unless const_defined?(const_name) && const_get(const_name) == subclass
92
+ const_set(const_name, controller)
93
+ end
94
+
95
+ define_method(key) do |*args|
96
+ instance = controller.new
97
+
98
+ instance.server = server
99
+ instance.controller_path = controller_path ? "#{controller_path}/#{key}" : key
100
+ instance.request = request
101
+ instance.response = response
102
+
103
+ instance.dispatch(args)
104
+ end
105
+ end
106
+
107
+ protected
108
+
114
109
  # Overridden so that if declare_action is set, new methods
115
110
  # are added to actions.
116
111
  def method_added(sym) # :nodoc:
117
112
  actions << sym if @define_action
118
113
  super
119
114
  end
120
-
115
+
121
116
  # Turns on declare_action when changing method context.
122
117
  def public(*symbols) # :nodoc:
123
118
  @define_action = true if symbols.empty?
124
119
  super
125
120
  end
126
-
121
+
127
122
  # Turns off declare_action when changing method context.
128
123
  def protected(*symbols) # :nodoc:
129
124
  @define_action = false if symbols.empty?
130
125
  super
131
126
  end
132
-
127
+
133
128
  # Turns off declare_action when changing method context.
134
129
  def private(*symbols) # :nodoc:
135
130
  @define_action = false if symbols.empty?
@@ -137,107 +132,234 @@ module Tap
137
132
  end
138
133
  end
139
134
 
135
+ extend Lazydoc::Attributes
136
+ include Rack::Utils
137
+ ServerError = Tap::Server::ServerError
138
+
139
+ lazy_attr :desc, 'controller'
140
+
140
141
  set :actions, []
141
- set :default_layout, nil
142
+ set :default_action, :index
143
+ set :default_layout, 'layout.erb'
142
144
 
145
+ #--
143
146
  # Ensures methods (even public methods) on Controller will
144
147
  # not be actions in subclasses.
145
148
  set :define_action, false
146
149
 
147
- include Rack::Utils
148
-
149
- # Accesses the 'tap.server' specified in env, set during call.
150
150
  attr_accessor :server
151
151
 
152
+ attr_accessor :controller_path
153
+
152
154
  # A Rack::Request wrapping env, set during call.
153
155
  attr_accessor :request
154
-
156
+
155
157
  # A Rack::Response. If the action returns a string, it will be written to
156
158
  # response and response will be returned by call. Otherwise, call returns
157
159
  # the action result and response is ignored.
158
160
  attr_accessor :response
159
161
 
160
- # The action currently being called by self.
161
- attr_accessor :action
162
+ # Initializes a new instance of self.
163
+ def initialize
164
+ @request = @response = @server = @controller_path = nil
165
+ end
166
+
167
+ # Returns true if action is registered as an action for self.
168
+ def action?(action)
169
+ self.class.actions.include?(action.to_sym)
170
+ end
171
+
172
+ # Returns a uri to the specified action on self.
173
+ def uri(action=nil, params={})
174
+ uri = []
175
+
176
+ if controller_path
177
+ uri << '/'
178
+ uri << controller_path
179
+ end
180
+
181
+ if action
182
+ uri << '/'
183
+ uri << action
184
+ end
185
+
186
+ unless params.empty?
187
+ uri << '?'
188
+ uri << build_query(params)
189
+ end
190
+
191
+ uri.join
192
+ end
193
+
194
+ def template_path(path)
195
+ server.env.path(:views, path) {|file| File.file?(file) }
196
+ end
162
197
 
163
- # Initializes a new instance of self. The input attributes are reset by
164
- # call and are only provided for convenience during testing.
165
- def initialize(server=nil, request=nil, response=nil)
166
- @server = server
167
- @request = request
168
- @response = response
169
- @action = nil
198
+ def module_path(path, klass=self.class)
199
+ server.env.module_path(:views, klass.ancestors, path) {|file| File.file?(file) }
170
200
  end
171
201
 
202
+ # Routes the request to an action and returns the response. Routing is
203
+ # simple and fixed (see route):
204
+ #
205
+ # route calls
206
+ # / default_action (ie 'index')
207
+ # /action/*args action(*args)
208
+ #
209
+ # If the action returns a string, it will be written to response.
210
+ # Otherwise, call returns the result of action. This allows actions like:
211
+ #
212
+ # class ActionsController < Tap::Controller
213
+ # def simple
214
+ # "html body"
215
+ # end
216
+ #
217
+ # def standard
218
+ # response["Content-Type"] = "text/plain"
219
+ # response << "text"
220
+ # response.finish
221
+ # end
222
+ #
223
+ # def custom
224
+ # [200, {"Content-Type" => "text/plain"}, ["text"]]
225
+ # end
226
+ # end
227
+ #
172
228
  def call(env)
173
- @server = env['tap.server'] || Tap::Server.new
229
+ @server = env['tap.server']
230
+ @controller_path = env['tap.controller_path']
231
+
174
232
  @request = Rack::Request.new(env)
175
233
  @response = Rack::Response.new
176
234
 
177
- # route to an action
178
- @action, args = route
179
- unless self.class.actions.include?(@action)
180
- raise ServerError.new("404 Error: page not found", 404)
181
- end
182
-
183
- result = send(@action, *args)
184
- if result.kind_of?(String)
235
+ case result = dispatch(route)
236
+ when String
185
237
  response.write result
186
238
  response.finish
239
+ when nil
240
+ response.finish
187
241
  else
188
242
  result
189
243
  end
190
244
  end
191
-
245
+
246
+ # Returns the action, args, and extname for the request.path_info. Routing
247
+ # is simple and fixed:
248
+ #
249
+ # route returns
250
+ # / [:index, []]
251
+ # /action/*args [:action, args]
252
+ #
253
+ # The action and args are unescaped by route. An alternate default action
254
+ # may be specified using set. Override this method in subclasses for
255
+ # fancier routes.
192
256
  def route
193
- blank, action, *args = request.path_info.split("/").collect {|arg| unescape(arg) }
194
- action = "index" if action == nil || action.empty?
195
- action = action.chomp(File.extname(action)).to_sym
257
+ blank, *route = request.path_info.split("/").collect {|arg| unescape(arg) }
258
+ route
259
+ end
260
+
261
+ def dispatch(route)
262
+ action, *args = route
263
+
264
+ if action == nil || action == ""
265
+ action = self.class.default_action
266
+ end
196
267
 
197
- [action, args]
268
+ unless action?(action)
269
+ raise ServerError.new("404 Error: page not found", 404)
270
+ end
271
+
272
+ send(action, *args)
198
273
  end
199
274
 
275
+ # Renders the class_file at path with the specified options. Path can be
276
+ # omitted if options specifies an alternate path to render. Options:
277
+ #
278
+ # template:: renders the template relative to the template directory
279
+ # file:: renders the specified file
280
+ # layout:: renders with the specified layout, or default_layout if true
281
+ # locals:: a hash of local variables used in the template
282
+ #
200
283
  def render(path, options={})
201
284
  options, path = path, nil if path.kind_of?(Hash)
202
-
285
+
203
286
  # lookup template
204
287
  template_path = case
205
- when options.has_key?(:template)
206
- server.search(:views, options[:template])
288
+ when options[:file]
289
+ options[:file]
290
+ when options[:template]
291
+ self.template_path(options[:template])
207
292
  else
208
- server.search(:views, "#{self.class.name}/#{path}")
293
+ self.module_path(path)
209
294
  end
210
-
295
+
211
296
  unless template_path
212
- raise "could not find template for: #{path}"
297
+ raise "could not find template: (path: #{path.inspect}, file: #{options[:file].inspect}, template: #{options[:template].inspect})"
213
298
  end
214
299
 
215
300
  # render template
216
301
  template = File.read(template_path)
217
- content = render_erb(template, options)
302
+ content = render_erb(template, options, template_path)
218
303
 
219
304
  # render layout
220
- layout = options[:layout]
221
- layout = self.class.default_layout if layout == true
222
- if layout
223
- render(:template => layout, :locals => {:content => content})
305
+ render_layout(options[:layout], content)
306
+ end
307
+
308
+ # Renders the specified layout with content as a local variable. If layout
309
+ # is true, the class default_layout will be rendered. Returns content if no
310
+ # layout is specified.
311
+ def render_layout(layout, content)
312
+ return content unless layout
313
+
314
+ if layout == true
315
+ layout = self.class.get(:default_layout)
316
+ end
317
+
318
+ if layout.kind_of?(Hash)
319
+ locals = layout[:locals] ||= {}
320
+
321
+ if locals.has_key?(:content)
322
+ raise "layout already has local content assigned: #{layout.inspect}"
323
+ end
324
+
325
+ locals[:content] = content
224
326
  else
225
- content
327
+ layout = {:template => layout, :locals => {:content => content}}
226
328
  end
329
+
330
+ render(layout)
227
331
  end
228
-
229
- def render_erb(template, options={})
332
+
333
+ # Renders the specified template as ERB using the options. Options:
334
+ #
335
+ # locals:: a hash of local variables used in the template
336
+ #
337
+ # The filename used to identify errors in an erb template to a specific
338
+ # file and is completely options (but handy).
339
+ def render_erb(template, options={}, filename=nil)
230
340
  # assign locals to the render binding
231
341
  # this almost surely may be optimized...
232
342
  locals = options[:locals]
233
- binding = empty_binding
234
-
343
+ binding = render_erb_binding
344
+
235
345
  locals.each_pair do |key, value|
236
346
  @assignment_value = value
237
347
  eval("#{key} = remove_instance_variable(:@assignment_value)", binding)
238
348
  end if locals
349
+
350
+ erb = ERB.new(template, nil, "<>")
351
+ erb.filename = filename
352
+ erb.result(binding)
353
+ end
354
+
355
+ def module_render(path, obj, options={})
356
+ obj = obj.class unless obj.kind_of?(Module)
357
+ options[:file] = module_path(path, obj) || module_path(path)
358
+
359
+ locals = options[:locals] ||= {}
360
+ locals[:obj] ||= obj
239
361
 
240
- ERB.new(template, nil, "<>").result(binding)
362
+ render options
241
363
  end
242
364
 
243
365
  # Redirects to the specified uri.
@@ -245,38 +367,15 @@ module Tap
245
367
  response.status = status
246
368
  response.headers.merge!(headers)
247
369
  response.body = body
248
-
249
- response['Location'] = uri
370
+
371
+ response['Location'] = [uri]
250
372
  response.finish
251
373
  end
252
374
 
253
- # Returns a session hash.
254
- def session
255
- request.env['rack.session'] ||= {}
256
- end
257
-
258
- # Returns the app for the current session.
259
- def app
260
- server.app(session[:id] ||= server.initialize_session)
261
- end
262
-
263
- # Returns the root for the current session.
264
- def root
265
- server.root(session[:id] ||= server.initialize_session)
266
- end
267
-
268
- # Returns the file-based controller persistence.
269
- def persistence
270
- @persistence ||= Support::Persistence.new(root)
271
- end
272
-
273
- # Returns a controller uri.
274
- def uri(action=nil, params={})
275
- server.uri(self.class.name, action, params)
276
- end
375
+ private
277
376
 
278
377
  # Generates an empty binding to self without any locals assigned.
279
- def empty_binding # :nodoc:
378
+ def render_erb_binding # :nodoc:
280
379
  binding
281
380
  end
282
381
  end