merb-core 0.9.7 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +136 -2
- data/CONTRIBUTORS +6 -0
- data/PUBLIC_CHANGELOG +38 -0
- data/Rakefile +38 -30
- data/lib/merb-core.rb +88 -23
- data/lib/merb-core/bootloader.rb +235 -51
- data/lib/merb-core/config.rb +121 -36
- data/lib/merb-core/controller/abstract_controller.rb +59 -36
- data/lib/merb-core/controller/exceptions.rb +2 -15
- data/lib/merb-core/controller/merb_controller.rb +44 -1
- data/lib/merb-core/controller/mime.rb +4 -0
- data/lib/merb-core/controller/mixins/controller.rb +38 -21
- data/lib/merb-core/controller/mixins/render.rb +44 -29
- data/lib/merb-core/controller/mixins/responder.rb +3 -31
- data/lib/merb-core/controller/template.rb +45 -21
- data/lib/merb-core/core_ext/kernel.rb +60 -32
- data/lib/merb-core/dispatch/default_exception/default_exception.rb +2 -2
- data/lib/merb-core/dispatch/default_exception/views/_css.html.erb +3 -1
- data/lib/merb-core/dispatch/default_exception/views/_javascript.html.erb +71 -67
- data/lib/merb-core/dispatch/default_exception/views/index.html.erb +7 -3
- data/lib/merb-core/dispatch/dispatcher.rb +3 -3
- data/lib/merb-core/dispatch/request.rb +56 -9
- data/lib/merb-core/dispatch/router.rb +159 -133
- data/lib/merb-core/dispatch/router/behavior.rb +462 -703
- data/lib/merb-core/dispatch/router/cached_proc.rb +3 -3
- data/lib/merb-core/dispatch/router/resources.rb +289 -0
- data/lib/merb-core/dispatch/router/route.rb +514 -294
- data/lib/merb-core/dispatch/session.rb +4 -2
- data/lib/merb-core/logger.rb +213 -202
- data/lib/merb-core/plugins.rb +9 -1
- data/lib/merb-core/rack.rb +3 -1
- data/lib/merb-core/rack/adapter.rb +7 -4
- data/lib/merb-core/rack/adapter/abstract.rb +188 -0
- data/lib/merb-core/rack/adapter/ebb.rb +12 -13
- data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -15
- data/lib/merb-core/rack/adapter/irb.rb +3 -2
- data/lib/merb-core/rack/adapter/mongrel.rb +22 -15
- data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +4 -16
- data/lib/merb-core/rack/adapter/thin.rb +21 -22
- data/lib/merb-core/rack/adapter/thin_turbo.rb +4 -11
- data/lib/merb-core/rack/adapter/webrick.rb +54 -18
- data/lib/merb-core/rack/application.rb +4 -4
- data/lib/merb-core/rack/handler/mongrel.rb +12 -13
- data/lib/merb-core/rack/middleware/csrf.rb +1 -1
- data/lib/merb-core/rack/stream_wrapper.rb +41 -0
- data/lib/merb-core/server.rb +157 -90
- data/lib/merb-core/tasks/gem_management.rb +267 -0
- data/lib/merb-core/tasks/merb.rb +1 -0
- data/lib/merb-core/tasks/merb_rake_helper.rb +48 -34
- data/lib/merb-core/tasks/stats.rake +1 -1
- data/lib/merb-core/test.rb +9 -3
- data/lib/merb-core/test/helpers.rb +1 -0
- data/lib/merb-core/test/helpers/mock_request_helper.rb +393 -0
- data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -2
- data/lib/merb-core/test/helpers/request_helper.rb +40 -372
- data/lib/merb-core/test/helpers/route_helper.rb +16 -2
- data/lib/merb-core/test/matchers.rb +1 -0
- data/lib/merb-core/test/matchers/controller_matchers.rb +4 -247
- data/lib/merb-core/test/matchers/request_matchers.rb +140 -0
- data/lib/merb-core/test/matchers/view_matchers.rb +22 -4
- data/lib/merb-core/test/run_specs.rb +118 -26
- data/lib/merb-core/test/test_ext/rspec.rb +181 -0
- data/lib/merb-core/version.rb +1 -9
- metadata +10 -342
- data/docs/bootloading.dox +0 -58
- data/docs/documentation_standards +0 -40
- data/docs/merb-core-call-stack-diagram.mmap +0 -0
- data/docs/merb-core-call-stack-diagram.pdf +0 -0
- data/docs/merb-core-call-stack-diagram.png +0 -0
- data/docs/new_render_api +0 -51
- data/lib/merb-core/vendor/facets.rb +0 -2
- data/lib/merb-core/vendor/facets/dictionary.rb +0 -433
- data/lib/merb-core/vendor/facets/inflect.rb +0 -342
- data/spec/private/config/adapter_spec.rb +0 -32
- data/spec/private/config/config_spec.rb +0 -202
- data/spec/private/config/environment_spec.rb +0 -13
- data/spec/private/config/merb_spec.rb +0 -34
- data/spec/private/config/spec_helper.rb +0 -1
- data/spec/private/core_ext/kernel_spec.rb +0 -159
- data/spec/private/dispatch/bootloader_spec.rb +0 -24
- data/spec/private/dispatch/fixture/app/controllers/application.rb +0 -4
- data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +0 -25
- data/spec/private/dispatch/fixture/app/controllers/foo.rb +0 -19
- data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +0 -8
- data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +0 -37
- data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +0 -216
- data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +0 -38
- data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +0 -40
- data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
- data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +0 -11
- data/spec/private/dispatch/fixture/config/black_hole.rb +0 -12
- data/spec/private/dispatch/fixture/config/environments/development.rb +0 -6
- data/spec/private/dispatch/fixture/config/environments/production.rb +0 -5
- data/spec/private/dispatch/fixture/config/environments/test.rb +0 -6
- data/spec/private/dispatch/fixture/config/init.rb +0 -45
- data/spec/private/dispatch/fixture/config/rack.rb +0 -11
- data/spec/private/dispatch/fixture/config/router.rb +0 -35
- data/spec/private/dispatch/fixture/log/merb_test.log +0 -8839
- data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
- data/spec/private/dispatch/fixture/public/merb.fcgi +0 -4
- data/spec/private/dispatch/fixture/public/stylesheets/master.css +0 -119
- data/spec/private/dispatch/route_params_spec.rb +0 -23
- data/spec/private/dispatch/spec_helper.rb +0 -1
- data/spec/private/router/behavior_spec.rb +0 -60
- data/spec/private/router/fixture/log/merb_test.log +0 -35
- data/spec/private/router/route_spec.rb +0 -418
- data/spec/private/router/router_spec.rb +0 -183
- data/spec/private/vendor/facets/plural_spec.rb +0 -564
- data/spec/private/vendor/facets/singular_spec.rb +0 -489
- data/spec/public/DEFINITIONS +0 -11
- data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/cousins.rb +0 -41
- data/spec/public/abstract_controller/controllers/display.rb +0 -60
- data/spec/public/abstract_controller/controllers/filters.rb +0 -260
- data/spec/public/abstract_controller/controllers/helpers.rb +0 -41
- data/spec/public/abstract_controller/controllers/partial.rb +0 -121
- data/spec/public/abstract_controller/controllers/render.rb +0 -113
- data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/layout/alt.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/layout/custom.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +0 -1
- data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
- data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +0 -1
- data/spec/public/abstract_controller/display_spec.rb +0 -37
- data/spec/public/abstract_controller/filter_spec.rb +0 -136
- data/spec/public/abstract_controller/helper_spec.rb +0 -21
- data/spec/public/abstract_controller/partial_spec.rb +0 -61
- data/spec/public/abstract_controller/render_spec.rb +0 -90
- data/spec/public/abstract_controller/spec_helper.rb +0 -31
- data/spec/public/boot_loader/boot_loader_spec.rb +0 -33
- data/spec/public/boot_loader/spec_helper.rb +0 -1
- data/spec/public/controller/authentication_spec.rb +0 -174
- data/spec/public/controller/base_spec.rb +0 -88
- data/spec/public/controller/conditional_get_spec.rb +0 -100
- data/spec/public/controller/config/init.rb +0 -6
- data/spec/public/controller/controllers/authentication.rb +0 -74
- data/spec/public/controller/controllers/base.rb +0 -65
- data/spec/public/controller/controllers/conditional_get.rb +0 -35
- data/spec/public/controller/controllers/cookies.rb +0 -36
- data/spec/public/controller/controllers/dispatcher.rb +0 -35
- data/spec/public/controller/controllers/display.rb +0 -118
- data/spec/public/controller/controllers/redirect.rb +0 -36
- data/spec/public/controller/controllers/responder.rb +0 -93
- data/spec/public/controller/controllers/url.rb +0 -7
- data/spec/public/controller/controllers/views/layout/custom.html.erb +0 -1
- data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +0 -1
- data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +0 -1
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +0 -1
- data/spec/public/controller/cookies_spec.rb +0 -95
- data/spec/public/controller/dispatcher_spec.rb +0 -410
- data/spec/public/controller/display_spec.rb +0 -84
- data/spec/public/controller/redirect_spec.rb +0 -33
- data/spec/public/controller/responder_spec.rb +0 -169
- data/spec/public/controller/spec_helper.rb +0 -13
- data/spec/public/controller/url_spec.rb +0 -255
- data/spec/public/core/merb_core_spec.rb +0 -45
- data/spec/public/core_ext/fixtures/core_ext_dependency.rb +0 -2
- data/spec/public/core_ext/kernel_spec.rb +0 -88
- data/spec/public/core_ext/spec_helper.rb +0 -1
- data/spec/public/directory_structure/directory/app/controllers/application.rb +0 -3
- data/spec/public/directory_structure/directory/app/controllers/base.rb +0 -13
- data/spec/public/directory_structure/directory/app/controllers/custom.rb +0 -19
- data/spec/public/directory_structure/directory/app/views/base/template.html.erb +0 -1
- data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +0 -1
- data/spec/public/directory_structure/directory/config/router.rb +0 -3
- data/spec/public/directory_structure/directory/log/merb_test.log +0 -4588
- data/spec/public/directory_structure/directory_spec.rb +0 -43
- data/spec/public/logger/logger_spec.rb +0 -181
- data/spec/public/logger/spec_helper.rb +0 -1
- data/spec/public/rack/conditinal_get_middleware_spec.rb +0 -127
- data/spec/public/rack/csrf_middleware_spec.rb +0 -70
- data/spec/public/rack/rack_middleware_spec.rb +0 -99
- data/spec/public/rack/shared_example_groups.rb +0 -35
- data/spec/public/reloading/directory/app/controllers/application.rb +0 -3
- data/spec/public/reloading/directory/app/controllers/reload.rb +0 -6
- data/spec/public/reloading/directory/config/init.rb +0 -2
- data/spec/public/reloading/directory/log/merb_test.log +0 -288231
- data/spec/public/reloading/reload_spec.rb +0 -103
- data/spec/public/request/multipart_spec.rb +0 -41
- data/spec/public/request/request_spec.rb +0 -250
- data/spec/public/router/default_spec.rb +0 -21
- data/spec/public/router/deferred_spec.rb +0 -22
- data/spec/public/router/fixation_spec.rb +0 -49
- data/spec/public/router/fixture/log/merb_test.log +0 -524
- data/spec/public/router/namespace_spec.rb +0 -113
- data/spec/public/router/nested_matches_spec.rb +0 -97
- data/spec/public/router/nested_resources_spec.rb +0 -41
- data/spec/public/router/resource_spec.rb +0 -37
- data/spec/public/router/resources_spec.rb +0 -82
- data/spec/public/router/spec_helper.rb +0 -90
- data/spec/public/router/special_spec.rb +0 -61
- data/spec/public/router/string_spec.rb +0 -61
- data/spec/public/session/controllers/sessions.rb +0 -56
- data/spec/public/session/cookie_session_spec.rb +0 -73
- data/spec/public/session/memcached_session_spec.rb +0 -31
- data/spec/public/session/memory_session_spec.rb +0 -28
- data/spec/public/session/multiple_sessions_spec.rb +0 -74
- data/spec/public/session/no_session_spec.rb +0 -12
- data/spec/public/session/session_spec.rb +0 -106
- data/spec/public/template/template_spec.rb +0 -104
- data/spec/public/template/templates/error.html.erb +0 -2
- data/spec/public/template/templates/template.html.erb +0 -1
- data/spec/public/template/templates/template.html.myt +0 -1
- data/spec/public/test/controller_matchers_spec.rb +0 -412
- data/spec/public/test/controllers/controller_assertion_mock.rb +0 -7
- data/spec/public/test/controllers/dispatch_controller.rb +0 -11
- data/spec/public/test/controllers/spec_helper_controller.rb +0 -39
- data/spec/public/test/multipart_request_helper_spec.rb +0 -159
- data/spec/public/test/multipart_upload_text_file.txt +0 -1
- data/spec/public/test/request_helper_spec.rb +0 -269
- data/spec/public/test/route_helper_spec.rb +0 -78
- data/spec/public/test/route_matchers_spec.rb +0 -166
- data/spec/public/test/view_helper_spec.rb +0 -96
- data/spec/public/test/view_matchers_spec.rb +0 -183
- data/spec/spec_helper.rb +0 -121
data/lib/merb-core/bootloader.rb
CHANGED
@@ -6,7 +6,8 @@ module Merb
|
|
6
6
|
#---
|
7
7
|
# @semipublic
|
8
8
|
cattr_accessor :subclasses, :after_load_callbacks, :before_load_callbacks, :finished
|
9
|
-
self.subclasses, self.after_load_callbacks,
|
9
|
+
self.subclasses, self.after_load_callbacks,
|
10
|
+
self.before_load_callbacks, self.finished = [], [], [], []
|
10
11
|
|
11
12
|
class << self
|
12
13
|
|
@@ -144,13 +145,23 @@ class Merb::BootLoader::Logger < Merb::BootLoader
|
|
144
145
|
|
145
146
|
# Sets Merb.logger to a new logger created based on the config settings.
|
146
147
|
def self.run
|
147
|
-
Merb
|
148
|
+
Merb::Config[:log_level] ||= begin
|
149
|
+
if Merb.environment == "production"
|
150
|
+
Merb::Logger::Levels[:warn]
|
151
|
+
else
|
152
|
+
Merb::Logger::Levels[:debug]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
Merb::Config[:log_stream] = Merb.log_stream
|
157
|
+
|
148
158
|
print_warnings
|
149
159
|
end
|
150
160
|
|
151
161
|
def self.print_warnings
|
152
162
|
if Gem::Version.new(Gem::RubyGemsVersion) < Gem::Version.new("1.1")
|
153
|
-
Merb.
|
163
|
+
Merb.fatal! "Merb requires Rubygems 1.1 and later. " \
|
164
|
+
"Please upgrade RubyGems with gem update --system."
|
154
165
|
end
|
155
166
|
end
|
156
167
|
end
|
@@ -159,12 +170,12 @@ end
|
|
159
170
|
#
|
160
171
|
# Only run if daemonization or clustering options specified on start.
|
161
172
|
# Port is taken from Merb::Config and must be already set at this point.
|
162
|
-
class Merb::BootLoader::DropPidFile <
|
173
|
+
class Merb::BootLoader::DropPidFile < Merb::BootLoader
|
163
174
|
class << self
|
164
175
|
|
165
176
|
# Stores a PID file if Merb is running daemonized or clustered.
|
166
177
|
def run
|
167
|
-
Merb::Server.store_pid(
|
178
|
+
Merb::Server.store_pid("main") #if Merb::Config[:daemonize] || Merb::Config[:cluster]
|
168
179
|
end
|
169
180
|
end
|
170
181
|
end
|
@@ -257,6 +268,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
|
|
257
268
|
# haven't been loaded up until this point.
|
258
269
|
|
259
270
|
def self.run
|
271
|
+
set_encoding
|
260
272
|
load_initfile
|
261
273
|
load_env_config
|
262
274
|
enable_json_gem unless Merb::disabled?(:json)
|
@@ -265,18 +277,25 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
|
|
265
277
|
end
|
266
278
|
|
267
279
|
def self.load_dependencies
|
268
|
-
dependencies.each { |
|
280
|
+
dependencies.each { |dependency| Kernel.load_dependency(dependency) }
|
269
281
|
end
|
270
282
|
|
271
283
|
def self.enable_json_gem
|
284
|
+
gem "json"
|
272
285
|
require "json/ext"
|
273
286
|
rescue LoadError
|
287
|
+
gem "json_pure"
|
274
288
|
require "json/pure"
|
275
289
|
end
|
276
290
|
|
277
291
|
def self.update_logger
|
278
|
-
|
279
|
-
Merb::
|
292
|
+
Merb.logger = nil
|
293
|
+
STDOUT.puts "Logging to #{Merb::Config[:log_file] || 'stdout'}" unless Merb.testing?
|
294
|
+
Merb::Config[:log_stream] = File.open(Merb::Config[:log_file], "w+") if Merb::Config[:log_file]
|
295
|
+
end
|
296
|
+
|
297
|
+
def self.set_encoding
|
298
|
+
$KCODE = 'UTF8' if $KCODE == 'NONE' || $KCODE.blank?
|
280
299
|
end
|
281
300
|
|
282
301
|
private
|
@@ -356,30 +375,172 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
|
|
356
375
|
# Load all classes from Merb's native load paths.
|
357
376
|
def run
|
358
377
|
# Add models, controllers, helpers and lib to the load path
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
378
|
+
unless @ran
|
379
|
+
$LOAD_PATH.unshift Merb.dir_for(:model)
|
380
|
+
$LOAD_PATH.unshift Merb.dir_for(:controller)
|
381
|
+
$LOAD_PATH.unshift Merb.dir_for(:lib)
|
382
|
+
$LOAD_PATH.unshift Merb.dir_for(:helper)
|
383
|
+
end
|
384
|
+
|
385
|
+
@ran = true
|
386
|
+
$0 = "merb#{" : " + Merb::Config[:name] if Merb::Config[:name]} : master"
|
387
|
+
|
388
|
+
if Merb::Config[:fork_for_class_load] && !Merb.testing?
|
389
|
+
start_transaction
|
390
|
+
else
|
391
|
+
Merb.trap('INT') do
|
392
|
+
Merb.logger.warn! "Killing children"
|
393
|
+
kill_children
|
394
|
+
end
|
395
|
+
end
|
363
396
|
|
364
397
|
# Load application file if it exists - for flat applications
|
365
398
|
load_file Merb.dir_for(:application) if File.file?(Merb.dir_for(:application))
|
366
399
|
|
367
400
|
# Load classes and their requirements
|
368
401
|
Merb.load_paths.each do |component, path|
|
369
|
-
next
|
402
|
+
next if path.last.blank? || component == :application || component == :router
|
370
403
|
load_classes(path.first / path.last)
|
371
404
|
end
|
372
405
|
|
373
406
|
Merb::Controller.send :include, Merb::GlobalHelpers
|
374
407
|
end
|
375
408
|
|
409
|
+
# Wait for any children to exit, remove the "main" PID, and
|
410
|
+
# exit.
|
411
|
+
def exit_gracefully
|
412
|
+
Process.waitall
|
413
|
+
Merb::Server.remove_pid("main")
|
414
|
+
exit
|
415
|
+
end
|
416
|
+
|
417
|
+
# If using fork-based code reloading, set up the BEGIN
|
418
|
+
# point and set up any signals in the parent and child.
|
419
|
+
def start_transaction
|
420
|
+
Merb.logger.warn! "Parent pid: #{Process.pid}"
|
421
|
+
reader, writer = nil, nil
|
422
|
+
|
423
|
+
if GC.respond_to?(:copy_on_write_friendly=)
|
424
|
+
GC.copy_on_write_friendly = true
|
425
|
+
end
|
426
|
+
|
427
|
+
loop do
|
428
|
+
reader, @writer = IO.pipe
|
429
|
+
pid = Kernel.fork
|
430
|
+
|
431
|
+
# pid means we're in the parent; only stay in the loop in that case
|
432
|
+
break unless pid
|
433
|
+
@writer.close
|
434
|
+
|
435
|
+
Merb::Server.store_pid("main")
|
436
|
+
|
437
|
+
if Merb::Config[:console_trap]
|
438
|
+
Merb.trap("INT") {}
|
439
|
+
else
|
440
|
+
Merb.trap("INT") do
|
441
|
+
Merb.logger.warn! "Killing children"
|
442
|
+
begin
|
443
|
+
Process.kill("ABRT", pid)
|
444
|
+
rescue SystemCallError
|
445
|
+
end
|
446
|
+
exit_gracefully
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
Merb.trap("HUP") do
|
451
|
+
Merb.logger.warn! "Doing a fast deploy\n"
|
452
|
+
Process.kill("HUP", pid)
|
453
|
+
end
|
454
|
+
|
455
|
+
reader_ary = [reader]
|
456
|
+
loop do
|
457
|
+
if exit_status = Process.wait2(pid, Process::WNOHANG)
|
458
|
+
exit_status[1] == 128 ? break : exit
|
459
|
+
end
|
460
|
+
if select(reader_ary, nil, nil, 0.25)
|
461
|
+
begin
|
462
|
+
next if reader.eof?
|
463
|
+
msg = reader.readline
|
464
|
+
if msg =~ /128/
|
465
|
+
break
|
466
|
+
else
|
467
|
+
exit_gracefully
|
468
|
+
end
|
469
|
+
rescue SystemCallError
|
470
|
+
exit_gracefully
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
reader.close
|
477
|
+
|
478
|
+
# add traps to the child
|
479
|
+
if Merb::Config[:console_trap]
|
480
|
+
Merb::Server.add_irb_trap
|
481
|
+
at_exit { kill_children }
|
482
|
+
else
|
483
|
+
Merb.trap('INT') {}
|
484
|
+
Merb.trap('ABRT') { kill_children }
|
485
|
+
Merb.trap('HUP') { kill_children(128) }
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
489
|
+
# Kill any children of the spawner process and exit with
|
490
|
+
# an appropriate status code.
|
491
|
+
#
|
492
|
+
# Note that exiting the spawner process with a status code
|
493
|
+
# of 128 when a master process exists will cause the
|
494
|
+
# spawner process to be recreated, and the app code reloaded.
|
495
|
+
#
|
496
|
+
# @param status<Integer> The status code to exit with
|
497
|
+
def kill_children(status = 0)
|
498
|
+
Merb.exiting = true unless status == 128
|
499
|
+
|
500
|
+
begin
|
501
|
+
@writer.puts(status.to_s) if @writer
|
502
|
+
rescue SystemCallError
|
503
|
+
end
|
504
|
+
|
505
|
+
threads = []
|
506
|
+
|
507
|
+
($CHILDREN || []).each do |p|
|
508
|
+
threads << Thread.new do
|
509
|
+
begin
|
510
|
+
Process.kill("ABRT", p)
|
511
|
+
Process.wait2(p)
|
512
|
+
rescue SystemCallError
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
threads.each {|t| t.join }
|
517
|
+
exit(status)
|
518
|
+
end
|
519
|
+
|
376
520
|
# ==== Parameters
|
377
521
|
# file<String>:: The file to load.
|
378
522
|
def load_file(file)
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
523
|
+
# Don't do this expensive operation unless we need to
|
524
|
+
unless Merb::Config[:fork_for_class_load]
|
525
|
+
klasses = ObjectSpace.classes.dup
|
526
|
+
end
|
527
|
+
|
528
|
+
# Ignore the file for syntax errors. The next time
|
529
|
+
# the file is changed, it'll be reloaded again
|
530
|
+
begin
|
531
|
+
load file
|
532
|
+
rescue SyntaxError
|
533
|
+
return
|
534
|
+
ensure
|
535
|
+
if Merb::Config[:reload_classes]
|
536
|
+
MTIMES[file] = File.mtime(file)
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
# Don't do this expensive operation unless we need to
|
541
|
+
unless Merb::Config[:fork_for_class_load]
|
542
|
+
LOADED_CLASSES[file] = ObjectSpace.classes - klasses
|
543
|
+
end
|
383
544
|
end
|
384
545
|
|
385
546
|
# Load classes from given paths - using path/glob pattern.
|
@@ -403,14 +564,10 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
|
|
403
564
|
# ==== Parameters
|
404
565
|
# file<String>:: The file to reload.
|
405
566
|
def reload(file)
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
def reload_router!
|
411
|
-
if File.file?(router_file = Merb.dir_for(:router) / Merb.glob_for(:router))
|
412
|
-
Merb::Router.reset!
|
413
|
-
reload router_file
|
567
|
+
if Merb::Config[:fork_for_class_load]
|
568
|
+
kill_children(128)
|
569
|
+
else
|
570
|
+
remove_classes_in_file(file) { |f| load_file(f) }
|
414
571
|
end
|
415
572
|
end
|
416
573
|
|
@@ -418,7 +575,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
|
|
418
575
|
# file<String>:: The file to remove classes for.
|
419
576
|
# &block:: A block to call with the file that has been removed.
|
420
577
|
def remove_classes_in_file(file, &block)
|
421
|
-
Merb.klass_hashes.each {|x| x.protect_keys!}
|
578
|
+
Merb.klass_hashes.each { |x| x.protect_keys! }
|
422
579
|
if klasses = LOADED_CLASSES.delete(file)
|
423
580
|
klasses.each { |klass| remove_constant(klass) unless klass.to_s =~ /Router/ }
|
424
581
|
end
|
@@ -488,10 +645,12 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
|
|
488
645
|
# Stop processing if nothing loads or if everything has loaded
|
489
646
|
if klasses.size == size_at_start && klasses.size != 0
|
490
647
|
# Write all remaining failed classes and their exceptions to the log
|
491
|
-
error_map.only(*failed_classes).
|
492
|
-
|
648
|
+
messages = error_map.only(*failed_classes).map do |klass, e|
|
649
|
+
["Could not load #{klass}:\n\n#{e.message} - (#{e.class})",
|
650
|
+
"#{(e.backtrace || []).join("\n")}"]
|
493
651
|
end
|
494
|
-
|
652
|
+
messages.each { |msg, trace| Merb.logger.fatal!("#{msg}\n\n#{trace}") }
|
653
|
+
Merb.fatal! "#{failed_classes.join(", ")} failed to load."
|
495
654
|
end
|
496
655
|
break if(klasses.size == size_at_start || klasses.size == 0)
|
497
656
|
end
|
@@ -501,6 +660,31 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
|
|
501
660
|
|
502
661
|
end
|
503
662
|
|
663
|
+
class Merb::BootLoader::Router < Merb::BootLoader
|
664
|
+
class << self
|
665
|
+
|
666
|
+
def run
|
667
|
+
Merb::BootLoader::LoadClasses.load_file(router_file) if router_file
|
668
|
+
end
|
669
|
+
|
670
|
+
def reload!
|
671
|
+
if router_file
|
672
|
+
Merb::Router.reset!
|
673
|
+
Merb::BootLoader::LoadClasses.reload(router_file)
|
674
|
+
end
|
675
|
+
end
|
676
|
+
|
677
|
+
def router_file
|
678
|
+
@router_file ||= begin
|
679
|
+
if File.file?(router = Merb.dir_for(:router) / Merb.glob_for(:router))
|
680
|
+
router
|
681
|
+
end
|
682
|
+
end
|
683
|
+
end
|
684
|
+
|
685
|
+
end
|
686
|
+
end
|
687
|
+
|
504
688
|
class Merb::BootLoader::Templates < Merb::BootLoader
|
505
689
|
class << self
|
506
690
|
|
@@ -531,7 +715,9 @@ class Merb::BootLoader::Templates < Merb::BootLoader
|
|
531
715
|
# template roots. eg app/views/shared/*
|
532
716
|
template_paths << Dir["#{Merb.dir_for(:view)}/**/*.#{extension_glob}"] if Merb.dir_for(:view)
|
533
717
|
|
534
|
-
|
718
|
+
# This ignores templates for partials, which need to be compiled at use time to generate
|
719
|
+
# a preamble that assigns local variables
|
720
|
+
template_paths.flatten.compact.uniq.grep(%r{^.*/[^_][^/]*$})
|
535
721
|
end
|
536
722
|
end
|
537
723
|
end
|
@@ -618,6 +804,7 @@ class Merb::BootLoader::SetupStubClasses < Merb::BootLoader
|
|
618
804
|
unless defined?(Exceptions)
|
619
805
|
Object.class_eval <<-RUBY
|
620
806
|
class Application < Merb::Controller
|
807
|
+
abstract!
|
621
808
|
end
|
622
809
|
|
623
810
|
class Exceptions < Application
|
@@ -679,7 +866,7 @@ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
|
|
679
866
|
Thread.new do
|
680
867
|
loop do
|
681
868
|
sleep( seconds )
|
682
|
-
|
869
|
+
yield
|
683
870
|
end
|
684
871
|
Thread.exit
|
685
872
|
end
|
@@ -690,36 +877,33 @@ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
|
|
690
877
|
def self.run
|
691
878
|
return unless Merb::Config[:reload_classes]
|
692
879
|
|
693
|
-
TimedExecutor.every(Merb::Config[:reload_time] || 0.5) do
|
694
|
-
reload
|
695
|
-
end
|
696
|
-
|
697
|
-
end
|
698
|
-
|
699
|
-
# Reloads all files.
|
700
|
-
def self.reload
|
701
880
|
paths = []
|
702
881
|
Merb.load_paths.each do |path_name, file_info|
|
703
882
|
path, glob = file_info
|
704
883
|
next unless glob
|
705
884
|
paths << Dir[path / glob]
|
706
885
|
end
|
886
|
+
|
887
|
+
if Merb.dir_for(:application) && File.file?(Merb.dir_for(:application))
|
888
|
+
paths << Merb.dir_for(:application)
|
889
|
+
end
|
707
890
|
|
708
|
-
paths
|
891
|
+
paths.flatten!
|
709
892
|
|
710
|
-
|
711
|
-
|
712
|
-
|
893
|
+
TimedExecutor.every(Merb::Config[:reload_time] || 0.5) do
|
894
|
+
GC.start
|
895
|
+
reload(paths)
|
713
896
|
end
|
897
|
+
|
714
898
|
end
|
715
|
-
end
|
716
|
-
|
717
|
-
class Merb::BootLoader::ReloadTemplates < Merb::BootLoader
|
718
899
|
|
719
|
-
# Reloads all
|
720
|
-
def self.
|
721
|
-
|
722
|
-
|
900
|
+
# Reloads all files.
|
901
|
+
def self.reload(paths)
|
902
|
+
paths.each do |file|
|
903
|
+
next if LoadClasses::MTIMES[file] &&
|
904
|
+
LoadClasses::MTIMES[file] == File.mtime(file)
|
905
|
+
|
906
|
+
LoadClasses.reload(file)
|
723
907
|
end
|
724
908
|
end
|
725
|
-
end
|
909
|
+
end
|
data/lib/merb-core/config.rb
CHANGED
@@ -14,6 +14,7 @@ module Merb
|
|
14
14
|
:port => "4000",
|
15
15
|
:adapter => "runner",
|
16
16
|
:reload_classes => true,
|
17
|
+
:fork_for_class_load => !RUBY_PLATFORM.in?("windows", "java"),
|
17
18
|
:environment => "development",
|
18
19
|
:merb_root => Dir.pwd,
|
19
20
|
:use_mutex => true,
|
@@ -22,7 +23,8 @@ module Merb
|
|
22
23
|
:log_level => :info,
|
23
24
|
:disabled_components => [],
|
24
25
|
:deferred_actions => [],
|
25
|
-
:verbose => false
|
26
|
+
:verbose => false,
|
27
|
+
:name => "merb"
|
26
28
|
}
|
27
29
|
end
|
28
30
|
|
@@ -55,14 +57,14 @@ module Merb
|
|
55
57
|
# ==== Returns
|
56
58
|
# Object:: The value of the configuration parameter.
|
57
59
|
def [](key)
|
58
|
-
(@configuration||=
|
60
|
+
(@configuration ||= setup)[key]
|
59
61
|
end
|
60
62
|
|
61
63
|
# ==== Parameters
|
62
64
|
# key<Object>:: The key to set the parameter for.
|
63
65
|
# val<Object>:: The value of the parameter.
|
64
|
-
def []=(key,val)
|
65
|
-
@configuration[key] = val
|
66
|
+
def []=(key, val)
|
67
|
+
(@configuration ||= setup)[key] = val
|
66
68
|
end
|
67
69
|
|
68
70
|
# ==== Parameters
|
@@ -102,6 +104,12 @@ module Merb
|
|
102
104
|
# Configuration settings to use. These are merged with the defaults.
|
103
105
|
def setup(settings = {})
|
104
106
|
@configuration = defaults.merge(settings)
|
107
|
+
|
108
|
+
unless @configuration[:reload_classes]
|
109
|
+
@configuration[:fork_for_class_load] = false
|
110
|
+
end
|
111
|
+
|
112
|
+
@configuration
|
105
113
|
end
|
106
114
|
|
107
115
|
# Parses the command line arguments and stores them in the config.
|
@@ -119,103 +127,169 @@ module Merb
|
|
119
127
|
# Build a parser for the command line arguments
|
120
128
|
opts = OptionParser.new do |opts|
|
121
129
|
opts.version = Merb::VERSION
|
122
|
-
opts.release = Merb::RELEASE
|
123
130
|
|
124
131
|
opts.banner = "Usage: merb [uGdcIpPhmailLerkKX] [argument]"
|
125
132
|
opts.define_head "Merb. Pocket rocket web framework"
|
126
|
-
opts.separator '*'*80
|
127
|
-
opts.separator
|
128
|
-
|
129
|
-
|
130
|
-
|
133
|
+
opts.separator '*' * 80
|
134
|
+
opts.separator "If no flags are given, Merb starts in the " \
|
135
|
+
"foreground on port 4000."
|
136
|
+
opts.separator '*' * 80
|
137
|
+
|
138
|
+
opts.on("-u", "--user USER", "This flag is for having merb run " \
|
139
|
+
"as a user other than the one currently logged in. Note: " \
|
140
|
+
"if you set this you must also provide a --group option " \
|
141
|
+
"for it to take effect.") do |user|
|
131
142
|
options[:user] = user
|
132
143
|
end
|
133
144
|
|
134
|
-
opts.on("-G", "--group GROUP", "This flag is for having merb run
|
145
|
+
opts.on("-G", "--group GROUP", "This flag is for having merb run " \
|
146
|
+
"as a group other than the one currently logged in. Note: " \
|
147
|
+
"if you set this you must also provide a --user option " \
|
148
|
+
"for it to take effect.") do |group|
|
135
149
|
options[:group] = group
|
136
150
|
end
|
137
151
|
|
138
|
-
opts.on("-d", "--daemonize", "This will run a single merb in the
|
152
|
+
opts.on("-d", "--daemonize", "This will run a single merb in the " \
|
153
|
+
"background.") do |daemon|
|
139
154
|
options[:daemonize] = true
|
140
155
|
end
|
156
|
+
|
157
|
+
opts.on("-N", "--no-daemonize", "This will allow you to run a " \
|
158
|
+
"cluster in console mode") do |no_daemon|
|
159
|
+
options[:daemonize] = false
|
160
|
+
end
|
141
161
|
|
142
|
-
opts.on("-c", "--cluster-nodes NUM_MERBS",
|
162
|
+
opts.on("-c", "--cluster-nodes NUM_MERBS", Integer,
|
163
|
+
"Number of merb daemons to run.") do |nodes|
|
164
|
+
options[:daemonize] = true unless options.key?(:daemonize)
|
143
165
|
options[:cluster] = nodes
|
144
166
|
end
|
145
167
|
|
146
|
-
opts.on("-I", "--init-file FILE", "File to use for initialization
|
168
|
+
opts.on("-I", "--init-file FILE", "File to use for initialization " \
|
169
|
+
"on load, defaults to config/init.rb") do |init_file|
|
147
170
|
options[:init_file] = init_file
|
148
171
|
end
|
149
172
|
|
150
|
-
opts.on("-p", "--port PORTNUM", "Port to run merb on,
|
173
|
+
opts.on("-p", "--port PORTNUM", Integer, "Port to run merb on, " \
|
174
|
+
"defaults to 4000.") do |port|
|
151
175
|
options[:port] = port
|
152
176
|
end
|
153
177
|
|
154
|
-
opts.on("-o", "--socket-file FILE", "Socket file to run merb on,
|
178
|
+
opts.on("-o", "--socket-file FILE", "Socket file to run merb on, " \
|
179
|
+
"defaults to [Merb.root]/log/merb.sock. This is for " \
|
180
|
+
"web servers, like thin, that use sockets." \
|
181
|
+
"Specify this *only* if you *must*.") do |port|
|
155
182
|
options[:socket_file] = port
|
156
183
|
end
|
157
184
|
|
158
|
-
opts.on("-s", "--socket SOCKNUM", "Socket number to run
|
185
|
+
opts.on("-s", "--socket SOCKNUM", Integer, "Socket number to run " \
|
186
|
+
"merb on, defaults to 0.") do |port|
|
159
187
|
options[:socket] = port
|
160
188
|
end
|
161
189
|
|
162
|
-
opts.on("-
|
190
|
+
opts.on("-n", "--name NAME", String, "Set the name of the application. "\
|
191
|
+
"This is used in the process title and log file names.") do |name|
|
192
|
+
options[:name] = name
|
193
|
+
end
|
194
|
+
|
195
|
+
opts.on("-P", "--pid PIDFILE", "PID file, defaults to " \
|
196
|
+
"[Merb.root]/log/merb.main.pid for the master process and" \
|
197
|
+
"[Merb.root]/log/merb.[port number].pid for worker " \
|
198
|
+
"processes. For clusters, use %s to specify where " \
|
199
|
+
"in the file merb should place the port number. For " \
|
200
|
+
"instance: -P myapp.%s.pid") do |pid_file|
|
163
201
|
options[:pid_file] = pid_file
|
164
202
|
end
|
165
203
|
|
166
|
-
opts.on("-h", "--host HOSTNAME", "Host to bind to
|
204
|
+
opts.on("-h", "--host HOSTNAME", "Host to bind to " \
|
205
|
+
"(default is 0.0.0.0).") do |host|
|
167
206
|
options[:host] = host
|
168
207
|
end
|
169
208
|
|
170
|
-
opts.on("-m", "--merb-root /path/to/approot", "The path to the
|
209
|
+
opts.on("-m", "--merb-root /path/to/approot", "The path to the " \
|
210
|
+
"Merb.root for the app you want to run " \
|
211
|
+
"(default is current working directory).") do |root|
|
171
212
|
options[:merb_root] = File.expand_path(root)
|
172
213
|
end
|
173
214
|
|
174
|
-
|
175
|
-
|
215
|
+
adapters = [:mongrel, :emongrel, :thin, :ebb, :fastcgi, :webrick]
|
216
|
+
|
217
|
+
opts.on("-a", "--adapter ADAPTER",
|
218
|
+
"The rack adapter to use to run merb (default is mongrel)" \
|
219
|
+
"[#{adapters.join(', ')}]") do |adapter|
|
220
|
+
options[:adapter] ||= adapter
|
176
221
|
end
|
177
222
|
|
178
|
-
opts.on("-R", "--rackup FILE", "Load an alternate Rack config
|
223
|
+
opts.on("-R", "--rackup FILE", "Load an alternate Rack config " \
|
224
|
+
"file (default is config/rack.rb)") do |rackup|
|
179
225
|
options[:rackup] = rackup
|
180
226
|
end
|
181
227
|
|
182
|
-
opts.on("-i", "--irb-console", "This flag will start merb in
|
228
|
+
opts.on("-i", "--irb-console", "This flag will start merb in " \
|
229
|
+
"irb console mode. All your models and other classes will " \
|
230
|
+
"be available for you in an irb session.") do |console|
|
183
231
|
options[:adapter] = 'irb'
|
184
232
|
end
|
185
233
|
|
186
|
-
opts.on("-S", "--sandbox", "This flag will enable a sandboxed irb
|
234
|
+
opts.on("-S", "--sandbox", "This flag will enable a sandboxed irb " \
|
235
|
+
"console. If your ORM supports transactions, all edits will " \
|
236
|
+
"be rolled back on exit.") do |sandbox|
|
187
237
|
options[:sandbox] = true
|
188
238
|
end
|
189
239
|
|
190
|
-
opts.on("-l", "--log-level LEVEL", "Log levels can be set to any of
|
240
|
+
opts.on("-l", "--log-level LEVEL", "Log levels can be set to any of " \
|
241
|
+
"these options: debug < info < warn < error < " \
|
242
|
+
"fatal (default is info)") do |log_level|
|
191
243
|
options[:log_level] = log_level.to_sym
|
244
|
+
options[:force_logging] = true
|
192
245
|
end
|
193
246
|
|
194
|
-
opts.on("-L", "--log LOGFILE", "A string representing the logfile to
|
247
|
+
opts.on("-L", "--log LOGFILE", "A string representing the logfile to " \
|
248
|
+
"use. Defaults to [Merb.root]/log/merb.[main].log for the " \
|
249
|
+
"master process and [Merb.root]/log/merb[port number].log" \
|
250
|
+
"for worker processes") do |log_file|
|
195
251
|
options[:log_file] = log_file
|
252
|
+
options[:force_logging] = true
|
196
253
|
end
|
197
254
|
|
198
|
-
opts.on("-e", "--environment STRING", "
|
255
|
+
opts.on("-e", "--environment STRING", "Environment to run Merb " \
|
256
|
+
"under [development, production, testing] " \
|
257
|
+
"(default is development)") do |env|
|
199
258
|
options[:environment] = env
|
200
259
|
end
|
201
260
|
|
202
261
|
opts.on("-r", "--script-runner ['RUBY CODE'| FULL_SCRIPT_PATH]",
|
203
|
-
|
262
|
+
"Command-line option to run scripts and/or code in the " \
|
263
|
+
"merb app.") do |code_or_file|
|
204
264
|
options[:runner_code] = code_or_file
|
205
265
|
options[:adapter] = 'runner'
|
206
266
|
end
|
207
267
|
|
208
|
-
opts.on("-K", "--graceful PORT or all", "Gracefully kill one
|
268
|
+
opts.on("-K", "--graceful PORT or all", "Gracefully kill one " \
|
269
|
+
"merb proceses by port number. Use merb -K all to " \
|
270
|
+
"gracefully kill all merbs.") do |ports|
|
209
271
|
options[:action] = :kill
|
272
|
+
ports = "main" if ports == "all"
|
210
273
|
options[:port] = ports
|
211
274
|
end
|
212
275
|
|
213
|
-
opts.on("-k", "--kill PORT
|
276
|
+
opts.on("-k", "--kill PORT", "Force kill one merb worker " \
|
277
|
+
"by port number. This will cause the worker to" \
|
278
|
+
"be respawned. If you want to kill ") do |port|
|
214
279
|
options[:action] = :kill_9
|
280
|
+
port = "main" if port == "all"
|
215
281
|
options[:port] = port
|
216
282
|
end
|
283
|
+
|
284
|
+
opts.on("--fast-deploy", "Reload the code, but not your" \
|
285
|
+
"init.rb or gems") do
|
286
|
+
options[:action] = :fast_deploy
|
287
|
+
end
|
217
288
|
|
218
|
-
|
289
|
+
# @todo Do we really need this flag? It seems unlikely to want to
|
290
|
+
# change the mutex from the command-line.
|
291
|
+
opts.on("-X", "--mutex on/off", "This flag is for turning the " \
|
292
|
+
"mutex lock on and off.") do |mutex|
|
219
293
|
if mutex == "off"
|
220
294
|
options[:use_mutex] = false
|
221
295
|
else
|
@@ -227,10 +301,13 @@ module Merb
|
|
227
301
|
begin
|
228
302
|
require "ruby-debug"
|
229
303
|
Debugger.start
|
230
|
-
|
304
|
+
if Debugger.respond_to?(:settings)
|
305
|
+
Debugger.settings[:autoeval] = true
|
306
|
+
end
|
231
307
|
puts "Debugger enabled"
|
232
308
|
rescue LoadError
|
233
|
-
puts "You need to install ruby-debug to run the server in
|
309
|
+
puts "You need to install ruby-debug to run the server in " \
|
310
|
+
"debugging mode. With gems, use `gem install ruby-debug'"
|
234
311
|
exit
|
235
312
|
end
|
236
313
|
end
|
@@ -238,7 +315,11 @@ module Merb
|
|
238
315
|
opts.on("-V", "--verbose", "Print extra information") do
|
239
316
|
options[:verbose] = true
|
240
317
|
end
|
241
|
-
|
318
|
+
|
319
|
+
opts.on("-C", "--console-trap", "Enter an irb console on ^C") do
|
320
|
+
options[:console_trap] = true
|
321
|
+
end
|
322
|
+
|
242
323
|
opts.on("-?", "-H", "--help", "Show this help message") do
|
243
324
|
puts opts
|
244
325
|
exit
|
@@ -246,7 +327,11 @@ module Merb
|
|
246
327
|
end
|
247
328
|
|
248
329
|
# Parse what we have on the command line
|
249
|
-
|
330
|
+
begin
|
331
|
+
opts.parse!(argv)
|
332
|
+
rescue OptionParser::InvalidOption => e
|
333
|
+
Merb.fatal! e.message, e
|
334
|
+
end
|
250
335
|
Merb::Config.setup(options)
|
251
336
|
end
|
252
337
|
|