padrino-core 0.11.3 → 0.11.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.rdoc +5 -5
- data/lib/padrino-core.rb +3 -9
- data/lib/padrino-core/application.rb +39 -35
- data/lib/padrino-core/application/flash.rb +7 -7
- data/lib/padrino-core/application/rendering.rb +136 -139
- data/lib/padrino-core/application/rendering/extensions/erubis.rb +15 -6
- data/lib/padrino-core/application/routing.rb +371 -369
- data/lib/padrino-core/application/showexceptions.rb +13 -12
- data/lib/padrino-core/caller.rb +40 -40
- data/lib/padrino-core/cli/adapter.rb +4 -4
- data/lib/padrino-core/cli/base.rb +40 -39
- data/lib/padrino-core/cli/rake.rb +2 -2
- data/lib/padrino-core/cli/rake_tasks.rb +2 -4
- data/lib/padrino-core/command.rb +2 -2
- data/lib/padrino-core/loader.rb +14 -15
- data/lib/padrino-core/locale/cs.yml +0 -1
- data/lib/padrino-core/locale/da.yml +0 -1
- data/lib/padrino-core/locale/de.yml +0 -1
- data/lib/padrino-core/locale/en.yml +0 -1
- data/lib/padrino-core/locale/es.yml +1 -2
- data/lib/padrino-core/locale/fr.yml +2 -3
- data/lib/padrino-core/locale/hu.yml +1 -2
- data/lib/padrino-core/locale/it.yml +0 -1
- data/lib/padrino-core/locale/ja.yml +1 -2
- data/lib/padrino-core/locale/lv.yml +0 -1
- data/lib/padrino-core/locale/nl.yml +0 -1
- data/lib/padrino-core/locale/no.yml +0 -2
- data/lib/padrino-core/locale/pl.yml +0 -1
- data/lib/padrino-core/locale/pt_br.yml +0 -1
- data/lib/padrino-core/locale/ro.yml +0 -1
- data/lib/padrino-core/locale/ru.yml +0 -1
- data/lib/padrino-core/locale/sv.yml +0 -1
- data/lib/padrino-core/locale/tr.yml +0 -1
- data/lib/padrino-core/locale/uk.yml +0 -1
- data/lib/padrino-core/locale/zh_cn.yml +0 -1
- data/lib/padrino-core/locale/zh_tw.yml +0 -1
- data/lib/padrino-core/logger.rb +26 -27
- data/lib/padrino-core/module.rb +3 -3
- data/lib/padrino-core/mounter.rb +59 -59
- data/lib/padrino-core/reloader.rb +23 -23
- data/lib/padrino-core/router.rb +10 -13
- data/lib/padrino-core/server.rb +17 -19
- data/lib/padrino-core/tasks.rb +3 -3
- data/lib/padrino-core/version.rb +1 -1
- data/padrino-core.gemspec +1 -1
- data/test/test_application.rb +7 -7
- data/test/test_rendering.rb +15 -2
- data/test/test_routing.rb +34 -10
- metadata +13 -27
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4eaaf6b58a471d045e8141109e191b8932937605
|
4
|
+
data.tar.gz: f84f79482e130307c53a7fd152b8db5b2e6aec2d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d19c9ccab9b572cb7d624e884f1e3948b8c1d4b7cd6e22cba8a8a4c16d0cc139b97365f8fdcf5e9fca288aef8b5d12d0308a193fd685d505c51c7378986cb644
|
7
|
+
data.tar.gz: f8c01eaba904cc2ba5dbab8ddb28d323721ed00b9ff56ac95619dc999cbd711172751fed794d249febfd33b932bc44a22c430c24f47182a101f7af622d956eab
|
data/README.rdoc
CHANGED
@@ -22,7 +22,7 @@ Here is a brief overview of functionality provided by the Padrino framework:
|
|
22
22
|
Agnostic:: Full support for many popular testing, templating, mocking, and data storage choices.
|
23
23
|
Generators:: Create Padrino applications, models, controllers i.e: padrino-gen project.
|
24
24
|
Mountable:: Unlike other ruby frameworks, principally designed for mounting multiple apps.
|
25
|
-
Routing:: Full url named routes, named params,
|
25
|
+
Routing:: Full url named routes, named params, before/after filter support.
|
26
26
|
Tag Helpers:: View helpers such as: tag, content_tag, input_tag.
|
27
27
|
Asset Helpers:: View helpers such as: link_to, image_tag, javascript_include_tag.
|
28
28
|
Form Helpers:: Builder support such as: form_tag, form_for, field_set_tag, text_field.
|
@@ -146,7 +146,7 @@ as well as mapping the route aliases to an explicit url:
|
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
|
-
and even configure the
|
149
|
+
and even configure the +provides+ for each route:
|
150
150
|
|
151
151
|
# app/controllers/example.rb
|
152
152
|
SimpleApp.controllers :admin do
|
@@ -154,7 +154,7 @@ and even configure the respond_to for each route:
|
|
154
154
|
"Url is /admin/show/#{params[:id]}.#{params[:format]}"
|
155
155
|
end
|
156
156
|
|
157
|
-
get :other, with => [:id, :name],
|
157
|
+
get :other, :with => [:id, :name], :provides => [:html, :json] do
|
158
158
|
case content_type
|
159
159
|
when :js then ... end
|
160
160
|
when :json then ... end
|
@@ -166,7 +166,7 @@ or auto lookup for current locale or content_type
|
|
166
166
|
|
167
167
|
# app/controllers/example.rb
|
168
168
|
SimpleApp.controllers :admin do
|
169
|
-
get :show, :with => :id, :provides => [html, :js] do
|
169
|
+
get :show, :with => :id, :provides => [:html, :js] do
|
170
170
|
render "admin/show"
|
171
171
|
end
|
172
172
|
end
|
@@ -291,4 +291,4 @@ For a complete overview of Padrino terminal commands, check out the
|
|
291
291
|
|
292
292
|
== Copyright
|
293
293
|
|
294
|
-
Copyright (c) 2011 Padrino. See LICENSE for details.
|
294
|
+
Copyright (c) 2011-2013 Padrino. See LICENSE for details.
|
data/lib/padrino-core.rb
CHANGED
@@ -15,9 +15,7 @@ require 'padrino-core/tasks'
|
|
15
15
|
require 'padrino-core/module'
|
16
16
|
|
17
17
|
|
18
|
-
# The Padrino environment (falls back to the rack env or finally develop)
|
19
18
|
PADRINO_ENV = ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= "development" unless defined?(PADRINO_ENV)
|
20
|
-
# The Padrino project root path (falls back to the first caller)
|
21
19
|
PADRINO_ROOT = ENV["PADRINO_ROOT"] ||= File.dirname(Padrino.first_caller) unless defined?(PADRINO_ROOT)
|
22
20
|
|
23
21
|
module Padrino
|
@@ -181,26 +179,22 @@ module Padrino
|
|
181
179
|
#
|
182
180
|
# @returns The root path of the loaded gem
|
183
181
|
def gem(name, main_module)
|
184
|
-
_,spec = Gem.loaded_specs.find
|
182
|
+
_, spec = Gem.loaded_specs.find{|spec_pair| spec_pair[0] == name }
|
185
183
|
gems << spec
|
186
184
|
modules << main_module
|
187
185
|
spec.full_gem_path
|
188
186
|
end
|
189
187
|
|
190
188
|
##
|
191
|
-
# Returns all currently known padrino gems.
|
192
|
-
#
|
193
189
|
# @returns [Gem::Specification]
|
194
190
|
def gems
|
195
191
|
@gems ||= []
|
196
192
|
end
|
197
193
|
|
198
194
|
##
|
199
|
-
# All loaded Padrino modules.
|
200
|
-
#
|
201
195
|
# @returns [<Padrino::Module>]
|
202
196
|
def modules
|
203
197
|
@modules ||= []
|
204
198
|
end
|
205
|
-
end
|
206
|
-
end
|
199
|
+
end
|
200
|
+
end
|
@@ -1,15 +1,17 @@
|
|
1
|
+
require 'padrino-core/application/flash'
|
1
2
|
require 'padrino-core/application/rendering'
|
2
3
|
require 'padrino-core/application/routing'
|
3
|
-
require 'padrino-core/application/flash'
|
4
4
|
require 'padrino-core/application/showexceptions'
|
5
5
|
|
6
6
|
module Padrino
|
7
|
-
class ApplicationSetupError < RuntimeError
|
7
|
+
class ApplicationSetupError < RuntimeError
|
8
8
|
end
|
9
9
|
|
10
10
|
##
|
11
|
-
# Subclasses of this become independent Padrino applications
|
12
|
-
#
|
11
|
+
# Subclasses of this become independent Padrino applications
|
12
|
+
# (stemming from Sinatra::Application).
|
13
|
+
# These subclassed applications can be easily mounted into other
|
14
|
+
# Padrino applications as well.
|
13
15
|
#
|
14
16
|
class Application < Sinatra::Base
|
15
17
|
# Support for advanced routing, controllers, url_for
|
@@ -25,8 +27,7 @@ module Padrino
|
|
25
27
|
end
|
26
28
|
|
27
29
|
class << self
|
28
|
-
|
29
|
-
def inherited(base) # @private
|
30
|
+
def inherited(base)
|
30
31
|
begun_at = Time.now
|
31
32
|
CALLERS_TO_IGNORE.concat(PADRINO_IGNORE_CALLERS)
|
32
33
|
base.default_configuration!
|
@@ -42,7 +43,7 @@ module Padrino
|
|
42
43
|
end
|
43
44
|
|
44
45
|
##
|
45
|
-
# Reloads the application files from all defined load paths
|
46
|
+
# Reloads the application files from all defined load paths.
|
46
47
|
#
|
47
48
|
# This method is used from our Padrino Reloader during development mode
|
48
49
|
# in order to reload the source files.
|
@@ -54,19 +55,19 @@ module Padrino
|
|
54
55
|
#
|
55
56
|
def reload!
|
56
57
|
logger.devel "Reloading #{settings}"
|
57
|
-
reset!
|
58
|
-
reset_router!
|
58
|
+
reset!
|
59
|
+
reset_router!
|
59
60
|
Padrino.require_dependencies(settings.app_file, :force => true) # Reload the app file
|
60
|
-
require_dependencies
|
61
|
-
default_filters!
|
62
|
-
default_routes!
|
63
|
-
default_errors!
|
64
|
-
I18n.reload! if defined?(I18n)
|
61
|
+
require_dependencies
|
62
|
+
default_filters!
|
63
|
+
default_routes!
|
64
|
+
default_errors!
|
65
|
+
I18n.reload! if defined?(I18n)
|
65
66
|
true
|
66
67
|
end
|
67
68
|
|
68
69
|
##
|
69
|
-
# Resets application routes to only routes not defined by the user
|
70
|
+
# Resets application routes to only routes not defined by the user.
|
70
71
|
#
|
71
72
|
# @return [TrueClass]
|
72
73
|
#
|
@@ -90,8 +91,8 @@ module Padrino
|
|
90
91
|
end
|
91
92
|
|
92
93
|
##
|
93
|
-
# Setup the application by registering initializers, load paths and logger
|
94
|
-
# Invoked automatically when an application is first instantiated
|
94
|
+
# Setup the application by registering initializers, load paths and logger.
|
95
|
+
# Invoked automatically when an application is first instantiated.
|
95
96
|
#
|
96
97
|
# @return [TrueClass]
|
97
98
|
#
|
@@ -111,7 +112,7 @@ module Padrino
|
|
111
112
|
|
112
113
|
##
|
113
114
|
# Run the Padrino app as a self-hosted server using
|
114
|
-
# Thin, Mongrel or WEBrick (in that order)
|
115
|
+
# Thin, Mongrel or WEBrick (in that order).
|
115
116
|
#
|
116
117
|
# @see Padrino::Server#start
|
117
118
|
#
|
@@ -130,8 +131,8 @@ module Padrino
|
|
130
131
|
end
|
131
132
|
|
132
133
|
##
|
133
|
-
# Returns default list of path globs to load as dependencies
|
134
|
-
# Appends custom dependency patterns to the be loaded for your Application
|
134
|
+
# Returns default list of path globs to load as dependencies.
|
135
|
+
# Appends custom dependency patterns to the be loaded for your Application.
|
135
136
|
#
|
136
137
|
# @return [Array]
|
137
138
|
# list of path globs to load as dependencies
|
@@ -148,7 +149,8 @@ module Padrino
|
|
148
149
|
end
|
149
150
|
|
150
151
|
##
|
151
|
-
# An array of file to load before your app.rb, basically are files
|
152
|
+
# An array of file to load before your app.rb, basically are files
|
153
|
+
# which our app depends on.
|
152
154
|
#
|
153
155
|
# By default we look for files:
|
154
156
|
#
|
@@ -158,7 +160,7 @@ module Padrino
|
|
158
160
|
# yourapp/lib.rb
|
159
161
|
# yourapp/lib/**/*.rb
|
160
162
|
#
|
161
|
-
# @example Adding a custom
|
163
|
+
# @example Adding a custom prerequisite
|
162
164
|
# MyApp.prerequisites << Padrino.root('my_app', 'custom_model.rb')
|
163
165
|
#
|
164
166
|
def prerequisites
|
@@ -167,7 +169,7 @@ module Padrino
|
|
167
169
|
|
168
170
|
protected
|
169
171
|
##
|
170
|
-
# Defines default settings for Padrino application
|
172
|
+
# Defines default settings for Padrino application.
|
171
173
|
#
|
172
174
|
def default_configuration!
|
173
175
|
# Overwriting Sinatra defaults
|
@@ -181,15 +183,17 @@ module Padrino
|
|
181
183
|
set :views, Proc.new { File.join(root, 'views') }
|
182
184
|
set :images_path, Proc.new { File.join(public_folder, 'images') }
|
183
185
|
set :protection, true
|
184
|
-
|
186
|
+
|
185
187
|
set :haml, { :ugly => (Padrino.env == :production) } if defined?(Haml)
|
188
|
+
|
186
189
|
# Padrino specific
|
187
190
|
set :uri_root, '/'
|
188
191
|
set :app_name, settings.to_s.underscore.to_sym
|
189
192
|
set :default_builder, 'StandardFormBuilder'
|
190
193
|
set :authentication, false
|
191
|
-
|
194
|
+
|
192
195
|
set :locale_path, Proc.new { Dir[File.join(settings.root, '/locale/**/*.{rb,yml}')] }
|
196
|
+
|
193
197
|
# Authenticity token
|
194
198
|
set :protect_from_csrf, false
|
195
199
|
set :allow_disabled_csrf, false
|
@@ -211,19 +215,19 @@ module Padrino
|
|
211
215
|
end
|
212
216
|
|
213
217
|
##
|
214
|
-
# This filter it's used for know the format of the request, and
|
218
|
+
# This filter it's used for know the format of the request, and
|
219
|
+
# automatically set the content type.
|
215
220
|
#
|
216
221
|
def default_filters!
|
217
222
|
before do
|
218
223
|
unless @_content_type
|
219
|
-
@_content_type = :html
|
220
224
|
response['Content-Type'] = 'text/html;charset=utf-8'
|
221
225
|
end
|
222
226
|
end
|
223
227
|
end
|
224
228
|
|
225
229
|
##
|
226
|
-
# This log errors for production environments
|
230
|
+
# This log errors for production environments.
|
227
231
|
#
|
228
232
|
def default_errors!
|
229
233
|
configure :production do
|
@@ -238,7 +242,7 @@ module Padrino
|
|
238
242
|
end
|
239
243
|
|
240
244
|
##
|
241
|
-
# Requires all files within the application load paths
|
245
|
+
# Requires all files within the application load paths.
|
242
246
|
#
|
243
247
|
def require_dependencies
|
244
248
|
Padrino.set_load_paths(*load_paths)
|
@@ -246,8 +250,8 @@ module Padrino
|
|
246
250
|
end
|
247
251
|
|
248
252
|
private
|
249
|
-
# Overrides the default middleware for Sinatra based on Padrino conventions
|
250
|
-
# Also initializes the application after setting up the middleware
|
253
|
+
# Overrides the default middleware for Sinatra based on Padrino conventions.
|
254
|
+
# Also initializes the application after setting up the middleware.
|
251
255
|
def setup_default_middleware(builder)
|
252
256
|
setup_sessions builder
|
253
257
|
builder.use Padrino::ShowExceptions if show_exceptions?
|
@@ -261,7 +265,7 @@ module Padrino
|
|
261
265
|
setup_application!
|
262
266
|
end
|
263
267
|
|
264
|
-
# sets up csrf protection for the app
|
268
|
+
# sets up csrf protection for the app:
|
265
269
|
def setup_csrf_protection(builder)
|
266
270
|
if protect_from_csrf? && !sessions?
|
267
271
|
raise(<<-ERROR)
|
@@ -288,6 +292,6 @@ ERROR
|
|
288
292
|
end
|
289
293
|
end
|
290
294
|
end
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
@@ -2,14 +2,13 @@ module Padrino
|
|
2
2
|
module Flash
|
3
3
|
|
4
4
|
class << self
|
5
|
-
# @private
|
6
5
|
def registered(app)
|
7
6
|
app.helpers Helpers
|
8
7
|
app.after do
|
9
8
|
session[:_flash] = @_flash.next if @_flash
|
10
9
|
end
|
11
10
|
end
|
12
|
-
end
|
11
|
+
end
|
13
12
|
|
14
13
|
class Storage
|
15
14
|
include Enumerable
|
@@ -178,7 +177,8 @@ module Padrino
|
|
178
177
|
|
179
178
|
module Helpers
|
180
179
|
###
|
181
|
-
# Overloads the existing redirect helper in-order to provide support for
|
180
|
+
# Overloads the existing redirect helper in-order to provide support for
|
181
|
+
# flash messages.
|
182
182
|
#
|
183
183
|
# @overload redirect(url)
|
184
184
|
# @param [String] url
|
@@ -215,7 +215,7 @@ module Padrino
|
|
215
215
|
alias_method :redirect_to, :redirect
|
216
216
|
|
217
217
|
###
|
218
|
-
# Returns the flash storage object
|
218
|
+
# Returns the flash storage object.
|
219
219
|
#
|
220
220
|
# @return [Storage]
|
221
221
|
#
|
@@ -224,6 +224,6 @@ module Padrino
|
|
224
224
|
def flash
|
225
225
|
@_flash ||= Storage.new(env['rack.session'] ? session[:_flash] : {})
|
226
226
|
end
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
@@ -10,7 +10,6 @@ module Padrino
|
|
10
10
|
##
|
11
11
|
# A SafeTemplate assumes that its output is safe.
|
12
12
|
#
|
13
|
-
# @api private
|
14
13
|
module SafeTemplate
|
15
14
|
def render(*)
|
16
15
|
super.html_safe
|
@@ -35,13 +34,13 @@ module Padrino
|
|
35
34
|
] unless defined?(IGNORE_FILE_PATTERN)
|
36
35
|
|
37
36
|
##
|
38
|
-
# Default options used in the
|
37
|
+
# Default options used in the resolve_template-method.
|
39
38
|
#
|
40
39
|
DEFAULT_RENDERING_OPTIONS = { :strict_format => false, :raise_exceptions => true } unless defined?(DEFAULT_RENDERING_OPTIONS)
|
41
40
|
|
42
41
|
class << self
|
43
42
|
##
|
44
|
-
# Default engine configurations for Padrino::Rendering
|
43
|
+
# Default engine configurations for Padrino::Rendering.
|
45
44
|
#
|
46
45
|
# @return {Hash<Symbol,Hash>}
|
47
46
|
# The configurations, keyed by engine.
|
@@ -49,9 +48,6 @@ module Padrino
|
|
49
48
|
@engine_configurations ||= {}
|
50
49
|
end
|
51
50
|
|
52
|
-
##
|
53
|
-
# Main class that register this extension.
|
54
|
-
#
|
55
51
|
def registered(app)
|
56
52
|
included(app)
|
57
53
|
engine_configurations.each do |engine, configs|
|
@@ -93,7 +89,8 @@ module Padrino
|
|
93
89
|
end
|
94
90
|
|
95
91
|
##
|
96
|
-
# Returns the cached template file to render for a given url,
|
92
|
+
# Returns the cached template file to render for a given url,
|
93
|
+
# content_type and locale.
|
97
94
|
#
|
98
95
|
# @param [Array<template_path, content_type, locale>] render_options
|
99
96
|
#
|
@@ -102,7 +99,7 @@ module Padrino
|
|
102
99
|
end
|
103
100
|
|
104
101
|
##
|
105
|
-
# Caches the template file for the given rendering options
|
102
|
+
# Caches the template file for the given rendering options.
|
106
103
|
#
|
107
104
|
# @param [String] template_file
|
108
105
|
# The path of the template file.
|
@@ -168,152 +165,152 @@ module Padrino
|
|
168
165
|
end
|
169
166
|
|
170
167
|
private
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
168
|
+
##
|
169
|
+
# Enhancing Sinatra render functionality for:
|
170
|
+
#
|
171
|
+
# * Using layout similar to rails
|
172
|
+
# * Use render 'path/to/my/template' (without symbols)
|
173
|
+
# * Use render 'path/to/my/template' (with engine lookup)
|
174
|
+
# * Use render 'path/to/template.haml' (with explicit engine lookup)
|
175
|
+
# * Use render 'path/to/template', :layout => false
|
176
|
+
# * Use render 'path/to/template', :layout => false, :engine => 'haml'
|
177
|
+
#
|
178
|
+
def render(engine, data=nil, options={}, locals={}, &block)
|
182
179
|
|
183
|
-
|
184
|
-
|
185
|
-
|
180
|
+
# If engine is nil, ignore engine parameter and shift up all arguments
|
181
|
+
# render nil, "index", { :layout => true }, { :localvar => "foo" }
|
182
|
+
engine, data, options = data, options, locals if engine.nil? && data
|
186
183
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
184
|
+
# Data is a hash of options when no engine isn't explicit
|
185
|
+
# render "index", { :layout => true }, { :localvar => "foo" }
|
186
|
+
# Data is options, and options is locals in this case
|
187
|
+
data, options, locals = nil, data, options if data.is_a?(Hash)
|
191
188
|
|
192
|
-
|
193
|
-
|
194
|
-
|
189
|
+
# If data is unassigned then this is a likely a template to be resolved
|
190
|
+
# This means that no engine was explicitly defined
|
191
|
+
data, engine = *resolve_template(engine, options.dup) if data.nil?
|
195
192
|
|
196
|
-
|
197
|
-
|
193
|
+
# Use @layout if it exists
|
194
|
+
layout_was = options[:layout]
|
195
|
+
options[:layout] = @layout if options[:layout].nil? || options[:layout] == true
|
196
|
+
# Resolve layouts similar to in Rails
|
197
|
+
if options[:layout].nil? && !settings.templates.has_key?(:layout)
|
198
|
+
layout_path, layout_engine = *resolved_layout
|
198
199
|
|
199
|
-
#
|
200
|
-
|
201
|
-
options[:layout] =
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
elsif options[:layout].present?
|
209
|
-
options[:layout] = settings.fetch_layout_path(options[:layout] || @layout)
|
210
|
-
end
|
211
|
-
# Default to original layout value if none found
|
212
|
-
options[:layout] ||= layout_was
|
200
|
+
# We need to force layout false so sinatra don't try to render it
|
201
|
+
options[:layout] = layout_path || false
|
202
|
+
options[:layout] = false unless layout_engine == engine # TODO allow different layout engine
|
203
|
+
options[:layout_engine] = layout_engine || engine if options[:layout]
|
204
|
+
elsif options[:layout].present?
|
205
|
+
options[:layout] = settings.fetch_layout_path(options[:layout] || @layout)
|
206
|
+
end
|
207
|
+
# Default to original layout value if none found.
|
208
|
+
options[:layout] ||= layout_was
|
213
209
|
|
214
|
-
|
215
|
-
|
216
|
-
|
210
|
+
# Cleanup the template.
|
211
|
+
@current_engine, engine_was = engine, @current_engine
|
212
|
+
@_out_buf, _buf_was = ActiveSupport::SafeBuffer.new, @_out_buf
|
217
213
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
214
|
+
# Pass arguments to Sinatra render method.
|
215
|
+
super(engine, data, options.dup, locals, &block)
|
216
|
+
ensure
|
217
|
+
@current_engine = engine_was
|
218
|
+
@_out_buf = _buf_was
|
219
|
+
end
|
224
220
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
221
|
+
##
|
222
|
+
# Returns the located layout tuple to be used for the rendered template
|
223
|
+
# (if available).
|
224
|
+
#
|
225
|
+
# @example
|
226
|
+
# resolve_layout
|
227
|
+
# # => ["/layouts/custom", :erb]
|
228
|
+
# # => [nil, nil]
|
229
|
+
#
|
230
|
+
def resolved_layout
|
231
|
+
located_layout = resolve_template(settings.fetch_layout_path, :raise_exceptions => false, :strict_format => true)
|
232
|
+
located_layout ? located_layout : [nil, nil]
|
233
|
+
end
|
238
234
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
235
|
+
##
|
236
|
+
# Returns the template path and engine that match content_type (if present),
|
237
|
+
# I18n.locale.
|
238
|
+
#
|
239
|
+
# @param [String] template_path
|
240
|
+
# The path of the template.
|
241
|
+
#
|
242
|
+
# @param [Hash] options
|
243
|
+
# Additional options.
|
244
|
+
#
|
245
|
+
# @option options [Boolean] :strict_format (false)
|
246
|
+
# The resolved template must match the content_type of the request.
|
247
|
+
#
|
248
|
+
# @option options [Boolean] :raise_exceptions (false)
|
249
|
+
# Raises a {TemplateNotFound} exception if the template cannot be located.
|
250
|
+
#
|
251
|
+
# @return [Array<Symbol, Symbol>]
|
252
|
+
# The path and format of the template.
|
253
|
+
#
|
254
|
+
# @raise [TemplateNotFound]
|
255
|
+
# The template could not be found.
|
256
|
+
#
|
257
|
+
# @example
|
258
|
+
# get "/foo", :provides => [:html, :js] do; render 'path/to/foo'; end
|
259
|
+
# # If you request "/foo.js" with I18n.locale == :ru => [:"/path/to/foo.ru.js", :erb]
|
260
|
+
# # If you request "/foo" with I18n.locale == :de => [:"/path/to/foo.de.haml", :haml]
|
261
|
+
#
|
262
|
+
def resolve_template(template_path, options={})
|
263
|
+
began_at = Time.now
|
264
|
+
_content_type = content_type || :html
|
265
|
+
# Fetch cached template for rendering options
|
266
|
+
template_path = template_path.to_s[0] == ?/ ? template_path.to_s : "/#{template_path}"
|
267
|
+
rendering_options = [template_path, _content_type, locale]
|
268
|
+
cached_template = settings.fetch_template_file(rendering_options)
|
269
|
+
if cached_template
|
270
|
+
logger.debug :cached, began_at, cached_template[0] if settings.logging? && defined?(logger)
|
271
|
+
return cached_template
|
272
|
+
end
|
276
273
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
274
|
+
# Resolve view path and options.
|
275
|
+
options.reverse_merge!(DEFAULT_RENDERING_OPTIONS)
|
276
|
+
view_path = options.delete(:views) || settings.views || "./views"
|
277
|
+
target_extension = File.extname(template_path)[1..-1] || "none" # explicit template extension
|
278
|
+
template_path = template_path.chomp(".#{target_extension}")
|
282
279
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
280
|
+
# Generate potential template candidates
|
281
|
+
templates = Dir[File.join(view_path, template_path) + ".*"].map do |file|
|
282
|
+
template_engine = File.extname(file)[1..-1].to_sym # Retrieves engine extension
|
283
|
+
template_file = file.sub(view_path, '').chomp(".#{template_engine}").to_sym # retrieves template filename
|
284
|
+
[template_file, template_engine] unless IGNORE_FILE_PATTERN.any? { |pattern| template_engine.to_s =~ pattern }
|
285
|
+
end
|
289
286
|
|
290
|
-
|
291
|
-
|
287
|
+
# Check if we have a simple content type
|
288
|
+
simple_content_type = [:html, :plain].include?(_content_type)
|
292
289
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
290
|
+
# Resolve final template to render
|
291
|
+
located_template =
|
292
|
+
templates.find { |file, e| file.to_s == "#{template_path}.#{locale}.#{_content_type}" } ||
|
293
|
+
templates.find { |file, e| file.to_s == "#{template_path}.#{locale}" && simple_content_type } ||
|
294
|
+
templates.find { |file, e| File.extname(file.to_s) == ".#{target_extension}" or e.to_s == target_extension.to_s } ||
|
295
|
+
templates.find { |file, e| file.to_s == "#{template_path}.#{_content_type}" } ||
|
296
|
+
templates.find { |file, e| file.to_s == "#{template_path}" && simple_content_type } ||
|
297
|
+
(!options[:strict_format] && templates.first) # If not strict, fall back to the first located template.
|
301
298
|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
299
|
+
raise TemplateNotFound, "Template '#{template_path}' not found in '#{view_path}'!" if !located_template && options[:raise_exceptions]
|
300
|
+
settings.cache_template_file!(located_template, rendering_options) unless settings.reload_templates?
|
301
|
+
logger.debug :template, began_at, located_template[0] if located_template && settings.logging? && defined?(logger)
|
302
|
+
located_template
|
303
|
+
end
|
307
304
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
305
|
+
##
|
306
|
+
# Return the I18n.locale if I18n is defined.
|
307
|
+
#
|
308
|
+
def locale
|
309
|
+
I18n.locale if defined?(I18n)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
317
314
|
|
318
315
|
require 'padrino-core/application/rendering/extensions/haml'
|
319
316
|
require 'padrino-core/application/rendering/extensions/erubis'
|