merb 0.3.4 → 0.3.7
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/README +206 -197
- data/Rakefile +12 -21
- data/bin/merb +1 -1
- data/examples/skeleton/Rakefile +6 -20
- data/examples/skeleton/dist/app/mailers/layout/application.erb +1 -0
- data/examples/skeleton/dist/conf/database.yml +23 -0
- data/examples/skeleton/dist/conf/environments/development.rb +1 -0
- data/examples/skeleton/dist/conf/environments/production.rb +1 -0
- data/examples/skeleton/dist/conf/environments/test.rb +1 -0
- data/examples/skeleton/dist/conf/merb.yml +32 -28
- data/examples/skeleton/dist/conf/merb_init.rb +16 -13
- data/examples/skeleton/dist/conf/router.rb +9 -9
- data/examples/skeleton/dist/schema/migrations/001_add_sessions_table.rb +2 -2
- data/lib/merb.rb +23 -18
- data/lib/merb/caching/fragment_cache.rb +3 -7
- data/lib/merb/caching/store/memcache.rb +20 -0
- data/lib/merb/core_ext/merb_array.rb +0 -0
- data/lib/merb/core_ext/merb_class.rb +44 -4
- data/lib/merb/core_ext/merb_enumerable.rb +43 -1
- data/lib/merb/core_ext/merb_hash.rb +200 -122
- data/lib/merb/core_ext/merb_kernel.rb +2 -0
- data/lib/merb/core_ext/merb_module.rb +41 -0
- data/lib/merb/core_ext/merb_numeric.rb +57 -5
- data/lib/merb/core_ext/merb_object.rb +172 -6
- data/lib/merb/generators/merb_app/merb_app.rb +15 -9
- data/lib/merb/merb_abstract_controller.rb +193 -0
- data/lib/merb/merb_constants.rb +26 -1
- data/lib/merb/merb_controller.rb +143 -234
- data/lib/merb/merb_dispatcher.rb +28 -20
- data/lib/merb/merb_drb_server.rb +2 -3
- data/lib/merb/merb_exceptions.rb +194 -49
- data/lib/merb/merb_handler.rb +34 -26
- data/lib/merb/merb_mail_controller.rb +200 -0
- data/lib/merb/merb_mailer.rb +33 -13
- data/lib/merb/merb_part_controller.rb +42 -0
- data/lib/merb/merb_plugins.rb +293 -0
- data/lib/merb/merb_request.rb +6 -4
- data/lib/merb/merb_router.rb +99 -65
- data/lib/merb/merb_server.rb +65 -21
- data/lib/merb/merb_upload_handler.rb +2 -1
- data/lib/merb/merb_view_context.rb +36 -15
- data/lib/merb/mixins/basic_authentication_mixin.rb +5 -5
- data/lib/merb/mixins/controller_mixin.rb +67 -28
- data/lib/merb/mixins/erubis_capture_mixin.rb +1 -8
- data/lib/merb/mixins/form_control_mixin.rb +280 -42
- data/lib/merb/mixins/render_mixin.rb +127 -45
- data/lib/merb/mixins/responder_mixin.rb +5 -7
- data/lib/merb/mixins/view_context_mixin.rb +260 -94
- data/lib/merb/session.rb +23 -0
- data/lib/merb/session/merb_ar_session.rb +28 -16
- data/lib/merb/session/merb_mem_cache_session.rb +108 -0
- data/lib/merb/session/merb_memory_session.rb +65 -20
- data/lib/merb/template/erubis.rb +22 -13
- data/lib/merb/template/haml.rb +5 -16
- data/lib/merb/template/markaby.rb +5 -3
- data/lib/merb/template/xml_builder.rb +17 -5
- data/lib/merb/test/merb_fake_request.rb +63 -0
- data/lib/merb/test/merb_multipart.rb +58 -0
- data/lib/tasks/db.rake +2 -0
- data/lib/tasks/merb.rake +20 -8
- metadata +24 -25
- data/examples/skeleton.tar +0 -0
data/lib/merb/merb_request.rb
CHANGED
@@ -13,7 +13,9 @@ module Merb
|
|
13
13
|
@request.read
|
14
14
|
end
|
15
15
|
|
16
|
-
#
|
16
|
+
# Returns true if the request is an Ajax request.
|
17
|
+
#
|
18
|
+
# Also aliased as the more memorable ajax? and xhr?.
|
17
19
|
def xml_http_request?
|
18
20
|
not /XMLHttpRequest/i.match(@env['HTTP_X_REQUESTED_WITH']).nil?
|
19
21
|
end
|
@@ -24,15 +26,15 @@ module Merb
|
|
24
26
|
def remote_ip
|
25
27
|
return @env['HTTP_CLIENT_IP'] if @env.include?('HTTP_CLIENT_IP')
|
26
28
|
|
27
|
-
if @env.include?(
|
28
|
-
remote_ips = @env[
|
29
|
+
if @env.include?(Merb::Const::HTTP_X_FORWARDED_FOR) then
|
30
|
+
remote_ips = @env[Merb::Const::HTTP_X_FORWARDED_FOR].split(',').reject do |ip|
|
29
31
|
ip =~ /^unknown$|^(127|10|172\.16|192\.168)\./i
|
30
32
|
end
|
31
33
|
|
32
34
|
return remote_ips.first.strip unless remote_ips.empty?
|
33
35
|
end
|
34
36
|
|
35
|
-
return @env[
|
37
|
+
return @env[Merb::Const::REMOTE_ADDR]
|
36
38
|
end
|
37
39
|
|
38
40
|
# returns either 'https://' or 'http://' depending on
|
data/lib/merb/merb_router.rb
CHANGED
@@ -6,7 +6,7 @@ module Merb
|
|
6
6
|
|
7
7
|
class << self
|
8
8
|
|
9
|
-
def prepare
|
9
|
+
def prepare
|
10
10
|
@@matcher = RouteMatcher.new
|
11
11
|
@@generator = RouteGenerator.new
|
12
12
|
|
@@ -31,8 +31,8 @@ module Merb
|
|
31
31
|
@@matcher.route_request(path)
|
32
32
|
end
|
33
33
|
|
34
|
-
def generate(method,
|
35
|
-
@@generator.generate(method,
|
34
|
+
def generate(method, *args)
|
35
|
+
@@generator.generate(method, *args)
|
36
36
|
end
|
37
37
|
|
38
38
|
def resources(res, opts={})
|
@@ -57,8 +57,8 @@ module Merb
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
def default_routes
|
61
|
-
@@matcher.default_routes
|
60
|
+
def default_routes(*a)
|
61
|
+
@@matcher.default_routes(*a)
|
62
62
|
end
|
63
63
|
|
64
64
|
def compiled_statement
|
@@ -80,32 +80,33 @@ module Merb
|
|
80
80
|
end # class << self
|
81
81
|
|
82
82
|
class RouteMatcher
|
83
|
-
|
83
|
+
attr_reader :routes, :compiled_statement, :compiled_regexen
|
84
|
+
|
84
85
|
def initialize
|
85
86
|
@routes = Array.new
|
87
|
+
# The final compiled lambda that gets used as the body of the route_request method.
|
86
88
|
@compiled_statement = String.new
|
87
89
|
@compiled_regexen = Array.new
|
88
90
|
end
|
89
91
|
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
92
|
+
# Add a route to be compiled.
|
93
|
+
def add(*route)
|
94
|
+
opt = Hash === route.last ? route.pop : {}
|
95
|
+
if n = opt[:namespace]
|
96
|
+
path = "/#{n}#{route[0]}"
|
97
|
+
else
|
98
|
+
path = route[0]
|
99
|
+
end
|
100
|
+
@routes << [path, opt]
|
94
101
|
end
|
95
102
|
|
96
|
-
def
|
97
|
-
@
|
98
|
-
end
|
99
|
-
|
100
|
-
# add a route to be compiled
|
101
|
-
def add(*route)
|
102
|
-
@routes << [route[0], (route[1] || {})]
|
103
|
+
def raw_add(*route)
|
104
|
+
@routes << [route[0], (route[1]||{})]
|
103
105
|
end
|
104
106
|
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
# first route that matches wins.
|
107
|
+
# Build up a string that defines a lambda that does a case statement on
|
108
|
+
# the PATH_INFO against each of the compiled routes in turn. First route
|
109
|
+
# that matches wins.
|
109
110
|
def compile_router
|
110
111
|
router_lambda = @routes.inject("lambda{|path| \n sections={}\n case path\n") { |m,r|
|
111
112
|
m << compile(r)
|
@@ -114,11 +115,10 @@ module Merb
|
|
114
115
|
meta_def(:route_request, &eval(router_lambda))
|
115
116
|
end
|
116
117
|
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
121
|
-
# the route in question.
|
118
|
+
# Compile each individual route into a when /.../ component of the case
|
119
|
+
# statement. Takes /:sections of the route def that start with : and
|
120
|
+
# turns them into placeholders for whatever urls match against the route
|
121
|
+
# in question.
|
122
122
|
def compile(route)
|
123
123
|
raise ArgumentError unless String === route[0]
|
124
124
|
code, count = '', 0
|
@@ -143,45 +143,48 @@ module Merb
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def generate_resources_routes(res,opt)
|
146
|
-
with_options :controller => res.to_s, :rest => true do |r|
|
147
|
-
r.
|
148
|
-
r.
|
149
|
-
r.
|
146
|
+
with_options opt.merge(:controller => res.to_s, :rest => true) do |r|
|
147
|
+
r.raw_add "#{opt[:prefix]}/#{res}/:id[;/]edit", :allowed => {:get => 'edit'}
|
148
|
+
r.raw_add "#{opt[:prefix]}/#{res}/new[;/]:action", :allowed => {:get => 'new', :post => 'new', :put => 'new', :delete => 'new'}
|
149
|
+
r.raw_add "#{opt[:prefix]}/#{res}/new" , :allowed => {:get => 'new'}
|
150
150
|
if mem = opt[:member]
|
151
151
|
mem.keys.sort_by{|x| "#{x}"}.each {|action|
|
152
152
|
allowed = mem[action].injecting({}) {|h, verb| h[verb] = "#{action}"}
|
153
|
-
r.
|
153
|
+
r.raw_add "#{opt[:prefix]}/#{res}/:id[;/]+#{action}", :allowed => allowed
|
154
154
|
}
|
155
155
|
end
|
156
156
|
if coll = opt[:collection]
|
157
157
|
coll.keys.sort_by{|x| "#{x}"}.each {|action|
|
158
158
|
allowed = coll[action].injecting({}) {|h, verb| h[verb] = "#{action}"}
|
159
|
-
r.
|
159
|
+
r.raw_add "#{opt[:prefix]}/#{res}[;/]#{action}", :allowed => allowed
|
160
160
|
}
|
161
161
|
end
|
162
|
-
r.
|
163
|
-
r.
|
164
|
-
r.
|
165
|
-
r.
|
162
|
+
r.raw_add "#{opt[:prefix]}/#{res}/:id\\.:format", :allowed => {:get => 'show', :put => 'update', :delete => 'destroy'}
|
163
|
+
r.raw_add "#{opt[:prefix]}/#{res}\\.:format", :allowed => {:get => 'index', :post => 'create'}
|
164
|
+
r.raw_add "#{opt[:prefix]}/#{res}/:id", :allowed => {:get => 'show', :put => 'update', :delete => 'destroy'}
|
165
|
+
r.raw_add "#{opt[:prefix]}/#{res}/?", :allowed => {:get => 'index', :post => 'create'}
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
169
169
|
def generate_singleton_routes(res,opt)
|
170
|
-
with_options :controller => res.to_s, :rest => true do |r|
|
171
|
-
r.
|
172
|
-
r.
|
173
|
-
r.
|
174
|
-
r.
|
170
|
+
with_options opt.merge(:controller => res.to_s, :rest => true ) do |r|
|
171
|
+
r.raw_add "#{opt[:prefix]}/#{res}[;/]edit", :allowed => {:get => 'edit'}
|
172
|
+
r.raw_add "#{opt[:prefix]}/#{res}\\.:format", :allowed => {:get => 'show'}
|
173
|
+
r.raw_add "#{opt[:prefix]}/#{res}/new" , :allowed => {:get => 'new'}
|
174
|
+
r.raw_add "#{opt[:prefix]}/#{res}/?", :allowed => {:get => 'show', :post => 'create', :put => 'update', :delete => 'destroy'}
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
-
def default_routes
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
178
|
+
def default_routes(opt={})
|
179
|
+
namespace = opt[:namespace] ? "/#{opt[:namespace]}" : ""
|
180
|
+
with_options opt do |r|
|
181
|
+
r.raw_add namespace + "/:controller/:action/:id\\.:format"
|
182
|
+
r.raw_add namespace + "/:controller/:action/:id"
|
183
|
+
r.raw_add namespace + "/:controller/:action\\.:format"
|
184
|
+
r.raw_add namespace + "/:controller/:action"
|
185
|
+
r.raw_add namespace + "/:controller\\.:format", :action => 'index'
|
186
|
+
r.raw_add namespace + "/:controller", :action => 'index'
|
187
|
+
end
|
185
188
|
end
|
186
189
|
end
|
187
190
|
|
@@ -194,14 +197,29 @@ module Merb
|
|
194
197
|
end
|
195
198
|
|
196
199
|
def add(name, path)
|
197
|
-
name =
|
198
|
-
@paths[name] = path
|
200
|
+
@paths[name.to_sym] = path
|
199
201
|
end
|
200
|
-
|
201
|
-
def generate(name,
|
202
|
+
|
203
|
+
def generate(name, *args)
|
204
|
+
options = Hash === args.last ? args.pop : {}
|
205
|
+
obj = args[0]
|
206
|
+
options.each do |key, value|
|
207
|
+
next unless value.respond_to?(:to_param)
|
208
|
+
unless key.to_s =~ /_?id$/
|
209
|
+
old_key = key
|
210
|
+
options[old_key] = value.to_param
|
211
|
+
key = "#{key}_id".intern
|
212
|
+
end
|
213
|
+
options[key] = value.to_param
|
214
|
+
end
|
215
|
+
|
202
216
|
path = @paths[name].dup
|
203
217
|
while path =~ Router::SECTION_REGEXP
|
204
|
-
|
218
|
+
if obj.respond_to?($1) && ! obj.nil?
|
219
|
+
path.sub!(Router::SECTION_REGEXP, obj.send($1).to_s)
|
220
|
+
else
|
221
|
+
path.sub!(Router::SECTION_REGEXP, options[$1.intern].to_s)
|
222
|
+
end
|
205
223
|
end
|
206
224
|
if f = options[:format]
|
207
225
|
"#{path}.#{f}"
|
@@ -209,28 +227,44 @@ module Merb
|
|
209
227
|
path
|
210
228
|
end
|
211
229
|
end
|
212
|
-
|
230
|
+
|
213
231
|
def generate_singleton_routes(res,opt)
|
214
|
-
|
215
|
-
|
216
|
-
|
232
|
+
res = res.to_s
|
233
|
+
if opt[:namespace]
|
234
|
+
namespace = "#{opt[:namespace]}_"
|
235
|
+
name = "/#{opt[:namespace]}"
|
236
|
+
else
|
237
|
+
namespace = ''
|
238
|
+
name = ''
|
239
|
+
end
|
240
|
+
add namespace + "edit_#{res}", name + "#{opt[:prefix]}/#{res}/edit"
|
241
|
+
add namespace + "new_#{res}", name + "#{opt[:prefix]}/#{res}/new"
|
242
|
+
add namespace + res, name + "#{opt[:prefix]}/#{res}"
|
217
243
|
end
|
218
244
|
|
219
245
|
def generate_resources_routes(res,opt)
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
246
|
+
res = res.to_s
|
247
|
+
res_singular = res.singularize
|
248
|
+
if opt[:namespace]
|
249
|
+
namespace = "#{opt[:namespace]}_"
|
250
|
+
name = "/#{opt[:namespace]}"
|
251
|
+
else
|
252
|
+
namespace = ''
|
253
|
+
name = ''
|
254
|
+
end
|
255
|
+
add namespace + res, name + "#{opt[:prefix]}/#{res}"
|
256
|
+
add namespace + res_singular, name + "#{opt[:prefix]}/#{res}/:id"
|
257
|
+
add namespace + "new_#{res_singular}", name + "#{opt[:prefix]}/#{res}/new"
|
258
|
+
add namespace + "custom_new_#{res_singular}", name + "#{opt[:prefix]}/#{res}/new/:action"
|
259
|
+
add namespace + "edit_#{res_singular}", name + "#{opt[:prefix]}/#{res}/:id/edit"
|
226
260
|
if mem = opt[:member]
|
227
261
|
mem.keys.sort_by{|x| "#{x}"}.each {|action|
|
228
|
-
add "#{action}_#{res_singular}", "#{opt[:prefix]}/#{res}/:id/#{action}"
|
262
|
+
add namespace + "#{action}_#{res_singular}", name + "#{opt[:prefix]}/#{res}/:id/#{action}"
|
229
263
|
}
|
230
264
|
end
|
231
265
|
if coll = opt[:collection]
|
232
266
|
coll.keys.sort_by{|x| "#{x}"}.each {|action|
|
233
|
-
add "#{action}_#{res_singular}", "#{opt[:prefix]}/#{res}/#{action}"
|
267
|
+
add namespace + "#{action}_#{res_singular}", name + "#{opt[:prefix]}/#{res}/#{action}"
|
234
268
|
}
|
235
269
|
end
|
236
270
|
end
|
data/lib/merb/merb_server.rb
CHANGED
@@ -15,7 +15,9 @@ module Merb
|
|
15
15
|
:allow_reloading => true,
|
16
16
|
:merb_root => Dir.pwd,
|
17
17
|
:cache_templates => false,
|
18
|
-
:use_mutex => true
|
18
|
+
:use_mutex => true,
|
19
|
+
:session_id_cookie_only => true,
|
20
|
+
:query_string_whitelist => []
|
19
21
|
}
|
20
22
|
begin
|
21
23
|
options = defaults.merge(YAML.load(Erubis::Eruby.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
|
@@ -36,9 +38,9 @@ module Merb
|
|
36
38
|
|
37
39
|
opts = OptionParser.new do |opts|
|
38
40
|
opts.banner = "Usage: merb [fdcepghmisluMG] [argument]"
|
39
|
-
opts.define_head "Merb Mongrel+ Erb. Lightweight replacement for ActionPack"
|
41
|
+
opts.define_head "Merb Mongrel+ Erb. Lightweight replacement for ActionPack."
|
40
42
|
opts.separator '*'*80
|
41
|
-
opts.separator 'If no flags are given, Merb starts in the foreground on port 4000'
|
43
|
+
opts.separator 'If no flags are given, Merb starts in the foreground on port 4000.'
|
42
44
|
opts.separator '*'*80
|
43
45
|
|
44
46
|
opts.on("-u", "--user USER", "This flag is for having merb run as a user other than the one currently logged in. Note: if you set this you must also provide a --group option for it to take effect.") do |config|
|
@@ -49,27 +51,27 @@ module Merb
|
|
49
51
|
options[:group] = config
|
50
52
|
end
|
51
53
|
|
52
|
-
opts.on("-f", "--config-file FILENAME", "This flag is for adding extra config files for things like the upload progress module") do |config|
|
54
|
+
opts.on("-f", "--config-file FILENAME", "This flag is for adding extra config files for things like the upload progress module.") do |config|
|
53
55
|
options[:config] = config
|
54
56
|
end
|
55
57
|
|
56
|
-
opts.on("-d", "--daemonize", "This will run a single merb in the background") do |config|
|
58
|
+
opts.on("-d", "--daemonize", "This will run a single merb in the background.") do |config|
|
57
59
|
options[:daemonize] = true
|
58
60
|
end
|
59
61
|
|
60
|
-
opts.on("-c", "--cluster-nodes NUM_MERBS", "Number of merb daemons to run") do |nodes|
|
62
|
+
opts.on("-c", "--cluster-nodes NUM_MERBS", "Number of merb daemons to run.") do |nodes|
|
61
63
|
options[:cluster] = nodes
|
62
64
|
end
|
63
65
|
|
64
|
-
opts.on("-p", "--port PORTNUM", "Port to run merb on, defaults to 4000") do |port|
|
66
|
+
opts.on("-p", "--port PORTNUM", "Port to run merb on, defaults to 4000.") do |port|
|
65
67
|
options[:port] = port
|
66
68
|
end
|
67
69
|
|
68
|
-
opts.on("-h", "--host HOSTNAME", "Host to bind to(default is all IP's)") do |host|
|
70
|
+
opts.on("-h", "--host HOSTNAME", "Host to bind to (default is all IP's).") do |host|
|
69
71
|
options[:host] = host
|
70
72
|
end
|
71
73
|
|
72
|
-
opts.on("-m", "--merb-root MERB_ROOT", "
|
74
|
+
opts.on("-m", "--merb-root MERB_ROOT", "The path to the MERB_ROOT for the app you want to run (default is current working dir).") do |merb_root|
|
73
75
|
options[:merb_root] = File.expand_path(merb_root)
|
74
76
|
end
|
75
77
|
|
@@ -77,7 +79,7 @@ module Merb
|
|
77
79
|
options[:console] = true
|
78
80
|
end
|
79
81
|
|
80
|
-
opts.on("-s", "--start-drb PORTNUM", "This is the port number to run the drb daemon on for sessions and
|
82
|
+
opts.on("-s", "--start-drb PORTNUM", "This is the port number to run the drb daemon on for sessions and upload progress monitoring.") do |drb_port|
|
81
83
|
options[:start_drb] = true
|
82
84
|
options[:only_drb] = true
|
83
85
|
options[:drb_server_port] = drb_port
|
@@ -91,19 +93,23 @@ module Merb
|
|
91
93
|
options[:environment] = env
|
92
94
|
end
|
93
95
|
|
94
|
-
opts.on("-r", "--script-runner ['RUBY CODE'| FULL_SCRIPT_PATH]", "Command-line option to run scripts and/or code in the merb app") do |stuff_to_run|
|
96
|
+
opts.on("-r", "--script-runner ['RUBY CODE'| FULL_SCRIPT_PATH]", "Command-line option to run scripts and/or code in the merb app.") do |stuff_to_run|
|
95
97
|
options[:runner] = stuff_to_run
|
96
98
|
end
|
97
99
|
|
98
|
-
opts.on("-g", "--generate-app PATH", "Generate a fresh merb app at PATH") do |path|
|
100
|
+
opts.on("-g", "--generate-app PATH", "Generate a fresh merb app at PATH.") do |path|
|
99
101
|
options[:generate] = path || Dir.pwd
|
100
102
|
end
|
101
103
|
|
102
|
-
opts.on("-
|
104
|
+
opts.on("-P", "--plugin ACTION NAME", "Do ACTION with a plugin called NAME.") do |action|
|
105
|
+
options[:plugin] = [action, ARGV] || nil
|
106
|
+
end
|
107
|
+
|
108
|
+
opts.on("-k", "--kill PORT or all", "Kill one merb proceses by port number. use merb -k all to kill all merbs.") do |ports|
|
103
109
|
options[:kill] = ports
|
104
110
|
end
|
105
111
|
|
106
|
-
opts.on("-M", "--merb-config FILENAME", "This flag is for explicitly declaring the merb app's config file") do |config|
|
112
|
+
opts.on("-M", "--merb-config FILENAME", "This flag is for explicitly declaring the merb app's config file.") do |config|
|
107
113
|
options[:merb_config] = config
|
108
114
|
end
|
109
115
|
|
@@ -131,9 +137,28 @@ module Merb
|
|
131
137
|
# or if we add :merb_root: /path/to/merb/app in the merb.yml we can now only call it
|
132
138
|
# like so: merb --merb-config /path/to/dist/conf/merb.yml
|
133
139
|
if options[:merb_config]
|
140
|
+
# Check and see if an environment has been set through the CLI
|
141
|
+
# if so, save it in a temp. In this case, if merb.yml has an :environment:
|
142
|
+
# set... it will be overwritten by the CLI. [Rogelio J. Samour] 2007-06-07
|
143
|
+
if options[:environment]
|
144
|
+
temp_env = options[:environment]
|
145
|
+
end
|
134
146
|
options = options.merge(YAML.load(Erubis::Eruby.new(IO.read("#{options[:merb_config]}")).result))
|
147
|
+
if temp_env
|
148
|
+
options[:environment] = temp_env
|
149
|
+
end
|
135
150
|
end
|
136
151
|
|
152
|
+
if ENV['MERB_ENV']
|
153
|
+
# ENV['MERB_ENV'] has precedence over all
|
154
|
+
options[:environment] = ENV['MERB_ENV']
|
155
|
+
end
|
156
|
+
|
157
|
+
# Finally, if all else fails... set the environment to 'development'
|
158
|
+
if options[:environment].nil?
|
159
|
+
options[:environment] = 'development'
|
160
|
+
end
|
161
|
+
|
137
162
|
@@merb_opts = options
|
138
163
|
end
|
139
164
|
|
@@ -141,6 +166,7 @@ module Merb
|
|
141
166
|
require 'merb'
|
142
167
|
require @@merb_opts[:merb_root] / 'dist/conf/router.rb'
|
143
168
|
require @@merb_opts[:merb_root] / 'dist/conf/merb_init.rb'
|
169
|
+
|
144
170
|
end
|
145
171
|
|
146
172
|
def run
|
@@ -180,8 +206,8 @@ module Merb
|
|
180
206
|
end
|
181
207
|
|
182
208
|
@@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
|
183
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
|
184
209
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/models') )
|
210
|
+
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
|
185
211
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/lib') )
|
186
212
|
if File.exist? File.join(@@merb_opts[:dist_root] , '/framework')
|
187
213
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/framework') )
|
@@ -193,17 +219,35 @@ module Merb
|
|
193
219
|
exit!
|
194
220
|
end
|
195
221
|
|
222
|
+
if @@merb_opts[:plugin]
|
223
|
+
require 'merb/merb_plugins'
|
224
|
+
::Merb::PluginManager.action(@@merb_opts[:plugin].shift, @@merb_opts[:plugin][0].shift, @@merb_opts[:plugin])
|
225
|
+
exit!
|
226
|
+
end
|
227
|
+
|
196
228
|
if @@merb_opts[:console]
|
197
229
|
initialize_merb
|
198
|
-
|
199
|
-
def show_routes
|
200
|
-
|
230
|
+
_merb = Class.new do
|
231
|
+
def self.show_routes(all_opts = false)
|
232
|
+
puts "== show_routes(all_opts = #{all_opts}) =="
|
233
|
+
puts "RouteMatcher:"
|
234
|
+
Merb::Router.matcher.routes.each {|route,opts| puts " #{route}" + (all_opts ? " " + opts.inspect : "") }
|
235
|
+
puts
|
236
|
+
puts "RouteGenerator:"
|
237
|
+
# Sort alphabetically by the url part of the route for easier reading.
|
238
|
+
Merb::Router.generator.paths.sort {|a,b| a.last <=> b.last }.each {|p| puts " " + p.inspect}
|
201
239
|
nil
|
202
240
|
end
|
203
|
-
|
204
|
-
|
241
|
+
|
242
|
+
def self.url(path, *args)
|
243
|
+
Merb::Router.generate(path,*args)
|
205
244
|
end
|
206
245
|
end
|
246
|
+
|
247
|
+
Object.send(:define_method, :merb) {
|
248
|
+
_merb
|
249
|
+
}
|
250
|
+
|
207
251
|
ARGV.clear # Avoid passing args to IRB
|
208
252
|
require 'irb'
|
209
253
|
require 'irb/completion'
|
@@ -306,7 +350,7 @@ module Merb
|
|
306
350
|
listener do
|
307
351
|
uri( "/", :handler => MerbUploadHandler.new(yconfig), :in_front => true) if @@merb_opts[:config]
|
308
352
|
uri "/", :handler => MerbHandler.new(@@merb_opts[:dist_root]+'/public')
|
309
|
-
uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
|
353
|
+
uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
|
310
354
|
end
|
311
355
|
|
312
356
|
trap("INT") { stop }
|