merb 0.5.2 → 0.5.3

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.
@@ -1 +1 @@
1
- 1297
1
+ 1334
@@ -131,7 +131,7 @@
131
131
  <div class="header">
132
132
  <h1><%= @exception.name.humanize %> <sup class="error_<%= @exception.class::STATUS %>"><%= @exception.class::STATUS %></sup></h1>
133
133
  <% if show_details = ::Merb::Config[:exception_details] -%>
134
- <h2><%= ERB::Util.html_escape @exception.message %></h2>
134
+ <h2><%== @exception.message %></h2>
135
135
  <% else -%>
136
136
  <h2>Sorry about that...</h2>
137
137
  <% end -%>
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  APP_ROOT = File.join(File.dirname(__FILE__), '..')
3
3
 
4
+ # required to overcome a callback in rspec
4
5
  def at_exit
5
6
  end
6
7
 
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  APP_ROOT = File.join(File.dirname(__FILE__), '..')
3
3
 
4
+ # required to overcome a callback in rspec
5
+ def at_exit
6
+ end
7
+
4
8
  begin
5
9
  require 'rubigen'
6
10
  rescue LoadError
@@ -45,6 +45,7 @@ module Merb
45
45
  autoload :Controller, 'merb/controller'
46
46
  autoload :ControllerExceptions, 'merb/exceptions'
47
47
  autoload :ControllerMixin, 'merb/mixins/controller'
48
+ autoload :Cookies, 'merb/cookies'
48
49
  autoload :Dispatcher, 'merb/dispatcher'
49
50
  autoload :DrbServiceProvider, 'drb_server'
50
51
  autoload :ErubisCaptureMixin, 'merb/mixins/erubis_capture'
@@ -58,20 +58,27 @@ module Merb
58
58
  end
59
59
 
60
60
 
61
- # Adds a path to the template path cache. This is requried for
61
+ # Adds the a template path to the template path cache. This is required for
62
62
  # any view templates or layouts to be found during renering.
63
63
  #
64
- # Example
65
- #
66
- # Merb::AbstractController.add_path_to_template_cache('/full/path/to/template.html.erb')
67
- def self.add_path_to_template_cache(template)
68
- arry = template.split("/").last.split(".")
69
- return false if template == "" || arry.size != 3
70
- key = template.split(".")[0..-2].join(".")
71
- self._template_path_cache[key] = template
64
+ # ==== Parameters
65
+ # template_path<String>:: Full path to the template file.
66
+ #
67
+ # ==== Returns
68
+ # Boolean:: true unless the template path is less than three levels deep.
69
+ #
70
+ # ==== Examples
71
+ # Merb::AbstractController.add_path_to_template_cache('/full/path/to/template.html.erb')
72
+ #
73
+ def self.add_path_to_template_cache(template_path)
74
+ arry = template_path.split("/").last.split(".")
75
+ return false if template_path == "" || arry.size != 3
76
+ key = template_path.split(".")[0..-2].join(".")
77
+ self._template_path_cache[key] = template_path
72
78
  end
73
79
 
74
80
  # Resets the template_path_cache to an empty hash
81
+ #
75
82
  def self.reset_template_path_cache!
76
83
  self._template_path_cache = {}
77
84
  end
@@ -88,7 +95,14 @@ module Merb
88
95
  send(action, *args)
89
96
  end
90
97
 
91
- # calls a filter chain according to rules.
98
+ # Calls a filter chain according to rules.
99
+ #
100
+ # ==== Parameters
101
+ # filter_set<Array>:: Array of filter-rule pairs as two piece arrays.
102
+ #
103
+ # ==== Returns
104
+ # Symbol:: :filter_chain_completed to signify execution is completed.
105
+ #
92
106
  def call_filters(filter_set)
93
107
  (filter_set || []).each do |(filter, rule)|
94
108
  ok = false
@@ -115,45 +129,38 @@ module Merb
115
129
  return :filter_chain_completed
116
130
  end
