merb 0.4.2 → 0.5.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 (108) hide show
  1. data/README +21 -14
  2. data/Rakefile +157 -108
  3. data/SVN_REVISION +1 -0
  4. data/app_generators/merb/templates/Rakefile +20 -4
  5. data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +1 -1
  6. data/app_generators/merb/templates/config/boot.rb +1 -1
  7. data/app_generators/merb/templates/config/dependencies.rb +3 -3
  8. data/app_generators/merb/templates/config/merb.yml +5 -0
  9. data/app_generators/merb/templates/config/merb_init.rb +3 -3
  10. data/app_generators/merb/templates/script/destroy +3 -0
  11. data/app_generators/merb/templates/script/generate +1 -1
  12. data/app_generators/merb/templates/spec/spec_helper.rb +2 -2
  13. data/app_generators/merb/templates/test/test_helper.rb +1 -1
  14. data/app_generators/merb_plugin/merb_plugin_generator.rb +4 -0
  15. data/bin/merb +1 -3
  16. data/lib/merb.rb +144 -76
  17. data/lib/merb/abstract_controller.rb +6 -5
  18. data/lib/merb/assets.rb +119 -0
  19. data/lib/merb/boot_loader.rb +217 -0
  20. data/lib/merb/caching.rb +1 -1
  21. data/lib/merb/caching/action_cache.rb +1 -1
  22. data/lib/merb/caching/fragment_cache.rb +1 -1
  23. data/lib/merb/caching/store/file_cache.rb +1 -1
  24. data/lib/merb/config.rb +290 -0
  25. data/lib/merb/controller.rb +5 -5
  26. data/lib/merb/core_ext/get_args.rb +1 -0
  27. data/lib/merb/core_ext/hash.rb +182 -169
  28. data/lib/merb/core_ext/kernel.rb +57 -26
  29. data/lib/merb/dispatcher.rb +6 -6
  30. data/lib/merb/drb_server.rb +1 -1
  31. data/lib/merb/generators/merb_generator_helpers.rb +7 -6
  32. data/lib/merb/logger.rb +1 -1
  33. data/lib/merb/mail_controller.rb +3 -4
  34. data/lib/merb/mailer.rb +2 -2
  35. data/lib/merb/mixins/basic_authentication.rb +2 -2
  36. data/lib/merb/mixins/controller.rb +1 -1
  37. data/lib/merb/mixins/general_controller.rb +13 -20
  38. data/lib/merb/mixins/inline_partial.rb +32 -0
  39. data/lib/merb/mixins/render.rb +3 -3
  40. data/lib/merb/mixins/responder.rb +1 -1
  41. data/lib/merb/mixins/view_context.rb +159 -33
  42. data/lib/merb/mongrel_handler.rb +9 -9
  43. data/lib/merb/plugins.rb +1 -1
  44. data/lib/merb/request.rb +25 -1
  45. data/lib/merb/router.rb +264 -226
  46. data/lib/merb/server.rb +66 -560
  47. data/lib/merb/session/cookie_store.rb +14 -13
  48. data/lib/merb/session/mem_cache_session.rb +20 -10
  49. data/lib/merb/session/memory_session.rb +21 -11
  50. data/lib/merb/template.rb +2 -2
  51. data/lib/merb/template/erubis.rb +3 -33
  52. data/lib/merb/template/haml.rb +8 -3
  53. data/lib/merb/test/fake_request.rb +8 -3
  54. data/lib/merb/test/helper.rb +66 -22
  55. data/lib/merb/test/rspec.rb +9 -155
  56. data/lib/merb/test/rspec_matchers/controller_matchers.rb +117 -0
  57. data/lib/merb/test/rspec_matchers/markup_matchers.rb +98 -0
  58. data/lib/merb/upload_handler.rb +2 -1
  59. data/lib/merb/version.rb +38 -3
  60. data/lib/merb/view_context.rb +1 -2
  61. data/lib/tasks/merb.rake +11 -11
  62. data/merb_generators/part_controller/USAGE +5 -0
  63. data/merb_generators/part_controller/part_controller_generator.rb +27 -0
  64. data/merb_generators/part_controller/templates/controller.rb +8 -0
  65. data/merb_generators/part_controller/templates/helper.rb +5 -0
  66. data/merb_generators/part_controller/templates/index.html.erb +3 -0
  67. data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +1 -1
  68. data/script/destroy +14 -0
  69. data/script/generate +14 -0
  70. data/spec/fixtures/controllers/dispatch_spec_controllers.rb +9 -1
  71. data/spec/fixtures/controllers/render_spec_controllers.rb +5 -5
  72. data/spec/fixtures/models/router_spec_models.rb +10 -0
  73. data/spec/merb/abstract_controller_spec.rb +2 -2
  74. data/spec/merb/assets_spec.rb +207 -0
  75. data/spec/merb/caching_spec.rb +2 -2
  76. data/spec/merb/controller_spec.rb +7 -2
  77. data/spec/merb/cookie_store_spec.rb +1 -1
  78. data/spec/merb/core_ext/class_spec.rb +97 -0
  79. data/spec/merb/core_ext/enumerable_spec.rb +27 -0
  80. data/spec/merb/core_ext/hash_spec.rb +251 -0
  81. data/spec/merb/core_ext/inflector_spec.rb +34 -0
  82. data/spec/merb/core_ext/kernel_spec.rb +25 -0
  83. data/spec/merb/core_ext/numeric_spec.rb +26 -0
  84. data/spec/merb/core_ext/object_spec.rb +47 -0
  85. data/spec/merb/core_ext/string_spec.rb +22 -0
  86. data/spec/merb/core_ext/symbol_spec.rb +7 -0
  87. data/spec/merb/dependency_spec.rb +22 -0
  88. data/spec/merb/dispatch_spec.rb +23 -12
  89. data/spec/merb/fake_request_spec.rb +8 -0
  90. data/spec/merb/generator_spec.rb +140 -21
  91. data/spec/merb/handler_spec.rb +5 -5
  92. data/spec/merb/mail_controller_spec.rb +3 -3
  93. data/spec/merb/render_spec.rb +1 -1
  94. data/spec/merb/responder_spec.rb +3 -3
  95. data/spec/merb/router_spec.rb +260 -191
  96. data/spec/merb/server_spec.rb +5 -5
  97. data/spec/merb/upload_handler_spec.rb +7 -0
  98. data/spec/merb/version_spec.rb +33 -0
  99. data/spec/merb/view_context_spec.rb +217 -59
  100. data/spec/spec_generator_helper.rb +15 -0
  101. data/spec/spec_helper.rb +5 -3
  102. data/spec/spec_helpers/url_shared_behaviour.rb +5 -7
  103. metadata +32 -7
  104. data/lib/merb/caching/store/memcache.rb +0 -20
  105. data/lib/merb/mixins/form_control.rb +0 -332
  106. data/lib/patch +0 -69
  107. data/spec/merb/core_ext_spec.rb +0 -464
  108. data/spec/merb/form_control_mixin_spec.rb +0 -431
