merb-core 0.9.13 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/Rakefile +5 -3
  2. data/lib/merb-core.rb +84 -41
  3. data/lib/merb-core/bootloader.rb +71 -60
  4. data/lib/merb-core/config.rb +31 -17
  5. data/lib/merb-core/controller/abstract_controller.rb +35 -35
  6. data/lib/merb-core/controller/exceptions.rb +14 -9
  7. data/lib/merb-core/controller/merb_controller.rb +22 -20
  8. data/lib/merb-core/controller/mime.rb +5 -5
  9. data/lib/merb-core/controller/mixins/authentication.rb +11 -8
  10. data/lib/merb-core/controller/mixins/conditional_get.rb +7 -7
  11. data/lib/merb-core/controller/mixins/controller.rb +15 -15
  12. data/lib/merb-core/controller/mixins/render.rb +16 -16
  13. data/lib/merb-core/controller/mixins/responder.rb +23 -23
  14. data/lib/merb-core/controller/template.rb +17 -17
  15. data/lib/merb-core/core_ext/hash.rb +2 -2
  16. data/lib/merb-core/core_ext/kernel.rb +19 -18
  17. data/lib/merb-core/dispatch/cookies.rb +13 -0
  18. data/lib/merb-core/dispatch/default_exception/default_exception.rb +12 -1
  19. data/lib/merb-core/dispatch/dispatcher.rb +6 -5
  20. data/lib/merb-core/dispatch/request.rb +56 -52
  21. data/lib/merb-core/dispatch/request_parsers.rb +7 -7
  22. data/lib/merb-core/dispatch/router.rb +14 -14
  23. data/lib/merb-core/dispatch/router/behavior.rb +31 -31
  24. data/lib/merb-core/dispatch/router/cached_proc.rb +13 -1
  25. data/lib/merb-core/dispatch/router/resources.rb +9 -9
  26. data/lib/merb-core/dispatch/router/route.rb +60 -7
  27. data/lib/merb-core/dispatch/session.rb +21 -15
  28. data/lib/merb-core/dispatch/session/container.rb +10 -8
  29. data/lib/merb-core/dispatch/session/cookie.rb +12 -11
  30. data/lib/merb-core/dispatch/session/memcached.rb +4 -2
  31. data/lib/merb-core/dispatch/session/memory.rb +8 -6
  32. data/lib/merb-core/dispatch/session/store_container.rb +6 -5
  33. data/lib/merb-core/dispatch/worker.rb +28 -10
  34. data/lib/merb-core/gem_ext/erubis.rb +4 -2
  35. data/lib/merb-core/logger.rb +3 -22
  36. data/lib/merb-core/plugins.rb +5 -5
  37. data/lib/merb-core/rack.rb +1 -1
  38. data/lib/merb-core/rack/adapter.rb +5 -1
  39. data/lib/merb-core/rack/adapter/abstract.rb +15 -10
  40. data/lib/merb-core/rack/adapter/ebb.rb +4 -2
  41. data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -1
  42. data/lib/merb-core/rack/adapter/fcgi.rb +3 -1
  43. data/lib/merb-core/rack/adapter/irb.rb +10 -1
  44. data/lib/merb-core/rack/adapter/mongrel.rb +5 -2
  45. data/lib/merb-core/rack/adapter/runner.rb +3 -1
  46. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +2 -1
  47. data/lib/merb-core/rack/adapter/thin.rb +4 -1
  48. data/lib/merb-core/rack/adapter/thin_turbo.rb +1 -0
  49. data/lib/merb-core/rack/adapter/webrick.rb +8 -34
  50. data/lib/merb-core/rack/application.rb +2 -2
  51. data/lib/merb-core/rack/handler/mongrel.rb +7 -0
  52. data/lib/merb-core/rack/helpers.rb +1 -1
  53. data/lib/merb-core/rack/middleware.rb +7 -1
  54. data/lib/merb-core/rack/middleware/conditional_get.rb +3 -0
  55. data/lib/merb-core/rack/middleware/content_length.rb +2 -0
  56. data/lib/merb-core/rack/middleware/path_prefix.rb +4 -0
  57. data/lib/merb-core/rack/middleware/profiler.rb +3 -1
  58. data/lib/merb-core/rack/middleware/static.rb +7 -1
  59. data/lib/merb-core/rack/middleware/tracer.rb +1 -0
  60. data/lib/merb-core/rack/stream_wrapper.rb +35 -30
  61. data/lib/merb-core/server.rb +17 -16
  62. data/lib/merb-core/tasks/gem_management.rb +1 -1
  63. data/lib/merb-core/tasks/merb.rb +3 -1
  64. data/lib/merb-core/tasks/merb_rake_helper.rb +1 -1
  65. data/lib/merb-core/test.rb +8 -8
  66. data/lib/merb-core/test/helpers.rb +1 -1
  67. data/lib/merb-core/test/helpers/cookie_jar.rb +16 -2
  68. data/lib/merb-core/test/helpers/mock_request_helper.rb +13 -13
  69. data/lib/merb-core/test/helpers/request_helper.rb +1 -1
  70. data/lib/merb-core/test/helpers/route_helper.rb +2 -2
  71. data/lib/merb-core/test/matchers.rb +3 -3
  72. data/lib/merb-core/test/matchers/request_matchers.rb +1 -1
  73. data/lib/merb-core/test/run_spec.rb +1 -1
  74. data/lib/merb-core/test/tasks/spectasks.rb +1 -1
  75. data/lib/merb-core/test/test_ext/hpricot.rb +1 -1
  76. data/lib/merb-core/test/test_ext/rspec.rb +2 -2
  77. data/lib/merb-core/test/test_ext/string.rb +1 -1
  78. data/lib/merb-core/version.rb +1 -1
  79. metadata +8 -22
  80. data/lib/merb-core/test/matchers/view_matchers.rb +0 -231
  81. data/lib/merb-core/test/webrat.rb +0 -37
  82. data/lib/merb-core/vendor/nokogiri/css.rb +0 -6
  83. data/lib/merb-core/vendor/nokogiri/css/generated_parser.rb +0 -653
  84. data/lib/merb-core/vendor/nokogiri/css/generated_tokenizer.rb +0 -159
  85. data/lib/merb-core/vendor/nokogiri/css/node.rb +0 -95
  86. data/lib/merb-core/vendor/nokogiri/css/parser.rb +0 -24
  87. data/lib/merb-core/vendor/nokogiri/css/parser.y +0 -198
  88. data/lib/merb-core/vendor/nokogiri/css/tokenizer.rb +0 -9
  89. data/lib/merb-core/vendor/nokogiri/css/tokenizer.rex +0 -63
  90. data/lib/merb-core/vendor/nokogiri/css/xpath_visitor.rb +0 -159
