merb-core 0.9.8 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/CONTRIBUTORS +33 -0
  2. data/README +7 -3
  3. data/Rakefile +3 -3
  4. data/lib/merb-core.rb +165 -94
  5. data/lib/merb-core/bootloader.rb +469 -100
  6. data/lib/merb-core/config.rb +79 -3
  7. data/lib/merb-core/constants.rb +24 -2
  8. data/lib/merb-core/controller/abstract_controller.rb +172 -67
  9. data/lib/merb-core/controller/exceptions.rb +50 -6
  10. data/lib/merb-core/controller/merb_controller.rb +215 -108
  11. data/lib/merb-core/controller/mime.rb +36 -12
  12. data/lib/merb-core/controller/mixins/authentication.rb +52 -7
  13. data/lib/merb-core/controller/mixins/conditional_get.rb +14 -0
  14. data/lib/merb-core/controller/mixins/controller.rb +90 -58
  15. data/lib/merb-core/controller/mixins/render.rb +34 -10
  16. data/lib/merb-core/controller/mixins/responder.rb +40 -16
  17. data/lib/merb-core/controller/template.rb +37 -16
  18. data/lib/merb-core/core_ext/hash.rb +9 -0
  19. data/lib/merb-core/core_ext/kernel.rb +92 -41
  20. data/lib/merb-core/dispatch/dispatcher.rb +29 -45
  21. data/lib/merb-core/dispatch/request.rb +186 -82
  22. data/lib/merb-core/dispatch/router.rb +141 -53
  23. data/lib/merb-core/dispatch/router/behavior.rb +296 -139
  24. data/lib/merb-core/dispatch/router/resources.rb +51 -19
  25. data/lib/merb-core/dispatch/router/route.rb +76 -23
  26. data/lib/merb-core/dispatch/session.rb +80 -36
  27. data/lib/merb-core/dispatch/session/container.rb +31 -15
  28. data/lib/merb-core/dispatch/session/cookie.rb +51 -22
  29. data/lib/merb-core/dispatch/session/memcached.rb +10 -6
  30. data/lib/merb-core/dispatch/session/memory.rb +17 -5
  31. data/lib/merb-core/dispatch/session/store_container.rb +21 -9
  32. data/lib/merb-core/dispatch/worker.rb +16 -2
  33. data/lib/merb-core/gem_ext/erubis.rb +4 -0
  34. data/lib/merb-core/plugins.rb +13 -0
  35. data/lib/merb-core/rack.rb +1 -0
  36. data/lib/merb-core/rack/adapter.rb +1 -0
  37. data/lib/merb-core/rack/adapter/abstract.rb +95 -17
  38. data/lib/merb-core/rack/adapter/irb.rb +50 -5
  39. data/lib/merb-core/rack/application.rb +27 -5
  40. data/lib/merb-core/rack/handler/mongrel.rb +6 -6
  41. data/lib/merb-core/rack/helpers.rb +33 -0
  42. data/lib/merb-core/rack/middleware/conditional_get.rb +1 -1
  43. data/lib/merb-core/rack/middleware/path_prefix.rb +3 -3
  44. data/lib/merb-core/rack/middleware/static.rb +11 -7
  45. data/lib/merb-core/server.rb +134 -69
  46. data/lib/merb-core/tasks/gem_management.rb +153 -80
  47. data/lib/merb-core/tasks/merb_rake_helper.rb +12 -4
  48. data/lib/merb-core/tasks/stats.rake +1 -1
  49. data/lib/merb-core/test/helpers/mock_request_helper.rb +29 -22
  50. data/lib/merb-core/test/helpers/request_helper.rb +1 -1
  51. data/lib/merb-core/test/helpers/route_helper.rb +50 -4
  52. data/lib/merb-core/test/matchers/request_matchers.rb +2 -36
  53. data/lib/merb-core/test/matchers/view_matchers.rb +32 -22
  54. data/lib/merb-core/test/run_specs.rb +6 -5
  55. data/lib/merb-core/test/test_ext/rspec.rb +6 -19
  56. data/lib/merb-core/version.rb +1 -1
  57. metadata +5 -4
data/CONTRIBUTORS CHANGED
@@ -4,49 +4,70 @@ Aaron Wheeler
4
4
  Abhay Kumar
5
5
  Adam Jacob
6
6
  Andy C
7
+ Andy Delcambre
7
8
  Antti Tarvainen
8
9
  Ben Burkert
9
10
  Ben Chiu
