padrino-core 0.10.2 → 0.10.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +3 -3
- data/.yardopts +1 -0
- data/{LICENSE → LICENSE.txt} +0 -0
- data/README.rdoc +2 -2
- data/lib/padrino-core/application/rendering.rb +79 -26
- data/lib/padrino-core/application/routing.rb +215 -127
- data/lib/padrino-core/application/showexceptions.rb +2 -1
- data/lib/padrino-core/application.rb +67 -57
- data/lib/padrino-core/caller.rb +10 -4
- data/lib/padrino-core/command.rb +11 -0
- data/lib/padrino-core/loader.rb +52 -24
- data/lib/padrino-core/locale/cs.yml +4 -1
- data/lib/padrino-core/locale/da.yml +4 -1
- data/lib/padrino-core/locale/de.yml +4 -1
- data/lib/padrino-core/locale/en.yml +4 -1
- data/lib/padrino-core/locale/es.yml +4 -1
- data/lib/padrino-core/locale/fr.yml +4 -1
- data/lib/padrino-core/locale/hu.yml +4 -1
- data/lib/padrino-core/locale/it.yml +4 -1
- data/lib/padrino-core/locale/ja.yml +4 -1
- data/lib/padrino-core/locale/lv.yml +34 -0
- data/lib/padrino-core/locale/nl.yml +4 -1
- data/lib/padrino-core/locale/no.yml +4 -1
- data/lib/padrino-core/locale/pl.yml +4 -1
- data/lib/padrino-core/locale/pt_br.yml +4 -1
- data/lib/padrino-core/locale/ru.yml +4 -1
- data/lib/padrino-core/locale/tr.yml +4 -1
- data/lib/padrino-core/locale/uk.yml +4 -1
- data/lib/padrino-core/locale/zh_cn.yml +4 -1
- data/lib/padrino-core/locale/zh_tw.yml +4 -1
- data/lib/padrino-core/logger.rb +119 -128
- data/lib/padrino-core/mounter.rb +46 -14
- data/lib/padrino-core/reloader.rb +5 -3
- data/lib/padrino-core/router.rb +30 -11
- data/lib/padrino-core/server.rb +14 -5
- data/lib/padrino-core/support_lite.rb +54 -20
- data/lib/padrino-core/tasks.rb +1 -3
- data/lib/padrino-core/version.rb +8 -4
- data/lib/padrino-core.rb +58 -11
- data/padrino-core.gemspec +1 -1
- data/test/fixtures/apps/simple.rb +1 -1
- data/test/helper.rb +4 -24
- data/test/mini_shoulda.rb +45 -0
- data/test/test_application.rb +19 -18
- data/test/test_core.rb +2 -2
- data/test/test_dependencies.rb +5 -5
- data/test/test_filters.rb +2 -1
- data/test/test_locale.rb +1 -1
- data/test/test_logger.rb +1 -1
- data/test/test_mounter.rb +26 -25
- data/test/test_reloader_complex.rb +5 -3
- data/test/test_reloader_simple.rb +6 -5
- data/test/test_rendering.rb +8 -5
- data/test/test_restful_routing.rb +1 -1
- data/test/test_router.rb +1 -1
- data/test/test_routing.rb +33 -12
- metadata +13 -9
@@ -13,7 +13,10 @@ pt_br:
|
|
13
13
|
abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sab]
|
14
14
|
month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
|
15
15
|
abbr_month_names: [~, Jan, Fev, Mar, Abr, Maio, Jun, Jul, Ago, Set, Out, Nov, Dez]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- day
|
18
|
+
- month
|
19
|
+
- year
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
@@ -13,7 +13,10 @@ ru:
|
|
13
13
|
abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб]
|
14
14
|
month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь]
|
15
15
|
abbr_month_names: [~, Янв, Феб, Мар, Апр, Май, Июн, Июл, Авг, Сен, Окт, Ноя, Дек]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- year
|
18
|
+
- month
|
19
|
+
- day
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
@@ -13,7 +13,10 @@ tr:
|
|
13
13
|
abbr_day_names: [Paz, Pts, Sal, Çar, Per, Cum, Cts]
|
14
14
|
month_names: [~, Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz, Ağustos, Eylül, Ekim, Kasım, Aralık]
|
15
15
|
abbr_month_names: [~, Oca, Şub, Mar, Nis, May, Haz, Tem, Ağu, Eyl, Eki, Kas, Ara]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- day
|
18
|
+
- month
|
19
|
+
- year
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
@@ -13,7 +13,10 @@ uk:
|
|
13
13
|
abbr_day_names: [Нд, Пн, Вт, Ср, Чт, Пт, Сб]
|
14
14
|
month_names: [~, Січено, Лютий, Березень, Квітень, Травень, Червень, Липень, Серпень, Вересень, Жовтень, Листопад, Грудень]
|
15
15
|
abbr_month_names: [~, Січ, Лют, Бер, Кві, Тра, Чер, Лип, Сер, Вер, Жов, Лис, Гру]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- year
|
18
|
+
- month
|
19
|
+
- day
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
@@ -13,7 +13,10 @@ zh_cn:
|
|
13
13
|
abbr_day_names: [日, 一, 二, 三, 四, 五, 六]
|
14
14
|
month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月]
|
15
15
|
abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- year
|
18
|
+
- month
|
19
|
+
- day
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
@@ -13,7 +13,10 @@ zh_tw:
|
|
13
13
|
abbr_day_names: [日, 一, 二, 三, 四, 五, 六]
|
14
14
|
month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月]
|
15
15
|
abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
|
16
|
-
order:
|
16
|
+
order:
|
17
|
+
- year
|
18
|
+
- month
|
19
|
+
- day
|
17
20
|
|
18
21
|
time:
|
19
22
|
formats:
|
data/lib/padrino-core/logger.rb
CHANGED
@@ -5,10 +5,9 @@ PADRINO_LOGGER = ENV['PADRINO_LOGGER'] unless defined?(PADRINO_LOGGER)
|
|
5
5
|
module Padrino
|
6
6
|
|
7
7
|
##
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# ==== Examples
|
8
|
+
# @return [Padrino::Logger]
|
11
9
|
#
|
10
|
+
# @example
|
12
11
|
# logger.debug "foo"
|
13
12
|
# logger.warn "bar"
|
14
13
|
#
|
@@ -20,6 +19,20 @@ module Padrino
|
|
20
19
|
##
|
21
20
|
# Set the padrino logger
|
22
21
|
#
|
22
|
+
# @param [Object] value
|
23
|
+
# an object that respond to <<, write, puts, debug, warn etc..
|
24
|
+
#
|
25
|
+
# @return [Object]
|
26
|
+
# the given value
|
27
|
+
#
|
28
|
+
# @example using ruby default logger
|
29
|
+
# require 'logger'
|
30
|
+
# Padrino.logger = Logger.new(STDOUT)
|
31
|
+
#
|
32
|
+
# @example using ActiveSupport
|
33
|
+
# require 'active_support/buffered_logger'
|
34
|
+
# Padrino.logger = Buffered.new(STDOUT)
|
35
|
+
#
|
23
36
|
def self.logger=(value)
|
24
37
|
Thread.current[:padrino_logger] = value
|
25
38
|
end
|
@@ -27,11 +40,6 @@ module Padrino
|
|
27
40
|
##
|
28
41
|
# Extensions to the built in Ruby logger.
|
29
42
|
#
|
30
|
-
# ==== Examples
|
31
|
-
#
|
32
|
-
# logger.debug "foo"
|
33
|
-
# logger.warn "bar"
|
34
|
-
#
|
35
43
|
class Logger
|
36
44
|
|
37
45
|
attr_accessor :level
|
@@ -76,8 +84,7 @@ module Padrino
|
|
76
84
|
# :format_message:: Format of message. Defaults to: ""%s - - [%s] \"%s\"""
|
77
85
|
# :log_static:: Whether or not to show log messages for static files. Defaults to: false
|
78
86
|
#
|
79
|
-
#
|
80
|
-
#
|
87
|
+
# @example
|
81
88
|
# Padrino::Logger::Config[:development] = { :log_level => :debug, :stream => :to_file }
|
82
89
|
# # or you can edit our defaults
|
83
90
|
# Padrino::Logger::Config[:development][:log_level] = :error
|
@@ -97,36 +104,27 @@ module Padrino
|
|
97
104
|
#
|
98
105
|
Config = {
|
99
106
|
:production => { :log_level => :warn, :stream => :to_file },
|
100
|
-
:development => { :log_level => :debug, :stream => :stdout },
|
107
|
+
:development => { :log_level => :debug, :stream => :stdout, :format_datetime => ' ' },
|
101
108
|
:test => { :log_level => :debug, :stream => :null }
|
102
109
|
}
|
103
110
|
Config.merge!(PADRINO_LOGGER) if PADRINO_LOGGER
|
104
111
|
|
105
|
-
# Embed in a String to clear all previous ANSI sequences.
|
106
|
-
CLEAR = "\e[0m"
|
107
|
-
BOLD = "\e[1m"
|
108
|
-
BLACK = "\e[30m"
|
109
|
-
RED = "\e[31m"
|
110
|
-
GREEN = "\e[32m"
|
111
|
-
YELLOW = "\e[33m"
|
112
|
-
BLUE = "\e[34m"
|
113
|
-
MAGENTA = "\e[35m"
|
114
|
-
CYAN = "\e[36m"
|
115
|
-
WHITE = "\e[37m"
|
116
|
-
|
117
112
|
# Colors for levels
|
118
113
|
ColoredLevels = {
|
119
|
-
:fatal => [
|
120
|
-
:error => [
|
121
|
-
:warn => [
|
122
|
-
:info => [
|
123
|
-
:debug => [
|
124
|
-
:devel => [
|
114
|
+
:fatal => [:bold, :red],
|
115
|
+
:error => [:red],
|
116
|
+
:warn => [:yellow],
|
117
|
+
:info => [:green],
|
118
|
+
:debug => [:cyan],
|
119
|
+
:devel => [:magenta]
|
125
120
|
} unless defined?(ColoredLevels)
|
126
121
|
|
127
122
|
##
|
128
123
|
# Setup a new logger
|
129
124
|
#
|
125
|
+
# @return [Padrino::Logger]
|
126
|
+
# A {Padrino::Logger} instance
|
127
|
+
#
|
130
128
|
def self.setup!
|
131
129
|
config_level = (PADRINO_LOG_LEVEL || Padrino.env || :test).to_sym # need this for PADRINO_LOG_LEVEL
|
132
130
|
config = Config[config_level]
|
@@ -151,46 +149,49 @@ module Padrino
|
|
151
149
|
##
|
152
150
|
# To initialize the logger you create a new object, proxies to set_log.
|
153
151
|
#
|
154
|
-
#
|
152
|
+
# @param [Hash] options
|
155
153
|
#
|
156
|
-
#
|
157
|
-
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# :
|
154
|
+
# @option options [Symbol] :stream ($stdout)
|
155
|
+
# Either an IO object or a name of a logfile. Defaults to $stdout
|
156
|
+
#
|
157
|
+
# @option options [Symbol] :log_level (:production in the production environment and :debug otherwise)
|
158
|
+
# The log level from, e.g. :fatal or :info.
|
159
|
+
#
|
160
|
+
# @option options [Symbol] :auto_flush (true)
|
161
161
|
# Whether the log should automatically flush after new messages are
|
162
162
|
# added. Defaults to true.
|
163
|
-
#
|
164
|
-
#
|
165
|
-
#
|
163
|
+
#
|
164
|
+
# @option options [Symbol] :format_datetime (" [%d/%b/%Y %H:%M:%S] ")
|
165
|
+
# Format of datetime
|
166
|
+
#
|
167
|
+
# @option options [Symbol] :format_message ("%s -%s%s")
|
168
|
+
# Format of message
|
169
|
+
#
|
170
|
+
# @option options [Symbol] :log_static (false)
|
171
|
+
# Whether or not to show log messages for static files.
|
166
172
|
#
|
167
173
|
def initialize(options={})
|
168
|
-
@buffer
|
169
|
-
@auto_flush
|
170
|
-
@level
|
171
|
-
@log
|
172
|
-
@log.sync
|
173
|
-
@mutex
|
174
|
-
@format_datetime
|
175
|
-
@format_message
|
176
|
-
@log_static
|
174
|
+
@buffer = []
|
175
|
+
@auto_flush = options.has_key?(:auto_flush) ? options[:auto_flush] : true
|
176
|
+
@level = options[:log_level] ? Levels[options[:log_level]] : Levels[:debug]
|
177
|
+
@log = options[:stream] || $stdout
|
178
|
+
@log.sync = true
|
179
|
+
@mutex = @@mutex[@log] ||= Mutex.new
|
180
|
+
@format_datetime = options[:format_datetime] || "%d/%b/%Y %H:%M:%S"
|
181
|
+
@format_message = options[:format_message] || "%s -%s%s"
|
182
|
+
@log_static = options.has_key?(:log_static) ? options[:log_static] : false
|
177
183
|
end
|
178
184
|
|
179
185
|
##
|
180
186
|
# Colorize our level
|
181
187
|
#
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
##
|
188
|
-
# Set a color for our string. Color can be a symbol/string
|
188
|
+
# @param [String, Symbol] level
|
189
|
+
#
|
190
|
+
# @see Padrino::Logger::ColoredLevels
|
189
191
|
#
|
190
|
-
def
|
191
|
-
|
192
|
-
|
193
|
-
"#{bold}#{color}#{string}#{CLEAR}"
|
192
|
+
def colored_level(level)
|
193
|
+
style = ColoredLevels[level].map { |c| "\e[%dm" % String.colors[c] } * ''
|
194
|
+
[style, level.to_s.upcase.rjust(7), "\e[0m"] * ''
|
194
195
|
end
|
195
196
|
|
196
197
|
##
|
@@ -206,6 +207,8 @@ module Padrino
|
|
206
207
|
##
|
207
208
|
# Close and remove the current log object.
|
208
209
|
#
|
210
|
+
# @return [NilClass]
|
211
|
+
#
|
209
212
|
def close
|
210
213
|
flush
|
211
214
|
@log.close if @log.respond_to?(:close) && !@log.tty?
|
@@ -216,13 +219,47 @@ module Padrino
|
|
216
219
|
# Appends a message to the log. The methods yield to an optional block and
|
217
220
|
# the output of this block will be appended to the message.
|
218
221
|
#
|
222
|
+
# @param [String] message
|
223
|
+
# The message that you want write to your stream
|
224
|
+
#
|
225
|
+
# @param [String] level
|
226
|
+
# The level one of :debug, :warn etc...
|
227
|
+
#
|
228
|
+
#
|
219
229
|
def push(message = nil, level = nil)
|
220
|
-
|
230
|
+
write @format_message % [colored_level(level), Time.now.strftime(@format_datetime).yellow, message.to_s.strip]
|
231
|
+
end
|
232
|
+
|
233
|
+
##
|
234
|
+
# Append a to development logger a given action with time
|
235
|
+
#
|
236
|
+
# @param [string] action
|
237
|
+
# The action
|
238
|
+
#
|
239
|
+
# @param [float] time
|
240
|
+
# Time duration for the given action
|
241
|
+
#
|
242
|
+
# @param [message] string
|
243
|
+
# The message that you want to log
|
244
|
+
#
|
245
|
+
# @example
|
246
|
+
# logger.bench 'GET', started_at, '/blog/categories'
|
247
|
+
# # => DEBUG - GET (0.056ms) - /blog/categories
|
248
|
+
#
|
249
|
+
def bench(action, began_at, message, level=:debug, color=:yellow)
|
250
|
+
@_pad ||= 8
|
251
|
+
@_pad = action.to_s.size if action.to_s.size > @_pad
|
252
|
+
duration = Time.now - began_at
|
253
|
+
color = :red if duration > 1
|
254
|
+
push "%s (" % action.to_s.upcase.rjust(@_pad).send(color) + "%0.4fms".bold.send(color) % duration + ") %s" % message.to_s, level
|
221
255
|
end
|
222
256
|
|
223
257
|
##
|
224
258
|
# Directly append message to the log.
|
225
259
|
#
|
260
|
+
# @param [String] message
|
261
|
+
# The message
|
262
|
+
#
|
226
263
|
def <<(message = nil)
|
227
264
|
message << "\n" unless message[-1] == ?\n
|
228
265
|
@buffer << message
|
@@ -232,50 +269,21 @@ module Padrino
|
|
232
269
|
alias :write :<<
|
233
270
|
|
234
271
|
##
|
235
|
-
# Generate the logging methods for Padrino.logger for each log level.
|
272
|
+
# Generate the logging methods for {Padrino.logger} for each log level.
|
236
273
|
#
|
237
274
|
Levels.each_pair do |name, number|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
#
|
245
|
-
# ==== Returns
|
246
|
-
# self:: The logger object for chaining.
|
247
|
-
def #{name}(message = nil)
|
248
|
-
if #{number} >= level
|
249
|
-
message = block_given? ? yield : message
|
250
|
-
self.push(message, :#{name}) if #{number} >= level
|
251
|
-
end
|
252
|
-
self
|
253
|
-
end
|
254
|
-
|
255
|
-
# Appends a message to the log if the log level is at least as high as
|
256
|
-
# the log level of the logger. The bang! version of the method also auto
|
257
|
-
# flushes the log buffer to disk.
|
258
|
-
#
|
259
|
-
# ==== Parameters
|
260
|
-
# message:: The message to be logged. Defaults to nil.
|
261
|
-
#
|
262
|
-
# ==== Returns
|
263
|
-
# self:: The logger object for chaining.
|
264
|
-
def #{name}!(message = nil)
|
265
|
-
if #{number} >= level
|
266
|
-
message = block_given? ? yield : message
|
267
|
-
self.push(message, :#{name}) if #{number} >= level
|
268
|
-
flush if #{number} >= level
|
275
|
+
define_method(name) do |*args|
|
276
|
+
return if number < level
|
277
|
+
if args.size > 1
|
278
|
+
bench(*args)
|
279
|
+
else
|
280
|
+
push(args * '', name)
|
269
281
|
end
|
270
|
-
self
|
271
282
|
end
|
272
283
|
|
273
|
-
#
|
274
|
-
|
275
|
-
def #{name}?
|
276
|
-
#{number} >= level
|
284
|
+
define_method(:"#{name}?") do
|
285
|
+
number >= level
|
277
286
|
end
|
278
|
-
LEVELMETHODS
|
279
287
|
end
|
280
288
|
|
281
289
|
##
|
@@ -284,19 +292,13 @@ module Padrino
|
|
284
292
|
# rack.errors by default.
|
285
293
|
#
|
286
294
|
class Rack
|
287
|
-
##
|
288
|
-
# Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
|
289
|
-
# "lilith.local - - GET / HTTP/1.1 500 -"
|
290
|
-
# %{%s - %s %s %s%s %s - %d %s %0.4f}
|
291
|
-
#
|
292
|
-
FORMAT = %{%s (%0.4fms) %s - %s %s%s%s %s - %d %s}
|
293
295
|
|
294
|
-
def initialize(app, uri_root)
|
296
|
+
def initialize(app, uri_root) # @private
|
295
297
|
@app = app
|
296
298
|
@uri_root = uri_root.sub(/\/$/,"")
|
297
299
|
end
|
298
300
|
|
299
|
-
def call(env)
|
301
|
+
def call(env) # @private
|
300
302
|
env['rack.logger'] = Padrino.logger
|
301
303
|
env['rack.errors'] = Padrino.logger.log
|
302
304
|
began_at = Time.now
|
@@ -307,31 +309,20 @@ module Padrino
|
|
307
309
|
|
308
310
|
private
|
309
311
|
def log(env, status, header, began_at)
|
310
|
-
now = Time.now
|
311
|
-
length = extract_content_length(header)
|
312
|
-
|
313
312
|
return if env['sinatra.static_file'] and !logger.log_static
|
314
|
-
|
315
|
-
logger.debug FORMAT % [
|
313
|
+
logger.bench(
|
316
314
|
env["REQUEST_METHOD"],
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
def extract_content_length(headers)
|
329
|
-
headers.each do |key, value|
|
330
|
-
if key.downcase == 'content-length'
|
331
|
-
return value.to_s == '0' ? '-' : value
|
332
|
-
end
|
333
|
-
end
|
334
|
-
'-'
|
315
|
+
began_at,
|
316
|
+
[
|
317
|
+
@uri_root.to_s,
|
318
|
+
env["PATH_INFO"],
|
319
|
+
env["QUERY_STRING"].empty? ? "" : "?" + env["QUERY_STRING"],
|
320
|
+
' - ',
|
321
|
+
status.to_s[0..3].bold
|
322
|
+
] * '',
|
323
|
+
:debug,
|
324
|
+
:magenta
|
325
|
+
)
|
335
326
|
end
|
336
327
|
end # Rack
|
337
328
|
end # Logger
|
data/lib/padrino-core/mounter.rb
CHANGED
@@ -3,8 +3,7 @@ module Padrino
|
|
3
3
|
# Represents a particular mounted padrino application
|
4
4
|
# Stores the name of the application (app folder name) and url mount path
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# @example
|
8
7
|
# Mounter.new("blog_app", :app_class => "Blog").to("/blog")
|
9
8
|
# Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")
|
10
9
|
#
|
@@ -14,6 +13,16 @@ module Padrino
|
|
14
13
|
|
15
14
|
attr_accessor :name, :uri_root, :app_file, :app_class, :app_root, :app_obj, :app_host
|
16
15
|
|
16
|
+
##
|
17
|
+
# @param [String, Padrino::Application] name
|
18
|
+
# The app name or the {Padrino::Application} class
|
19
|
+
#
|
20
|
+
# @param [Hash] options
|
21
|
+
# @option options [Symbol] :app_class (Detected from name)
|
22
|
+
# @option options [Symbol] :app_file (Automatically detected)
|
23
|
+
# @option options [Symbol] :app_obj (Detected)
|
24
|
+
# @option options [Symbol] :app_root (Directory of :app_file)
|
25
|
+
#
|
17
26
|
def initialize(name, options={})
|
18
27
|
@name = name.to_s
|
19
28
|
@app_class = options[:app_class] || @name.camelize
|
@@ -28,8 +37,10 @@ module Padrino
|
|
28
37
|
##
|
29
38
|
# Registers the mounted application onto Padrino
|
30
39
|
#
|
31
|
-
#
|
40
|
+
# @param [String] mount_url
|
41
|
+
# Path where we mount the app
|
32
42
|
#
|
43
|
+
# @example
|
33
44
|
# Mounter.new("blog_app").to("/blog")
|
34
45
|
#
|
35
46
|
def to(mount_url)
|
@@ -41,8 +52,10 @@ module Padrino
|
|
41
52
|
##
|
42
53
|
# Registers the mounted application onto Padrino for the given host
|
43
54
|
#
|
44
|
-
#
|
55
|
+
# @param [String] mount_host
|
56
|
+
# Host name
|
45
57
|
#
|
58
|
+
# @example
|
46
59
|
# Mounter.new("blog_app").to("/blog").host("blog.padrino.org")
|
47
60
|
# Mounter.new("blog_app").host("blog.padrino.org")
|
48
61
|
# Mounter.new("catch_all").host(/.*\.padrino.org/)
|
@@ -57,17 +70,22 @@ module Padrino
|
|
57
70
|
# Maps Padrino application onto a Padrino::Router
|
58
71
|
# For use in constructing a Rack application
|
59
72
|
#
|
73
|
+
# @param [Padrino::Router]
|
74
|
+
#
|
75
|
+
# @return [Padrino::Router]
|
76
|
+
#
|
77
|
+
# @example
|
60
78
|
# @app.map_onto(router)
|
61
79
|
#
|
62
80
|
def map_onto(router)
|
63
81
|
app_data, app_obj = self, @app_obj
|
64
|
-
app_obj.set :uri_root,
|
65
|
-
app_obj.set :app_name,
|
66
|
-
app_obj.set :app_file,
|
67
|
-
app_obj.set :root,
|
68
|
-
app_obj.set :
|
69
|
-
app_obj.set :static,
|
70
|
-
app_obj.setup_application! #
|
82
|
+
app_obj.set :uri_root, app_data.uri_root
|
83
|
+
app_obj.set :app_name, app_data.name
|
84
|
+
app_obj.set :app_file, app_data.app_file unless ::File.exist?(app_obj.app_file)
|
85
|
+
app_obj.set :root, app_data.app_root unless app_data.app_root.blank?
|
86
|
+
app_obj.set :public_folder, Padrino.root('public', app_data.uri_root) unless File.exists?(app_obj.public_folder)
|
87
|
+
app_obj.set :static, File.exist?(app_obj.public_folder) if app_obj.nil?
|
88
|
+
app_obj.setup_application! # Initializes the app here with above settings.
|
71
89
|
router.map(:to => app_obj, :path => app_data.uri_root, :host => app_data.app_host)
|
72
90
|
end
|
73
91
|
|
@@ -81,6 +99,8 @@ module Padrino
|
|
81
99
|
###
|
82
100
|
# Returns the basic route information for each named route
|
83
101
|
#
|
102
|
+
# @return [Array]
|
103
|
+
# Array of routes
|
84
104
|
#
|
85
105
|
def named_routes
|
86
106
|
app_obj.routes.map { |route|
|
@@ -95,12 +115,15 @@ module Padrino
|
|
95
115
|
##
|
96
116
|
# Makes two Mounters equal if they have the same name and uri_root
|
97
117
|
#
|
118
|
+
# @param [Padrino::Mounter] other
|
119
|
+
#
|
98
120
|
def ==(other)
|
99
121
|
other.is_a?(Mounter) && self.app_class == other.app_class && self.uri_root == other.uri_root
|
100
122
|
end
|
101
123
|
|
102
124
|
##
|
103
|
-
#
|
125
|
+
# @return [Padrino::Application]
|
126
|
+
# the class object for the app if defined, nil otherwise
|
104
127
|
#
|
105
128
|
def app_constant
|
106
129
|
klass = Object
|
@@ -160,14 +183,18 @@ module Padrino
|
|
160
183
|
attr_writer :mounted_root # Set root directory where padrino searches mounted apps
|
161
184
|
|
162
185
|
##
|
163
|
-
#
|
186
|
+
# @param [Array] args
|
187
|
+
#
|
188
|
+
# @return [String]
|
189
|
+
# the root to the mounted apps base directory
|
164
190
|
#
|
165
191
|
def mounted_root(*args)
|
166
192
|
Padrino.root(@mounted_root ||= "", *args)
|
167
193
|
end
|
168
194
|
|
169
195
|
##
|
170
|
-
#
|
196
|
+
# @return [Array]
|
197
|
+
# the mounted padrino applications (MountedApp objects)
|
171
198
|
#
|
172
199
|
def mounted_apps
|
173
200
|
@mounted_apps ||= []
|
@@ -176,6 +203,8 @@ module Padrino
|
|
176
203
|
##
|
177
204
|
# Inserts a Mounter object into the mounted applications (avoids duplicates)
|
178
205
|
#
|
206
|
+
# @param [Padrino::Mounter] mounter
|
207
|
+
#
|
179
208
|
def insert_mounted_app(mounter)
|
180
209
|
Padrino.mounted_apps.push(mounter) unless Padrino.mounted_apps.include?(mounter)
|
181
210
|
end
|
@@ -183,6 +212,9 @@ module Padrino
|
|
183
212
|
##
|
184
213
|
# Mounts a new sub-application onto Padrino project
|
185
214
|
#
|
215
|
+
# @see Padrino::Mounter#new
|
216
|
+
#
|
217
|
+
# @example
|
186
218
|
# Padrino.mount("blog_app").to("/blog")
|
187
219
|
#
|
188
220
|
def mount(name, options={})
|
@@ -39,6 +39,7 @@ module Padrino
|
|
39
39
|
def include_constants
|
40
40
|
@_include_constants ||= []
|
41
41
|
end
|
42
|
+
|
42
43
|
##
|
43
44
|
# Reload all files with changes detected.
|
44
45
|
#
|
@@ -107,6 +108,7 @@ module Padrino
|
|
107
108
|
# A safe Kernel::require which issues the necessary hooks depending on results
|
108
109
|
#
|
109
110
|
def safe_load(file, options={})
|
111
|
+
began_at = Time.now
|
110
112
|
force, file = options[:force], figure_path(file)
|
111
113
|
|
112
114
|
# Check if file was changed or if force a reload
|
@@ -134,8 +136,8 @@ module Padrino
|
|
134
136
|
|
135
137
|
# And finally load the specified file
|
136
138
|
begin
|
137
|
-
logger.devel
|
138
|
-
logger.debug
|
139
|
+
logger.devel :loading, began_at, file if !reload
|
140
|
+
logger.debug :reload, began_at, file if reload
|
139
141
|
$LOADED_FEATURES.delete(file)
|
140
142
|
verbosity_was, $-v = $-v, nil
|
141
143
|
loaded = false
|
@@ -143,7 +145,7 @@ module Padrino
|
|
143
145
|
loaded = true
|
144
146
|
MTIMES[file] = File.mtime(file)
|
145
147
|
rescue SyntaxError => e
|
146
|
-
logger.error "Cannot require #{file}
|
148
|
+
logger.error "Cannot require #{file} due to a syntax error: #{e.message}"
|
147
149
|
ensure
|
148
150
|
$-v = verbosity_was
|
149
151
|
new_constants = (ObjectSpace.classes - klasses).uniq
|