data/Rakefile CHANGED
@@ -56,6 +56,8 @@ spec = Gem::Specification.new do |s|
56
56
  s.has_rdoc = true
57
57
  s.extra_rdoc_files = %w( README LICENSE TODO )
58
58
 
59
+ s.required_rubygems_version = ">= 1.3.0"
60
+
59
61
  # Dependencies
60
62
  s.add_dependency "extlib", ">= 0.9.8"
61
63
  s.add_dependency "erubis", ">= 2.6.2"
@@ -64,12 +66,12 @@ spec = Gem::Specification.new do |s|
64
66
  s.add_dependency "rspec"
65
67
  s.add_dependency "rack"
66
68
  s.add_dependency "mime-types"
67
- s.add_dependency "hpricot"
68
69
  s.add_dependency "thor", ">= 0.9.7"
69
70
  # this escalates to "regular" dependencies, comment it out
70
71
  # for now. RubyGems need some love.
71
72
  #s.add_development_dependency "libxml-ruby"
72
73
  #s.add_development_dependency "memcache-client"
74
+ s.add_development_dependency "webrat", ">= 0.3.1"
73
75
  # Requirements
74
76
  s.requirements << "install the json gem to get faster json parsing"
75
77
  s.required_ruby_version = ">= 1.8.6"
@@ -101,7 +103,7 @@ task :gemspec do
101
103
  end
102
104
  end
103
105
 
104
- CLEAN.include ["**/.*.sw?", "pkg", "lib/*.bundle", "lib/*.so", "*.gem", "doc/rdoc", ".config", "coverage", "cache", "spec/**/*.log"]
106
+ CLEAN.include ["**/.*.sw?", "pkg", "lib/*.bundle", "lib/*.so", "*.gem", "doc/rdoc", ".config", "coverage", "cache", "spec/**/*.log", "**/gems/*"]
105
107
 
106
108
  desc "Run the specs."
107
109
  task :default => :specs
@@ -184,7 +186,7 @@ def setup_specs(name, spec_cmd='spec', run_opts = "-c")
184
186
  except = []
185
187
  except += Dir["spec/**/memcache*_spec.rb"] if ENV['MEMCACHED'] == 'no'
186
188
 
187
- public_globs = Dir["#{Dir.pwd}/spec/public/**/*_spec.rb"]
189
+ public_globs = Dir["#{Dir.pwd}/spec/public/**/*_spec.rb"].reject{|file| file.include?('/gems/')}
188
190
 
189
191
  private_globs = Dir["#{Dir.pwd}/spec/private/**/*_spec.rb"]
190
192
 
data/lib/merb-core.rb CHANGED
@@ -42,12 +42,47 @@ module Merb
42
42
  class << self
43
43
  attr_reader :exiting
44
44
 
45
+ # The list of procs that have been registered with Merb to run when
46
+ # Merb exits gracefully.
47
+ #
48
+ # ==== Returns
49
+ # Array:: The current list of procs
50
+ #
51
+ # :api: private
52
+ def at_exit_procs
53
+ @at_exit_procs ||= []
54
+ end
55
+
56
+ # Set the current exiting state of Merb. Setting this state to true
57
+ # also alerts Extlib to exit and clean up its state.
58
+ #
59
+ # ==== Returns
60
+ # Boolean:: The current exiting state of Merb
61
+ #
62
+ # :api: private
45
63
  def exiting=(bool)
46
64
  Extlib.exiting = bool
47
- if bool && Extlib.const_defined?("Pooling") && Extlib::Pooling.scavenger
48
- Extlib::Pooling.scavenger.wakeup
49
- end
50
65
  @exiting = bool
66
+ if bool
67
+ if Extlib.const_defined?("Pooling") && Extlib::Pooling.scavenger
68
+ Extlib::Pooling.scavenger.wakeup
69
+ end
70
+ while prc = self.at_exit_procs.pop
71
+ prc.call
72
+ end unless Merb::Config[:reap_workers_quickly]
73
+ end
74
+ @exiting
75
+ end
76
+
77
+ # Register a proc to run when Merb is exiting gracefully. It will *not*
78
+ # be run when Merb exits quickly.
79
+ #
80
+ # ==== Returns
81
+ # Array:: The current list of procs to run when Merb exits gracefully
82
+ #
83
+ # :api: plugin
84
+ def at_exit(&blk)
85
+ self.at_exit_procs << blk
51
86
  end
52
87
 
53
88
  # Merge environment settings
@@ -71,7 +106,7 @@ module Merb
71
106
  # use_db<~Boolean>:: Should Merb use the merged environments DB connection
72
107
  # Defaults to +false+
73
108
  #
74
- # @api public
109
+ # :api: public
75
110
  def merge_env(env,use_db=false)