10
11
  Ben Griffiths
11
12
  Bradly Feeley
12
13
  Brandon Dimcheff
14
+ Brandon Mitchell
13
15
  Brian Mitchell
14
16
  Bryan Ray
15
17
  Carl Lerche
18
+ Carlos Villela
16
19
  Charles Jolley
20
+ Cheah Chu Yeow
21
+ Chris Van Pelt
17
22
  Coda Hale
18
23
  Cory ODaniel
24
+ Cristi Balan
25
+ Damian Terentiev
19
26
  Daniel Neighman
20
27
  Daniel Schierbeck
21
28
  Daniel Siemssen
22
29
  David James
30
+ Debian User
23
31
  Diego Scataglini
24
32
  Dirkjan Bussink
33
+ Dr Nic
25
34
  Drew Colthorp
35
+ Duane Johnson
26
36
  Dudley Flanders
37
+ Eric D. White
27
38
  Ezra Zygmuntowicz
28
39
  Fabien Franzen
29
40
  Flea
30
41
  Foy Savas
31
42
  Gabe
32
43
  Geoffrey Grosenbach
44
+ Gert Goet
45
+ Glenn Rempe
33
46
  Goh Toh Chye
34
47
  Grant Hollingworth
35
48
  Guillaume Maury
36
49
  Hampton Catlin
37
50
  Ho-Sheng Hsiao
38
51
  Jack Dempsey
52
+ Jakub Šťastný aka Botanicus
39
53
  James Herdman
40
54
  James Whiteman
41
55
  Janne Asmala
56
+ Jarkko Laine
42
57
  Jaroslaw Zabiello
58
+ Jed Hurt
43
59
  Jonas Nicklas
60
+ Jonathan Stott
44
61
  Jonathan Younger
45
62
  Josh Nichols
63
+ Justin Pease
64
+ Justin S. Leitgeb
46
65
  Kyle Drake
66
+ Lachie Cox
47
67
  Lance Carlson
48
68
  Loren Segal
49
69
  Lori Holden
70
+ Maciej Piechotka
50
71
  Martin Grund
51
72
  Mason Browne
52
73
  Matt Aimonetti
@@ -65,16 +86,25 @@ Michael S. Klishin
65
86
  Michael Sheakoski
66
87
  Mirko Froehlich
67
88
  Nathan Weizenbaum
89
+ Nick Dufresne
90
+ Nicos Gollan
91
+ Nikos Dimitrakopoulos
68
92
  Oliver Jakubiec
69
93
  Paul Barry
70
94
  Paul Boone
71
95
  Paul Carey
72
96
  Ray Morgan
73
97
  Rich Cavanaugh
98
+ Richard Grundy
99
+ Rob Ares
100
+ Rob Kaufman
74
101
  Ross Lawley
102
+ Sergey Molodtsoff
103
+ Seth Thomas Rasmussen
75
104
  Shalon Wood
76
105
  Shay Arnett
77
106
  Simon Jefford
107
+ Simon Rozet
78
108
  Sindre Aarsaether
79
109
  StarTrader
80
110
  Steve Tooke
@@ -90,7 +120,10 @@ William Smith
90
120
  Wilson Bilkovich
91
121
  Yehuda Katz
92
122
  Zach Holt
123
+ atmos
124
+ booss
93
125
  brainopia
126
+ gert@pacificstarfish.net
94
127
  jonas
95
128
  jonuts
96
129
  macournoyer
data/README CHANGED
@@ -1,6 +1,9 @@
1
- merb-core is a new branch of Merb (also referred to as merb-next or the 0.9 series) which aims to provide a stable, stripped down API for a future Merb 1.0 release.
1
+ merb-core
2
2
 
3
- This branch is based off the 0.5 release series but with significant rewrites.
3
+ A new branch of Merb (sometimes referred to as merb-next) which aims to provide
4
+ a stable, stripped down API for the Merb 1.0 release.
5
+
6
+ This branch was based off the 0.5 release series with *significant* rewrites.
4
7
 
5
8
  Goals of this release:
6
9
 
@@ -13,8 +16,9 @@ Goals of this release:
13
16
  * Implement a new render API
14
17
  * Build more extensions to regain selected features when needed
15
18
 
16
- To familiarize yourself with how a merb-core application might look,
19
+ To familiarize yourself with how a merb-core application might look,
17
20
  use merb-gen (from merb-more) to generate a few apps:
21
+
18
22
  $ merb-gen app myapp # a "normal" merb app
