merb 0.3.7 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +25 -26
- data/Rakefile +48 -36
- data/app_generators/merb/USAGE +5 -0
- data/app_generators/merb/merb_generator.rb +107 -0
- data/app_generators/merb/templates/Rakefile +99 -0
- data/{examples/skeleton/dist → app_generators/merb/templates}/app/controllers/application.rb +1 -1
- data/app_generators/merb/templates/app/controllers/exceptions.rb +13 -0
- data/{examples/skeleton/dist → app_generators/merb/templates}/app/helpers/global_helper.rb +0 -0
- data/{examples/skeleton/dist/app/mailers → app_generators/merb/templates/app/mailers/views}/layout/application.erb +0 -0
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +207 -0
- data/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb +38 -0
- data/app_generators/merb/templates/app/views/exceptions/not_found.html.erb +40 -0
- data/app_generators/merb/templates/app/views/layout/application.html.erb +11 -0
- data/app_generators/merb/templates/config/boot.rb +11 -0
- data/app_generators/merb/templates/config/dependencies.rb +41 -0
- data/{examples/skeleton/dist/conf → app_generators/merb/templates/config}/environments/development.rb +0 -0
- data/{examples/skeleton/dist/conf → app_generators/merb/templates/config}/environments/production.rb +0 -0
- data/{examples/skeleton/dist/conf → app_generators/merb/templates/config}/environments/test.rb +0 -0
- data/app_generators/merb/templates/config/merb.yml +64 -0
- data/app_generators/merb/templates/config/merb_init.rb +16 -0
- data/app_generators/merb/templates/config/plugins.yml +1 -0
- data/app_generators/merb/templates/config/router.rb +32 -0
- data/{lib/merb/core_ext/merb_array.rb → app_generators/merb/templates/config/upload.conf} +0 -0
- data/app_generators/merb/templates/public/images/merb.jpg +0 -0
- data/app_generators/merb/templates/public/merb.fcgi +6 -0
- data/app_generators/merb/templates/public/stylesheets/master.css +119 -0
- data/app_generators/merb/templates/script/destroy +28 -0
- data/app_generators/merb/templates/script/generate +28 -0
- data/{examples/skeleton → app_generators/merb/templates}/script/stop_merb +0 -0
- data/app_generators/merb/templates/script/win_script.cmd +1 -0
- data/app_generators/merb/templates/spec/spec.opts +6 -0
- data/app_generators/merb/templates/spec/spec_helper.rb +10 -0
- data/app_generators/merb/templates/test/test_helper.rb +13 -0
- data/app_generators/merb_plugin/USAGE +5 -0
- data/app_generators/merb_plugin/merb_plugin_generator.rb +64 -0
- data/app_generators/merb_plugin/templates/LICENSE +20 -0
- data/app_generators/merb_plugin/templates/README +4 -0
- data/app_generators/merb_plugin/templates/Rakefile +35 -0
- data/app_generators/merb_plugin/templates/TODO +5 -0
- data/app_generators/merb_plugin/templates/merbtasks.rb +6 -0
- data/app_generators/merb_plugin/templates/sampleplugin.rb +10 -0
- data/app_generators/merb_plugin/templates/sampleplugin_spec.rb +7 -0
- data/app_generators/merb_plugin/templates/spec_helper.rb +2 -0
- data/bin/merb +1 -1
- data/lib/autotest/discover.rb +3 -0
- data/lib/autotest/merb_rspec.rb +79 -0
- data/lib/merb.rb +72 -93
- data/lib/merb/{merb_abstract_controller.rb → abstract_controller.rb} +28 -5
- data/lib/merb/caching/action_cache.rb +65 -29
- data/lib/merb/caching/fragment_cache.rb +9 -4
- data/lib/merb/caching/store/file_cache.rb +22 -14
- data/lib/merb/caching/store/memory_cache.rb +26 -8
- data/lib/merb/{merb_constants.rb → constants.rb} +9 -7
- data/lib/merb/controller.rb +178 -0
- data/lib/merb/core_ext.rb +13 -11
- data/lib/merb/core_ext/array.rb +0 -0
- data/lib/merb/core_ext/{merb_class.rb → class.rb} +0 -0
- data/lib/merb/core_ext/{merb_enumerable.rb → enumerable.rb} +0 -0
- data/lib/merb/core_ext/get_args.rb +52 -0
- data/lib/merb/core_ext/{merb_hash.rb → hash.rb} +40 -11
- data/lib/merb/core_ext/{merb_inflections.rb → inflections.rb} +0 -0
- data/lib/merb/core_ext/{merb_inflector.rb → inflector.rb} +1 -1
- data/lib/merb/core_ext/{merb_kernel.rb → kernel.rb} +56 -3
- data/lib/merb/core_ext/mash.rb +88 -0
- data/lib/merb/core_ext/{merb_module.rb → module.rb} +0 -0
- data/lib/merb/core_ext/{merb_numeric.rb → numeric.rb} +0 -0
- data/lib/merb/core_ext/{merb_object.rb → object.rb} +10 -47
- data/lib/merb/core_ext/string.rb +56 -0
- data/lib/merb/core_ext/{merb_symbol.rb → symbol.rb} +0 -0
- data/lib/merb/dispatcher.rb +109 -0
- data/lib/merb/{merb_drb_server.rb → drb_server.rb} +0 -0
- data/lib/merb/erubis_ext.rb +10 -0
- data/lib/merb/exceptions.rb +173 -0
- data/lib/merb/generators/merb_app/merb_app.rb +5 -25
- data/lib/merb/generators/merb_generator_helpers.rb +317 -0
- data/lib/merb/generators/merb_plugin.rb +19 -0
- data/lib/merb/logger.rb +65 -0
- data/lib/merb/{merb_mail_controller.rb → mail_controller.rb} +102 -49
- data/lib/merb/{merb_mailer.rb → mailer.rb} +31 -27
- data/lib/merb/mixins/{basic_authentication_mixin.rb → basic_authentication.rb} +3 -3
- data/lib/merb/mixins/{controller_mixin.rb → controller.rb} +131 -112
- data/lib/merb/mixins/{erubis_capture_mixin.rb → erubis_capture.rb} +12 -21
- data/lib/merb/mixins/{form_control_mixin.rb → form_control.rb} +6 -12
- data/lib/merb/mixins/render.rb +401 -0
- data/lib/merb/mixins/responder.rb +378 -0
- data/lib/merb/mixins/{view_context_mixin.rb → view_context.rb} +65 -10
- data/lib/merb/mixins/web_controller.rb +29 -0
- data/lib/merb/{merb_handler.rb → mongrel_handler.rb} +59 -38
- data/lib/merb/part_controller.rb +19 -0
- data/lib/merb/plugins.rb +16 -0
- data/lib/merb/rack_adapter.rb +37 -0
- data/lib/merb/request.rb +421 -0
- data/lib/merb/router.rb +576 -0
- data/lib/merb/{merb_server.rb → server.rb} +275 -71
- data/lib/merb/session.rb +10 -10
- data/lib/merb/session/cookie_store.rb +125 -0
- data/lib/merb/session/{merb_mem_cache_session.rb → mem_cache_session.rb} +22 -9
- data/lib/merb/session/{merb_memory_session.rb → memory_session.rb} +15 -11
- data/lib/merb/template.rb +35 -8
- data/lib/merb/template/erubis.rb +16 -10
- data/lib/merb/template/haml.rb +33 -20
- data/lib/merb/template/markaby.rb +16 -14
- data/lib/merb/template/xml_builder.rb +8 -4
- data/lib/merb/test/{merb_fake_request.rb → fake_request.rb} +11 -5
- data/lib/merb/test/helper.rb +31 -0
- data/lib/merb/test/hpricot.rb +136 -0
- data/lib/merb/test/{merb_multipart.rb → multipart.rb} +1 -1
- data/lib/merb/test/rspec.rb +93 -0
- data/lib/merb/{merb_upload_handler.rb → upload_handler.rb} +5 -6
- data/lib/merb/{merb_upload_progress.rb → upload_progress.rb} +1 -1
- data/lib/merb/{merb_view_context.rb → view_context.rb} +27 -42
- data/lib/{merb_tasks.rb → tasks.rb} +0 -0
- data/lib/tasks/merb.rake +21 -11
- data/merb_default_generators/model/USAGE +0 -0
- data/merb_default_generators/model/model_generator.rb +16 -0
- data/merb_default_generators/model/templates/new_model_template.erb +5 -0
- data/merb_default_generators/resource_controller/USAGE +0 -0
- data/merb_default_generators/resource_controller/resource_controller_generator.rb +26 -0
- data/merb_default_generators/resource_controller/templates/controller.rb +30 -0
- data/merb_default_generators/resource_controller/templates/edit.html.erb +1 -0
- data/merb_default_generators/resource_controller/templates/helper.rb +5 -0
- data/merb_default_generators/resource_controller/templates/index.html.erb +1 -0
- data/merb_default_generators/resource_controller/templates/new.html.erb +1 -0
- data/merb_default_generators/resource_controller/templates/show.html.erb +1 -0
- data/merb_generators/controller/USAGE +5 -0
- data/merb_generators/controller/controller_generator.rb +16 -0
- data/merb_generators/controller/templates/controller.rb +8 -0
- data/merb_generators/controller/templates/helper.rb +5 -0
- data/merb_generators/controller/templates/index.html.erb +3 -0
- data/merb_generators/resource/USAGE +0 -0
- data/merb_generators/resource/resource_generator.rb +60 -0
- data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +67 -0
- data/rspec_generators/merb_controller_test/templates/controller_spec.rb +8 -0
- data/rspec_generators/merb_controller_test/templates/edit_spec.rb +12 -0
- data/rspec_generators/merb_controller_test/templates/helper_spec.rb +5 -0
- data/rspec_generators/merb_controller_test/templates/index_spec.rb +12 -0
- data/rspec_generators/merb_controller_test/templates/new_spec.rb +12 -0
- data/rspec_generators/merb_controller_test/templates/show_spec.rb +5 -0
- data/rspec_generators/merb_model_test/merb_model_test_generator.rb +26 -0
- data/rspec_generators/merb_model_test/templates/model_spec_template.erb +7 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb +53 -0
- data/test_unit_generators/merb_controller_test/templates/functional_test.rb +17 -0
- data/test_unit_generators/merb_controller_test/templates/helper_test.rb +9 -0
- data/test_unit_generators/merb_model_test/merb_model_test_generator.rb +29 -0
- data/test_unit_generators/merb_model_test/templates/model_test_unit_template.erb +9 -0
- metadata +172 -94
- data/examples/README_EXAMPLES +0 -10
- data/examples/skeleton/Rakefile +0 -68
- data/examples/skeleton/dist/app/views/layout/application.herb +0 -12
- data/examples/skeleton/dist/conf/database.yml +0 -23
- data/examples/skeleton/dist/conf/merb.yml +0 -57
- data/examples/skeleton/dist/conf/merb_init.rb +0 -24
- data/examples/skeleton/dist/conf/router.rb +0 -22
- data/examples/skeleton/dist/conf/upload.conf +0 -5
- data/examples/skeleton/dist/schema/migrations/001_add_sessions_table.rb +0 -14
- data/examples/skeleton/script/new_migration +0 -21
- data/lib/merb/core_ext/merb_string.rb +0 -18
- data/lib/merb/merb_controller.rb +0 -206
- data/lib/merb/merb_dispatcher.rb +0 -87
- data/lib/merb/merb_exceptions.rb +0 -319
- data/lib/merb/merb_part_controller.rb +0 -42
- data/lib/merb/merb_plugins.rb +0 -293
- data/lib/merb/merb_request.rb +0 -165
- data/lib/merb/merb_router.rb +0 -309
- data/lib/merb/merb_yaml_store.rb +0 -31
- data/lib/merb/mixins/render_mixin.rb +0 -283
- data/lib/merb/mixins/responder_mixin.rb +0 -159
- data/lib/merb/session/merb_ar_session.rb +0 -131
- data/lib/merb/vendor/paginator/README.txt +0 -84
- data/lib/merb/vendor/paginator/paginator.rb +0 -124
- data/lib/tasks/db.rake +0 -55
@@ -3,29 +3,36 @@ require 'optparse'
|
|
3
3
|
require 'ostruct'
|
4
4
|
require 'fileutils'
|
5
5
|
require 'yaml'
|
6
|
-
require 'erubis'
|
7
6
|
|
8
7
|
module Merb
|
9
8
|
|
10
9
|
class Config
|
11
|
-
|
12
|
-
defaults
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
options = defaults.merge(YAML.load(Erubis::Eruby.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
|
24
|
-
rescue
|
25
|
-
options = defaults
|
10
|
+
class << self
|
11
|
+
def defaults
|
12
|
+
@defaults ||= {
|
13
|
+
:host => "0.0.0.0",
|
14
|
+
:port => "4000",
|
15
|
+
:reloader => true,
|
16
|
+
:merb_root => Dir.pwd,
|
17
|
+
:cache_templates => false,
|
18
|
+
:use_mutex => true,
|
19
|
+
:session_id_cookie_only => true,
|
20
|
+
:query_string_whitelist => []
|
21
|
+
}
|
26
22
|
end
|
27
23
|
|
28
|
-
|
24
|
+
def setup
|
25
|
+
if FileTest.exist? "#{defaults[:merb_root]}/framework"
|
26
|
+
$LOAD_PATH.unshift( "#{defaults[:merb_root]}/framework" )
|
27
|
+
end
|
28
|
+
merb_yml = "#{defaults[:merb_root]}/config/merb.yml"
|
29
|
+
if File.exists?(merb_yml)
|
30
|
+
require 'merb/erubis_ext'
|
31
|
+
defaults.merge(Erubis.load_yaml_file(merb_yml))
|
32
|
+
else
|
33
|
+
defaults
|
34
|
+
end
|
35
|
+
end
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
@@ -37,6 +44,9 @@ module Merb
|
|
37
44
|
options = Merb::Config.setup
|
38
45
|
|
39
46
|
opts = OptionParser.new do |opts|
|
47
|
+
opts.version = "0.4.0"
|
48
|
+
opts.release = "svn"
|
49
|
+
|
40
50
|
opts.banner = "Usage: merb [fdcepghmisluMG] [argument]"
|
41
51
|
opts.define_head "Merb Mongrel+ Erb. Lightweight replacement for ActionPack."
|
42
52
|
opts.separator '*'*80
|
@@ -66,7 +76,7 @@ module Merb
|
|
66
76
|
opts.on("-p", "--port PORTNUM", "Port to run merb on, defaults to 4000.") do |port|
|
67
77
|
options[:port] = port
|
68
78
|
end
|
69
|
-
|
79
|
+
|
70
80
|
opts.on("-h", "--host HOSTNAME", "Host to bind to (default is all IP's).") do |host|
|
71
81
|
options[:host] = host
|
72
82
|
end
|
@@ -93,26 +103,39 @@ module Merb
|
|
93
103
|
options[:environment] = env
|
94
104
|
end
|
95
105
|
|
96
|
-
opts.on("-r", "--script-runner ['RUBY CODE'| FULL_SCRIPT_PATH]",
|
106
|
+
opts.on("-r", "--script-runner ['RUBY CODE'| FULL_SCRIPT_PATH]",
|
107
|
+
"Command-line option to run scripts and/or code in the merb app.") do |stuff_to_run|
|
97
108
|
options[:runner] = stuff_to_run
|
98
109
|
end
|
99
|
-
|
110
|
+
|
100
111
|
opts.on("-g", "--generate-app PATH", "Generate a fresh merb app at PATH.") do |path|
|
101
112
|
options[:generate] = path || Dir.pwd
|
102
113
|
end
|
103
|
-
|
104
|
-
opts.on("-P",
|
105
|
-
options[:
|
114
|
+
|
115
|
+
opts.on("-P","--generate-plugin PATH", "Generate a fresh merb plugin at PATH.") do |path|
|
116
|
+
options[:generate_plugin] = path || Dir.pwd
|
106
117
|
end
|
107
|
-
|
108
|
-
opts.on("-k", "--kill PORT or all", "Kill one merb proceses by port number.
|
118
|
+
|
119
|
+
opts.on("-k", "--kill PORT or all", "Kill one merb proceses by port number. Use merb -k all to kill all merbs.") do |ports|
|
109
120
|
options[:kill] = ports
|
110
121
|
end
|
122
|
+
|
123
|
+
opts.on("-K", "--graceful PORT or all", "Gracefully kill one merb proceses by port number. Use merb -K all to gracefully kill all merbs.") do |ports|
|
124
|
+
options[:graceful] = ports
|
125
|
+
end
|
111
126
|
|
112
127
|
opts.on("-M", "--merb-config FILENAME", "This flag is for explicitly declaring the merb app's config file.") do |config|
|
113
128
|
options[:merb_config] = config
|
114
129
|
end
|
115
|
-
|
130
|
+
|
131
|
+
opts.on("-w", "--webrick", "Run merb using Webrick Rack Adapter instead of mongrel.") do |webport|
|
132
|
+
options[:webrick] = true
|
133
|
+
end
|
134
|
+
|
135
|
+
opts.on("-F", "--fastcgi", "Run merb using FastCGI Rack Adapter instead of mongrel.") do
|
136
|
+
options[:fastcgi] = true
|
137
|
+
end
|
138
|
+
|
116
139
|
opts.on("-X", "--mutex on/off", "This flag is for turning the mutex lock on and off.") do |mutex|
|
117
140
|
if mutex == 'off'
|
118
141
|
options[:use_mutex] = false
|
@@ -121,21 +144,29 @@ module Merb
|
|
121
144
|
end
|
122
145
|
end
|
123
146
|
|
124
|
-
opts.on("-?", "--help", "Show this help message") do
|
147
|
+
opts.on("-?", "-H", "--help", "Show this help message") do
|
125
148
|
puts opts
|
126
149
|
exit
|
127
|
-
end
|
128
|
-
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Special case of looking for help
|
154
|
+
if ARGV == ["-h"]
|
155
|
+
puts opts
|
156
|
+
exit
|
129
157
|
end
|
130
|
-
|
131
158
|
opts.parse!(@@merb_raw_opts)
|
159
|
+
# merb <argument> is same as merb -g <argument>
|
160
|
+
if ARGV.size == 1
|
161
|
+
options[:generate] = File.expand_path(ARGV.last)
|
162
|
+
end
|
132
163
|
|
133
164
|
# Added by: Rogelio J. Samour 2007-01-23
|
134
165
|
# We need to reload the options that exist in the App's merb.yml
|
135
166
|
# This is needed when one calls merb NOT from the merb_app ROOT
|
136
|
-
# like so: merb --merb-config /path/to/
|
167
|
+
# like so: merb --merb-config /path/to/config/merb.yml -m /path/to/merb/app
|
137
168
|
# or if we add :merb_root: /path/to/merb/app in the merb.yml we can now only call it
|
138
|
-
# like so: merb --merb-config /path/to/
|
169
|
+
# like so: merb --merb-config /path/to/config/merb.yml
|
139
170
|
if options[:merb_config]
|
140
171
|
# Check and see if an environment has been set through the CLI
|
141
172
|
# if so, save it in a temp. In this case, if merb.yml has an :environment:
|
@@ -143,7 +174,7 @@ module Merb
|
|
143
174
|
if options[:environment]
|
144
175
|
temp_env = options[:environment]
|
145
176
|
end
|
146
|
-
options
|
177
|
+
options.merge!(Erubis.load_yaml_file("#{options[:merb_config]}"))
|
147
178
|
if temp_env
|
148
179
|
options[:environment] = temp_env
|
149
180
|
end
|
@@ -161,26 +192,175 @@ module Merb
|
|
161
192
|
|
162
193
|
@@merb_opts = options
|
163
194
|
end
|
195
|
+
|
196
|
+
def max_mtime( files = [] )
|
197
|
+
files.map{ |file| File.mtime(file) rescue @mtime }.max
|
198
|
+
end
|
199
|
+
|
200
|
+
def register_session_type(name, file, description = nil)
|
201
|
+
@registered_session_types ||= YAML::Omap.new
|
202
|
+
@registered_session_types[name] = {
|
203
|
+
:file => file,
|
204
|
+
:description => (description || "Using #{name} sessions")
|
205
|
+
}
|
206
|
+
end
|
164
207
|
|
208
|
+
def add_controller_mixins
|
209
|
+
types = @registered_session_types
|
210
|
+
Merb::Controller.class_eval do
|
211
|
+
lib = File.join(__DIR__, 'merb')
|
212
|
+
session_store = Merb::Server.config[:session_store].to_s
|
213
|
+
if ["", "false"].include?(session_store)
|
214
|
+
puts "Not Using Sessions"
|
215
|
+
elsif reg = types[session_store]
|
216
|
+
require reg[:file]
|
217
|
+
include ::Merb::SessionMixin
|
218
|
+
puts reg[:description]
|
219
|
+
else
|
220
|
+
puts "Session store not found, '#{Merb::Server.config[:session_store]}'."
|
221
|
+
puts "Defaulting to CookieStore Sessions"
|
222
|
+
require types['cookie'][:file]
|
223
|
+
include ::Merb::SessionMixin
|
224
|
+
puts "(plugin not installed?)"
|
225
|
+
end
|
226
|
+
|
227
|
+
if Merb::Server.config[:basic_auth]
|
228
|
+
require lib + "/mixins/basic_authentication"
|
229
|
+
include ::Merb::AuthenticationMixin
|
230
|
+
puts "Basic Authentication mixed in"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
165
235
|
def initialize_merb
|
166
236
|
require 'merb'
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
237
|
+
@mtime = Time.now if @@merb_opts[:reloader] == true
|
238
|
+
# Register session types before merb_init.rb so that any additional
|
239
|
+
# session stores will be added to the end of the list and become the
|
240
|
+
# default.
|
241
|
+
register_session_type('memory',
|
242
|
+
__DIR__ / "merb" / "session" / "memory_session",
|
243
|
+
"Using in-memory sessions; sessions will be lost whenever the server stops.")
|
244
|
+
register_session_type('mem_cache',
|
245
|
+
__DIR__ / "merb" / "session" / "mem_cache_session",
|
246
|
+
"Using MemCache distributed memory sessions")
|
247
|
+
register_session_type('cookie', # Last session type becomes the default
|
248
|
+
__DIR__ / "merb" / "session" / "cookie_store",
|
249
|
+
"Using 'share-nothing' cookie sessions (4kb limit per client)")
|
250
|
+
require @@merb_opts[:merb_root] / 'config/merb_init.rb'
|
251
|
+
add_controller_mixins
|
252
|
+
end
|
253
|
+
|
254
|
+
def after_app_loads(&block)
|
255
|
+
@after_app_blocks ||= []
|
256
|
+
@after_app_blocks << block
|
257
|
+
end
|
258
|
+
|
259
|
+
def app_loaded?
|
260
|
+
@app_loaded
|
261
|
+
end
|
262
|
+
|
263
|
+
def load_action_arguments(klasses = Merb::Controller._subclasses)
|
264
|
+
klasses.each do |controller|
|
265
|
+
controller = Object.full_const_get(controller)
|
266
|
+
controller.action_argument_list = {}
|
267
|
+
controller.callable_actions.each do |action, bool|
|
268
|
+
controller.action_argument_list[action.to_sym] = ParseTreeArray.translate(controller, action).get_args
|
269
|
+
end
|
270
|
+
end if defined?(ParseTreeArray)
|
271
|
+
end
|
272
|
+
|
273
|
+
def load_application
|
274
|
+
MERB_PATHS.each do |glob|
|
275
|
+
Dir[MERB_ROOT + glob].each { |m| require m }
|
276
|
+
end
|
277
|
+
load_action_arguments
|
278
|
+
@app_loaded = true
|
279
|
+
(@after_app_blocks || []).each { |b| b.call }
|
280
|
+
end
|
171
281
|
|
282
|
+
def remove_constant(const)
|
283
|
+
parts = const.to_s.split("::")
|
284
|
+
base = parts.size == 1 ? Object : Object.full_const_get(parts[0..-2].join("::"))
|
285
|
+
object = parts[-1].intern
|
286
|
+
MERB_LOGGER.info("Removing constant #{object} from #{base}")
|
287
|
+
base.send(:remove_const, object) if object
|
288
|
+
Merb::Controller._subclasses.delete(const)
|
289
|
+
end
|
290
|
+
|
291
|
+
def reload
|
292
|
+
return if !@@merb_opts[:reloader] || !Object.const_defined?(:MERB_PATHS)
|
293
|
+
# First we collect all files in the project (this will also grab newly added files)
|
294
|
+
project_files = MERB_PATHS.map { |path| Dir[@@merb_opts[:merb_root] + path] }.flatten.uniq
|
295
|
+
project_mtime = max_mtime project_files # Latest changed time of all project files
|
296
|
+
|
297
|
+
return if @mtime.nil? || @mtime >= project_mtime # Only continue if a file has changed
|
298
|
+
|
299
|
+
project_files.each do |file|
|
300
|
+
if File.mtime(file) >= @mtime
|
301
|
+
# If the file has changed or been added since the last project reload time
|
302
|
+
# remove any cannonical constants, based on what type of project file it is
|
303
|
+
# and then reload the file
|
304
|
+
begin
|
305
|
+
constant = case file
|
306
|
+
when %r[/app/(models|controllers|parts|mailers)/(.+)\.rb$]
|
307
|
+
$2.to_const_string
|
308
|
+
when %r[/app/(helpers)/(.+)\.rb$]
|
309
|
+
"Merb::" + $2.to_const_string
|
310
|
+
end
|
311
|
+
remove_constant(constant)
|
312
|
+
rescue NameError => e
|
313
|
+
MERB_LOGGER.warn "Couldn't remove constant #{constant}"
|
314
|
+
end
|
315
|
+
|
316
|
+
begin
|
317
|
+
MERB_LOGGER.info("Reloading file #{file}")
|
318
|
+
old_subclasses = Merb::Controller._subclasses.dup
|
319
|
+
load(file)
|
320
|
+
loaded_classes = Merb::Controller._subclasses - old_subclasses
|
321
|
+
load_action_arguments(loaded_classes)
|
322
|
+
rescue Exception => e
|
323
|
+
puts "Error reloading file #{file}: #{e}"
|
324
|
+
MERB_LOGGER.warn " Error: #{e}"
|
325
|
+
end
|
326
|
+
|
327
|
+
# constant = file =~ /\/(controllers|models|mailers|helpers|parts)\/(.*).rb/ ? $2.to_const_string : nil
|
328
|
+
# remove_constant($2.to_const_string, ($1 == "helpers") ? Merb : nil)
|
329
|
+
# load file and puts "loaded file: #{file}"
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
@mtime = project_mtime # As the last action, update the current @mtime
|
334
|
+
end
|
335
|
+
|
172
336
|
def run
|
173
337
|
@@merb_raw_opts = ARGV
|
174
338
|
merb_config
|
339
|
+
|
340
|
+
if @@merb_opts[:generate] #|| @@merb_opts.size == 1
|
341
|
+
require 'merb/generators/merb_app/merb_app'
|
342
|
+
::Merb::AppGenerator.run @@merb_opts[:generate]
|
343
|
+
exit!
|
344
|
+
end
|
345
|
+
|
346
|
+
if ENV['EVENT'] || ENV['SWIFT']
|
347
|
+
@@merb_opts[:use_mutex] = false
|
348
|
+
end
|
175
349
|
|
350
|
+
if @@merb_opts[:graceful]
|
351
|
+
@@merb_opts[:kill] = @@merb_opts[:graceful]
|
352
|
+
graceful = true
|
353
|
+
end
|
354
|
+
|
176
355
|
if k = @@merb_opts[:kill]
|
177
356
|
begin
|
178
357
|
Dir[@@merb_opts[:merb_root] + "/log/merb.#{k == 'all' ? '*' : k }.pid"].each do |f|
|
179
358
|
puts f
|
180
359
|
pid = IO.read(f).chomp.to_i
|
181
|
-
|
360
|
+
signal = graceful ? 1 : 9
|
361
|
+
Process.kill(signal, pid)
|
182
362
|
FileUtils.rm f
|
183
|
-
puts "killed PID
|
363
|
+
puts "killed PID #{pid} with signal #{signal}"
|
184
364
|
end
|
185
365
|
rescue
|
186
366
|
puts "Failed to kill! #{k}"
|
@@ -190,39 +370,36 @@ module Merb
|
|
190
370
|
end
|
191
371
|
|
192
372
|
case @@merb_opts[:environment].to_s
|
193
|
-
when 'development'
|
194
|
-
@@merb_opts[:allow_reloading] ||= true
|
195
|
-
@@merb_opts[:show_error] ||= true
|
196
373
|
when 'production'
|
197
|
-
@@merb_opts[:
|
198
|
-
@@merb_opts[:
|
374
|
+
@@merb_opts[:reloader] = @@merb_opts.fetch(:reloader, false)
|
375
|
+
@@merb_opts[:exception_details] = @@merb_opts.fetch(:exception_details, false)
|
199
376
|
@@merb_opts[:cache_templates] = true
|
200
|
-
when 'test'
|
201
|
-
@@merb_opts[:allow_reloading] ||= true
|
202
|
-
@@merb_opts[:show_error] ||= true
|
203
377
|
else
|
204
|
-
@@merb_opts[:
|
205
|
-
@@merb_opts[:
|
206
|
-
end
|
207
|
-
|
208
|
-
@@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
|
209
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/models') )
|
210
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
|
211
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/lib') )
|
212
|
-
if File.exist? File.join(@@merb_opts[:dist_root] , '/framework')
|
213
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/framework') )
|
378
|
+
@@merb_opts[:reloader] = @@merb_opts.fetch(:reloader, true)
|
379
|
+
@@merb_opts[:exception_details] = @@merb_opts.fetch(:exception_details, true)
|
214
380
|
end
|
215
|
-
|
216
|
-
if @@merb_opts[:
|
217
|
-
|
218
|
-
|
381
|
+
|
382
|
+
@@merb_opts[:reloader_time] ||= 0.5 if @@merb_opts[:reloader] == true
|
383
|
+
|
384
|
+
$LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/app/models') )
|
385
|
+
$LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/app/controllers') )
|
386
|
+
$LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/lib') )
|
387
|
+
|
388
|
+
if @@merb_opts[:generate_plugin]
|
389
|
+
require 'merb/generators/merb_plugin'
|
390
|
+
::Merb::PluginGenerator.run @@merb_opts[:generate_plugin]
|
219
391
|
exit!
|
220
392
|
end
|
221
393
|
|
222
|
-
if @@merb_opts[:
|
223
|
-
|
224
|
-
|
225
|
-
|
394
|
+
if @@merb_opts[:reloader]
|
395
|
+
Thread.abort_on_exception = true
|
396
|
+
Thread.new do
|
397
|
+
loop do
|
398
|
+
sleep( @@merb_opts[:reloader_time] )
|
399
|
+
reload
|
400
|
+
end
|
401
|
+
Thread.exit
|
402
|
+
end
|
226
403
|
end
|
227
404
|
|
228
405
|
if @@merb_opts[:console]
|
@@ -278,6 +455,18 @@ module Merb
|
|
278
455
|
exit if @@merb_opts[:only_drb]
|
279
456
|
end
|
280
457
|
|
458
|
+
if @@merb_opts[:webrick]
|
459
|
+
puts "Starting merb webrick server on port: #{@@merb_opts[:port]}"
|
460
|
+
trap('TERM') { exit }
|
461
|
+
webrick_start(@@merb_opts[:port])
|
462
|
+
end
|
463
|
+
|
464
|
+
if @@merb_opts[:fastcgi]
|
465
|
+
trap('TERM') { exit }
|
466
|
+
fastcgi_start
|
467
|
+
end
|
468
|
+
|
469
|
+
|
281
470
|
if @@merb_opts[:cluster]
|
282
471
|
delete_pidfiles
|
283
472
|
@@merb_opts[:port].to_i.upto(@@merb_opts[:port].to_i+@@merb_opts[:cluster].to_i-1) do |port|
|
@@ -317,6 +506,21 @@ module Merb
|
|
317
506
|
end
|
318
507
|
end
|
319
508
|
|
509
|
+
def webrick_start(port)
|
510
|
+
initialize_merb
|
511
|
+
require 'rack'
|
512
|
+
require 'merb/rack_adapter'
|
513
|
+
::Rack::Handler::WEBrick.run Merb::Rack::Adapter.new,
|
514
|
+
:Port => port
|
515
|
+
end
|
516
|
+
|
517
|
+
def fastcgi_start
|
518
|
+
initialize_merb
|
519
|
+
require 'rack'
|
520
|
+
require 'merb/rack_adapter'
|
521
|
+
::Rack::Handler::FastCGI.run Merb::Rack::Adapter.new
|
522
|
+
end
|
523
|
+
|
320
524
|
def delete_pidfiles(portor_star='*')
|
321
525
|
Dir["#{@@merb_opts[:merb_root]}/log/merb.#{portor_star}.pid"].each do |pid|
|
322
526
|
FileUtils.rm(pid) rescue nil
|
@@ -326,7 +530,7 @@ module Merb
|
|
326
530
|
def drbserver_start(port)
|
327
531
|
puts "Starting merb drb server on port: #{port}"
|
328
532
|
require 'merb/merb_drb_server'
|
329
|
-
drb_init = File.join(@@merb_opts[:merb_root], "/
|
533
|
+
drb_init = File.join(@@merb_opts[:merb_root], "/config/merb_drb_init")
|
330
534
|
require drb_init if File.exist?(drb_init)
|
331
535
|
DRb.start_service("druby://#{@@merb_opts[:host]}:#{port}", Merb::DrbServiceProvider)
|
332
536
|
DRb.thread.join
|
@@ -346,12 +550,12 @@ module Merb
|
|
346
550
|
mconf_hash[:group] = @@merb_opts[:group]
|
347
551
|
end
|
348
552
|
mconfig = Mongrel::Configurator.new(mconf_hash) do
|
349
|
-
yconfig = YAML.load(Erubis::Eruby.new(IO.read(File.expand_path(@@merb_opts[:config]))).result) if @@merb_opts[:config]
|
350
553
|
listener do
|
351
|
-
uri( "/", :handler => MerbUploadHandler.new(
|
352
|
-
uri "/", :handler => MerbHandler.new(@@merb_opts[:
|
554
|
+
uri( "/", :handler => MerbUploadHandler.new(@@merb_opts), :in_front => true) if @@merb_opts[:upload_path_match]
|
555
|
+
uri "/", :handler => MerbHandler.new(@@merb_opts[:merb_root]+'/public')
|
353
556
|
uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
|
354
557
|
end
|
558
|
+
MerbHandler.path_prefix = @@merb_opts[:path_prefix]
|
355
559
|
|
356
560
|
trap("INT") { stop }
|
357
561
|
run
|
@@ -362,8 +566,8 @@ module Merb
|
|
362
566
|
def config
|
363
567
|
@@merb_opts
|
364
568
|
end
|
365
|
-
|
366
|
-
end
|
569
|
+
|
570
|
+
end # class << self
|
367
571
|
|
368
572
|
end # Server
|
369
573
|
|