@@ -1,4 +1,41 @@
1
1
  module Kernel
2
+ # Loads the given string as a gem.
3
+ # An optional second parameter of a version string can be specified and is passed to rubygems.
4
+ # If rubygems cannot find the gem it requires the string as a library.
5
+
6
+ # Note that this new version tries to load the file via ROOT/gems first before moving off to
7
+ # the system gems (so if you have a lower version of a gem in ROOT/gems, it'll still get loaded)
8
+
9
+ def dependency(name, *ver)
10
+ begin
11
+ # If it's not in ROOT/gems, skip to the next attempt
12
+ raise LoadError unless File.directory?(Merb.root / "gems")
13
+
14
+ # cache the gem path
15
+ begin
16
+ # Clear out the paths and reset them to Merb
17
+ Gem.use_paths(Merb.root / "gems", [Merb.root / "gems"])
18
+
19
+ # Try activating the gem (Failure will raise a LoadError)
20
+ Gem.activate(name, true, *ver)
21
+ Merb.logger.info("#{Time.now.httpdate}: loading gem '#{name}' from #{__app_file_trace__.first} ...")
22
+ ensure
23
+ # Either way, set the gem path back to normal
24
+ Gem.clear_paths
25
+ end
26
+
27
+ # If we couldn't load the gem or there was no ROOT/gems, try again, now with the full gem path
28
+ rescue LoadError
29
+ begin
30
+ # Try activating again
31
+ Gem.activate(name, true, *ver)
32
+ Merb.logger.info("#{Time.now.httpdate}: loading gem '#{name}' from #{__app_file_trace__.first} ...")
33
+ rescue LoadError
34
+ # Failed requiring as a gem, let's try loading with a normal require.
35
+ require name
36
+ end
37
+ end
38
+ end
2
39
 
