padrino-core 0.11.3 → 0.11.4
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.
- 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'
|