117
131
 
118
- # +finalize_session+ is called at the end of a request to finalize/store any data placed in the session.
119
- # Mixins/Classes wishing to define a new session store must implement this method.
120
- # See merb/lib/sessions/* for examples of built in session stores.
121
-
132
+ # +finalize_session+ is called at the end of a request to finalize/store
133
+ # any data placed in the session. Mixins/Classes wishing to define a new
134
+ # session store must implement this method. See merb/lib/sessions/*
135
+ # for examples of built in session stores.
122
136
  def finalize_session #:nodoc:
123
137
  # noop
124
138
  end
125
139
 
126
- # +setup_session+ is called at the beginning of a request to load the current session data.
127
- # Mixins/Classes wishing to define a new session store must implement this method.
128
- # See merb/lib/sessions/* for examples of built in session stores.
129
-
140
+ # +setup_session+ is called at the beginning of a request to load the
141
+ # current session data. Mixins/Classes wishing to define a new session
142
+ # store must implement this method. See merb/lib/sessions/* for examples
143
+ # of built in session stores.
130
144
  def setup_session #:nodoc:
131
145
  # noop
132
146
  end
133
147
 
134
- # override this method on your controller classes to specialize
148
+ # Override this method on your controller classes to specialize
135
149
  # the output when the filter chain is halted.
150
+ #
151
+ # ==== Returns
152
+ # String:: A message explaining what happened.
153
+ #
136
154
  def filters_halted
137
155
  "<html><body><h1>Filter Chain Halted!</h1></body></html>"
138
156
  end
139
157
 
140
158
 
141
- # #before is a class method that allows you to specify before filters in
142
- # your controllers. Filters can either be a symbol or string that
143
- # corresponds to a method name to call, or a proc object. if it is a method
144
- # name that method will be called and if it is a proc it will be called
159
+ # Specify before filters in your controllers. If a method name is given
160
+ # that method will be called and if a proc is given it will be called
145
161
  # with an argument of self where self is the current controller object.
146
162
  # When you use a proc as a filter it needs to take one parameter.
147
163
  #
148
- # examples:
149
- # before :some_filter
150
- # before :authenticate, :exclude => [:login, :signup]
151
- # before Proc.new {|c| c.some_method }, :only => :foo
152
- #
153
- # You can use either :only => :actionname or :exclude => [:this, :that]
154
- # but not both at once. :only will only run before the listed actions
155
- # and :exclude will run for every action that is not listed.
156
- #
157
164
  # Merb's before filter chain is very flexible. To halt the filter chain you
158
165
  # use throw :halt. If throw is called with only one argument of :halt the
159
166
  # return of the method filters_halted will be what is rendered to the view.
@@ -183,40 +190,86 @@ module Merb
183
190
  #
184
191
  # throw :halt, Proc.new {|c| c.access_denied }
185
192
  # throw :halt, Proc.new {|c| Tidy.new(c.index) }
186
- #
193
+ #
194
+ # ==== Parameters
195
+ # filter<Symbol, String, Proc>:: The filter to be added.
196
+ # opts<Hash>::
197
+ # The options for the filter to be added (see below). Defaults to an
198
+ # empty Hash.
199
+ #
200
+ # ==== Options (opts)
201
+ # :only<Array, Symbol>:: The actions that the filter should be applied to.
202
+ # :exclude<Array, Symbol>:: The actions that should ignore this filter.
203
+ #
204
+ # Note: :only and :exluce cannot be used simultaneously.
205
+ #
206
+ # ==== Examples
207
+ # before :some_filter
208
+ # before :authenticate, :exclude => [:login, :signup]
209
+ # before Proc.new {|c| c.some_method }, :only => :foo
210
+ #
187
211
  def self.before(filter, opts={})
188
212
  add_filter((self.before_filters ||= []), filter, opts)
189
213
  end
190
214
 