3
40
  # Loads both gem and library dependencies that are passed in as arguments.
4
41
  # Each argument can be:
@@ -15,23 +52,7 @@ module Kernel
15
52
  end
16
53
  end
17
54
  end
18
-
19
- # Loads the given string as a gem.
20
- # An optional second parameter of a version string can be specified and is passed to rubygems.
21
- # If rubygems cannot find the gem it requires the string as a library.
22
-
23
- def dependency(name, *ver)
24
- begin
25
- Gem.activate(name, true, *ver)
26
- message = "#{Time.now.httpdate}: loading gem '#{name}' from #{__app_file_trace__.first} ..."
27
- puts(message)
28
- MERB_LOGGER.info(message)
29
- rescue LoadError
30
- # Failed requiring as a gem, let's try loading with a normal require.
31
- requires(name)
32
- end
33
- end
34
-
55
+
35
56
  # Requires the library string passed in.
36
57
  # If the library fails to load then it will display a helpful message.
37
58
 
@@ -41,19 +62,19 @@ module Kernel
41
62
  require(library)
42
63
  message = "#{Time.now.httpdate}: loading library '#{library}' from #{__app_file_trace__.first} ..."
43
64
  puts(message)
44
- MERB_LOGGER.info(message)
65
+ Merb.logger.info(message)
45
66
  rescue LoadError
46
67
  # TODO: adjust the two messages below to use merb's logger.error/info once logging refactor is complete.
47
68
  message = "#{Time.now.httpdate}: <e> Could not find '#{library}' as either a library or gem, loaded from #{__app_file_trace__.first}.\n"
48
69
  puts(message)
49
- MERB_LOGGER.error(message)
70
+ Merb.logger.error(message)
50
71
 
51
72
  # Print a helpful message
52
73
  message = "#{Time.now.httpdate}: <i> Please be sure that if '#{library}': \n"
53
74
  message << "#{Time.now.httpdate}: <i> * is a normal ruby library (file), be sure that the path of the library it is present in the $LOAD_PATH via $LOAD_PATH.unshift(\"/path/to/#{library}\") \n"
54
75
  message << "#{Time.now.httpdate}: <i> * is included within a gem, be sure that you are specifying the gem as a dependency \n"
55
76
  puts(message)
56
- MERB_LOGGER.error(message)
77
+ Merb.logger.error(message)
57
78
  exit() # Missing library/gem must be addressed.
58
79
  end
59
80
 
@@ -66,7 +87,7 @@ module Kernel
66
87
  puts message if message
67
88
  end
68
89
 
69
- # Used in MERB_ROOT/dependencies.yml
90
+ # Used in Merb.root/dependencies.yml
70
91
  # Tells merb which ORM (Object Relational Mapper) you wish to use.
71
92
  # Currently merb has plugins to support ActiveRecord, DataMapper, and Sequel.
72
93
  #
@@ -85,7 +106,7 @@ module Kernel
85
106
  Kernel.dependency(orm_plugin)
86
107
  end
87
108
 
88
- # Used in MERB_ROOT/dependencies.yml
109
+ # Used in Merb.root/dependencies.yml
89
110
  # Tells merb which testing framework to use.
90
111
  # Currently merb supports rspec and test_unit for testing
91
112
  #
@@ -107,9 +128,9 @@ module Kernel
107
128
 
108
129
  def __app_file_trace__
109
130
  caller.select do |call|
110
- call.include?(MERB_ROOT) && !call.include?(MERB_ROOT + "/framework")
131
+ call.include?(Merb.root) && !call.include?(Merb.root + "/framework")
111
132
  end.map do |call|
112
- file, line = call.scan(Regexp.new("#{MERB_ROOT}/(.*):(.*)")).first
133
+ file, line = call.scan(Regexp.new("#{Merb.root}/(.*):(.*)")).first
113
134
  "#{file}:#{line}"
