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.
Files changed (274) hide show
  1. data/CHANGELOG +136 -2
  2. data/CONTRIBUTORS +6 -0
  3. data/PUBLIC_CHANGELOG +38 -0
  4. data/Rakefile +38 -30
  5. data/lib/merb-core.rb +88 -23
  6. data/lib/merb-core/bootloader.rb +235 -51
  7. data/lib/merb-core/config.rb +121 -36
  8. data/lib/merb-core/controller/abstract_controller.rb +59 -36
  9. data/lib/merb-core/controller/exceptions.rb +2 -15
  10. data/lib/merb-core/controller/merb_controller.rb +44 -1
  11. data/lib/merb-core/controller/mime.rb +4 -0
  12. data/lib/merb-core/controller/mixins/controller.rb +38 -21
  13. data/lib/merb-core/controller/mixins/render.rb +44 -29
  14. data/lib/merb-core/controller/mixins/responder.rb +3 -31
  15. data/lib/merb-core/controller/template.rb +45 -21
  16. data/lib/merb-core/core_ext/kernel.rb +60 -32
  17. data/lib/merb-core/dispatch/default_exception/default_exception.rb +2 -2
  18. data/lib/merb-core/dispatch/default_exception/views/_css.html.erb +3 -1
  19. data/lib/merb-core/dispatch/default_exception/views/_javascript.html.erb +71 -67
  20. data/lib/merb-core/dispatch/default_exception/views/index.html.erb +7 -3
  21. data/lib/merb-core/dispatch/dispatcher.rb +3 -3
  22. data/lib/merb-core/dispatch/request.rb +56 -9
  23. data/lib/merb-core/dispatch/router.rb +159 -133
  24. data/lib/merb-core/dispatch/router/behavior.rb +462 -703
  25. data/lib/merb-core/dispatch/router/cached_proc.rb +3 -3
  26. data/lib/merb-core/dispatch/router/resources.rb +289 -0
  27. data/lib/merb-core/dispatch/router/route.rb +514 -294
  28. data/lib/merb-core/dispatch/session.rb +4 -2
  29. data/lib/merb-core/logger.rb +213 -202
  30. data/lib/merb-core/plugins.rb +9 -1
  31. data/lib/merb-core/rack.rb +3 -1
  32. data/lib/merb-core/rack/adapter.rb +7 -4
  33. data/lib/merb-core/rack/adapter/abstract.rb +188 -0
  34. data/lib/merb-core/rack/adapter/ebb.rb +12 -13
  35. data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -15
  36. data/lib/merb-core/rack/adapter/irb.rb +3 -2
  37. data/lib/merb-core/rack/adapter/mongrel.rb +22 -15
  38. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +4 -16
  39. data/lib/merb-core/rack/adapter/thin.rb +21 -22
  40. data/lib/merb-core/rack/adapter/thin_turbo.rb +4 -11
  41. data/lib/merb-core/rack/adapter/webrick.rb +54 -18
  42. data/lib/merb-core/rack/application.rb +4 -4
  43. data/lib/merb-core/rack/handler/mongrel.rb +12 -13
  44. data/lib/merb-core/rack/middleware/csrf.rb +1 -1
  45. data/lib/merb-core/rack/stream_wrapper.rb +41 -0
  46. data/lib/merb-core/server.rb +157 -90
  47. data/lib/merb-core/tasks/gem_management.rb +267 -0
  48. data/lib/merb-core/tasks/merb.rb +1 -0
  49. data/lib/merb-core/tasks/merb_rake_helper.rb +48 -34
  50. data/lib/merb-core/tasks/stats.rake +1 -1
  51. data/lib/merb-core/test.rb +9 -3
  52. data/lib/merb-core/test/helpers.rb +1 -0
  53. data/lib/merb-core/test/helpers/mock_request_helper.rb +393 -0
  54. data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -2
  55. data/lib/merb-core/test/helpers/request_helper.rb +40 -372
  56. data/lib/merb-core/test/helpers/route_helper.rb +16 -2
  57. data/lib/merb-core/test/matchers.rb +1 -0
  58. data/lib/merb-core/test/matchers/controller_matchers.rb +4 -247
  59. data/lib/merb-core/test/matchers/request_matchers.rb +140 -0
  60. data/lib/merb-core/test/matchers/view_matchers.rb +22 -4
  61. data/lib/merb-core/test/run_specs.rb +118 -26
  62. data/lib/merb-core/test/test_ext/rspec.rb +181 -0
  63. data/lib/merb-core/version.rb +1 -9
  64. metadata +10 -342
  65. data/docs/bootloading.dox +0 -58
  66. data/docs/documentation_standards +0 -40
  67. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  68. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  69. data/docs/merb-core-call-stack-diagram.png +0 -0
  70. data/docs/new_render_api +0 -51
  71. data/lib/merb-core/vendor/facets.rb +0 -2
  72. data/lib/merb-core/vendor/facets/dictionary.rb +0 -433
  73. data/lib/merb-core/vendor/facets/inflect.rb +0 -342
  74. data/spec/private/config/adapter_spec.rb +0 -32
  75. data/spec/private/config/config_spec.rb +0 -202
  76. data/spec/private/config/environment_spec.rb +0 -13
  77. data/spec/private/config/merb_spec.rb +0 -34
  78. data/spec/private/config/spec_helper.rb +0 -1
  79. data/spec/private/core_ext/kernel_spec.rb +0 -159
  80. data/spec/private/dispatch/bootloader_spec.rb +0 -24
  81. data/spec/private/dispatch/fixture/app/controllers/application.rb +0 -4
  82. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +0 -25
  83. data/spec/private/dispatch/fixture/app/controllers/foo.rb +0 -19
  84. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +0 -8
  85. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +0 -37
  86. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +0 -216
  87. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +0 -38
  88. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +0 -40
  89. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  90. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +0 -11
  91. data/spec/private/dispatch/fixture/config/black_hole.rb +0 -12
  92. data/spec/private/dispatch/fixture/config/environments/development.rb +0 -6
  93. data/spec/private/dispatch/fixture/config/environments/production.rb +0 -5
  94. data/spec/private/dispatch/fixture/config/environments/test.rb +0 -6
  95. data/spec/private/dispatch/fixture/config/init.rb +0 -45
  96. data/spec/private/dispatch/fixture/config/rack.rb +0 -11
  97. data/spec/private/dispatch/fixture/config/router.rb +0 -35
  98. data/spec/private/dispatch/fixture/log/merb_test.log +0 -8839
  99. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  100. data/spec/private/dispatch/fixture/public/merb.fcgi +0 -4
  101. data/spec/private/dispatch/fixture/public/stylesheets/master.css +0 -119
  102. data/spec/private/dispatch/route_params_spec.rb +0 -23
  103. data/spec/private/dispatch/spec_helper.rb +0 -1
  104. data/spec/private/router/behavior_spec.rb +0 -60
  105. data/spec/private/router/fixture/log/merb_test.log +0 -35
  106. data/spec/private/router/route_spec.rb +0 -418
  107. data/spec/private/router/router_spec.rb +0 -183
  108. data/spec/private/vendor/facets/plural_spec.rb +0 -564
  109. data/spec/private/vendor/facets/singular_spec.rb +0 -489
  110. data/spec/public/DEFINITIONS +0 -11
  111. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +0 -1
  112. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +0 -1
  113. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +0 -1
  114. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +0 -1
  115. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +0 -1
  116. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
  117. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +0 -1
  118. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +0 -1
  119. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +0 -1
  120. data/spec/public/abstract_controller/controllers/cousins.rb +0 -41
  121. data/spec/public/abstract_controller/controllers/display.rb +0 -60
  122. data/spec/public/abstract_controller/controllers/filters.rb +0 -260
  123. data/spec/public/abstract_controller/controllers/helpers.rb +0 -41
  124. data/spec/public/abstract_controller/controllers/partial.rb +0 -121
  125. data/spec/public/abstract_controller/controllers/render.rb +0 -113
  126. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +0 -1
  127. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +0 -1
  128. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +0 -1
  129. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +0 -1
  130. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +0 -1
  131. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +0 -1
  132. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +0 -1
  133. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +0 -1
  134. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +0 -1
  135. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  136. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +0 -1
  137. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
  138. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +0 -1
  139. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +0 -1
  140. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +0 -1
  141. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +0 -1
  142. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +0 -1
  143. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +0 -1
  144. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +0 -1
  145. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +0 -1
  146. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +0 -1
  147. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +0 -1
  148. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +0 -1
  149. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +0 -1
  150. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +0 -1
  151. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +0 -1
  152. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +0 -1
  153. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +0 -1
  154. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +0 -1
  155. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +0 -1
  156. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +0 -1
  157. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +0 -1
  158. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +0 -1
  159. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +0 -1
  160. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +0 -1
  161. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +0 -1
  162. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +0 -1
  163. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +0 -1
  164. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +0 -1
  165. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +0 -1
  166. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +0 -1
  167. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +0 -1
  168. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +0 -1
  169. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  170. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +0 -1
  171. data/spec/public/abstract_controller/display_spec.rb +0 -37
  172. data/spec/public/abstract_controller/filter_spec.rb +0 -136
  173. data/spec/public/abstract_controller/helper_spec.rb +0 -21
  174. data/spec/public/abstract_controller/partial_spec.rb +0 -61
  175. data/spec/public/abstract_controller/render_spec.rb +0 -90
  176. data/spec/public/abstract_controller/spec_helper.rb +0 -31
  177. data/spec/public/boot_loader/boot_loader_spec.rb +0 -33
  178. data/spec/public/boot_loader/spec_helper.rb +0 -1
  179. data/spec/public/controller/authentication_spec.rb +0 -174
  180. data/spec/public/controller/base_spec.rb +0 -88
  181. data/spec/public/controller/conditional_get_spec.rb +0 -100
  182. data/spec/public/controller/config/init.rb +0 -6
  183. data/spec/public/controller/controllers/authentication.rb +0 -74
  184. data/spec/public/controller/controllers/base.rb +0 -65
  185. data/spec/public/controller/controllers/conditional_get.rb +0 -35
  186. data/spec/public/controller/controllers/cookies.rb +0 -36
  187. data/spec/public/controller/controllers/dispatcher.rb +0 -35
  188. data/spec/public/controller/controllers/display.rb +0 -118
  189. data/spec/public/controller/controllers/redirect.rb +0 -36
  190. data/spec/public/controller/controllers/responder.rb +0 -93
  191. data/spec/public/controller/controllers/url.rb +0 -7
  192. data/spec/public/controller/controllers/views/layout/custom.html.erb +0 -1
  193. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +0 -1
  194. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +0 -1
  195. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +0 -1
  196. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +0 -1
  197. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +0 -1
  198. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +0 -1
  199. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +0 -1
  200. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +0 -1
  201. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +0 -1
  202. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +0 -1
  203. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +0 -1
  204. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +0 -1
  205. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +0 -1
  206. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +0 -1
  207. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +0 -1
  208. data/spec/public/controller/cookies_spec.rb +0 -95
  209. data/spec/public/controller/dispatcher_spec.rb +0 -410
  210. data/spec/public/controller/display_spec.rb +0 -84
  211. data/spec/public/controller/redirect_spec.rb +0 -33
  212. data/spec/public/controller/responder_spec.rb +0 -169
  213. data/spec/public/controller/spec_helper.rb +0 -13
  214. data/spec/public/controller/url_spec.rb +0 -255
  215. data/spec/public/core/merb_core_spec.rb +0 -45
  216. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +0 -2
  217. data/spec/public/core_ext/kernel_spec.rb +0 -88
  218. data/spec/public/core_ext/spec_helper.rb +0 -1
  219. data/spec/public/directory_structure/directory/app/controllers/application.rb +0 -3
  220. data/spec/public/directory_structure/directory/app/controllers/base.rb +0 -13
  221. data/spec/public/directory_structure/directory/app/controllers/custom.rb +0 -19
  222. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +0 -1
  223. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +0 -1
  224. data/spec/public/directory_structure/directory/config/router.rb +0 -3
  225. data/spec/public/directory_structure/directory/log/merb_test.log +0 -4588
  226. data/spec/public/directory_structure/directory_spec.rb +0 -43
  227. data/spec/public/logger/logger_spec.rb +0 -181
  228. data/spec/public/logger/spec_helper.rb +0 -1
  229. data/spec/public/rack/conditinal_get_middleware_spec.rb +0 -127
  230. data/spec/public/rack/csrf_middleware_spec.rb +0 -70
  231. data/spec/public/rack/rack_middleware_spec.rb +0 -99
  232. data/spec/public/rack/shared_example_groups.rb +0 -35
  233. data/spec/public/reloading/directory/app/controllers/application.rb +0 -3
  234. data/spec/public/reloading/directory/app/controllers/reload.rb +0 -6
  235. data/spec/public/reloading/directory/config/init.rb +0 -2
  236. data/spec/public/reloading/directory/log/merb_test.log +0 -288231
  237. data/spec/public/reloading/reload_spec.rb +0 -103
  238. data/spec/public/request/multipart_spec.rb +0 -41
  239. data/spec/public/request/request_spec.rb +0 -250
  240. data/spec/public/router/default_spec.rb +0 -21
  241. data/spec/public/router/deferred_spec.rb +0 -22
  242. data/spec/public/router/fixation_spec.rb +0 -49
  243. data/spec/public/router/fixture/log/merb_test.log +0 -524
  244. data/spec/public/router/namespace_spec.rb +0 -113
  245. data/spec/public/router/nested_matches_spec.rb +0 -97
  246. data/spec/public/router/nested_resources_spec.rb +0 -41
  247. data/spec/public/router/resource_spec.rb +0 -37
  248. data/spec/public/router/resources_spec.rb +0 -82
  249. data/spec/public/router/spec_helper.rb +0 -90
  250. data/spec/public/router/special_spec.rb +0 -61
  251. data/spec/public/router/string_spec.rb +0 -61
  252. data/spec/public/session/controllers/sessions.rb +0 -56
  253. data/spec/public/session/cookie_session_spec.rb +0 -73
  254. data/spec/public/session/memcached_session_spec.rb +0 -31
  255. data/spec/public/session/memory_session_spec.rb +0 -28
  256. data/spec/public/session/multiple_sessions_spec.rb +0 -74
  257. data/spec/public/session/no_session_spec.rb +0 -12
  258. data/spec/public/session/session_spec.rb +0 -106
  259. data/spec/public/template/template_spec.rb +0 -104
  260. data/spec/public/template/templates/error.html.erb +0 -2
  261. data/spec/public/template/templates/template.html.erb +0 -1
  262. data/spec/public/template/templates/template.html.myt +0 -1
  263. data/spec/public/test/controller_matchers_spec.rb +0 -412
  264. data/spec/public/test/controllers/controller_assertion_mock.rb +0 -7
  265. data/spec/public/test/controllers/dispatch_controller.rb +0 -11
  266. data/spec/public/test/controllers/spec_helper_controller.rb +0 -39
  267. data/spec/public/test/multipart_request_helper_spec.rb +0 -159
  268. data/spec/public/test/multipart_upload_text_file.txt +0 -1
  269. data/spec/public/test/request_helper_spec.rb +0 -269
  270. data/spec/public/test/route_helper_spec.rb +0 -78
  271. data/spec/public/test/route_matchers_spec.rb +0 -166
  272. data/spec/public/test/view_helper_spec.rb +0 -96
  273. data/spec/public/test/view_matchers_spec.rb +0 -183
  274. data/spec/spec_helper.rb +0 -121
