merb-core 0.9.13 → 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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] &&