114
135
  end
115
136
  end
@@ -171,7 +192,7 @@ module Kernel
171
192
 
172
193
  # Requires ruby-prof (<tt>sudo gem install ruby-prof</tt>)
173
194
  # Takes a block and profiles the results of running the block 100 times.
174
- # The resulting profile is written out to MERB_ROOT/log/#{name}.html.
195
+ # The resulting profile is written out to Merb.root/log/#{name}.html.
175
196
  # <tt>min</tt> specifies the minimum percentage of the total time a method must take for it to be included in the result.
176
197
  #
177
198
  # Example
@@ -189,7 +210,7 @@ module Kernel
189
210
  100.times{return_result = yield}
190
211
  end
191
212
  printer = RubyProf::GraphHtmlPrinter.new(result)
192
- path = File.join(MERB_ROOT, 'log', "#{name}.html")
213
+ path = File.join(Merb.root, 'log', "#{name}.html")
193
214
  File.open(path, 'w') do |file|
194
215
  printer.print(file, {:min_percent => min,
195
216
  :print_file => true})
@@ -208,4 +229,14 @@ module Kernel
208
229
  args.pop if Hash === args.last
209
230
  end
210
231
 
232
+ unless Kernel.respond_to?(:debugger)
233
+ # define debugger method so that code even works if debugger was not
234
+ # requested
235
+ # Drops a not to the logs that Debugger was not available
236
+ def debugger
237
+ Merb.logger.info "\n***** Debugger requested, but was not " +
238
+ "available: Start server with --debugger " +
239
+ "to enable *****\n"
240
+ end
241
+ end
211
242
  end
@@ -2,7 +2,7 @@ module Merb
2
2
  class Dispatcher
3
3
 
4
4
  DEFAULT_ERROR_TEMPLATE = Erubis::MEruby.new((File.read(
5
- File.join(MERB_ROOT, 'app/views/exceptions/internal_server_error.html.erb')) rescue "Internal Server Error!"))
5
+ File.join(Merb.root, 'app/views/exceptions/internal_server_error.html.erb')) rescue "Internal Server Error!"))
6
6
 
7
7
  class << self
8
8
 
@@ -11,7 +11,7 @@ module Merb
11
11
  end
12
12
 
13
13
  @@mutex = Mutex.new
14
- @@use_mutex = ::Merb::Server.config[:use_mutex]
14
+ @@use_mutex = ::Merb::Config[:use_mutex]
15
15
  # This is where we grab the incoming request REQUEST_URI and use that in
16
16
  # the merb RouteMatcher to determine which controller and method to run.
17
17
  # Returns a 2 element tuple of: [controller, action]
@@ -21,20 +21,20 @@ module Merb
21
21
  def handle(http_request, response)
22
22
  start = Time.now
23
23
  request = Merb::Request.new(http_request)
24
- MERB_LOGGER.info("Params: #{request.params.inspect}")
25
- MERB_LOGGER.info("Cookies: #{request.cookies.inspect}")
24
+ Merb.logger.info("Params: #{request.params.inspect}")
25
+ Merb.logger.info("Cookies: #{request.cookies.inspect}")
26
26
  # user friendly error messages
27
27
  if request.route_params.empty?
28
28
  raise ControllerExceptions::BadRequest, "No routes match the request"
29
29
  elsif request.controller_name.nil?
30
30
  raise ControllerExceptions::BadRequest, "Route matched, but route did not specify a controller"
31
31
  end
32
- MERB_LOGGER.debug("Routed to: #{request.route_params.inspect}")
32
+ Merb.logger.debug("Routed to: #{request.route_params.inspect}")
33
33
  # set controller class and the action to call
34
34
  klass = request.controller_class
35
35
  dispatch_action(klass, request.action, request, response)
36
36
  rescue => exception
37
- MERB_LOGGER.error(Merb.exception(exception))
37
+ Merb.logger.error(Merb.exception(exception))
38
38
  exception = controller_exception(exception)
39
39
  dispatch_exception(request, response, exception)
40
40
  end
@@ -1,5 +1,5 @@
1
1
  require 'drb'
2
- require File.dirname(__FILE__)+'/merb_upload_progress'
2
+ require File.dirname(__FILE__)+'/upload_progress'
3
3
 
