padrino-core 0.10.2 → 0.10.3
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/.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
|