191
- # #after is a class method that allows you to specify after filters in your
192
- # controllers. Filters can either be a symbol or string that corresponds to
193
- # a method name or a proc object. If it is a method name that method will
194
- # be called and if it is a proc it will be called with an argument of self.
195
- # When you use a proc as a filter it needs to take one parameter. You can
196
- # gain access to the response body like so: after Proc.new {|c|
197
- # Tidy.new(c.body) }, :only => :index
198
-
215
+ # Specify after filters in your controllers. If a method name is given
216
+ # that method will be called and if a proc is given it will be called
217
+ # with an argument of self where self is the current controller object.
218
+ # When you use a proc as a filter it needs to take one parameter.
219
+ #
220
+ # ==== Parameters
221
+ # filter<Symbol, String, Proc>:: The filter to be added.
222
+ # opts<Hash>::
223
+ # The options for the filter to be added (see below). Defaults to an
224
+ # empty Hash.
225
+ #
226
+ # ==== Options (opts)
227
+ # :only<Array, Symbol>:: The actions that the filter should be applied to.
228
+ # :exclude<Array, Symbol>:: The actions that should ignore this filter.
229
+ #
230
+ # Note: :only and :exluce cannot be used simultaneously.
231
+ #
232
+ # ==== Examples
233
+ # after :some_filter
234
+ # after :tidy, :exclude => [:stats]
235
+ # before Proc.new {|c| c.some_method }, :only => :foo
236
+ #
199
237
  def self.after(filter, opts={})
200
238
  add_filter((self.after_filters ||= []), filter, opts)
201
239
  end
202
240
 
203
- # Call #skip_before to remove an already declared (before) filter from your controller.
204
- #
205
- # Example:
241
+ # Remove an already declared before filter from your controller.
242
+ #
243
+ # ==== Parameters
244
+ # filter<String, Symbol>:: The filter to be removed.
245
+ #
246
+ # ==== Examples
206
247
  # class Application < Merb::Controller
207
248
  # before :require_login
208
249
  # end
209
250
  #
210
- # class Login < Merb::Controller
211
- # skip_before :require_login # Users shouldn't have to be logged in to log in
251
+ # class Login < Application
252
+ # skip_before :require_login # Login should be accessible by everyone
212
253
  # end
213
-
254
+ #
214
255
  def self.skip_before(filter)
215
256
  skip_filter((self.before_filters || []), filter)
216
257
  end
217
258
 
218
- # Exactly like #skip_before, but for after filters
219
-
259
+ # Remove an already declared after filter from your controller.
260
+ #
261
+ # ==== Parameters
262
+ # filter<String, Symbol>:: The filter to be removed.
263
+ #
264
+ # ==== Examples
265
+ # class Application < Merb::Controller
266
+ # after :log_activitiy
267
+ # end
268
+ #
269
+ # class Stats < Application
270
+ # skip_after :log_activitiy
271
+ # end
272
+ #
220
273
  def self.skip_after(filter)
221
274
  skip_filter((self.after_filters || []), filter)
222
275
  end
@@ -225,17 +278,51 @@ module Merb
225
278
  Hash.new{ |hash, key| hash[key] = "" }
226
279
  end
227
280
 
228
- # Set here to respond when rendering to cover the provides syntax of setting the content_type
281
+ # Set here to respond when rendering to cover the provides syntax of
282
+ # setting the content_type
283
+ #
284
+ # ==== Returns
285
+ # Boolean:: True if the content type was set.
286
+ #
229
287
  def content_type_set?
230
288
  false
231
289
  end
232
290
 
291
+ # Returns the content type.
292
+ #
293
+ # ==== Returns
294
+ # Symbol:: The content type.
295
+ #
233
296
  def content_type
234
297
  params[:format] || :html
235
298
  end
236
-
299
+
237
300
  private
238
301
 