4
4
  module Merb
5
5
 
@@ -255,6 +255,7 @@ EOS
255
255
  @engine = runtime_options[:engine] || "erb" # set by subclasses only
256
256
  @template_actions = runtime_options[:actions] || %w[index] # Used by subclasses only
257
257
  @test_generator = runtime_options[:test_stub_generator] || "merb_controller_test"
258
+ @base_dest_folder = runtime_options[:base_dest_folder] || "app"
258
259
  extract_options
259
260
  end
260
261
 
@@ -264,10 +265,10 @@ EOS
264
265
  # ensure there are no other definitions of this model already defined.
265
266
  m.class_collisions(@class_name)
266
267
 
267
- m.directory "app/controllers"
268
- m.template "controller.rb", "app/controllers/#{file_name}.rb", :assigns => {:actions => @template_actions}
268
+ m.directory "#{@base_dest_folder}/controllers"
269
+ m.template "controller.rb", "#{@base_dest_folder}/controllers/#{file_name}.rb", :assigns => {:actions => @template_actions}
269
270
 
270
- m.directory "app/views/#{file_name}"
271
+ m.directory "#{@base_dest_folder}/views/#{file_name}"
271
272
 
272
273
  # Include templates if they exist
273
274
  @template_actions.each do |the_action|
@@ -275,12 +276,12 @@ EOS
275
276
  template_path = "/" + source_path(spec.name).split("/")[0..-2].join("/")
276
277
 
277
278
  if File.exists?(File.join(template_path,template_name))
278
- m.template template_name, "app/views/#{file_name}/#{template_name}"
279
+ m.template template_name, "#{@base_dest_folder}/views/#{file_name}/#{template_name}"
279
280
  end
280
281
  end
281
282
 
282
- m.directory "app/helpers/"
283
- m.template "helper.rb", "app/helpers/#{file_name}_helper.rb"
283
+ m.directory "#{@base_dest_folder}/helpers/"
284
+ m.template "helper.rb", "#{@base_dest_folder}/helpers/#{file_name}_helper.rb"
284
285
  m.dependency @test_generator, [name], :destination => destination_root, :template_actions => @template_actions
285
286
  end
286
287
  end
@@ -28,7 +28,7 @@ module Merb
28
28
  @log.sync = true
29
29
  @log.write("# Logfile created on %s\n" % [Time.now.to_s])
30
30
  end
31
- if !MERB_ENV.match(/development|test/) &&
31
+ if !Merb.environment.match(/development|test/) &&
32
32
  !RUBY_PLATFORM.match(/java|mswin/) &&
33
33
  !(@log == STDOUT) &&
34
34
  @log.respond_to?(:write_nonblock)
@@ -183,7 +183,7 @@ module Merb
183
183
  rescue => e
184
184
  # An error should be logged if no template is found instead of an error raised
185
185
  if @_missing_templates
186
- MERB_LOGGER.error(e)
186
+ Merb.logger.error(e)
187
187
  else
188
188
  @_missing_templates = true
189
189
  end
@@ -237,9 +237,9 @@ module Merb
237
237
  body = dispatch method
238
238
  if !@mail.html.blank? || !@mail.text.blank?
239
239
  @mailer.deliver!
240
- MERB_LOGGER.info "#{method} sent to #{@mail.to} about #{@mail.subject}"
240
+ Merb.logger.info "#{method} sent to #{@mail.to} about #{@mail.subject}"
241
241
  else
242
- MERB_LOGGER.info "#{method} was not sent because nothing was rendered for it"
242
+ Merb.logger.info "#{method} was not sent because nothing was rendered for it"
243
243
  end
244
244
  end
245
245
 
@@ -258,7 +258,6 @@ module Merb
258
258
  # This method is here to overwrite the one in the general_controller mixin
259
259
  # The method ensures that when a url is generated with a hash, it contains a controller
260
260
  def get_controller_for_url_generation(opts)
261
- puts @base_controller.params[:controller] if @base_controller
262
261
  controller = opts[:controller] || ( @base_controller.params[:controller] if @base_controller)
263
262
  raise "No Controller Specified for url()" unless controller
264
263
  controller
@@ -3,7 +3,7 @@ begin
3
3
  require 'net/smtp'
4
4
  rescue LoadError