@@ -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, self.before_load_callbacks, self.finished = [], [], [], []
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.logger = Merb::Logger.new(Merb.log_file, Merb::Config[:log_level], Merb::Config[:log_delimiter], Merb::Config[:log_auto_flush])
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.logger.warn! "Merb requires Rubygems 1.1 and later. Please upgrade RubyGems with gem update --system."
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 < Merb::BootLoader
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(Merb::Config[:port]) if Merb::Config[:daemonize] || Merb::Config[:cluster]
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 { |name, ver| Kernel.load_dependency(name, *ver) }
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
- updated_logger_options = [ Merb.log_file, Merb::Config[:log_level], Merb::Config[:log_delimiter], Merb::Config[:log_auto_flush] ]
279
- Merb::BootLoader::Logger.run if updated_logger_options != Merb.logger.init_args
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
- $LOAD_PATH.unshift Merb.dir_for(:model)
360
- $LOAD_PATH.unshift Merb.dir_for(:controller)
361
- $LOAD_PATH.unshift Merb.dir_for(:lib)
362
- $LOAD_PATH.unshift Merb.dir_for(:helper)
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 unless path.last && component != :application
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
- klasses = ObjectSpace.classes.dup
380
- load file
381
- LOADED_CLASSES[file] = ObjectSpace.classes - klasses
382
- MTIMES[file] = File.mtime(file)
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
- remove_classes_in_file(file) { |f| load_file(f) }
407
- end
408
-
409
- # Reload the router to regenerate all routes.
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).each do |klass, e|
492
- Merb.logger.fatal! "Could not load #{klass}:\n\n#{e.message} - (#{e.class})\n\n#{(e.backtrace || []).join("\n")}"
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
- raise LoadError, "Could not load #{failed_classes.inspect} (see log for details)."
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
- template_paths.flatten.compact.uniq
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
- block.call
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 << Merb.dir_for(:application) if Merb.dir_for(:application) && File.file?(Merb.dir_for(:application))
891
+ paths.flatten!
709
892
 