19
23
  $ merb-gen app myapp --flat # a flattened app
20
24
  $ merb-gen app myapp --very-flat # a single-file app
data/Rakefile CHANGED
@@ -57,7 +57,7 @@ spec = Gem::Specification.new do |s|
57
57
  s.extra_rdoc_files = %w( README LICENSE TODO )
58
58
 
59
59
  # Dependencies
60
- s.add_dependency "extlib", ">= 0.9.7"
60
+ s.add_dependency "extlib", ">= 0.9.8"
61
61
  s.add_dependency "erubis"
62
62
  s.add_dependency "rake"
63
63
  s.add_dependency "json_pure"
@@ -65,7 +65,7 @@ spec = Gem::Specification.new do |s|
65
65
  s.add_dependency "rack"
66
66
  s.add_dependency "mime-types"
67
67
  s.add_dependency "hpricot"
68
- s.add_dependency "thor", ">= 0.9.6"
68
+ s.add_dependency "thor", ">= 0.9.7"
69
69
  # this escalates to "regular" dependencies, comment it out
70
70
  # for now. RubyGems need some love.
71
71
  #s.add_development_dependency "libxml-ruby"
@@ -336,7 +336,7 @@ def contributors(since_release = nil)
336
336
  git_log(since_release).split("\n").uniq.sort
337
337
  end
338
338
 
339
- PREVIOUS_RELEASE = '0.9.7'
339
+ PREVIOUS_RELEASE = '0.9.8'
340
340
  namespace :history do
341
341
  namespace :update do
342
342
  desc "updates contributors list"
data/lib/merb-core.rb CHANGED
@@ -1,26 +1,25 @@
1
- #---
2
1
  # require 'merb' must happen after Merb::Config is instantiated
3
- require 'rubygems'
2
+ require "rubygems"
4
3
 
5
4
  # Add the local gems dir if found within the app root; any dependencies loaded
6
5
  # hereafter will try to load from the local gems before loading system gems.
7
6
  root_key = %w[-m --merb-root].detect { |o| ARGV.index(o) }
8
7
  root = ARGV[ARGV.index(root_key) + 1] if root_key
9
8
  root = root.to_a.empty? ? Dir.getwd : root
10
- if File.directory?(gems_dir = File.join(root, 'gems')) && !$BUNDLE
9
+ if File.directory?(gems_dir = File.join(root, "gems")) && !$BUNDLE
11
10
  $BUNDLE = true; Gem.clear_paths; Gem.path.unshift(gems_dir)
12
11
  # Warn if local merb-core is available but not loaded.
13
12
  if File.expand_path($0).index(root) != 0 &&
14
- (local_mc = Dir[File.join(gems_dir, 'specifications', 'merb-core-*.gemspec')].last)
15
- puts "Warning: please use bin/#{File.basename($0)} to load #{File.basename(local_mc, '.gemspec')} from ./gems"
13
+ (local_mc = Dir[File.join(gems_dir, "specifications", "merb-core-*.gemspec")].last)
14
+ puts "Warning: please use bin/#{File.basename($0)} to load #{File.basename(local_mc, ".gemspec")} from ./gems"
16
15
  end
17
16
  end
18
17
 
19
- require 'thread'
20
- require 'set'
21
- require 'fileutils'
22
- require 'socket'
23
- require 'pathname'
18
+ require "thread"
19
+ require "set"
20
+ require "fileutils"
21
+ require "socket"
22
+ require "pathname"
24
23
  require "extlib"
25
24
  require "extlib/dictionary"
26
25
 
@@ -30,31 +29,47 @@ $LOAD_PATH.unshift __DIR__ unless
30
29
  $LOAD_PATH.include?(__DIR__) ||
31
30
  $LOAD_PATH.include?(File.expand_path(__DIR__))
32
31
 
32
+ # Some dependencies tend to require&rescue for optionally required files;
33
+ # doing so will load the full rubygems, even though it was just optional.
34
+ $MINIGEMS_SKIPPABLE = ['encoding/character/utf-8']
35
+
33
36
  module Merb
34
37
  # Create stub module for global controller helpers.
35
38
  module GlobalHelpers; end
36
39
 
37
40
  class << self
38
- attr_accessor :exiting
41
+ attr_reader :exiting
42
+
43
+ def exiting=(bool)
44
+ Extlib.exiting = bool
45
+ if bool && Extlib.const_defined?("Pooling") && Extlib::Pooling.scavenger
46
+ Extlib::Pooling.scavenger.wakeup
47
+ end
48
+ @exiting = bool
49
+ end
39
50
 