5
5
  puts "You need to install the mailfactory gem to use Merb::Mailer"
6
- MERB_LOGGER.warn "You need to install the mailfactory gem to use Merb::Mailer"
6
+ Merb.logger.warn "You need to install the mailfactory gem to use Merb::Mailer"
7
7
  end
8
8
 
9
9
  class MailFactory
@@ -25,7 +25,7 @@ module Merb
25
25
  #
26
26
  # or
27
27
  #
28
- # Merb::Mailer.config = {:sendmail_path => '/somewhere/odd')
28
+ # Merb::Mailer.config = {:sendmail_path => '/somewhere/odd'}
29
29
  # Merb::Mailer.delivery_method = :sendmail
30
30
  #
31
31
  # You could send mail manually like this (but it's better to use
@@ -13,7 +13,7 @@ module Merb
13
13
 
14
14
  def authenticated?
15
15
  username, password = *credentials
16
- username == Merb::Server.config[:basic_auth][:username] and password == Merb::Server.config[:basic_auth][:password]
16
+ username == Merb::Config[:basic_auth][:username] and password == Merb::Config[:basic_auth][:password]
17
17
  end
18
18
 
19
19
  def basic_authentication
@@ -26,7 +26,7 @@ module Merb
26
26
  set_status(401)
27
27
  headers['Content-type'] = 'text/plain'
28
28
  headers['Status'] = 'Unauthorized'
29
- headers['WWW-Authenticate'] = "Basic realm=\"#{Merb::Server.config[:basic_auth][:domain]}\""
29
+ headers['WWW-Authenticate'] = "Basic realm=\"#{Merb::Config[:basic_auth][:domain]}\""
30
30
  return 'Unauthorized'
31
31
  end
32
32
 
@@ -66,7 +66,7 @@ module Merb
66
66
  # fully-qualified URL.
67
67
  #
68
68
  def redirect(url)
69
- MERB_LOGGER.info("Redirecting to: #{url}")
69
+ Merb.logger.info("Redirecting to: #{url}")
70
70
  set_status(302)
71
71
  headers['Location'] = url
72
72
  "<html><body>You are being <a href=\"#{url}\">redirected</a>.</body></html>"
@@ -52,11 +52,11 @@ module Merb
52
52
  # url(:edit_blogpost, @post) # => /blogposts/1/edit
53
53
  # url(:custom_new_blogpost, :action => 'alternate') # => /blogposts/new/alternate
54
54
  #
55
- # url(:comments, :blogpost => @post) # => /blogposts/1/comments
56
- # url(:new_comment, :blogpost => @post) # => /blogposts/1/comments/new
55
+ # url(:comments, :blogpost_id => @post) # => /blogposts/1/comments
56
+ # url(:new_comment, :blogpost_id => @post) # => /blogposts/1/comments/new
57
57
  # url(:comment, @comment) # => /blogposts/1/comments/1
58
58
  # url(:edit_comment, @comment) # => /blogposts/1/comments/1/edit
59
- # url(:custom_new_comment, :blogpost => @post)
59
+ # url(:custom_new_comment, :blogpost_id => @post)
60
60
  #
61
61
  # url(:page => 2) # => /posts/show/1?page=2
62
62
  # url(:new_post, :page => 3) # => /posts/new?page=3
@@ -86,7 +86,7 @@ module Merb
86
86
  else
87
87
  raise "URL not generated: #{route_name.inspect}, #{new_params.inspect}"
88
88
  end
89
- url = Merb::Server.config[:path_prefix] + url if Merb::Server.config[:path_prefix]
89
+ url = Merb::Config[:path_prefix] + url if Merb::Config[:path_prefix]
90
90
  url
91
91
  end
92
92
 
@@ -97,10 +97,12 @@ module Merb
97
97
  end
98
98
  route = symbol.is_a?(Symbol) ? Merb::Router.named_routes[symbol] : symbol
99
99
  unless route
100
- raise InternalServerError, "URL could not be constructed. Route symbol not found: #{symbol.inspect}"
100
+ raise "URL could not be constructed. Route symbol not found: #{symbol.inspect}"
101
101
  end
102
+
102
103
  path = route.generate(new_params, params)
103
104
  keys = route.symbol_segments