710
- paths.flatten.each do |file|
711
- next if Merb::BootLoader::LoadClasses::MTIMES[file] && Merb::BootLoader::LoadClasses::MTIMES[file] == File.mtime(file)
712
- Merb::BootLoader::LoadClasses.reload(file)
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 templates if the reload_templates key has been set in config.
720
- def self.run
721
- unless Merb::Config.key?(:reload_templates)
722
- Merb::Config[:reload_templates] = (Merb.environment == "development")
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
@@ -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||={})[key]
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 'If no flags are given, Merb starts in the foreground on port 4000.'
128
- opts.separator '*'*80
129
-
130
- 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 |user|
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 as a group other than the one currently logged in. Note: if you set this you must also provide a --user option for it to take effect.") do |group|
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 background.") do |daemon|
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", "Number of merb daemons to run.") do |nodes|
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 on load, defaults to config/init.rb") do |init_file|
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, defaults to 4000.") do |port|
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, defaults to [Merb.root]/log/merb.sock") do |port|
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 merb on, defaults to 0.") do |port|
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("-P", "--pid PIDFILE", "PID file, defaults to [Merb.root]/log/merb.[port_number].pid") do |pid_file|
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 (default is 0.0.0.0).") do |host|
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 Merb.root for the app you want to run (default is current working dir).") do |root|
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
- opts.on("-a", "--adapter mongrel", "The rack adapter to use to run merb[mongrel, emongrel, thin, ebb, fastcgi, webrick, runner, irb]") do |adapter|
175
- options[:adapter] = adapter
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 file (default is config/rack.rb)") do |rackup|
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 irb console mode. All your models and other classes will be available for you in an irb session.") do |console|
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 console. If your ORM supports transactions, all edits will be rolled back on exit.") do |sandbox|
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 these options: debug < info < warn < error < fatal") do |log_level|
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 use.") do |log_file|
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", "Run merb in the correct mode(development, production, testing)") do |env|
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
- "Command-line option to run scripts and/or code in the merb app.") do |code_or_file|
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 merb proceses by port number. Use merb -K all to gracefully kill all merbs.") do |ports|
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 or all", "Kill one merb proceses by port number. Use merb -k all to kill all merbs.") do |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
- opts.on("-X", "--mutex on/off", "This flag is for turning the mutex lock on and off.") do |mutex|
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
- Debugger.settings[:autoeval] = true if Debugger.respond_to?(:settings)
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 debugging mode. With gems, use 'gem install ruby-debug'"
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
- opts.parse!(argv)
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