40
51
  # Merge environment settings
41
- # Can allow you to have a "localdev" that runs like your "development"
52
+ #
53
+ # This can allow you to have a "localdev" environment that runs like your "development".
42
54
  # OR
43
- # A "staging" environment that runs like your "production"
55
+ # A "staging" environment that runs identical to your "production" environment.
44
56
  #
45
57
  # ==== Examples
46
- # From any environment config file (ie, development.rb, custom.rb, localdev.rb, etc)
58
+ # From any environment config file (ie, development.rb, custom.rb, localdev.rb, etc).
47
59
  # staging.rb:
48
- # Merb.merge_env "production" #We want to use all the settings production uses
49
- # Merb::Config.use { |c|
50
- # c[:log_level] = "debug" #except we want debug log level
51
- # c[:exception_details] = true #and we want to see exception details
52
- # }
60
+ # Merb.merge_env "production" # We want to use all the settings production uses
61
+ # Merb::Config.use do |c|
62
+ # c[:log_level] = "debug" # except we want debug log level
63
+ # c[:log_stream] = @some_io # and log to this IO handle
64
+ # c[:exception_details] = true # and we want to see exception details
65
+ # end
53
66
  #
54
67
  # ==== Parameters
55
68
  # env<~String>:: Environment to run like
56
69
  # use_db<~Boolean>:: Should Merb use the merged environments DB connection
57
70
  # Defaults to +false+
71
+ #
72
+ # @api public
58
73
  def merge_env(env,use_db=false)
59
74
  if Merb.environment_info.nil?