76
111
  if Merb.environment_info.nil?
77
112
  Merb.environment_info = {
@@ -108,7 +143,7 @@ module Merb
108
143
  # argv<String, Hash>::
109
144
  # The config arguments to start Merb with. Defaults to +ARGV+.
110
145
  #
111
- # @api public
146
+ # :api: public
112
147
  def start(argv = ARGV)
113
148
  Merb::Config[:original_log_stream] = Merb::Config[:log_stream]
114
149
  Merb::Config[:log_stream] ||= STDOUT
@@ -142,7 +177,7 @@ module Merb
142
177
  # argv<String, Hash>::
143
178
  # The config arguments to start Merb with. Defaults to +ARGV+.
144
179
  #
145
- # @api public
180
+ # :api: public
146
181
  def start_environment(argv=ARGV)
147
182
  start(argv) unless (@started ||= false)
148
183
  end
@@ -153,15 +188,20 @@ module Merb
153
188
  # argv<String, Hash>::
154
189
  # The config arguments to restart Merb with. Defaults to +Merb::Config+.
155
190
  #
156
- # @api public
191
+ # :api: public
157
192
  def restart_environment(argv={})
158
193
  @started = false
159
194
  start_environment(Merb::Config.to_hash.merge(argv))
160
195
  end
161
196
 
162
- attr_accessor :environment, :load_paths, :adapter, :environment_info, :started
197
+ # :api: public
198
+ attr_accessor :environment, :adapter
199
+ # :api: private
200
+ attr_accessor :load_paths, :environment_info, :started
163
201
 
202
+ # :api: public
164
203
  alias :env :environment
204
+ # :api: public
165
205
  alias :started? :started
166
206
 
167
207
  Merb.load_paths = Dictionary.new { [Merb.root] } unless Merb.load_paths.is_a?(Dictionary)
@@ -216,7 +256,7 @@ module Merb
216
256
  # A glob that will be used to autoload files under the path. Defaults to
217
257
  # "**/*.rb".
218
258
  #
219
- # @api public
259
+ # :api: public
220
260
  def push_path(type, path, file_glob = "**/*.rb")
221
261
  enforce!(type => Symbol)
222
262
  load_paths[type] = [path, file_glob]
@@ -239,7 +279,7 @@ module Merb
239
279
  #
240
280
  # Will make Merb use app/models for mailers just like Ruby on Rails does.
241
281
  #
242
- # @api public
282
+ # :api: public
243
283
  def remove_paths(*args)
244
284
  args.each {|arg| load_paths.delete(arg)}
245
285
  end
@@ -250,7 +290,7 @@ module Merb
250
290
  # ==== Returns
251
291
  # String:: The directory for the requested type.
252
292
  #
253
- # @api public
293
+ # :api: public
254
294
  def dir_for(type)
255
295
  Merb.load_paths[type].first
256
296
  end
@@ -261,7 +301,7 @@ module Merb
261
301
  # ===== Returns
262
302
  # String:: The pattern with which to match files within the type directory.
263
303
  #
264
- # @api public
304
+ # :api: public
265
305
  def glob_for(type)
266
306
  Merb.load_paths[type][1]
267
307
  end
@@ -269,7 +309,7 @@ module Merb
269
309
  # ==== Returns
270
310
  # String:: The Merb root path.
271
311
  #
272
- # @api public
312
+ # :api: public
273
313
  def root
274
314
  @root || Merb::Config[:merb_root] || File.expand_path(Dir.pwd)
275
315
  end
@@ -277,7 +317,7 @@ module Merb
277
317
  # ==== Parameters
278
318
  # value<String>:: Path to the root directory.
279
319
  #
280
- # @api public
320
+ # :api: public
281
321
  def root=(value)
282
322
  @root = value
283
323
  end
@@ -303,14 +343,14 @@ module Merb
303
343
  # Return the Merb Logger object for the current thread.
304
344
  # Set it up if it does not exist.
305
345
  #
306
- # @api public
346
+ # :api: public
307
347
  def logger
308
348
  Thread.current[:merb_logger] ||= Merb::Logger.new
309
349
  end
310
350
 
311
351
  # Removes the logger for the current thread (nil).
312
352
  #
313
- # @api public
353
+ # :api: public
314
354
  def reset_logger!
315
355
  Thread.current[:merb_logger] = nil
316
356
  end
@@ -326,7 +366,7 @@ module Merb
326
366
  # just once, thereby never taking changes into account again. Now, it will
327
367
  # be memoized as :test - and just logging to merb_test.log.
328
368
  #
329
- # @api public
369
+ # :api: public
330
370
  def log_stream(port = "main")
331
371
  port = :test if Merb.testing?
332
372
  @streams ||= {}
@@ -357,7 +397,7 @@ module Merb
357
397
  # ==== Returns
358
398
  # String:: Path to the log directory which contains the log file.
359
399
  #
360
- # @api public
400
+ # :api: public
361
401
  def log_path
362
402
  case Merb::Config[:log_file]
363
403
  when String then File.dirname(Merb::Config[:log_file])
@@ -368,7 +408,7 @@ module Merb
368
408
  # ==== Returns
369
409
  # String:: The path of root directory of the Merb framework.
370
410
  #
371
- # @api public
411
+ # :api: public
372
412
  def framework_root
373
413
  @framework_root ||= File.dirname(__FILE__)
374
414
  end
@@ -381,7 +421,7 @@ module Merb
381
421
  # ==== Notes
382
422
  # Concatenates :deferred_actions configuration option values.
383
423
  #
384
- # @api public
424
+ # :api: public
385
425
  def deferred_actions
386
426
  @deferred ||= begin
387
427
  if Merb::Config[:deferred_actions].empty?
@@ -395,7 +435,7 @@ module Merb
395
435
  # Perform a hard Exit.
396
436
  # Print a backtrace to the merb logger before exiting if verbose is enabled.
397
437
  #
398
- # @api private
438
+ # :api: private
399
439
  def fatal!(str, e = nil)
400
440
  Merb.logger.fatal!
401
441
  Merb.logger.fatal!("\e[1;31;47mFATAL: #{str}\e[0m")
@@ -412,7 +452,7 @@ module Merb
412
452
 
413
453
  # Print a colorized backtrace to the merb logger.
414
454
  #
415
- # @api private
455
+ # :api: private
416
456
  def print_colorized_backtrace(e)
417
457
  e.backtrace.map! do |line|
418
458
  line.gsub!(/^#{Merb.framework_root}/, "\e[34mFRAMEWORK_ROOT\e[31m")
@@ -434,7 +474,7 @@ module Merb
434
474
  # ==== Returns
435
475
  # <Symbol>:: default ORM.
436
476
  #
437
- # @api public
477
+ # :api: public
438
478
  def orm
439
479
  @orm ||= :none
440
480
  end
@@ -451,7 +491,7 @@ module Merb
451
491
  # ==== Returns
452
492
  # <Symbol>:: default test framework.
453
493
  #
454
- # @api public
494
+ # :api: public
455
495
  def test_framework
456
496
  @test_framework ||= :rspec
457
497
  end
@@ -467,7 +507,7 @@ module Merb
467
507
  # ==== Returns
468
508
  # <Symbol>:: default template engine.
469
509
  #
470
- # @api public
510
+ # :api: public
471
511
  def template_engine
472
512
  @template_engine ||= :erb
473
513
  end
@@ -483,7 +523,7 @@ module Merb
483
523
  # framework and gems and is very useful when application is run in
484
524
  # some sort of sandbox, for instance, shared hosting with preconfigured gems.
485
525
  #
486
- # @api public
526
+ # :api: public
487
527
  def bundled?
488
528
  $BUNDLE || ENV.key?("BUNDLE")
489
529
  end
@@ -546,7 +586,7 @@ module Merb
546
586
  # application start, some of them are set in Merb init file
547
587
  # or environment-specific.
548
588
  #
549
- # @api public
589
+ # :api: public
550
590
  def load_config(options = {})
551
591
  Merb::Config.setup(Merb::Config.defaults.merge(options))
552
592
  Merb::BootLoader::Logger.run
@@ -561,7 +601,7 @@ module Merb
561
601
  # ==== Parameters
562
602
  # options<Hash>:: Options to pass on to the Merb config.
563
603
  #
564
- # @api public
604
+ # :api: public
565
605
  def load_dependencies(options = {})
566
606
  load_config(options)
567
607
  Merb::BootLoader::BuildFramework.run
@@ -572,7 +612,7 @@ module Merb
572
612
  # Reload application and framework classes.
573
613
  # See Merb::BootLoader::ReloadClasses for details.
574
614
  #
575
- # @api public
615
+ # :api: public
576
616
  def reload
577
617
  Merb::BootLoader::ReloadClasses.reload
578
618
  end
@@ -581,7 +621,7 @@ module Merb
581
621
  # Boolean:: True if Merb environment is testing for instance,
582
622
  # Merb is running with RSpec, Test::Unit of other testing facility.
583
623
  #
584
- # @api public
624
+ # :api: public
585
625
  def testing?
586
626
  $TESTING ||= env?(:test) || Merb::Config[:testing]
587
627
  end
@@ -595,7 +635,7 @@ module Merb
595
635
  # Merb.env?(:production) #=> true
596
636
  # Merb.env?(:development) #=> false
597
637
  #
598
- # @api public
638
+ # :api: public
599
639
  def env?(env)
600
640
  Merb.env == env.to_s
601
641
  end
@@ -624,7 +664,7 @@ module Merb
624
664
  # reload_time 0.5
625
665
  # end
626
666
  #
627
- # @api public
667
+ # :api: public
628
668
  def config(&block)
629
669
  Merb::Config.configure(&block) if block_given?
630
670
  Config
@@ -635,7 +675,7 @@ module Merb
635
675
  # ==== Parameters
636
676
  # *args:: One or more symbols of Merb internal components.
637
677
  #
638
- # @api public
678
+ # :api: public
639
679
  def disable(*components)
640
680
  disabled_components.push(*components)
641
681
  end
@@ -643,7 +683,7 @@ module Merb
643
683
  # ==== Parameters
644
684
  # Array:: All components that should be disabled.
645
685
  #
646
- # @api public
686
+ # :api: public
647
687
  def disabled_components=(components)
648
688
  disabled_components.replace components
649
689
  end
@@ -651,7 +691,7 @@ module Merb
651
691
  # ==== Returns
652
692
  # Array:: All components that have been disabled.
653
693
  #
654
- # @api public
694
+ # :api: public
655
695
  def disabled_components
656
696
  Merb::Config[:disabled_components] ||= []
657
697
  end
@@ -659,7 +699,7 @@ module Merb
659
699
  # ==== Returns
660
700
  # Boolean:: True if all components (or just one) are disabled.
661
701
  #
662
- # @api public
702
+ # :api: public
663
703
  def disabled?(*components)
664
704
  components.all? { |c| disabled_components.include?(c) }
665
705
  end
@@ -671,7 +711,7 @@ module Merb
671
711
  # Recommended way to find out what paths Rakefiles
672
712
  # are loaded from.
673
713
  #
674
- # @api public
714
+ # :api: public
675
715
  def rakefiles
676
716
  @rakefiles ||= []
677
717
  end
@@ -682,7 +722,7 @@ module Merb
682
722
  # === Notes
683
723
  # Recommended way to find out what paths generators are loaded from.
684
724
  #
685
- # @api public
725
+ # :api: public
686
726
  def generators
687
727
  @generators ||= []
688
728
  end
@@ -693,7 +733,7 @@ module Merb
693
733
  # ==== Notes
694
734
  # Recommended way to add Rakefiles load path for plugins authors.
695
735
  #
696
- # @api public
736
+ # :api: public
697
737
  def add_rakefiles(*rakefiles)
698
738
  @rakefiles ||= []
699
739
  @rakefiles += rakefiles
@@ -705,7 +745,7 @@ module Merb
705
745
  # ==== Notes
706
746
  # Recommended way to add Generator load paths for plugin authors.
707
747
  #
708
- # @api public
748
+ # :api: public
709
749
  def add_generators(*generators)
710
750
  @generators ||= []
711
751
  @generators += generators
@@ -717,21 +757,24 @@ module Merb
717
757
  # signal:: The name of the signal to install a handler for.
718
758
  # &block:: The block to be run when the given signal is received.
719
759
  #
720
- # @api public
760
+ # :api: public
721
761
  def trap(signal, &block)
722
762
  if Signal.list.include?(signal)
723
763
  Kernel.trap(signal, &block) unless Merb.disabled?(:signals)
724
764
  end
725
765
  end
726
766
 
767
+ # :api: plugin
727
768
  def forking_environment?
728
769
  !on_windows? && !on_jruby?
729
770
  end
730
771
 
772
+ # :api: plugin
731
773
  def on_jruby?
732
774
  RUBY_PLATFORM =~ Merb::Const::JAVA_PLATFORM_REGEXP
733
775
  end
734
776
 
777
+ # :api: plugin
735
778
  def on_windows?
736
779
  RUBY_PLATFORM =~ Merb::Const::WIN_PLATFORM_REGEXP
737
780
  end
@@ -4,7 +4,7 @@ module Merb
4
4
 
5
5
  # def self.subclasses
6
6
  #
7
- # @api plugin
7
+ # :api: plugin
8
8
  cattr_accessor :subclasses, :after_load_callbacks, :before_load_callbacks,
9
9
  :finished, :before_worker_shutdown_callbacks, :before_master_shutdown_callbacks
10
10
 
@@ -23,7 +23,7 @@ module Merb
23
23
  # ==== Returns
24
24
  # nil
25
25
  #
26
- # @api plugin
26
+ # :api: plugin
27
27
  def inherited(klass)
28
28
  subclasses << klass.to_s
29
29
  super
@@ -38,7 +38,7 @@ module Merb
38
38
  # ==== Returns
39
39
  # nil
40
40
  #
41
- # @api plugin
41
+ # :api: plugin
42
42
  def after(klass)
43
43
  move_klass(klass, 1)
44
44
  nil
@@ -53,7 +53,7 @@ module Merb
53
53
  # ==== Returns
54
54
  # nil
55
55
  #
56
- # @api plugin
56
+ # :api: plugin
57
57
  def before(klass)
58
58
  move_klass(klass, 0)
59
59
  nil
@@ -71,7 +71,7 @@ module Merb
71
71
  # ==== Returns
72
72
  # nil
73
73
  #
74
- # @api private
74
+ # :api: private
75
75
  def move_klass(klass, where)
76
76
  index = Merb::BootLoader.subclasses.index(klass.to_s)
77
77
  if index
@@ -86,7 +86,7 @@ module Merb
86
86
  # ==== Returns
87
87
  # nil
88
88
  #
89
- # @api plugin
89
+ # :api: plugin
90
90
  def run
91
91
  Merb.started = true
92
92
  subklasses = subclasses.dup
@@ -114,7 +114,7 @@ module Merb
114
114
  # ==== Returns
115
115
  # Boolean:: Whether or not the bootloader has finished.
116
116
  #
117
- # @api private
117
+ # :api: private
118
118
  def finished?(bootloader)
119
119
  self.finished.include?(bootloader.to_s)
120
120
  end
@@ -124,7 +124,7 @@ module Merb
124
124
  # ==== Returns
125
125
  # nil
126
126
  #
127
- # @api plugin
127
+ # :api: plugin
128
128
  # @overridable
129
129
  def default_framework
130
130
  %w[view model helper controller mailer part].each do |component|
@@ -150,7 +150,7 @@ module Merb
150
150
  # A block to be added to the callbacks that will be executed after the
151
151
  # app loads.
152
152
  #
153
- # @api public
153
+ # :api: public
154
154
  def after_app_loads(&block)
155
155
  after_load_callbacks << block
156
156
  end
@@ -162,7 +162,7 @@ module Merb
162
162
  # A block to be added to the callbacks that will be executed before the
163
163
  # app loads.
164
164
  #
165
- # @api public
165
+ # :api: public
166
166
  def before_app_loads(&block)
167
167
  before_load_callbacks << block
168
168
  end
@@ -175,7 +175,7 @@ module Merb
175
175
  # A block to be added to the callbacks that will be executed
176
176
  # before master process is shut down.
177
177
  #
178
- # @api public
178
+ # :api: public
179
179
  def before_master_shutdown(&block)
180
180
  before_master_shutdown_callbacks << block
181
181
  end
@@ -188,7 +188,7 @@ module Merb
188
188
  # A block to be added to the callbacks that will be executed
189
189
  # before worker process is shut down.
190
190
  #
191
- # @api public
191
+ # :api: public
192
192
  def before_worker_shutdown(&block)
193
193
  before_worker_shutdown_callbacks << block
194
194
  end
@@ -209,7 +209,7 @@ class Merb::BootLoader::Logger < Merb::BootLoader
209
209
  # ==== Returns
210
210
  # nil
211
211
  #
212
- # @api plugin
212
+ # :api: plugin
213
213
  def self.run
214
214
  Merb::Config[:log_level] ||= begin
215
215
  if Merb.environment == "production"
@@ -232,7 +232,7 @@ class Merb::BootLoader::Logger < Merb::BootLoader
232
232
  # ==== Returns
233
233
  # nil
234
234
  #
235
- # @api private
235
+ # :api: private
236
236
  def self.print_warnings
237
237
  if Gem::Version.new(Gem::RubyGemsVersion) < Gem::Version.new("1.1")
238
238
  Merb.fatal! "Merb requires Rubygems 1.1 and later. " \
@@ -253,7 +253,7 @@ class Merb::BootLoader::DropPidFile < Merb::BootLoader
253
253
  # ==== Returns
254
254
  # nil
255
255
  #
256
- # @api plugin
256
+ # :api: plugin
257
257
  def run
258
258
  Merb::Server.store_pid("main") #if Merb::Config[:daemonize] || Merb::Config[:cluster]
259
259
  nil
@@ -268,7 +268,7 @@ class Merb::BootLoader::Defaults < Merb::BootLoader
268
268
  # ==== Returns
269
269
  # nil
270
270
  #
271
- # @api plugin
271
+ # :api: plugin
272
272
  def self.run
273
273
  Merb::Request.http_method_overrides.concat([
274
274
  proc { |c| c.params[:_method] },
@@ -321,6 +321,8 @@ class Merb::BootLoader::BuildFramework < Merb::BootLoader
321
321
  #
322
322
  # ==== Returns
323
323
  # nil
324
+ #
325
+ # :api: plugin
324
326
  def run
325
327
  $:.push Merb.root unless Merb.root == File.expand_path(Dir.pwd)
326
328
  build_framework
@@ -335,7 +337,7 @@ class Merb::BootLoader::BuildFramework < Merb::BootLoader
335
337
  # ==== Returns
336
338
  # nil
337
339
  #
338
- # @api plugin
340
+ # :api: plugin
339
341
  # @overridable
340
342
  def build_framework
341
343
  if File.exists?(Merb.root / "config" / "framework.rb")
@@ -359,7 +361,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
359
361
  # ==== Returns
360
362
  # Array[Gem::Dependency]:: The dependencies regiestered in init.rb.
361
363
  #
362
- # @api plugin
364
+ # :api: plugin
363
365
  cattr_accessor :dependencies
364
366
  self.dependencies = []
365
367
 
@@ -376,7 +378,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
376
378
  # ==== Returns
377
379
  # nil
378
380
  #
379
- # @api plugin
381
+ # :api: plugin
380
382
  def self.run
381
383
  set_encoding
382
384
  # this is crucial: load init file with all the preferences
@@ -398,7 +400,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
398
400
  # ==== Returns
399
401
  # nil
400
402
  #
401
- # @api private
403
+ # :api: private
402
404
  def self.load_dependencies
403
405
  dependencies.each { |dependency| Kernel.load_dependency(dependency) }
404
406
  nil
@@ -408,6 +410,8 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
408
410
  #
409
411
  # ==== Returns
410
412
  # nil
413
+ #
414
+ # :api: private
411
415
  def self.enable_json_gem
412
416
  gem "json"
413
417
  require "json/ext"
@@ -422,7 +426,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
422
426
  # ==== Returns
423
427
  # nil
424
428
  #
425
- # @api private
429
+ # :api: private
426
430
  def self.update_logger
427
431
  Merb.reset_logger!
428
432
 
@@ -444,7 +448,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
444
448
  # ==== Returns
445
449
  # nil
446
450
  #
447
- # @api private
451
+ # :api: private
448
452
  def self.set_encoding
449
453
  $KCODE = 'UTF8' if $KCODE == 'NONE' || $KCODE.blank?
450
454
  nil
@@ -457,7 +461,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
457
461
  # ==== Returns
458
462
  # String:: The path to the config file for the environment
459
463
  #
460
- # @api private
464
+ # :api: private
461
465
  def self.env_config
462
466
  Merb.dir_for(:config) / "environments" / (Merb.environment + ".rb")
463
467
  end
@@ -467,7 +471,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
467
471
  # ==== Returns
468
472
  # Boolean:: Whether or not the environment configuration file exists.
469
473
  #
470
- # @api private
474
+ # :api: private
471
475
  def self.env_config?
472
476
  Merb.environment && File.exist?(env_config)
473
477
  end
@@ -477,7 +481,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
477
481
  # ==== Returns
478
482
  # nil
479
483
  #
480
- # @api private
484
+ # :api: private
481
485
  def self.load_env_config
482
486
  if env_config?
483
487
  STDOUT.puts "Loading #{env_config}" unless Merb.testing?
@@ -492,7 +496,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
492
496
  # ==== Returns
493
497
  # nil
494
498
  #
495
- # @api private
499
+ # :api: private
496
500
  def self.initfile
497
501
  if Merb::Config[:init_file]
498
502
  Merb::Config[:init_file].chomp(".rb") + ".rb"
@@ -506,7 +510,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
506
510
  # ==== Returns
507
511
  # nil
508
512
  #
509
- # @api private
513
+ # :api: private
510
514
  def self.load_initfile
511
515
  if File.exists?(initfile)
512
516
  STDOUT.puts "Loading init file from #{initfile}" unless Merb.testing?
@@ -524,7 +528,7 @@ class Merb::BootLoader::Dependencies < Merb::BootLoader
524
528
  # ==== Returns
525
529
  # nil
526
530
  #
527
- # @api private
531
+ # :api: private
528
532
  def self.expand_ruby_path
529
533
  # Add models, controllers, helpers and lib to the load path
530
534
  unless @ran
@@ -554,7 +558,7 @@ class Merb::BootLoader::MixinSession < Merb::BootLoader
554
558
  # ==== Returns
555
559
  # nil
556
560
  #
557
- # @api plugin
561
+ # :api: plugin
558
562
  def self.run
559
563
  require 'merb-core/dispatch/session'
560
564
  Merb::Controller.send(:include, ::Merb::SessionMixin)
@@ -571,7 +575,7 @@ class Merb::BootLoader::BeforeAppLoads < Merb::BootLoader
571
575
  # ==== Returns
572
576
  # nil
573
577
  #
574
- # @api plugin
578
+ # :api: plugin
575
579
  def self.run
576
580
  Merb::BootLoader.before_load_callbacks.each { |x| x.call }
577
581
  nil
@@ -604,7 +608,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
604
608
  # Returns at least once:
605
609
  # nil
606
610
  #
607
- # @api plugin
611
+ # :api: plugin
608
612
  def run
609
613
  # process name you see in ps output
610
614
  $0 = "merb#{" : " + Merb::Config[:name] if Merb::Config[:name]} : master"
@@ -644,7 +648,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
644
648
  # ==== Returns
645
649
  # (Does not return.)
646
650
  #
647
- # @api private
651
+ # :api: private
648
652
  def exit_gracefully
649
653
  # wait all workers to exit
650
654
  Process.waitall
@@ -675,8 +679,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
675
679
  # Child Process returns at least once:
676
680
  # nil
677
681
  #
678
- # @api private
679
-
682
+ # :api: private
680
683
  def start_transaction
681
684
  Merb.logger.warn! "Parent pid: #{Process.pid}"
682
685
  reader, writer = nil, nil
@@ -706,7 +709,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
706
709
  Merb.trap("INT") do
707
710
  Merb.logger.warn! "Reaping Workers"
708
711
  begin
709
- Process.kill("ABRT", pid)
712
+ Process.kill(reap_workers_signal, pid)
710
713
  rescue SystemCallError
711
714
  end
712
715
  exit_gracefully
@@ -758,12 +761,18 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
758
761
  Merb::Server.add_irb_trap
759
762
  at_exit { reap_workers }
760
763
  else
761
- Merb.trap('INT') { Merb::BootLoader.before_worker_shutdown_callbacks.each { |cb| cb.call } }
764
+ Merb.trap('INT') do
765
+ Merb::BootLoader.before_worker_shutdown_callbacks.each { |cb| cb.call }
766
+ end
762
767
  Merb.trap('ABRT') { reap_workers }
763
- Merb.trap('HUP') { reap_workers(128) }
768
+ Merb.trap('HUP') { reap_workers(128, "ABRT") }
764
769
  end
765
770
  end
766
771
 
772
+ def reap_workers_signal
773
+ Merb::Config[:reap_workers_quickly] ? "KILL" : "ABRT"
774
+ end
775
+
767
776
  # Reap any workers of the spawner process and
768
777
  # exit with an appropriate status code.
769
778
  #
@@ -773,14 +782,14 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
773
782
  #
774
783
  # ==== Parameters
775
784
  # status<Integer>:: The status code to exit with. Defaults to 0.
785
+ # sig<String>:: The signal to send to workers
776
786
  #
777
787
  # ==== Returns
778
788
  # (Does not return.)
779
789
  #
780
- # @api private
781
- # @param status<Integer> The status code to exit with
782
- # @param sig<String> The signal to send to workers
783
- def reap_workers(status = 0, sig = "ABRT")
790
+ # :api: private
791
+ def reap_workers(status = 0, sig = reap_workers_signal)
792
+
784
793
  Merb.logger.info "Executed all before worker shutdown callbacks..."
785
794
  Merb::BootLoader.before_worker_shutdown_callbacks.each do |cb|
786
795
  begin
@@ -821,7 +830,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
821
830
  # ==== Returns
822
831
  # nil
823
832
  #
824
- # @api private
833
+ # :api: private
825
834
  def load_file(file)
826
835
  # Don't do this expensive operation unless we need to
827
836
  unless Merb::Config[:fork_for_class_load]
@@ -857,7 +866,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
857
866
  # ==== Returns
858
867
  # nil
859
868
  #
860
- # @api private
869
+ # :api: private
861
870
  def load_classes(*paths)
862
871
  orphaned_classes = []
863
872
  paths.flatten.each do |path|
@@ -886,7 +895,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
886
895
  # When fork-based loading is not in use:
887
896
  # nil
888
897
  #
889
- # @api private
898
+ # :api: private
890
899
  def reload(file)
891
900
  if Merb::Config[:fork_for_class_load]
892
901
  reap_workers(128)
@@ -908,7 +917,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
908
917
  # ==== Returns
909
918
  # nil
910
919
  #
911
- # @api private
920
+ # :api: private
912
921
  def remove_classes_in_file(file, &block)
913
922
  Merb.klass_hashes.each { |x| x.protect_keys! }
914
923
  if klasses = LOADED_CLASSES.delete(file)
@@ -932,7 +941,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
932
941
  # ==== Returns
933
942
  # nil
934
943
  #
935
- # @api private
944
+ # :api: private
936
945
  def remove_constant(const)
937
946
  # This is to support superclasses (like AbstractController) that track
938
947
  # their subclasses in a class variable.
@@ -968,7 +977,7 @@ class Merb::BootLoader::LoadClasses < Merb::BootLoader
968
977
  # ==== Returns
969
978
  # nil
970
979
  #
971
- # @api private
980
+ # :api: private
972
981
  def load_classes_with_requirements(klasses)
973
982
  klasses.uniq!
974
983
 
@@ -1024,7 +1033,7 @@ class Merb::BootLoader::Router < Merb::BootLoader
1024
1033
  # ==== Returns
1025
1034
  # nil
1026
1035
  #
1027
- # @api plugin
1036
+ # :api: plugin
1028
1037
  def run
1029
1038
  Merb::BootLoader::LoadClasses.load_file(router_file) if router_file
1030
1039
 
@@ -1035,6 +1044,8 @@ class Merb::BootLoader::Router < Merb::BootLoader
1035
1044
  #
1036
1045
  # ==== Returns
1037
1046
  # String:: The path to the router file if it exists, nil otherwise.
1047
+ #
1048
+ # :api: private
1038
1049
  def router_file
1039
1050
  @router_file ||= begin
1040
1051
  if File.file?(router = Merb.dir_for(:router) / Merb.glob_for(:router))
@@ -1055,7 +1066,7 @@ class Merb::BootLoader::Templates < Merb::BootLoader
1055
1066
  # ==== Returns
1056
1067
  # Array[String]:: The list of template files which were loaded.
1057
1068
  #
1058
- # @api plugin
1069
+ # :api: plugin
1059
1070
  def run
1060
1071
  template_paths.each do |path|
1061
1072
  Merb::Template.inline_template(File.open(path))
@@ -1067,7 +1078,7 @@ class Merb::BootLoader::Templates < Merb::BootLoader
1067
1078
  # ==== Returns
1068
1079
  # Array[String]:: All found template files whose basename does not begin with "_".
1069
1080
  #
1070
- # @api private
1081
+ # :api: private
1071
1082
  def template_paths
1072
1083
  extension_glob = "{#{Merb::Template.template_extensions.join(',')}}"
1073
1084
 
@@ -1110,7 +1121,7 @@ class Merb::BootLoader::MimeTypes < Merb::BootLoader
1110
1121
  # ==== Returns
1111
1122
  # nil
1112
1123
  #
1113
- # @api plugin
1124
+ # :api: plugin
1114
1125
  def self.run
1115
1126
  Merb.add_mime_type(:all, nil, %w[*/*])
1116
1127
  Merb.add_mime_type(:yaml, :to_yaml, %w[application/x-yaml text/yaml], :charset => "utf-8")
@@ -1131,7 +1142,7 @@ class Merb::BootLoader::Cookies < Merb::BootLoader
1131
1142
  # ==== Returns
1132
1143
  # nil
1133
1144
  #
1134
- # @api plugin
1145
+ # :api: plugin
1135
1146
  def self.run
1136
1147
  require 'merb-core/dispatch/cookies'
1137
1148
  Merb::Controller.send(:include, Merb::CookiesMixin)
@@ -1149,7 +1160,7 @@ class Merb::BootLoader::SetupSession < Merb::BootLoader
1149
1160
  # ==== Returns
1150
1161
  # nil
1151
1162
  #
1152
- # @api plugin
1163
+ # :api: plugin
1153
1164
  def self.run
1154
1165
  # Require all standard session containers.
1155
1166
  Dir[Merb.framework_root / "merb-core" / "dispatch" / "session" / "*.rb"].each do |file|
@@ -1193,7 +1204,7 @@ class Merb::BootLoader::SetupStubClasses < Merb::BootLoader
1193
1204
  # ==== Returns
1194
1205
  # nil
1195
1206
  #
1196
- # @api plugin
1207
+ # :api: plugin
1197
1208
  def self.run
1198
1209
  unless defined?(Exceptions)
1199
1210
  Object.class_eval <<-RUBY
@@ -1217,7 +1228,7 @@ class Merb::BootLoader::AfterAppLoads < Merb::BootLoader
1217
1228
  # ==== Returns
1218
1229
  # nil
1219
1230
  #
1220
- # @api plugin
1231
+ # :api: plugin
1221
1232
  def self.run
1222
1233
  Merb::BootLoader.after_load_callbacks.each {|x| x.call }
1223
1234
  nil
@@ -1231,7 +1242,7 @@ class Merb::BootLoader::ChooseAdapter < Merb::BootLoader
1231
1242
  # ==== Returns
1232
1243
  # nil
1233
1244
  #
1234
- # @api plugin
1245
+ # :api: plugin
1235
1246
  def self.run
1236
1247
  Merb.adapter = Merb::Rack::Adapter.get(Merb::Config[:adapter])
1237
1248
  end
@@ -1247,7 +1258,7 @@ class Merb::BootLoader::RackUpApplication < Merb::BootLoader
1247
1258
  # ==== Returns
1248
1259
  # nil
1249
1260
  #
1250
- # @api plugin
1261
+ # :api: plugin
1251
1262
  def self.run
1252
1263
  require 'rack'
1253
1264
  if File.exists?(Merb.dir_for(:config) / "rack.rb")
@@ -1283,7 +1294,7 @@ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
1283
1294
  # ==== Returns
1284
1295
  # Thread:: The thread executing the block periodically.
1285
1296
  #
1286
- # @api private
1297
+ # :api: private
1287
1298
  def self.every(seconds, &block)
1288
1299
  Thread.new do
1289
1300
  loop do
@@ -1302,7 +1313,7 @@ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
1302
1313
  # ==== Returns
1303
1314
  # nil
1304
1315
  #
1305
- # @api plugin
1316
+ # :api: plugin
1306
1317
  def self.run
1307
1318
  return unless Merb::Config[:reload_classes]
1308
1319
 
@@ -1332,7 +1343,7 @@ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
1332
1343
  # ==== Returns
1333
1344
  # nil
1334
1345
  #
1335
- # @api private
1346
+ # :api: private
1336
1347
  def self.reload(paths)
1337
1348
  paths.each do |file|
1338
1349
  next if LoadClasses::MTIMES[file] &&