105
+
104
106
  if new_params.is_a? Hash
105
107
  if ext = format_extension(new_params)
106
108
  new_params.delete(:format)
@@ -190,7 +192,7 @@ module Merb
190
192
  # # => /products/3
191
193
  #
192
194
  def format_extension(new_params={})
193
- use_format = Merb::Server.config[:use_format_in_urls]
195
+ use_format = Merb::Config[:use_format_in_urls]
194
196
  if use_format.nil?
195
197
  prms = params.merge(new_params)
196
198
  use_format = prms[:format] != 'html' && prms[:format]
@@ -223,18 +225,10 @@ module Merb
223
225
  alias h escape_xml
224
226
  alias html_escape escape_xml
225
227
 
226
- # Escapes +s+ for use in a URL.
227
- #
228
- # ==== Parameter
229
- #
230
- # +s+ - String to URL escape.
231
- #
232
228
  def escape(s)
233
- s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
234
- '%'+$1.unpack('H2'*$1.size).join('%').upcase
235
- }.tr(' ', '+')
229
+ ::Merb::Request.escape(s)
236
230
  end
237
-
231
+
238
232
  # Unescapes a string (i.e., reverse URL escaping).
239
233
  #
240
234
  # ==== Parameter
@@ -242,11 +236,10 @@ module Merb
242
236
  # +s+ - String to unescape.
243
237
  #
244
238
  def unescape(s)
245
- s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){
246
- [$1.delete('%')].pack('H*')
247
- }
239
+ ::Merb::Request.unescape(s)
248
240
  end
249
241
 
242
+
250
243
  private
251
244
  # Used for sepccing
252
245
  def get_controller_for_url_generation(options)
@@ -255,4 +248,4 @@ module Merb
255
248
  end
256
249
 
257
250
  end
258
- end
251
+ end
@@ -0,0 +1,32 @@
1
+ module Merb::InlinePartialMixin
2
+ def partial(template, opts={})
3
+
4
+ unless @_template_format
5
+ @web_controller.choose_template_format(Merb.available_mime_types, {})
6
+ end
7
+
8
+ found_template = @web_controller._cached_partials["#{template}.#{@_template_format}"] ||=
9
+ @web_controller.send(:find_partial, template, opts)
10
+
11
+ template_method = found_template.gsub(/[^\.a-zA-Z0-9]/, "__").gsub(/\./, "_")
12
+
13
+ unless self.respond_to?(template_method)
14
+ return super
15
+ end
16
+
17
+ if with = opts.delete(:with)
18
+ as = opts.delete(:as) || found_template.match(/(.*\/_)([^\.]*)/)[2]
19
+ @_merb_partial_locals = opts
20
+ sent_template = [with].flatten.map do |temp|
21
+ @_merb_partial_locals[as.to_sym] = temp
22
+ send(template_method)
23
+ end.join
24
+ else
25
+ @_merb_partial_locals = opts
26
+ sent_template = send(template_method)
27
+ end
28
+
29
+ return sent_template if sent_template
30
+
31
+ end
32
+ end
@@ -12,7 +12,7 @@ module Merb
12
12
  :_cached_partials
13
13
 
14
14
  self._layout = :application
15
- self._template_root = File.expand_path(MERB_VIEW_ROOT)
15
+ self._template_root = File.expand_path(Merb.view_path)
16
16
  self._templates = {}
17
17
  self._cached_partials = {}
18
18
 
@@ -226,7 +226,7 @@ module Merb
226
226
  # set any additinal headers that may be associated with the current mime type
227
227
  Merb.response_headers[tmpl_fmt].each do |key,value|
228
228
  headers[key.to_s] = value
229
- end if Merb.response_headers[tmpl_fmt]
229
+ end
230
230
 
231
231
  end
232
232
  end
@@ -421,7 +421,7 @@ module Merb
421
421
  # This method will return a matching template at the specified path, using the
422
422
  # template_name.format.engine convention
423
423
  def glob_template(path, opts = {})
424
- the_template = "#{path}.#{@_template_format}"
424
+ the_template = "#{path}.#{opts[:format] || @_template_format}"
425
425
  Merb::AbstractController._template_path_cache[the_template] || (@_merb_unmatched = (the_template + ".*"); nil)
426
426
  end
427
427