60
75
  Merb.environment_info = {
@@ -74,7 +89,6 @@ module Merb
74
89
  else
75
90
  Merb.logger.warn! "Environment file does not exist! #{env_file}"
76
91
  end
77
-
78
92
  end
79
93
 
80
94
  # Mark specific environment to load when ORM loads,
@@ -85,14 +99,15 @@ module Merb
85
99
  end
86
100
  end
87
101
 
88
- # Startup Merb by setting up the Config and starting the server.
89
- # This is where Merb application environment and root path are set.
102
+ # Start Merb by setting up the Config and then starting the server.
103
+ # Set the Merb application environment and the root path.
90
104
  #
91
105
  # ==== Parameters
92
106
  # argv<String, Hash>::
93
107
  # The config arguments to start Merb with. Defaults to +ARGV+.
94
- def start(argv=ARGV)
95
- # Hardcode the log stream to STDOUT
108
+ #
109
+ # @api public
110
+ def start(argv = ARGV)
96
111
  Merb::Config[:log_stream] = STDOUT
97
112
  if Hash === argv
98
113
  Merb::Config.setup(argv)
@@ -103,6 +118,7 @@ module Merb
103
118
 
104
119
  Merb.environment = Merb::Config[:environment]
105
120
  Merb.root = Merb::Config[:merb_root]
121
+
106
122
  case Merb::Config[:action]
107
123
  when :kill
108
124
  Merb::Server.kill(Merb::Config[:port], 2)
@@ -112,6 +128,7 @@ module Merb
112
128
  Merb::Server.kill("main", "HUP")
113
129
  else
114
130
  Merb::Server.start(Merb::Config[:port], Merb::Config[:cluster])
131
+ @started = true
115
132
  end
116
133
  end
117
134
 
@@ -120,11 +137,10 @@ module Merb
120
137
  # ==== Parameters
121
138
  # argv<String, Hash>::
122
139
  # The config arguments to start Merb with. Defaults to +ARGV+.
140
+ #
141
+ # @api public
123
142
  def start_environment(argv=ARGV)
124
- unless (@started ||= false)
125
- start(argv)
126
- @started = true
127
- end
143
+ start(argv) unless (@started ||= false)
128
144
  end
129
145
 
130
146
  # Restart the Merb environment explicitly.
@@ -132,6 +148,8 @@ module Merb
132
148
  # ==== Parameters
133
149
  # argv<String, Hash>::
134
150
  # The config arguments to restart Merb with. Defaults to +Merb::Config+.
151
+ #
152
+ # @api public
135
153
  def restart_environment(argv={})
136
154
  @started = false
137
155
  start_environment(Merb::Config.to_hash.merge(argv))
@@ -144,30 +162,30 @@ module Merb
144
162
 
145
163
  Merb.load_paths = Dictionary.new { [Merb.root] } unless Merb.load_paths.is_a?(Dictionary)
146
164
 
147
- # This is the core mechanism for setting up your application layout.
165
+ # This is the mechanism for setting up your application layout.
148
166
  # There are three application layouts in Merb:
149
167
  #
150
- # Regular app/:type layout of Ruby on Rails fame:
168
+ # 1. Regular app/:type layout of Ruby on Rails fame:
151
169
  #
152
- # app/models for models
153
- # app/mailers for mailers (special type of controllers)
154
- # app/parts for parts, Merb components
155
- # app/views for templates
156
- # app/controllers for controller
157
- # lib for libraries
170
+ # app/models for models
171
+ # app/mailers for mailers (special type of controllers)
172
+ # app/parts for parts, Merb components
173
+ # app/views for templates
174
+ # app/controllers for controller
175
+ # lib for libraries
158
176
  #
159
- # Flat application layout:
177
+ # 2. Flat application layout:
160
178
  #
161
179
  # application.rb for models, controllers, mailers, etc
162
180
  # config/init.rb for initialization and router configuration
163
181
  # config/framework.rb for framework and dependencies configuration
164
182
  # views for views
165
183
  #
166
- # and Camping-style "very flat" application layout, where the whole Merb
167
- # application and configs fit into a single file.
184
+ # 3. Camping-style "very flat" application layout, where the whole Merb
185
+ # application and configs are contained within a single file.
168
186
  #
169
187
  # ==== Notes
170
- # Autoloading for lib uses empty glob by default. If you
188
+ # Autoloading for lib uses an empty glob by default. If you
171
189
  # want to have your libraries under lib use autoload, add
172
190
  # the following to Merb init file:
173
191
  #
@@ -193,6 +211,8 @@ module Merb
193
211
  # file_glob<String>::
194
212
  # A glob that will be used to autoload files under the path. Defaults to
195
213
  # "**/*.rb".
214
+ #
215
+ # @api public
196
216
  def push_path(type, path, file_glob = "**/*.rb")
197
217
  enforce!(type => Symbol)
198
218
  load_paths[type] = [path, file_glob]
@@ -203,18 +223,19 @@ module Merb
203
223
  #
204
224
  # ==== Parameters
205
225
  # *args<Array(Symbol)>::
206
- # components names, for instance, :views, :models
226
+ # component(s) names, for instance, :views, :models
207
227
  #
208
228
  # ==== Examples
209
- # Using this combined with Merb::GlobalHelpers.push_path
210
- # you can make your Merb application use legacy Rails
211
- # application components.
229
+ # Using this combined with Merb::GlobalHelpers.push_path you can make
230
+ # your Merb application use legacy Rails application components.
212
231
  #
213
232
  # Merb.root = "path/to/legacy/app/root"
214
233
  # Merb.remove_paths(:mailer)
215
- # Merb.push_path(:mailer, Merb.root / "app" / "models", "**/*.rb")
234
+ # Merb.push_path(:mailer, Merb.root / "app" / "models", "**/*.rb")
216
235
  #
217
236
  # Will make Merb use app/models for mailers just like Ruby on Rails does.
237
+ #
238
+ # @api public
218
239
  def remove_paths(*args)
219
240
  args.each {|arg| load_paths.delete(arg)}
220
241
  end
@@ -224,6 +245,8 @@ module Merb
224
245
  #
225
246
  # ==== Returns
226
247
  # String:: The directory for the requested type.
248
+ #
249
+ # @api public
227
250
  def dir_for(type)
228
251
  Merb.load_paths[type].first
229
252
  end
@@ -233,18 +256,24 @@ module Merb
233
256
  #
234
257
  # ===== Returns
235
258
  # String:: The pattern with which to match files within the type directory.
259
+ #
260
+ # @api public
236
261
  def glob_for(type)
237
262
  Merb.load_paths[type][1]
238
263
  end
239
264
 
240
265
  # ==== Returns
241
266
  # String:: The Merb root path.
267
+ #
268
+ # @api public
242
269
  def root
243
270
  @root || Merb::Config[:merb_root] || File.expand_path(Dir.pwd)
244
271
  end
245
272
 
246
273
  # ==== Parameters
247
274
  # value<String>:: Path to the root directory.
275
+ #
276
+ # @api public
248
277
  def root=(value)
249
278
  @root = value
250
279
  end
@@ -261,28 +290,41 @@ module Merb
261
290
  # Merb.root = "/home/merb/app"
262
291
  # Merb.path("images") # => "/home/merb/app/images"
263
292
  # Merb.path("views", "admin") # => "/home/merb/app/views/admin"
264
- #---
293
+ #
265
294
  # @public
266
295
  def root_path(*path)
267
296
  File.join(root, *path)
268
297
  end
269
298
 
270
- # Logger settings
299
+ # Return the Merb Logger object for the current thread.
300
+ # Set it up if it does not exist.
301
+ #
302
+ # @api public
271
303
  def logger
272
304
  Thread.current[:merb_logger] ||= Merb::Logger.new
273
305
  end
274
306
 
275
- def logger=(obj)
276
- unless obj
277
- Thread.current[:merb_logger] = nil
278
- end
307
+ # Removes the logger for the current thread (nil).
308
+ #
309
+ # @api public
310
+ def reset_logger!
311
+ Thread.current[:merb_logger] = nil
279
312
  end
280
313
 
281
314
  # ==== Returns
282
315
  # String::
283
- # The path to the log file. If this Merb instance is running as a daemon
284
- # this will return +STDOUT+.
316
+ # The path to the log file.
317
+ # If this Merb instance is running as a daemon this will return +STDOUT+.
318
+ #
319
+ # ==== Notes
320
+ # When Merb.testing? the port is modified to become :test - this keeps this
321
+ # special environment situation from ending up in the memoized @streams
322
+ # just once, thereby never taking changes into account again. Now, it will
323
+ # be memoized as :test - and just logging to merb_test.log.
324
+ #
325
+ # @api public
285
326
  def log_stream(port = "main")
327
+ port = :test if Merb.testing?
286
328
  @streams ||= {}
287
329
  @streams[port] ||= begin
288
330
  log = if Merb.testing?
@@ -309,7 +351,9 @@ module Merb
309
351
  end
310
352
 
311
353
  # ==== Returns
312
- # String:: Path to directory that contains the log file.
354
+ # String:: Path to the log directory which contains the log file.
355
+ #
356
+ # @api public
313
357
  def log_path
314
358
  case Merb::Config[:log_file]
315
359
  when String then File.dirname(Merb::Config[:log_file])
@@ -319,6 +363,8 @@ module Merb
319
363
 
320
364
  # ==== Returns
321
365
  # String:: The path of root directory of the Merb framework.
366
+ #
367
+ # @api public
322
368
  def framework_root
323
369
  @framework_root ||= File.dirname(__FILE__)
324
370
  end
@@ -329,8 +375,9 @@ module Merb
329
375
  # are matched by Rack application handler.
330
376
  #
331
377
  # ==== Notes
332
- # Concatenates :deferred_actions configuration option
333
- # values.
378
+ # Concatenates :deferred_actions configuration option values.
379
+ #
380
+ # @api public
334
381
  def deferred_actions
335
382
  @deferred ||= begin
336
383
  if Merb::Config[:deferred_actions].empty?
@@ -341,28 +388,10 @@ module Merb
341
388
  end
342
389
  end
343
390
 
344
- # Allows flat apps by setting no default framework directories and yielding
345
- # a Merb::Router instance. This is optional since the router will
346
- # automatically configure the app with default routes.
347
- #
348
- # ==== Block parameters
349
- # r<Merb::Router::Behavior>::
350
- # The root behavior upon which new routes can be added.
351
- def flat!(framework = {})
352
- default = {
353
- :framework => { :public => [Merb.root / "public", nil] },
354
- :session_store => 'none',
355
- :exception_details => true
356
- }
357
-
358
- Merb::Config[:framework] = default.merge(framework)
359
-
360
- Merb::Router.prepare do |r|
361
- yield(r) if block_given?
362
- r.default_routes
363
- end
364
- end
365
-
391
+ # Perform a hard Exit.
392
+ # Print a backtrace to the merb logger before exiting if verbose is enabled.
393
+ #
394
+ # @api private
366
395
  def fatal!(str, e = nil)
367
396
  Merb.logger.fatal!
368
397
  Merb.logger.fatal!("\e[1;31;47mFATAL: #{str}\e[0m")
@@ -372,6 +401,9 @@ module Merb
372
401
  exit(1)
373
402
  end
374
403
 
404
+ # Print a colorized backtrace to the merb logger.
405
+ #
406
+ # @api private
375
407
  def print_colorized_backtrace(e)
376
408
  e.backtrace.map! do |line|
377
409
  line.gsub!(/^#{Merb.framework_root}/, "\e[34mFRAMEWORK_ROOT\e[31m")
@@ -392,13 +424,15 @@ module Merb
392
424
  #
393
425
  # ==== Returns
394
426
  # <Symbol>:: default ORM.
427
+ #
428
+ # @api public
395
429
  def orm
396
430
  @orm ||= :none
397
431
  end
398
432
 
399
433
  # @deprecated
400
434
  def orm_generator_scope
401
- Merb.logger.warn!("WARNING: Merb.orm_generator_scope is deprecated")
435
+ Merb.logger.warn!("WARNING: Merb.orm_generator_scope is deprecated!")
402
436
  return :merb_default if Merb.orm == :none
403
437
  Merb.orm
404
438
  end
@@ -407,6 +441,8 @@ module Merb
407
441
  #
408
442
  # ==== Returns
409
443
  # <Symbol>:: default test framework.
444
+ #
445
+ # @api public
410
446
  def test_framework
411
447
  @test_framework ||= :rspec
412
448
  end
@@ -421,6 +457,8 @@ module Merb
421
457
  #
422
458
  # ==== Returns
423
459
  # <Symbol>:: default template engine.
460
+ #
461
+ # @api public
424
462
  def template_engine
425
463
  @template_engine ||= :erb
426
464
  end
@@ -432,14 +470,16 @@ module Merb
432
470
  #
433
471
  # ==== Notes
434
472
  # Bundling required gems makes your application independent from the
435
- # environment it runs in. This is a good practice to freeze application
436
- # framework and gems it uses and very useful when application is run in
473
+ # environment it runs in. It is a good practice to freeze application
474
+ # framework and gems and is very useful when application is run in
437
475
  # some sort of sandbox, for instance, shared hosting with preconfigured gems.
476
+ #
477
+ # @api public
438
478
  def bundled?
439
479
  $BUNDLE || ENV.key?("BUNDLE")
440
480
  end
441
481
 
442
- # Load configuration and assign logger.
482
+ # Load configuration and assign the logger.
443
483
  #
444
484
  # ==== Parameters
445
485
  # options<Hash>:: Options to pass on to the Merb config.
@@ -477,9 +517,11 @@ module Merb
477
517
  # flush after new messages are
478
518
  # added, defaults to true.
479
519
  #
480
- # :log_file<IO>:: IO for logger. Default is STDOUT.
520
+ # :log_stream<IO>:: IO handle for logger. Defaults to STDOUT.
521
+ #
522
+ # :log_file<String>:: File path for logger. Overrides :log_stream.
481
523
  #
482
- # :log_level<Symbol>:: logger level, default is :warn
524
+ # :log_level<Symbol>:: logger level, default is :info
483
525
  #
484
526
  # :disabled_components<Array[Symbol]>::
485
527
  # array of disabled component names,
@@ -494,8 +536,10 @@ module Merb
494
536
  # Some of these options come from command line on Merb
495
537
  # application start, some of them are set in Merb init file
496
538
  # or environment-specific.
539
+ #
540
+ # @api public
497
541
  def load_config(options = {})
498
- Merb::Config.setup({ :log_file => STDOUT, :log_level => :warn, :log_auto_flush => true }.merge(options))
542
+ Merb::Config.setup(Merb::Config.defaults.merge(options))
499
543
  Merb::BootLoader::Logger.run
500
544
  end
501
545
 
@@ -507,6 +551,8 @@ module Merb
507
551
  #
508
552
  # ==== Parameters
509
553
  # options<Hash>:: Options to pass on to the Merb config.
554
+ #
555
+ # @api public
510
556
  def load_dependencies(options = {})
511
557
  load_config(options)
512
558
  Merb::BootLoader::BuildFramework.run
@@ -516,6 +562,8 @@ module Merb
516
562
 
517
563
  # Reload application and framework classes.
518
564
  # See Merb::BootLoader::ReloadClasses for details.
565
+ #
566
+ # @api public
519
567
  def reload
520
568
  Merb::BootLoader::ReloadClasses.reload
521
569
  end
@@ -523,6 +571,8 @@ module Merb
523
571
  # ==== Returns
524
572
  # Boolean:: True if Merb environment is testing for instance,
525
573
  # Merb is running with RSpec, Test::Unit of other testing facility.
574
+ #
575
+ # @api public
526
576
  def testing?
527
577
  $TESTING ||= env?(:test) || Merb::Config[:testing]
528
578
  end
@@ -535,6 +585,8 @@ module Merb
535
585
  # Merb.env #=> production
536
586
  # Merb.env?(:production) #=> true
537
587
  # Merb.env?(:development) #=> false
588
+ #
589
+ # @api public
538
590
  def env?(env)
539
591
  Merb.env == env.to_s
540
592
  end
@@ -562,6 +614,8 @@ module Merb
562
614
  # reload_classes true
563
615
  # reload_time 0.5
564
616
  # end
617
+ #
618
+ # @api public
565
619
  def config(&block)
566
620
  Merb::Config.configure(&block) if block_given?
567
621
  Config
@@ -571,24 +625,32 @@ module Merb
571
625
  #
572
626
  # ==== Parameters
573
627
  # *args:: One or more symbols of Merb internal components.
628
+ #
629
+ # @api public
574
630
  def disable(*components)
575
631
  disabled_components.push(*components)
576
632
  end
577
633
 
578
634
  # ==== Parameters
579
635
  # Array:: All components that should be disabled.
636
+ #
637
+ # @api public
580
638
  def disabled_components=(components)
581
639
  disabled_components.replace components
582
640
  end
583
641
 
584
642
  # ==== Returns
585
643
  # Array:: All components that have been disabled.
644
+ #
645
+ # @api public
586
646
  def disabled_components
587
647
  Merb::Config[:disabled_components] ||= []
588
648
  end
589
649
 
590
650
  # ==== Returns
591
651
  # Boolean:: True if all components (or just one) are disabled.
652
+ #
653
+ # @api public
592
654
  def disabled?(*components)
593
655
  components.all? { |c| disabled_components.include?(c) }
594
656
  end
@@ -599,6 +661,8 @@ module Merb
599
661
  # ==== Notes
600
662
  # Recommended way to find out what paths Rakefiles
601
663
  # are loaded from.
664
+ #
665
+ # @api public
602
666
  def rakefiles
603
667
  @rakefiles ||= []
604
668
  end
@@ -607,8 +671,9 @@ module Merb
607
671
  # Array(String):: Paths generators are loaded from
608
672
  #
609
673
  # === Notes
610
- # Recommended way to find out what paths generators
611
- # are loaded from.
674
+ # Recommended way to find out what paths generators are loaded from.
675
+ #
676
+ # @api public
612
677
  def generators
613
678
  @generators ||= []
614
679
  end
@@ -618,6 +683,8 @@ module Merb
618
683
  #
619
684
  # ==== Notes
620
685
  # Recommended way to add Rakefiles load path for plugins authors.
686
+ #
687
+ # @api public
621
688
  def add_rakefiles(*rakefiles)
622
689
  @rakefiles ||= []
623
690
  @rakefiles += rakefiles
@@ -628,6 +695,8 @@ module Merb
628
695
  #
629
696
  # ==== Notes
630
697
  # Recommended way to add Generator load paths for plugin authors.
698
+ #
699
+ # @api public
631
700
  def add_generators(*generators)
632
701
  @generators ||= []
633
702
  @generators += generators
@@ -638,6 +707,8 @@ module Merb
638
707
  # ==== Parameters
639
708
  # signal:: The name of the signal to install a handler for.
640
709
  # &block:: The block to be run when the given signal is received.
710
+ #
711
+ # @api public
641
712
  def trap(signal, &block)
642
713
  Kernel.trap(signal, &block) unless Merb.disabled?(:signals)
643
714
  end
@@ -645,12 +716,12 @@ module Merb
645
716
  end
646
717
  end
647
718
 
648
- require 'merb-core/autoload'
649
- require 'merb-core/server'
650
- require 'merb-core/gem_ext/erubis'
651
- require 'merb-core/logger'
652
- require 'merb-core/version'
653
- require 'merb-core/controller/mime'
719
+ require "merb-core/autoload"
720
+ require "merb-core/server"
721
+ require "merb-core/gem_ext/erubis"
722
+ require "merb-core/logger"
723
+ require "merb-core/version"
724
+ require "merb-core/controller/mime"
654
725
 
655
726
  # Set the environment if it hasn't already been set.
656
- Merb.environment ||= ENV['MERB_ENV'] || Merb::Config[:environment] || (Merb.testing? ? 'test' : 'development')
727
+ Merb.environment ||= ENV["MERB_ENV"] || Merb::Config[:environment] || (Merb.testing? ? "test" : "development")