302
+ # Adds a filter to a list of filters.
303
+ #
304
+ # ==== Parameters
305
+ # filters<Array>::
306
+ # The array of filters to which the filter should be added.
307
+ # filter<Symbol, String, Proc>:: The filter to be added.
308
+ # opts<Hash>::
309
+ # The options for the filter to be added (see below). Defaults to an
310
+ # empty Hash.
311
+ #
312
+ # ==== Options (opts)
313
+ # :only<Array, Symbol>:: The actions that the filter should be applied to.
314
+ # :exclude<Array, Symbol>:: The actions that should ignore this filter.
315
+ #
316
+ # ==== Raises
317
+ # ArgumentError::
318
+ # The options include both the :only and the :exclude key or the filter
319
+ # is not a Symbol, String or Proc.
320
+ #
321
+ # ==== Examples
322
+ # add_filter([ :log_activity ], :login_required)
323
+ #
324
+ # add_filter([ :log_activity ], :login_required, { :exclude => :login })
325
+ #
239
326
  def self.add_filter(filters, filter, opts={})
240
327
  raise(ArgumentError,
241
328
  "You can specify either :only or :exclude but
@@ -257,7 +344,20 @@ module Merb
257
344
  )
258
345
  end
259
346
  end
260
-
347
+
348
+ # Removes a filter from a list of filters.
349
+ #
350
+ # ==== Parameters
351
+ # filters<Array>::
352
+ # The array of filters from which the filter should be removed.
353
+ # filter<Symbol, String>:: The filter to be removed.
354
+ #
355
+ # ==== Raises
356
+ # ArgumentError:: The filter argument is not a String or a Symbol.
357
+ #
358
+ # ==== Examples
359
+ # skip_filter([ :login_required, :log_activity ], :login_required)
360
+ #
261
361
  def self.skip_filter(filters, filter)
262
362
  raise(ArgumentError,
263
363
  'You can only skip filters that have a String or Symbol name.'
@@ -267,10 +367,23 @@ module Merb
267
367
  ) unless filters.reject! {|f| f.first.to_s[filter.to_s] }
268
368
  end
269
369
 
270
- # Ensures that the passed in hash values are always arrays.
370
+ # Changes filter options hash values for the only and exclude keys to
371
+ # arrays, if they are not arrays already.
372
+ #
373
+ # ==== Parameters
374
+ # opts<Hash>:: The filter options hash. Will default to an empty Hash.
375
+ #
376
+ # ==== Options (opts)
377
+ # :only<Array, Symbol>:: The actions that the filter should be applied to.
378
+ # :exclude<Array, Symbol>:: The actions that should ignore this filter.
379
+ #
380
+ # ==== Returns
381
+ # Hash:: The original options with the only and exclude values as arrays.
382
+ #
383
+ # ==== Examples
384
+ # shuffle_filters!(:only => :new)
385
+ # # => { :only => [:new] }
271
386
  #
272
- # shuffle_filters!(:only => :new) #=> {:only => [:new]}
273
-
274
387
  def self.shuffle_filters!(opts={})
275
388
  if opts[:only] && opts[:only].is_a?(Symbol)
276
389
  opts[:only] = [opts[:only]]
@@ -1,10 +1,15 @@
1
1
  module Merb
2
2
  module Assets
3
3
 
4
- # Returns true if assets should be bundled (e.g., production mode or
5
- # :bundle_assets is explicitly enabled), false if not.
4
+ # Check whether the assets should be bundled.
5
+ #
6
+ # ==== Returns
7
+ # Boolean::
8
+ # True if the assets should be bundled (e.g., production mode or
9
+ # :bundle_assets is explicitly enabled).
10
+ #
6
11
  def self.bundle?
7
- (Merb::Config[:environment] == :production) ||
12
+ (Merb::Config[:environment].to_s == 'production') ||
8
13
  (!!Merb::Config[:bundle_assets])
9
14
  end
10
15
 
@@ -20,8 +25,24 @@ module Merb
20
25
  # true, returns the path relative to the Merb.root, not the public
21
26
  # directory. Uses the path_prefix, if any is configured.
22
27
  #
