padrino-core 0.12.2 → 0.12.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.
- checksums.yaml +4 -4
- data/lib/padrino-core/application/application_setup.rb +3 -4
- data/lib/padrino-core/application/routing.rb +133 -380
- data/lib/padrino-core/application.rb +17 -24
- data/lib/padrino-core/cli/base.rb +2 -90
- data/lib/padrino-core/cli/launcher.rb +95 -0
- data/lib/padrino-core/ext/http_router.rb +181 -0
- data/lib/padrino-core/ext/sinatra.rb +29 -0
- data/lib/padrino-core/filter.rb +47 -0
- data/lib/padrino-core/loader.rb +27 -50
- data/lib/padrino-core/reloader.rb +63 -23
- data/lib/padrino-core/server.rb +3 -1
- data/lib/padrino-core/version.rb +1 -1
- data/padrino-core.gemspec +1 -1
- data/test/fixtures/apps/helpers/class_methods_helpers.rb +4 -0
- data/test/fixtures/apps/helpers/instance_methods_helpers.rb +4 -0
- data/test/fixtures/apps/system_class_methods_demo.rb +7 -0
- data/test/fixtures/apps/system_instance_methods_demo.rb +7 -0
- data/test/test_core.rb +1 -0
- data/test/test_logger.rb +39 -11
- data/test/test_reloader_system.rb +57 -1
- data/test/test_routing.rb +12 -0
- metadata +18 -6
@@ -26,14 +26,16 @@ module Padrino
|
|
26
26
|
Padrino.logger
|
27
27
|
end
|
28
28
|
|
29
|
-
# TODO: Remove this hack after getting rid of thread-unsafe http_router:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
# TODO: Remove this hack (issue #863) after getting rid of thread-unsafe http_router:
|
30
|
+
if RUBY_PLATFORM == "java"
|
31
|
+
alias_method :original_call, :call
|
32
|
+
def call(*args)
|
33
|
+
settings.init_mutex.synchronize do
|
34
|
+
instance_eval{ undef :call }
|
35
|
+
class_eval{ alias_method :call, :original_call }
|
36
|
+
instance_eval{ undef :original_call }
|
37
|
+
super(*args)
|
38
|
+
end
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -126,20 +128,6 @@ module Padrino
|
|
126
128
|
Padrino.run!(options)
|
127
129
|
end
|
128
130
|
|
129
|
-
##
|
130
|
-
# @return [Array]
|
131
|
-
# directory that need to be added to +$LOAD_PATHS+ from this application
|
132
|
-
#
|
133
|
-
def load_paths
|
134
|
-
@_load_paths ||= [
|
135
|
-
'models',
|
136
|
-
'lib',
|
137
|
-
'mailers',
|
138
|
-
'controllers',
|
139
|
-
'helpers',
|
140
|
-
].map { |path| File.join(settings.root, path) }
|
141
|
-
end
|
142
|
-
|
143
131
|
##
|
144
132
|
# Returns default list of path globs to load as dependencies.
|
145
133
|
# Appends custom dependency patterns to the be loaded for your Application.
|
@@ -161,7 +149,7 @@ module Padrino
|
|
161
149
|
'controllers.rb',
|
162
150
|
'helpers/**/*.rb',
|
163
151
|
'helpers.rb',
|
164
|
-
].map { |file| Dir
|
152
|
+
].map { |file| Dir.glob(File.join(settings.root, file)) }.flatten
|
165
153
|
end
|
166
154
|
|
167
155
|
##
|
@@ -187,13 +175,18 @@ module Padrino
|
|
187
175
|
set(option, *args, &block) unless respond_to?(option)
|
188
176
|
end
|
189
177
|
|
178
|
+
# Deprecated
|
179
|
+
def load_paths
|
180
|
+
warn 'Padrino::Application#load_paths is deprecated. Please, use #prerequisites'
|
181
|
+
[]
|
182
|
+
end
|
183
|
+
|
190
184
|
protected
|
191
185
|
|
192
186
|
##
|
193
187
|
# Requires all files within the application load paths.
|
194
188
|
#
|
195
189
|
def require_dependencies
|
196
|
-
Padrino.set_load_paths(*load_paths)
|
197
190
|
Padrino.require_dependencies(dependencies, :force => true)
|
198
191
|
end
|
199
192
|
end
|
@@ -1,47 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'padrino-core/cli/launcher'
|
2
2
|
|
3
3
|
module Padrino
|
4
4
|
module Cli
|
5
|
-
|
6
|
-
class Base < Thor
|
7
|
-
include Thor::Actions
|
8
|
-
|
9
|
-
class_option :chdir, :type => :string, :aliases => "-c", :desc => "Change to dir before starting."
|
10
|
-
class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Padrino Environment."
|
11
|
-
class_option :help, :type => :boolean, :desc => "Show help usage"
|
12
|
-
|
13
|
-
desc "start", "Starts the Padrino application (alternatively use 's')."
|
14
|
-
map "s" => :start
|
15
|
-
method_option :server, :type => :string, :aliases => "-a", :desc => "Rack Handler (default: autodetect)"
|
16
|
-
method_option :host, :type => :string, :aliases => "-h", :desc => "Bind to HOST address (default: 127.0.0.1)"
|
17
|
-
method_option :port, :type => :numeric, :aliases => "-p", :desc => "Use PORT (default: 3000)"
|
18
|
-
method_option :daemonize, :type => :boolean, :aliases => "-d", :desc => "Run daemonized in the background."
|
19
|
-
method_option :pid, :type => :string, :aliases => "-i", :desc => "File to store pid."
|
20
|
-
method_option :debug, :type => :boolean, :desc => "Set debugging flags."
|
21
|
-
method_option :options, :type => :array, :aliases => "-O", :desc => "--options NAME=VALUE NAME2=VALUE2'. pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} --server_options"
|
22
|
-
method_option :server_options, :type => :boolean, :desc => "Tells the current server handler's options that can be used with --options"
|
23
|
-
|
24
|
-
def start(*args)
|
25
|
-
prepare :start
|
26
|
-
require File.expand_path("../adapter", __FILE__)
|
27
|
-
require File.expand_path('config/boot.rb')
|
28
|
-
|
29
|
-
if options[:server_options]
|
30
|
-
puts server_options(options)
|
31
|
-
else
|
32
|
-
Padrino::Cli::Adapter.start(args.last ? options.merge(:config => args.last).freeze : options)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
desc "stop", "Stops the Padrino application (alternatively use 'st')."
|
37
|
-
map "st" => :stop
|
38
|
-
method_option :pid, :type => :string, :aliases => "-p", :desc => "File to store pid", :default => 'tmp/pids/server.pid'
|
39
|
-
def stop
|
40
|
-
prepare :stop
|
41
|
-
require File.expand_path("../adapter", __FILE__)
|
42
|
-
Padrino::Cli::Adapter.stop(options)
|
43
|
-
end
|
44
|
-
|
5
|
+
class Base < Launcher
|
45
6
|
desc "rake", "Execute rake tasks."
|
46
7
|
method_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development
|
47
8
|
method_option :list, :type => :string, :aliases => "-T", :desc => "Display the tasks (matching optional PATTERN) with descriptions, then exit."
|
@@ -120,61 +81,12 @@ module Padrino
|
|
120
81
|
end
|
121
82
|
end
|
122
83
|
|
123
|
-
private
|
124
|
-
|
125
|
-
def prepare(task)
|
126
|
-
if options.help?
|
127
|
-
help(task.to_s)
|
128
|
-
raise SystemExit
|
129
|
-
end
|
130
|
-
ENV["RACK_ENV"] ||= options.environment.to_s
|
131
|
-
chdir(options.chdir)
|
132
|
-
unless File.exist?('config/boot.rb')
|
133
|
-
puts "=> Could not find boot file in: #{options.chdir}/config/boot.rb !!!"
|
134
|
-
raise SystemExit
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
# https://github.com/rack/rack/blob/master/lib/rack/server.rb\#L100
|
139
|
-
def server_options(options)
|
140
|
-
begin
|
141
|
-
info = []
|
142
|
-
server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
|
143
|
-
if server && server.respond_to?(:valid_options)
|
144
|
-
info << ""
|
145
|
-
info << "Server-specific options for #{server.name}:"
|
146
|
-
|
147
|
-
has_options = false
|
148
|
-
server.valid_options.each do |name, description|
|
149
|
-
next if name.to_s.match(/^(Host|Port)[^a-zA-Z]/) # ignore handler's host and port options, we do our own.
|
150
|
-
info << " -O %-21s %s" % [name, description]
|
151
|
-
has_options = true
|
152
|
-
end
|
153
|
-
return "" if !has_options
|
154
|
-
end
|
155
|
-
info.join("\n")
|
156
|
-
rescue NameError
|
157
|
-
return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
84
|
protected
|
162
85
|
|
163
86
|
def self.banner(task=nil, *args)
|
164
87
|
"padrino #{task.name}"
|
165
88
|
end
|
166
89
|
|
167
|
-
def chdir(dir)
|
168
|
-
return unless dir
|
169
|
-
begin
|
170
|
-
Dir.chdir(dir.to_s)
|
171
|
-
rescue Errno::ENOENT
|
172
|
-
puts "=> Specified Padrino root '#{dir}' does not appear to exist!"
|
173
|
-
rescue Errno::EACCES
|
174
|
-
puts "=> Specified Padrino root '#{dir}' cannot be accessed by the current user!"
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
90
|
def capture(stream)
|
179
91
|
begin
|
180
92
|
stream = stream.to_s
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Padrino
|
4
|
+
module Cli
|
5
|
+
class Launcher < Thor
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
class_option :chdir, :type => :string, :aliases => "-c", :desc => "Change to dir before starting."
|
9
|
+
class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Padrino Environment."
|
10
|
+
class_option :help, :type => :boolean, :desc => "Show help usage"
|
11
|
+
|
12
|
+
desc "start", "Starts the Padrino application (alternatively use 's')."
|
13
|
+
map "s" => :start
|
14
|
+
method_option :server, :type => :string, :aliases => "-a", :desc => "Rack Handler (default: autodetect)"
|
15
|
+
method_option :host, :type => :string, :aliases => "-h", :desc => "Bind to HOST address (default: 127.0.0.1)"
|
16
|
+
method_option :port, :type => :numeric, :aliases => "-p", :desc => "Use PORT (default: 3000)"
|
17
|
+
method_option :daemonize, :type => :boolean, :aliases => "-d", :desc => "Run daemonized in the background."
|
18
|
+
method_option :pid, :type => :string, :aliases => "-i", :desc => "File to store pid."
|
19
|
+
method_option :debug, :type => :boolean, :desc => "Set debugging flags."
|
20
|
+
method_option :options, :type => :array, :aliases => "-O", :desc => "--options NAME=VALUE NAME2=VALUE2'. pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} --server_options"
|
21
|
+
method_option :server_options, :type => :boolean, :desc => "Tells the current server handler's options that can be used with --options"
|
22
|
+
def start(*args)
|
23
|
+
prepare :start
|
24
|
+
require File.expand_path("../adapter", __FILE__)
|
25
|
+
require File.expand_path('config/boot.rb')
|
26
|
+
|
27
|
+
if options[:server_options]
|
28
|
+
puts server_options(options)
|
29
|
+
else
|
30
|
+
Padrino::Cli::Adapter.start(args.last ? options.merge(:config => args.last).freeze : options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "stop", "Stops the Padrino application (alternatively use 'st')."
|
35
|
+
map "st" => :stop
|
36
|
+
method_option :pid, :type => :string, :aliases => "-p", :desc => "File to store pid", :default => 'tmp/pids/server.pid'
|
37
|
+
def stop
|
38
|
+
prepare :stop
|
39
|
+
require File.expand_path("../adapter", __FILE__)
|
40
|
+
Padrino::Cli::Adapter.stop(options)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# https://github.com/rack/rack/blob/master/lib/rack/server.rb\#L100
|
46
|
+
def server_options(options)
|
47
|
+
begin
|
48
|
+
info = []
|
49
|
+
server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
|
50
|
+
if server && server.respond_to?(:valid_options)
|
51
|
+
info << ""
|
52
|
+
info << "Server-specific options for #{server.name}:"
|
53
|
+
|
54
|
+
has_options = false
|
55
|
+
server.valid_options.each do |name, description|
|
56
|
+
next if name.to_s.match(/^(Host|Port)[^a-zA-Z]/) # ignore handler's host and port options, we do our own.
|
57
|
+
info << " -O %-21s %s" % [name, description]
|
58
|
+
has_options = true
|
59
|
+
end
|
60
|
+
return "" if !has_options
|
61
|
+
end
|
62
|
+
info.join("\n")
|
63
|
+
rescue NameError
|
64
|
+
return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
|
70
|
+
def prepare(task)
|
71
|
+
if options.help?
|
72
|
+
help(task.to_s)
|
73
|
+
raise SystemExit
|
74
|
+
end
|
75
|
+
ENV["RACK_ENV"] ||= options.environment.to_s
|
76
|
+
chdir(options.chdir)
|
77
|
+
unless File.exist?('config/boot.rb')
|
78
|
+
puts "=> Could not find boot file in: #{options.chdir}/config/boot.rb !!!"
|
79
|
+
raise SystemExit
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def chdir(dir)
|
84
|
+
return unless dir
|
85
|
+
begin
|
86
|
+
Dir.chdir(dir.to_s)
|
87
|
+
rescue Errno::ENOENT
|
88
|
+
puts "=> Specified Padrino root '#{dir}' does not appear to exist!"
|
89
|
+
rescue Errno::EACCES
|
90
|
+
puts "=> Specified Padrino root '#{dir}' cannot be accessed by the current user!"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require 'http_router' unless defined?(HttpRouter)
|
2
|
+
|
3
|
+
class HttpRouter
|
4
|
+
def rewrite_partial_path_info(env, request); end
|
5
|
+
def rewrite_path_info(env, request); end
|
6
|
+
|
7
|
+
def process_destination_path(path, env)
|
8
|
+
Thread.current['padrino.instance'].instance_eval do
|
9
|
+
request.route_obj = path.route
|
10
|
+
@_response_buffer = nil
|
11
|
+
@route = path.route
|
12
|
+
@params ||= {}
|
13
|
+
@params.update(env['router.params'])
|
14
|
+
@block_params = if match_data = env['router.request'].extra_env['router.regex_match']
|
15
|
+
params_list = match_data.to_a
|
16
|
+
params_list.shift
|
17
|
+
@params[:captures] = params_list
|
18
|
+
params_list
|
19
|
+
else
|
20
|
+
env['router.request'].params
|
21
|
+
end
|
22
|
+
# Provide access to the current controller to the request
|
23
|
+
# Now we can eval route, but because we have "throw halt" we need to be
|
24
|
+
# (en)sure to reset old layout and run controller after filters.
|
25
|
+
original_params = @params
|
26
|
+
parent_layout = @layout
|
27
|
+
successful = false
|
28
|
+
begin
|
29
|
+
filter! :before
|
30
|
+
(@route.before_filters - settings.filters[:before]).each { |block| instance_eval(&block) }
|
31
|
+
@layout = path.route.use_layout if path.route.use_layout
|
32
|
+
@route.custom_conditions.each { |block| pass if block.bind(self).call == false }
|
33
|
+
halt_response = catch(:halt) { route_eval { @route.dest[self, @block_params] } }
|
34
|
+
@_response_buffer = halt_response.is_a?(Array) ? halt_response.last : halt_response
|
35
|
+
successful = true
|
36
|
+
halt halt_response
|
37
|
+
ensure
|
38
|
+
(@route.after_filters - settings.filters[:after]).each { |block| instance_eval(&block) } if successful
|
39
|
+
@layout = parent_layout
|
40
|
+
@params = original_params
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Route
|
46
|
+
VALID_HTTP_VERBS.replace %w[GET POST PUT PATCH DELETE HEAD OPTIONS LINK UNLINK]
|
47
|
+
|
48
|
+
attr_accessor :use_layout, :controller, :action, :cache, :cache_key, :cache_expires, :parent
|
49
|
+
|
50
|
+
def before_filters(&block)
|
51
|
+
@_before_filters ||= []
|
52
|
+
@_before_filters << block if block_given?
|
53
|
+
|
54
|
+
@_before_filters
|
55
|
+
end
|
56
|
+
|
57
|
+
def after_filters(&block)
|
58
|
+
@_after_filters ||= []
|
59
|
+
@_after_filters << block if block_given?
|
60
|
+
|
61
|
+
@_after_filters
|
62
|
+
end
|
63
|
+
|
64
|
+
def custom_conditions(&block)
|
65
|
+
@_custom_conditions ||= []
|
66
|
+
@_custom_conditions << block if block_given?
|
67
|
+
|
68
|
+
@_custom_conditions
|
69
|
+
end
|
70
|
+
|
71
|
+
def significant_variable_names
|
72
|
+
@significant_variable_names ||= if @original_path.is_a?(String)
|
73
|
+
@original_path.scan(/(^|[^\\])[:\*]([a-zA-Z0-9_]+)/).map{|p| p.last.to_sym}
|
74
|
+
elsif @original_path.is_a?(Regexp) and @original_path.respond_to?(:named_captures)
|
75
|
+
@original_path.named_captures.keys.map(&:to_sym)
|
76
|
+
else
|
77
|
+
[]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def to(dest = nil, &dest_block)
|
82
|
+
@dest = dest || dest_block || raise("you didn't specify a destination")
|
83
|
+
|
84
|
+
@router.current_order ||= 0
|
85
|
+
@order = @router.current_order
|
86
|
+
@router.current_order += 1
|
87
|
+
|
88
|
+
if @dest.respond_to?(:url_mount=)
|
89
|
+
urlmount = UrlMount.new(@path_for_generation, @default_values || {}) # TODO url mount should accept nil here.
|
90
|
+
urlmount.url_mount = @router.url_mount if @router.url_mount
|
91
|
+
@dest.url_mount = urlmount
|
92
|
+
end
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
attr_accessor :order
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
attr_accessor :current_order
|
101
|
+
|
102
|
+
def sort!
|
103
|
+
@routes.sort!{ |a, b| a.order <=> b.order }
|
104
|
+
end
|
105
|
+
|
106
|
+
class Node::Glob
|
107
|
+
def to_code
|
108
|
+
id = root.next_counter
|
109
|
+
"request.params << (globbed_params#{id} = [])
|
110
|
+
until request.path.empty?
|
111
|
+
globbed_params#{id} << request.path.shift
|
112
|
+
#{super}
|
113
|
+
end
|
114
|
+
request.path[0,0] = globbed_params#{id}
|
115
|
+
request.params.pop"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class Node::SpanningRegex
|
120
|
+
def to_code
|
121
|
+
params_count = @ordered_indicies.size
|
122
|
+
whole_path_var = "whole_path#{root.next_counter}"
|
123
|
+
"#{whole_path_var} = request.joined_path
|
124
|
+
if match = #{@matcher.inspect}.match(#{whole_path_var}) and match.begin(0).zero?
|
125
|
+
_#{whole_path_var} = request.path.dup
|
126
|
+
" << param_capturing_code << "
|
127
|
+
remaining_path = #{whole_path_var}[match[0].size + (#{whole_path_var}[match[0].size] == ?/ ? 1 : 0), #{whole_path_var}.size]
|
128
|
+
request.path = remaining_path.split('/')
|
129
|
+
#{node_to_code}
|
130
|
+
request.path = _#{whole_path_var}
|
131
|
+
request.params.slice!(#{-params_count}, #{params_count})
|
132
|
+
end
|
133
|
+
"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Monkey patching the Request class. Using Rack::Utils.unescape rather than
|
138
|
+
# URI.unescape which can't handle utf-8 chars
|
139
|
+
class Request
|
140
|
+
def initialize(path, rack_request)
|
141
|
+
@rack_request = rack_request
|
142
|
+
@path = path.split(/\//).map{|part| Rack::Utils.unescape(part) }
|
143
|
+
@path.shift if @path.first == ''
|
144
|
+
@path.push('') if path[-1] == ?/
|
145
|
+
@extra_env = {}
|
146
|
+
@params = []
|
147
|
+
@acceptable_methods = Set.new
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Node::Path
|
152
|
+
def to_code
|
153
|
+
path_ivar = inject_root_ivar(self)
|
154
|
+
"#{"if !callback && request.path.size == 1 && request.path.first == '' && (request.rack_request.head? || request.rack_request.get?) && request.rack_request.path_info[-1] == ?/
|
155
|
+
catch(:pass) do
|
156
|
+
response = ::Rack::Response.new
|
157
|
+
response.redirect(request.rack_request.path_info[0, request.rack_request.path_info.size - 1], 302)
|
158
|
+
return response.finish
|
159
|
+
end
|
160
|
+
end" if router.redirect_trailing_slash?}
|
161
|
+
|
162
|
+
#{"if request.#{router.ignore_trailing_slash? ? 'path_finished?' : 'path.empty?'}" unless route.match_partially}
|
163
|
+
catch(:pass) do
|
164
|
+
if callback
|
165
|
+
request.called = true
|
166
|
+
callback.call(Response.new(request, #{path_ivar}))
|
167
|
+
else
|
168
|
+
env = request.rack_request.dup.env
|
169
|
+
env['router.request'] = request
|
170
|
+
env['router.params'] ||= {}
|
171
|
+
#{"env['router.params'].merge!(Hash[#{param_names.inspect}.zip(request.params)])" if dynamic?}
|
172
|
+
env['router.params'] = env['router.params'].with_indifferent_access
|
173
|
+
@router.rewrite#{"_partial" if route.match_partially}_path_info(env, request)
|
174
|
+
response = @router.process_destination_path(#{path_ivar}, env)
|
175
|
+
return response unless router.pass_on_response(response)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
#{"end" unless route.match_partially}"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Adds to Sinatra +controller+ informations
|
5
|
+
#
|
6
|
+
class Sinatra::Request
|
7
|
+
attr_accessor :route_obj
|
8
|
+
|
9
|
+
def controller
|
10
|
+
route_obj && route_obj.controller
|
11
|
+
end
|
12
|
+
def action
|
13
|
+
route_obj && route_obj.action
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# This patches Sinatra to accept UTF-8 urls on JRuby 1.7.6
|
19
|
+
#
|
20
|
+
if RUBY_ENGINE == 'jruby' && defined?(JRUBY_VERSION) && JRUBY_VERSION > '1.7.4'
|
21
|
+
class Sinatra::Base
|
22
|
+
class << self
|
23
|
+
alias_method :old_generate_method, :generate_method
|
24
|
+
def generate_method(method_name, &block)
|
25
|
+
old_generate_method(method_name.to_sym, &block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Padrino
|
2
|
+
class Filter
|
3
|
+
attr_reader :block
|
4
|
+
|
5
|
+
def initialize(mode, scoped_controller, options, args, &block)
|
6
|
+
@mode, @scoped_controller, @options, @args, @block = mode, scoped_controller, options, args, block
|
7
|
+
end
|
8
|
+
|
9
|
+
def apply?(request)
|
10
|
+
detect = match_with_arguments?(request) || match_with_options?(request)
|
11
|
+
detect ^ !@mode
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_proc
|
15
|
+
if @args.empty? && @options.empty?
|
16
|
+
block
|
17
|
+
else
|
18
|
+
filter = self
|
19
|
+
proc { instance_eval(&filter.block) if filter.apply?(request) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def scoped_controller_name
|
26
|
+
@scoped_controller_name ||= Array(@scoped_controller).join("_")
|
27
|
+
end
|
28
|
+
|
29
|
+
def match_with_arguments?(request)
|
30
|
+
route, path = request.route_obj, request.path_info
|
31
|
+
@args.any? do |argument|
|
32
|
+
if argument.instance_of?(Symbol)
|
33
|
+
next unless route
|
34
|
+
name = route.name
|
35
|
+
argument == name || name == [scoped_controller_name, argument].join(" ").to_sym
|
36
|
+
else
|
37
|
+
argument === path
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def match_with_options?(request)
|
43
|
+
user_agent = request.user_agent
|
44
|
+
@options.any?{|name, value| value === (name == :agent ? user_agent : request.send(name)) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/padrino-core/loader.rb
CHANGED
@@ -52,9 +52,7 @@ module Padrino
|
|
52
52
|
began_at = Time.now
|
53
53
|
@_called_from = first_caller
|
54
54
|
set_encoding
|
55
|
-
|
56
|
-
Logger.setup!
|
57
|
-
require_dependencies("#{root}/config/database.rb")
|
55
|
+
Padrino.logger
|
58
56
|
Reloader.lock!
|
59
57
|
before_load.each(&:call)
|
60
58
|
require_dependencies(*dependency_paths)
|
@@ -71,9 +69,7 @@ module Padrino
|
|
71
69
|
def clear!
|
72
70
|
clear_middleware!
|
73
71
|
mounted_apps.clear
|
74
|
-
@_load_paths = nil
|
75
72
|
@_dependency_paths = nil
|
76
|
-
@_global_configuration = nil
|
77
73
|
before_load.clear
|
78
74
|
after_load.clear
|
79
75
|
Reloader.clear!
|
@@ -134,9 +130,9 @@ module Padrino
|
|
134
130
|
#
|
135
131
|
def require_dependencies(*paths)
|
136
132
|
options = paths.extract_options!.merge( :cyclic => true )
|
137
|
-
files = paths.flatten.map{|path| Dir
|
133
|
+
files = paths.flatten.map{ |path| Dir.glob(path).sort_by{ |filename| filename.count('/') } }.flatten.uniq
|
138
134
|
|
139
|
-
|
135
|
+
until files.empty?
|
140
136
|
error, fatal, loaded = nil, nil, nil
|
141
137
|
|
142
138
|
files.dup.each do |file|
|
@@ -144,44 +140,21 @@ module Padrino
|
|
144
140
|
Reloader.safe_load(file, options)
|
145
141
|
files.delete(file)
|
146
142
|
loaded = true
|
147
|
-
rescue NameError, LoadError =>
|
148
|
-
logger.devel "Cyclic dependency reload for #{
|
149
|
-
|
150
|
-
rescue Exception => e
|
151
|
-
fatal = e
|
143
|
+
rescue NameError, LoadError => error
|
144
|
+
logger.devel "Cyclic dependency reload for #{error.class}: #{error.message}"
|
145
|
+
rescue Exception => fatal
|
152
146
|
break
|
153
147
|
end
|
154
148
|
end
|
155
149
|
|
156
150
|
if fatal || !loaded
|
157
|
-
|
158
|
-
logger.exception
|
159
|
-
raise
|
151
|
+
exception = fatal || error
|
152
|
+
logger.exception exception, :short
|
153
|
+
raise exception
|
160
154
|
end
|
161
155
|
end
|
162
156
|
end
|
163
157
|
|
164
|
-
##
|
165
|
-
# Concat to +$LOAD_PATH+ the given paths.
|
166
|
-
#
|
167
|
-
# @param [Array<String>] paths
|
168
|
-
# The paths to concat.
|
169
|
-
#
|
170
|
-
def set_load_paths(*paths)
|
171
|
-
load_paths.concat(paths).uniq!
|
172
|
-
$LOAD_PATH.concat(paths).uniq!
|
173
|
-
end
|
174
|
-
|
175
|
-
##
|
176
|
-
# The used +$LOAD_PATHS+ from Padrino.
|
177
|
-
#
|
178
|
-
# @return [Array<String>]
|
179
|
-
# The load paths used by Padrino.
|
180
|
-
#
|
181
|
-
def load_paths
|
182
|
-
@_load_paths ||= load_paths_was.dup
|
183
|
-
end
|
184
|
-
|
185
158
|
##
|
186
159
|
# Returns default list of path globs to load as dependencies.
|
187
160
|
# Appends custom dependency patterns to the be loaded for Padrino.
|
@@ -193,32 +166,36 @@ module Padrino
|
|
193
166
|
# Padrino.dependency_paths << "#{Padrino.root}/uploaders/*.rb"
|
194
167
|
#
|
195
168
|
def dependency_paths
|
196
|
-
@_dependency_paths ||=
|
169
|
+
@_dependency_paths ||= default_dependency_paths + modules_dependency_paths
|
197
170
|
end
|
198
171
|
|
199
|
-
|
172
|
+
# Deprecated
|
173
|
+
def set_load_paths(*)
|
174
|
+
warn 'Padrino.set_load_paths is deprecated. Please, use $LOAD_PATH.concat(paths)'
|
175
|
+
[]
|
176
|
+
end
|
200
177
|
|
201
|
-
|
202
|
-
|
178
|
+
# Deprecated
|
179
|
+
def load_paths
|
180
|
+
warn 'Padrino.load_paths is deprecated. Please, use Padrino::Application#prerequisites'
|
181
|
+
[]
|
203
182
|
end
|
204
183
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
"#{root}/shared",
|
210
|
-
].freeze
|
184
|
+
private
|
185
|
+
|
186
|
+
def modules_dependency_paths
|
187
|
+
modules.map(&:dependency_paths).flatten
|
211
188
|
end
|
212
189
|
|
213
|
-
def
|
214
|
-
@
|
190
|
+
def default_dependency_paths
|
191
|
+
@default_dependency_paths ||= [
|
215
192
|
"#{root}/config/database.rb",
|
216
193
|
"#{root}/lib/**/*.rb",
|
217
194
|
"#{root}/models/**/*.rb",
|
218
195
|
"#{root}/shared/lib/**/*.rb",
|
219
196
|
"#{root}/shared/models/**/*.rb",
|
220
|
-
"#{root}/config/apps.rb"
|
221
|
-
]
|
197
|
+
"#{root}/config/apps.rb",
|
198
|
+
]
|
222
199
|
end
|
223
200
|
end
|
224
201
|
end
|