padrino-core 0.9.29 → 0.10.0
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/bin/padrino +2 -1
- data/lib/padrino-core.rb +1 -1
- data/lib/padrino-core/application.rb +45 -10
- data/lib/padrino-core/application/routing.rb +179 -90
- data/lib/padrino-core/cli/base.rb +15 -4
- data/lib/padrino-core/cli/rake_tasks.rb +1 -1
- data/lib/padrino-core/loader.rb +1 -1
- data/lib/padrino-core/locale/hu.yml +30 -0
- data/lib/padrino-core/logger.rb +2 -1
- data/lib/padrino-core/mounter.rb +2 -2
- data/lib/padrino-core/reloader.rb +58 -28
- data/lib/padrino-core/server.rb +3 -3
- data/lib/padrino-core/support_lite.rb +86 -18
- data/lib/padrino-core/version.rb +1 -1
- data/padrino-core.gemspec +12 -7
- data/test/fixtures/apps/simple.rb +1 -1
- data/test/fixtures/dependencies/circular/e.rb +13 -0
- data/test/fixtures/dependencies/circular/f.rb +2 -0
- data/test/fixtures/dependencies/circular/g.rb +2 -0
- data/test/helper.rb +5 -2
- data/test/test_core.rb +1 -1
- data/test/test_dependencies.rb +13 -1
- data/test/test_filters.rb +266 -0
- data/test/test_rendering.rb +6 -2
- data/test/test_routing.rb +78 -14
- metadata +22 -7
data/bin/padrino
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems' unless defined?(Gem)
|
2
|
+
require 'rubygems' unless defined?(Gem)
|
3
|
+
require 'bundler/setup' if %w(Gemfile .components).all? { |f| File.exist?(f) }
|
3
4
|
|
4
5
|
padrino_core_path = File.expand_path('../../lib', __FILE__)
|
5
6
|
$:.unshift(padrino_core_path) if File.directory?(padrino_core_path) && !$:.include?(padrino_core_path)
|
data/lib/padrino-core.rb
CHANGED
@@ -8,9 +8,6 @@ module Padrino
|
|
8
8
|
#
|
9
9
|
class Application < Sinatra::Base
|
10
10
|
register Padrino::Routing # Support for advanced routing, controllers, url_for
|
11
|
-
unless defined?(SKIP_PADRINO_RENDERING) && SKIP_PADRINO_RENDERING
|
12
|
-
register Padrino::Rendering # Support for enhanced rendering with template detection
|
13
|
-
end
|
14
11
|
|
15
12
|
class << self
|
16
13
|
|
@@ -18,10 +15,13 @@ module Padrino
|
|
18
15
|
logger.devel "Setup #{base}"
|
19
16
|
CALLERS_TO_IGNORE.concat(PADRINO_IGNORE_CALLERS)
|
20
17
|
base.default_configuration!
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
base.prerequisites.concat([
|
19
|
+
File.join(base.root, "/models.rb"),
|
20
|
+
File.join(base.root, "/models/**/*.rb"),
|
21
|
+
File.join(base.root, "/lib.rb"),
|
22
|
+
File.join(base.root, "/lib/**/*.rb")
|
23
|
+
]).uniq!
|
24
|
+
Padrino.require_dependencies(base.prerequisites)
|
25
25
|
super(base) # Loading the subclass inherited method
|
26
26
|
end
|
27
27
|
|
@@ -112,7 +112,7 @@ module Padrino
|
|
112
112
|
def run!(options={})
|
113
113
|
return unless Padrino.load!
|
114
114
|
Padrino.mount(self.to_s).to("/")
|
115
|
-
Padrino.run!
|
115
|
+
Padrino.run!(options)
|
116
116
|
end
|
117
117
|
|
118
118
|
##
|
@@ -137,6 +137,23 @@ module Padrino
|
|
137
137
|
].map { |file| Dir[File.join(self.root, file)] }.flatten
|
138
138
|
end
|
139
139
|
|
140
|
+
##
|
141
|
+
# An array of file to load before your app.rb, basically are files wich our app depends on.
|
142
|
+
#
|
143
|
+
# By default we look for files:
|
144
|
+
#
|
145
|
+
# yourapp/models.rb
|
146
|
+
# yourapp/models/**/*.rb
|
147
|
+
# yourapp/lib.rb
|
148
|
+
# yourapp/lib/**/*.rb
|
149
|
+
#
|
150
|
+
# ==== Examples
|
151
|
+
# MyApp.prerequisites << Padrino.root('my_app', 'custom_model.rb')
|
152
|
+
#
|
153
|
+
def prerequisites
|
154
|
+
@_prerequisites ||= []
|
155
|
+
end
|
156
|
+
|
140
157
|
protected
|
141
158
|
##
|
142
159
|
# Defines default settings for Padrino application
|
@@ -182,8 +199,10 @@ module Padrino
|
|
182
199
|
#
|
183
200
|
def default_filters!
|
184
201
|
before do
|
185
|
-
@_content_type
|
186
|
-
|
202
|
+
unless @_content_type
|
203
|
+
@_content_type = :html
|
204
|
+
response['Content-Type'] = 'text/html;charset=utf-8'
|
205
|
+
end
|
187
206
|
end
|
188
207
|
end
|
189
208
|
|
@@ -220,5 +239,21 @@ module Padrino
|
|
220
239
|
Padrino.require_dependencies(dependencies, :force => true)
|
221
240
|
end
|
222
241
|
end # self
|
242
|
+
|
243
|
+
# TODO Remove deprecated render inclusion in a few versions
|
244
|
+
# Detects if a user is incorrectly using 'render' and warns them about the fix
|
245
|
+
# In 0.10.0, Padrino::Rendering now has to be explicitly included in the application
|
246
|
+
def render(*args)
|
247
|
+
if !defined?(DEFAULT_RENDERING_OPTIONS) && !@_render_included &&
|
248
|
+
(args.size == 1 || (args.size == 2 && args[0].is_a?(String) && args[1].is_a?(Hash)))
|
249
|
+
logger.warn "[Deprecation] Please 'register Padrino::Rendering' for each application as shown here:
|
250
|
+
https://gist.github.com/1d36a35794dbbd664ea4 for 'render' to function as expected"
|
251
|
+
self.class.instance_eval { register Padrino::Rendering }
|
252
|
+
@_render_included = true
|
253
|
+
render(*args)
|
254
|
+
else # pass through, rendering is valid
|
255
|
+
super(*args)
|
256
|
+
end
|
257
|
+
end # render method
|
223
258
|
end # Application
|
224
259
|
end # Padrino
|
@@ -1,10 +1,13 @@
|
|
1
|
-
$:.unshift '/Users/joshbuddy/Development/http_router/lib'
|
2
|
-
|
3
1
|
require 'http_router' unless defined?(HttpRouter)
|
4
2
|
require 'padrino-core/support_lite' unless defined?(SupportLite)
|
5
3
|
|
6
4
|
class Sinatra::Request #:nodoc:
|
7
|
-
attr_accessor :route_obj
|
5
|
+
attr_accessor :route_obj, :runner
|
6
|
+
|
7
|
+
def runner=(runner)
|
8
|
+
@runner = runner
|
9
|
+
env['padrino.instance'] = runner
|
10
|
+
end
|
8
11
|
|
9
12
|
def controller
|
10
13
|
route_obj && route_obj.controller
|
@@ -12,7 +15,49 @@ class Sinatra::Request #:nodoc:
|
|
12
15
|
end
|
13
16
|
|
14
17
|
class HttpRouter #:nodoc:
|
15
|
-
|
18
|
+
def rewrite_partial_path_info(env, request); end
|
19
|
+
def rewrite_path_info(env, request); end
|
20
|
+
|
21
|
+
def process_destination_path(path, env)
|
22
|
+
env['padrino.instance'].instance_eval do
|
23
|
+
request.route_obj = path.route
|
24
|
+
@_response_buffer = nil
|
25
|
+
@params ||= {}
|
26
|
+
@params.update(env['router.params'])
|
27
|
+
@block_params = if path.route.is_a?(HttpRouter::RegexRoute)
|
28
|
+
params_list = env['router.request'].extra_env['router.regex_match'].to_a
|
29
|
+
params_list.shift
|
30
|
+
@params[:captures] = params_list
|
31
|
+
params_list
|
32
|
+
else
|
33
|
+
env['router.request'].params
|
34
|
+
end
|
35
|
+
# Provide access to the current controller to the request
|
36
|
+
# Now we can eval route, but because we have "throw halt" we need to be
|
37
|
+
# (en)sure to reset old layout and run controller after filters.
|
38
|
+
old_params = @params
|
39
|
+
parent_layout = @layout
|
40
|
+
successful = false
|
41
|
+
begin
|
42
|
+
filter! :before
|
43
|
+
(path.route.before_filters - self.class.filters[:before]).each { |filter| instance_eval(&filter)} if path.route.before_filters
|
44
|
+
# If present set current controller layout
|
45
|
+
@layout = path.route.use_layout if path.route.use_layout
|
46
|
+
@route = path.route
|
47
|
+
@route.custom_conditions.each { |blk| pass if instance_eval(&blk) == false } if @route.custom_conditions
|
48
|
+
@block_params = @block_params.slice(0, path.route.dest.arity) if path.route.dest.arity > 0
|
49
|
+
halt_response = catch(:halt) { route_eval(&path.route.dest) }
|
50
|
+
@_response_buffer = halt_response.is_a?(Array) ? halt_response.last : halt_response
|
51
|
+
successful = true
|
52
|
+
halt @_response_buffer
|
53
|
+
ensure
|
54
|
+
(@_pending_after_filters ||= []).concat(path.route.after_filters) if path.route.after_filters && successful
|
55
|
+
@layout = parent_layout
|
56
|
+
@params = old_params
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
16
61
|
class Route #:nodoc:
|
17
62
|
attr_reader :before_filters, :after_filters
|
18
63
|
attr_accessor :custom_conditions, :use_layout, :controller, :cache
|
@@ -36,13 +81,43 @@ class HttpRouter #:nodoc:
|
|
36
81
|
end
|
37
82
|
|
38
83
|
def custom_conditions=(custom_conditions)
|
39
|
-
custom_conditions.each { |blk| arbitrary { |req, params| router.runner.instance_eval(&blk) != false } } if custom_conditions
|
40
84
|
@custom_conditions = custom_conditions
|
41
85
|
end
|
42
86
|
end
|
43
87
|
end
|
44
88
|
|
45
89
|
module Padrino
|
90
|
+
class Filter
|
91
|
+
attr_reader :block
|
92
|
+
|
93
|
+
def initialize(mode, scoped_controller, options, args, &block)
|
94
|
+
@mode, @scoped_controller, @options, @args, @block = mode, scoped_controller, options, args, block
|
95
|
+
end
|
96
|
+
|
97
|
+
def apply?(request)
|
98
|
+
return true if @args.empty? && @options.empty?
|
99
|
+
detect = @args.any? do |arg|
|
100
|
+
case arg
|
101
|
+
when Symbol then request.route_obj.named == arg or request.route_obj.named == [@scoped_controller, arg].flatten.join("_").to_sym
|
102
|
+
else arg === request.path_info
|
103
|
+
end
|
104
|
+
end || @options.any? { |name, val|
|
105
|
+
case name
|
106
|
+
when :agent then val === request.user_agent
|
107
|
+
else val === request.send(name)
|
108
|
+
end
|
109
|
+
}
|
110
|
+
detect ^ !@mode
|
111
|
+
end
|
112
|
+
|
113
|
+
def to_proc
|
114
|
+
filter = self
|
115
|
+
proc {
|
116
|
+
instance_eval(&filter.block) if filter.apply?(request)
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
46
121
|
##
|
47
122
|
# Padrino provides advanced routing definition support to make routes and url generation much easier.
|
48
123
|
# This routing system supports named route aliases and easy access to url paths.
|
@@ -52,6 +127,7 @@ module Padrino
|
|
52
127
|
#
|
53
128
|
module Routing
|
54
129
|
CONTENT_TYPE_ALIASES = { :htm => :html } unless defined?(CONTENT_TYPE_ALIASES)
|
130
|
+
ROUTE_PRIORITY = {:high => 0, :normal => 1, :low => 2}
|
55
131
|
|
56
132
|
class UnrecognizedException < RuntimeError #:nodoc:
|
57
133
|
end
|
@@ -132,6 +208,30 @@ module Padrino
|
|
132
208
|
# end
|
133
209
|
# end
|
134
210
|
#
|
211
|
+
# You can specify conditions to run for all routes:
|
212
|
+
#
|
213
|
+
# controller :conditions => {:protect => true} do
|
214
|
+
# def self.protect(protected)
|
215
|
+
# condition do
|
216
|
+
# halt 403, "No secrets for you!" unless params[:key] == "s3cr3t"
|
217
|
+
# end if protected
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# # This route will only return "secret stuff" if the user goes to
|
221
|
+
# # `/private?key=s3cr3t`.
|
222
|
+
# get("/private") { "secret stuff" }
|
223
|
+
#
|
224
|
+
# # And this one, too!
|
225
|
+
# get("/also-private") { "secret stuff" }
|
226
|
+
#
|
227
|
+
# # But you can override the conditions for each route as needed.
|
228
|
+
# # This route will be publicly accessible without providing the
|
229
|
+
# # secret key.
|
230
|
+
# get :index, :protect => false do
|
231
|
+
# "Welcome!"
|
232
|
+
# end
|
233
|
+
# end
|
234
|
+
#
|
135
235
|
# You can supply default values:
|
136
236
|
#
|
137
237
|
# controller :lang => :de do
|
@@ -158,11 +258,12 @@ module Padrino
|
|
158
258
|
@_use_format, original_use_format = options.delete(:use_format), @_use_format
|
159
259
|
@_cache, original_cache = options.delete(:cache), @_cache
|
160
260
|
@_map, original_map = options.delete(:map), @_map
|
261
|
+
@_conditions, original_conditions = options.delete(:conditions), @_conditions
|
161
262
|
@_defaults, original_defaults = options, @_defaults
|
162
263
|
|
163
264
|
# Application defaults
|
164
|
-
@filters, original_filters
|
165
|
-
@layout, original_layout
|
265
|
+
@filters, original_filters = { :before => @filters[:before].dup, :after => @filters[:after].dup }, @filters
|
266
|
+
@layout, original_layout = nil, @layout
|
166
267
|
|
167
268
|
instance_eval(&block)
|
168
269
|
|
@@ -173,13 +274,29 @@ module Padrino
|
|
173
274
|
# Controller defaults
|
174
275
|
@_controller, @_parents, @_cache = original_controller, original_parent, original_cache
|
175
276
|
@_defaults, @_provides, @_map = original_defaults, original_provides, original_map
|
176
|
-
@_use_format = original_use_format
|
277
|
+
@_conditions, @_use_format = original_conditions, original_use_format
|
177
278
|
else
|
178
279
|
include(*args) if extensions.any?
|
179
280
|
end
|
180
281
|
end
|
181
282
|
alias :controllers :controller
|
182
283
|
|
284
|
+
def before(*args, &block)
|
285
|
+
add_filter :before, &(args.empty? ? block : construct_filter(*args, &block))
|
286
|
+
end
|
287
|
+
|
288
|
+
def after(*args, &block)
|
289
|
+
add_filter :after, &(args.empty? ? block : construct_filter(*args, &block))
|
290
|
+
end
|
291
|
+
|
292
|
+
def construct_filter(*args, &block)
|
293
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
294
|
+
except = options.key?(:except) && Array(options.delete(:except))
|
295
|
+
raise("You cannot use except with other options specified") if except && (!args.empty? || !options.empty?)
|
296
|
+
options = except.last.is_a?(Hash) ? except.pop : {} if except
|
297
|
+
Filter.new(!except, @_controller, options, Array(except || args), &block)
|
298
|
+
end
|
299
|
+
|
183
300
|
##
|
184
301
|
# Provides many parents with shallowing.
|
185
302
|
#
|
@@ -220,17 +337,27 @@ module Padrino
|
|
220
337
|
end
|
221
338
|
alias :urls :router
|
222
339
|
|
223
|
-
def
|
224
|
-
|
340
|
+
def compiled_router
|
341
|
+
if deferred_routes.empty?
|
342
|
+
router
|
343
|
+
else
|
344
|
+
deferred_routes.each { |_, routes| routes.each { |(route, dest)| route.to(dest) } }
|
345
|
+
@deferred_routes = nil
|
346
|
+
router
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
def deferred_routes
|
351
|
+
@deferred_routes ||= Hash[ROUTE_PRIORITY.values.sort.map{|p| [p, []]}]
|
225
352
|
end
|
226
353
|
|
227
354
|
def reset_router!
|
355
|
+
@deferred_routes = nil
|
228
356
|
router.reset!
|
229
|
-
recognition_router.reset!
|
230
357
|
end
|
231
358
|
|
232
359
|
def recognize_path(path)
|
233
|
-
if response = @
|
360
|
+
if response = @router.recognize(Rack::MockRequest.env_for(path))
|
234
361
|
[response.path.route.named, response.params]
|
235
362
|
end
|
236
363
|
end
|
@@ -253,15 +380,15 @@ module Padrino
|
|
253
380
|
params = value_to_param(params)
|
254
381
|
end
|
255
382
|
url = if params_array.empty?
|
256
|
-
|
383
|
+
compiled_router.url(name, params)
|
257
384
|
else
|
258
|
-
|
385
|
+
compiled_router.url(name, *(params_array << params))
|
259
386
|
end
|
260
387
|
url[0,0] = conform_uri(uri_root) if defined?(uri_root)
|
261
388
|
url[0,0] = conform_uri(ENV['RACK_BASE_URI']) if ENV['RACK_BASE_URI']
|
262
389
|
url = "/" if url.blank?
|
263
390
|
url
|
264
|
-
rescue HttpRouter::
|
391
|
+
rescue HttpRouter::InvalidRouteException
|
265
392
|
route_error = "route mapping for url(#{name.inspect}) could not be found!"
|
266
393
|
raise Padrino::Routing::UnrecognizedException.new(route_error)
|
267
394
|
end
|
@@ -275,6 +402,10 @@ module Padrino
|
|
275
402
|
route('HEAD', path, *args, &block)
|
276
403
|
end
|
277
404
|
|
405
|
+
def current_controller
|
406
|
+
@_controller && @_controller.last
|
407
|
+
end
|
408
|
+
|
278
409
|
private
|
279
410
|
# Parse params from the url method
|
280
411
|
def value_to_param(value)
|
@@ -318,6 +449,7 @@ module Padrino
|
|
318
449
|
# get :list, :provides => :any # => "/list(.:format)"
|
319
450
|
# get :list, :provides => [:js, :json] # => "/list.{!format,js|json}"
|
320
451
|
# get :list, :provides => [:html, :js, :json] # => "/list(.{!format,js|json})"
|
452
|
+
# get :list, :priority => :low # Defers route to be last
|
321
453
|
#
|
322
454
|
def route(verb, path, *args, &block)
|
323
455
|
options = case args.size
|
@@ -340,21 +472,18 @@ module Padrino
|
|
340
472
|
route_options[:provides] = @_provides if @_provides
|
341
473
|
path, *route_options[:with] = path if path.is_a?(Array)
|
342
474
|
path, name, options = *parse_route(path, route_options, verb)
|
475
|
+
options.reverse_merge!(@_conditions) if @_conditions
|
343
476
|
|
344
477
|
# Sinatra defaults
|
345
|
-
|
478
|
+
method_name = "#{verb} #{path}"
|
479
|
+
define_method(method_name, &block)
|
346
480
|
unbound_method = instance_method("#{verb} #{path}")
|
481
|
+
remove_method(method_name)
|
347
482
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
proc {
|
352
|
-
@block_params = @block_params.slice(0, block_arity) if block_arity > 0
|
353
|
-
unbound_method.bind(self).call(*@block_params)
|
354
|
-
}
|
355
|
-
else
|
483
|
+
block_arity = block.arity
|
484
|
+
block = block_arity != 0 ?
|
485
|
+
proc { @block_params = @block_params[0, block_arity]; unbound_method.bind(self).call(*@block_params) } :
|
356
486
|
proc { unbound_method.bind(self).call }
|
357
|
-
end
|
358
487
|
|
359
488
|
invoke_hook(:route_added, verb, path, block)
|
360
489
|
|
@@ -362,6 +491,8 @@ module Padrino
|
|
362
491
|
route = router.add(path)
|
363
492
|
|
364
493
|
route.name(name) if name
|
494
|
+
priority_name = options.delete(:priority) || :normal
|
495
|
+
priority = ROUTE_PRIORITY[priority_name] or raise("Priority #{priority_name} not recognized, try #{ROUTE_PRIORITY.keys.join(', ')}")
|
365
496
|
route.cache = options.key?(:cache) ? options.delete(:cache) : @_cache
|
366
497
|
route.send(verb.downcase.to_sym)
|
367
498
|
route.host(options.delete(:host)) if options.key?(:host)
|
@@ -377,40 +508,25 @@ module Padrino
|
|
377
508
|
end
|
378
509
|
end
|
379
510
|
|
380
|
-
recognition_router.add(path).name(name).to(name)
|
381
|
-
|
382
511
|
# Add Sinatra conditions
|
383
|
-
options.each { |
|
384
|
-
if route.respond_to?(option)
|
385
|
-
route.send(option, *args)
|
386
|
-
else
|
387
|
-
send(option, *args)
|
388
|
-
end
|
389
|
-
}
|
512
|
+
options.each { |o, a| route.respond_to?(o) ? route.send(o, *a) : send(o, *a) }
|
390
513
|
conditions, @conditions = @conditions, []
|
391
514
|
route.custom_conditions = conditions
|
392
515
|
|
393
516
|
invoke_hook(:padrino_route_added, route, verb, path, args, options, block)
|
394
517
|
|
395
518
|
# Add Application defaults
|
519
|
+
route.before_filters = @filters[:before]
|
520
|
+
route.after_filters = @filters[:after]
|
396
521
|
if @_controller
|
397
|
-
route.
|
398
|
-
route.
|
399
|
-
route.use_layout = @layout
|
400
|
-
route.controller = Array(@_controller).first.to_s
|
401
|
-
else
|
402
|
-
route.before_filters = @filters[:before] || []
|
403
|
-
route.after_filters = @filters[:after] || []
|
522
|
+
route.use_layout = @layout
|
523
|
+
route.controller = Array(@_controller).first.to_s
|
404
524
|
end
|
405
525
|
|
406
|
-
route
|
526
|
+
deferred_routes[priority] << [route, block]
|
407
527
|
route
|
408
528
|
end
|
409
529
|
|
410
|
-
def current_controller
|
411
|
-
@_controller && @_controller.last
|
412
|
-
end
|
413
|
-
|
414
530
|
##
|
415
531
|
# Returns the final parsed route details (modified to reflect all Padrino options)
|
416
532
|
# given the raw route. Raw route passed in could be a named alias or a string and
|
@@ -555,11 +671,7 @@ module Padrino
|
|
555
671
|
# per rfc2616-sec14:
|
556
672
|
# Assume */* if no ACCEPT header is given.
|
557
673
|
catch_all = (accepts.delete "*/*" || accepts.empty?)
|
558
|
-
|
559
|
-
matching_types = mime_types.slice(0,1)
|
560
|
-
else
|
561
|
-
matching_types = (accepts & mime_types)
|
562
|
-
end
|
674
|
+
matching_types = accepts.empty? ? mime_types.slice(0,1) : (accepts & mime_types)
|
563
675
|
|
564
676
|
if params[:format]
|
565
677
|
accept_format = params[:format]
|
@@ -668,51 +780,29 @@ module Padrino
|
|
668
780
|
end
|
669
781
|
|
670
782
|
private
|
671
|
-
|
672
|
-
|
673
|
-
|
783
|
+
def dispatch!
|
784
|
+
static! if settings.static? && (request.get? || request.head?)
|
785
|
+
route!
|
786
|
+
rescue Sinatra::NotFound => boom
|
787
|
+
handle_not_found!(boom)
|
788
|
+
rescue ::Exception => boom
|
789
|
+
handle_exception!(boom)
|
790
|
+
ensure
|
791
|
+
@_pending_after_filters.each { |filter| instance_eval(&filter)} if @_pending_after_filters
|
792
|
+
end
|
793
|
+
|
674
794
|
def route!(base=self.class, pass_block=nil)
|
675
|
-
|
676
|
-
if base.
|
677
|
-
|
678
|
-
@_response_buffer = nil
|
679
|
-
if match.path.route.is_a?(HttpRouter::RegexRoute)
|
680
|
-
params_list = match.request.extra_env['router.regex_match'].to_a
|
681
|
-
params_list.shift
|
682
|
-
@block_params = params_list
|
683
|
-
@params.update({:captures => params_list}.merge(@params || {}))
|
684
|
-
else
|
685
|
-
@block_params = match.param_values
|
686
|
-
@params.update(match.params.merge(@params || {}))
|
687
|
-
end
|
688
|
-
parent_layout = @layout
|
689
|
-
@params ||= {}
|
690
|
-
@layout = match.path.route.use_layout if match.path.route.use_layout
|
691
|
-
# Provide access to the current controller to the request
|
692
|
-
# Now we can eval route, but because we have "throw halt" we need to be
|
693
|
-
# (en)sure to reset old layout and run controller after filters.
|
694
|
-
begin
|
695
|
-
old_params = @params
|
696
|
-
match.path.route.before_filters.each { |filter| instance_eval(&filter) } if match.path.route.before_filters
|
697
|
-
# If present set current controller layout
|
698
|
-
@route = match.path.route
|
699
|
-
@block_params = @block_params.slice(0, match.path.route.dest.arity) if match.path.route.dest.arity > 0
|
700
|
-
match.acceptance_response = catch(:halt) { route_eval(&match.path.route.dest) } || ''
|
701
|
-
ensure
|
702
|
-
@layout = parent_layout
|
703
|
-
(@_pending_after_filters ||= []).concat(match.path.route.after_filters) if match.path.route.after_filters
|
704
|
-
@params = old_params
|
705
|
-
end
|
706
|
-
}
|
707
|
-
if match.respond_to?(:path)
|
708
|
-
throw :halt, @_response_buffer = match.acceptance_response
|
709
|
-
elsif match.respond_to?(:each)
|
795
|
+
@request.env['padrino.instance'] = self
|
796
|
+
if base.compiled_router and match = base.router.call(@request.env)
|
797
|
+
if match.respond_to?(:each)
|
710
798
|
route_eval do
|
711
799
|
match[1].each {|k,v| response[k] = v}
|
712
800
|
status match[0]
|
713
801
|
route_missing if match[0] == 404
|
714
802
|
end
|
715
803
|
end
|
804
|
+
else
|
805
|
+
filter! :before
|
716
806
|
end
|
717
807
|
|
718
808
|
# Run routes defined in superclass.
|
@@ -725,7 +815,6 @@ module Padrino
|
|
725
815
|
|
726
816
|
route_missing
|
727
817
|
ensure
|
728
|
-
@_pending_after_filters.each { |aft| instance_eval(&aft) } if @_pending_after_filters
|
729
818
|
end
|
730
819
|
end # InstanceMethods
|
731
820
|
end # Routing
|