23
- # asset_path(:javascript, :dingo) #=> "/javascripts/dingo.js"
24
- # asset_path(:javascript, :dingo, true) #=> "public/javascripts/dingo.js"
28
+ # ==== Parameters
29
+ # asset_type<Symbol>:: Type of the asset (e.g. :javascript).
30
+ # filename<~to_s>:: The path to the file.
31
+ #
32
+ # local_path<Boolean>::
33
+ # If true, the returned path will be relative to the Merb.root,
34
+ # otherwise it will be the public URI path. Defaults to false.
35
+ #
36
+ # ==== Returns
37
+ # String:: The path to the asset.
38
+ #
39
+ # ==== Examples
40
+ # asset_path(:javascript, :dingo)
41
+ # # => "/javascripts/dingo.js"
42
+ #
43
+ # asset_path(:javascript, :dingo, true)
44
+ # # => "public/javascripts/dingo.js"
45
+ #
25
46
  def asset_path(asset_type, filename, local_path = false)
26
47
  filename = filename.to_s
27
48
  if filename !~ /#{'\\' + ASSET_FILE_EXTENSIONS[asset_type]}\Z/
@@ -40,24 +61,36 @@ module Merb
40
61
  class AbstractAssetBundler
41
62
  class << self
42
63
 
43
- # Add a post-bundle callback, for example to run a Javascript or CSS
44
- # compressor on the bundled file:
45
- #
46
- # Merb::Assets::JavascriptAssetBundler.add_callback do |filename|
47
- # `yuicompressor #{filename}`
48
- # end
64
+ # Add a post-bundle callback.
65
+ #
66
+ # ==== Examples
67
+ # add_callback { |filename| `yuicompressor #{filename}` }
68
+ #
49
69
  def add_callback(&block)
50
70
  callbacks << block
51
71
  end
52
72
  alias_method :after_bundling, :add_callback
53
73
 
54
- # An array of any existing callbacks.
74
+ # Retrieve existing callbacks.
75
+ #
76
+ # ==== Returns
77
+ # Array:: An array of existing callbacks.
78
+ #
55
79
  def callbacks
56
80
  @callbacks ||= []
57
81
  return @callbacks
58
82
  end
59
83
 
60
- # The type of asset for which the bundler is responsible.
84
+ # The type of asset for which the bundler is responsible. Override
85
+ # this method in your bundler code.
86
+ #
87
+ # ==== Raises
88
+ # NotImplementedError::
89
+ # If this method has not been implemented by the bundler.
90
+ #
91
+ # ==== Returns
92
+ # Symbol:: The type of the asset
93
+ #
61
94
  def asset_type
62
95
  raise NotImplementedError, "should return a symbol for the first argument to be passed to asset_path"
63
96
  end
@@ -73,8 +106,11 @@ module Merb
73
106
  @files = files.map { |f| asset_path(self.class.asset_type, f, true) }
74
107
  end
75
108
 
76
- # Creates the new bundled file, executes all the callbacks, and returns
77
- # the name of the bundled file.
109
+ # Creates the new bundled file, executing all the callbacks.
110
+ #
111
+ # ==== Returns
112
+ # Symbol:: Name of the bundle.
113
+ #
78
114
  def bundle!
79
115
  # TODO: Move this file check out into an in-memory cache. Also, push it out to the helper level so we don't have to create the helper object.
80
116
  unless File.exist?(@bundle_filename)
@@ -88,7 +124,12 @@ module Merb
88
124
 
89
125
  include Merb::Assets::AssetHelpers # for asset_path
90
126
 
91
- # Bundle all the filenames in +files+ into +filename+.
127
+ # Bundle all the files into one.
128
+ #
129
+ # ==== Parameters
130
+ # filename<String>:: Name of the bundle file.
131
+ # files<Array>:: An array of filenames to be bundled.
132
+ #
92
133
  def bundle_files(filename, *files)
93
134
  File.open(filename, "w") do |f|
94
135
  files.each { |file| f.puts(File.read(file)) }