<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>merb-assets/spec/merb-assets_spec.rb</filename>
    </added>
    <added>
      <filename>merb-builder/spec/controllers/views/capture_builder/index.xml.builder</filename>
    </added>
    <added>
      <filename>merb-builder/spec/controllers/views/concat_builder/index.xml.builder</filename>
    </added>
    <added>
      <filename>merb-freezer/LICENSE</filename>
    </added>
    <added>
      <filename>merb-freezer/README</filename>
    </added>
    <added>
      <filename>merb-freezer/README.markdown</filename>
    </added>
    <added>
      <filename>merb-freezer/Rakefile</filename>
    </added>
    <added>
      <filename>merb-freezer/TODO</filename>
    </added>
    <added>
      <filename>merb-freezer/bin/frozen-merb</filename>
    </added>
    <added>
      <filename>merb-freezer/lib/merb-freezer.rb</filename>
    </added>
    <added>
      <filename>merb-freezer/lib/merb-freezer/freezer.rb</filename>
    </added>
    <added>
      <filename>merb-freezer/lib/merb-freezer/freezer_mode.rb</filename>
    </added>
    <added>
      <filename>merb-freezer/lib/merb-freezer/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-freezer/spec/merb-freezer_spec.rb</filename>
    </added>
    <added>
      <filename>merb-freezer/spec/spec_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/controller.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/generator.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/merb.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/merb_flat.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/merb_very_flat.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/migration.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/model.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/part_controller.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/resource.rb</filename>
    </added>
    <added>
      <filename>merb-gen/lib/merb-gen/resource_controller.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/controller_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/merb_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/migration_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/model_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/resource_controller_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/spec/spec_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/Rakefile</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/controllers/application.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/controllers/exceptions.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/helpers/global_helpers.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/views/exceptions/internal_server_error.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/views/exceptions/not_acceptable.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/views/exceptions/not_found.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/app/views/layout/application.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/autotest/discover.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/autotest/merb.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/autotest/merb_rspec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/environments/development.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/environments/production.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/environments/rake.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/environments/test.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/init.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/rack.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/config/router.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/public/htaccess</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/public/images/merb.jpg</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/public/merb.fcgi</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/public/stylesheets/master.css</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/spec/spec.opts</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/spec/spec_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb/test/test_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_flat/README.txt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_flat/application.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_flat/config/framework.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_flat/config/init.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_flat/views/foo.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/merb_plugin_generator.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/LICENSE</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/README</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/Rakefile</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/TODO</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/lib/%base_name%.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/lib/%base_name%/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/spec/%base_name%_spec.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/spec/spec_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/test/%base_name%_test.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_plugin/templates/test/test_helper.rb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/application/merb_very_flat/application.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/controller.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/controller_spec.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/controller_test_unit.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/helper.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/helper_spec.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/controller/index.html.erbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/migration/migration_activerecord.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/migration/migration_datamapper.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/migration/migration_sequel.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/model.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/model_activerecord.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/model_datamapper.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/model_sequel.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/spec.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/model/test_unit.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/part_controller/controller.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/part_controller/helper.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/part_controller/index.html.erbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/controller.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/helpers.rbt</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/views/edit.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/views/index.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/views/new.html.erb</filename>
    </added>
    <added>
      <filename>merb-gen/templates/component/resource_controller/views/show.html.erb</filename>
    </added>
    <added>
      <filename>merb-jquery/LICENSE</filename>
    </added>
    <added>
      <filename>merb-jquery/README</filename>
    </added>
    <added>
      <filename>merb-jquery/Rakefile</filename>
    </added>
    <added>
      <filename>merb-jquery/TODO</filename>
    </added>
    <added>
      <filename>merb-jquery/lib/merb-jquery.rb</filename>
    </added>
    <added>
      <filename>merb-jquery/lib/merb-jquery/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-mailer/lib/merb-mailer/mailer_mixin.rb</filename>
    </added>
    <added>
      <filename>merb-parts/lib/merb-parts/mixins/parts_mixin.rb</filename>
    </added>
    <added>
      <filename>merb-parts/spec/fixtures/parts/done_part.rb</filename>
    </added>
    <added>
      <filename>merb-slices/.gitignore</filename>
    </added>
    <added>
      <filename>merb-slices/LICENSE</filename>
    </added>
    <added>
      <filename>merb-slices/README</filename>
    </added>
    <added>
      <filename>merb-slices/Rakefile</filename>
    </added>
    <added>
      <filename>merb-slices/TODO</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices/controller_mixin.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices/module.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices/module_mixin.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/merb-slices/router_ext.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/USAGE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/slice_generator.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/LICENSE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/README</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/Rakefile</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/TODO</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/app/controllers/application.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/app/controllers/main.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/app/helpers/application_helper.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/app/views/layout/%underscored_base_name%.html.erb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/app/views/main/index.html.erb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/lib/%base_name%.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/lib/%base_name%/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/lib/%base_name%/slicetasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/public/javascripts/master.js</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/public/stylesheets/master.css</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/spec/%base_name%_spec.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/spec/controllers/main_spec.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/spec/spec_helper.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/stubs/app/controllers/application.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/slice/templates/stubs/app/controllers/main.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/USAGE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/LICENSE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/README</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/Rakefile</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/TODO</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/application.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/lib/%base_name%.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/lib/%base_name%/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/lib/%base_name%/slicetasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/public/javascripts/master.js</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/public/stylesheets/master.css</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/stubs/application.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/views/layout/%underscored_base_name%.html.erb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/templates/views/main/index.html.erb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/thin_slice/thin_slice_generator.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/USAGE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/LICENSE</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/README</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/Rakefile</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/TODO</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/application.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/lib/%base_name%.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/lib/%base_name%/merbtasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/templates/lib/%base_name%/slicetasks.rb</filename>
    </added>
    <added>
      <filename>merb-slices/merb_generators/very_thin_slice/very_thin_slice_generator.rb</filename>
    </added>
    <added>
      <filename>merb-slices/spec/merb-slice_spec.rb</filename>
    </added>
    <added>
      <filename>merb-slices/spec/spec_helper.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,39 @@
+== 0.9.3 &quot;We Sold Our Soul for Rock 'n' Roll&quot; 2008-05-03
+* Add mongrel as dependency of merb meta gem
+* make merb.fcgi executable
+* Added /log dir back to default app generator; logger auto-flush set to true (dev/test/rake env.)
+* Fixed a bug where cache_{action,page} wouldn't work with multiple controllers (closing #90)
+* moved the generated frozen merb script to merb-freezer
+* action-args: Add support for iherited/mixed-in controller actions
+* refactored the rake tasks and added support for rubygems freeze using MODE=rubygems
+* Fixes Merb::AssetsMixin errors from #103, also added specs
+* finally fixed the submodules freezer
+* added simple message to let the user know what merb-core gem is being used
+* removed merb-core dependency so frozen-merb can work properly
+* Makes frozen_merb bin work outside of the working directory by looking for the -m CLI option
+* quieted missleading merb-gen warning when using rspec.  Thanks ec!
+* added default file logging in production mode
+* merb-mailer absolute_url convenience method
+* Added bundling for require_js and require_css; track cached bundles in-memory
+* Made bundles stale for 60 seconds after modification/generation
+* Fixed &quot;Page caching doesn't deactivate&quot; closing #106
+* Properly handle assets urls with query strings in them
+* Arguments to require_js and require_css methods are now kept seperate
+* Cached page requests now respect the original content-type, fixing #116
+* Update generated init file: add inflection examples, notes on gems bundling and lazy loading
+* Add example and dependencies / installation order tricks to generated init.rb
+* Updated templates for merb app generation
+* Added a small fix to autotest/merb_rspec.rb template
+* Make Merb::Config.use section come after dependencies.
+* Make loadp paths and dependencies come first in generated config.
+* Fix merb-builder, thanks atmpos
+* Leave a notice on libraries under lib/ autoloading in init.rb (see details).
+* A css/js auto linker based on controller/action names.
+* make partials with args work in parts.
+* Add missing dependency for merb-builder
+* allow usage of a custom GEM_HOME when building gems in rakefile
+* Make generated Autotest files Windows-friendly again.
+
 == 0.9.2 &quot;appropriate response to reality&quot; 2008-03-24
 * Fix merb-flat and merb-very-flat generators
 * merb-gen no longer generates apps by default</diff>
      <filename>CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -1,23 +1,25 @@
 ## THESE ARE CRUCIAL
 module Merb
   # Set this to the version of merb-core that you are building against/for
-  VERSION = &quot;0.9.2&quot;
+  VERSION = &quot;0.9.4&quot;
 
   # Set this to the version of merb-more you plan to release
-  MORE_VERSION = &quot;0.9.2&quot;
+  MORE_VERSION = &quot;0.9.4&quot;
 end
 
 require &quot;rake/clean&quot;
 require &quot;rake/gempackagetask&quot;
+require 'merb-core/tasks/merb_rake_helper'
 require 'fileutils'
 include FileUtils
 
 gems = %w[
   merb-action-args merb-assets merb-gen merb-haml
-  merb-builder merb-mailer merb-parts merb-cache
+  merb-builder merb-mailer merb-parts merb-cache merb-freezer merb-slices
 ]
 
 merb_more_spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name         = &quot;merb-more&quot;
   s.version      = Merb::MORE_VERSION
   s.platform     = Gem::Platform::RUBY
@@ -34,6 +36,7 @@ merb_more_spec = Gem::Specification.new do |s|
 end
 
 merb_spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name         = &quot;merb&quot;
   s.version      = Merb::MORE_VERSION
   s.platform     = Gem::Platform::RUBY
@@ -50,13 +53,6 @@ end
 
 CLEAN.include [&quot;**/.*.sw?&quot;, &quot;pkg&quot;, &quot;lib/*.bundle&quot;, &quot;*.gem&quot;, &quot;doc/rdoc&quot;, &quot;.config&quot;, &quot;coverage&quot;, &quot;cache&quot;, &quot;lib/merb-more.rb&quot;]
 
-windows = (PLATFORM =~ /win32|cygwin/) rescue nil
-
-SUDO = windows ? &quot;&quot; : &quot;sudo&quot;
-
-# desc &quot;Installs Merb More.&quot;
-# task :default =&gt; :install
-
 Rake::GemPackageTask.new(merb_more_spec) do |package|
   package.gem_spec = merb_more_spec
 end
@@ -65,10 +61,11 @@ Rake::GemPackageTask.new(merb_spec) do |package|
   package.gem_spec = merb_spec
 end
 
+gem_home = ENV['GEM_HOME'] ? &quot;GEM_HOME=#{ENV['GEM_HOME']}&quot; : &quot;&quot;
 desc &quot;Install it all&quot;
 task :install =&gt; [:install_gems, :package] do
-  sh %{#{SUDO} gem install --local pkg/merb-more-#{Merb::MORE_VERSION}.gem  --no-update-sources}
-  sh %{#{SUDO} gem install --local pkg/merb-#{Merb::MORE_VERSION}.gem --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} --local pkg/merb-more-#{Merb::MORE_VERSION}.gem  --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} --local pkg/merb-#{Merb::MORE_VERSION}.gem --no-update-sources}
 end
 
 desc &quot;Build the merb-more gems&quot;
@@ -81,14 +78,14 @@ end
 desc &quot;Install the merb-more sub-gems&quot;
 task :install_gems do
   gems.each do |dir|
-    Dir.chdir(dir){ sh &quot;#{SUDO} rake install&quot; }
+    Dir.chdir(dir){ sh &quot;rake install&quot; }
   end
 end
 
 desc &quot;Uninstall the merb-more sub-gems&quot;
 task :uninstall_gems do
   gems.each do |sub_gem|
-    sh %{#{SUDO} gem uninstall #{sub_gem}}
+    sh %{#{sudo} gem uninstall #{sub_gem}}
   end
 end
 
@@ -111,9 +108,6 @@ task :bundle =&gt; [:package, :build_gems] do
   cp &quot;pkg/merb-#{Merb::MORE_VERSION}.gem&quot;, &quot;bundle&quot;
   cp &quot;pkg/merb-more-#{Merb::MORE_VERSION}.gem&quot;, &quot;bundle&quot;
   gems.each do |gem|
-    File.open(&quot;#{gem}/Rakefile&quot;) do |rakefile|
-      rakefile.read.detect {|l| l =~ /^VERSION\s*=\s*&quot;(.*)&quot;$/ }
-      sh %{cp #{gem}/pkg/#{gem}-#{$1}.gem bundle/}
-    end
+    sh %{cp #{gem}/pkg/#{gem}-#{Merb::MORE_VERSION}.gem bundle/}
   end
 end</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,18 @@
 require 'rubygems'
 require 'rake/gempackagetask'
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-action-args&quot;
 NAME = &quot;merb-action-args&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Yehuda Katz&quot;
 EMAIL = &quot;ykatz@engineyard.com&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-haml/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb plugin that provides support for ActionArgs&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -20,10 +21,11 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
+  s.add_dependency('ruby2ruby', '&gt;= 1.1.9')
+  s.add_dependency('ParseTree', '&gt;= 2.2')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
@@ -31,14 +33,14 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end</diff>
      <filename>merb-action-args/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 class Merb::AbstractController
   
   class &lt;&lt; self
-    attr_accessor :action_argument_list    
+    attr_accessor :action_argument_list
     alias_method :old_inherited, :inherited
 
     # Stores the argument lists for all methods for this class.
@@ -25,10 +25,11 @@ class Merb::AbstractController
   # ==== Raises
   # BadRequest:: The params hash doesn't have a required parameter.
   def _call_action(action)
-    args = self.class.action_argument_list[action].map do |arg, default|
+    arguments, defaults = self.class.action_argument_list[action]
+    args = arguments.map do |arg, default|
       arg = arg
       p = params.key?(arg.to_sym)
-      raise BadRequest unless p || default
+      raise BadRequest unless p || (defaults &amp;&amp; defaults.include?(arg))
       p ? params[arg.to_sym] : default
     end
     __send__(action, *args)</diff>
      <filename>merb-action-args/lib/merb-action-args/abstract_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,20 @@
+require 'parse_tree'
 require 'ruby2ruby'
 
-class ParseTreeArray &lt; Array #:nodoc:
+class ParseTreeArray &lt; Array
   def self.translate(*args)
-    self.new(ParseTree.translate(*args))
+    sexp = ParseTree.translate(*args)
+    # ParseTree.translate returns [nil] if called on an inherited method, so walk
+    # up the inheritance chain to find the class that the method was defined in
+    unless sexp.first
+      klass = args.first.ancestors.detect do |klass| 
+        klass.public_instance_methods(false).include?(args.last.to_s)
+      end
+      sexp = ParseTree.translate(klass, args.last) if klass
+    end
+    self.new(sexp)
   end
-
+  
   def deep_array_node(type = nil)
     each do |node|
       return ParseTreeArray.new(node) if node.is_a?(Array) &amp;&amp; (!type || node[0] == type)
@@ -26,20 +36,19 @@ class ParseTreeArray &lt; Array #:nodoc:
       # method defined with def keyword
       args = arg_node.arg_nodes
       default_node = arg_node.deep_array_node(:block)
-      return args unless default_node
+      return [args, []] unless default_node
     else
       # assuming method defined with Module#define_method
-      return []
+      return [[],[]]
     end
     
     # if it was defined with def, and we found the default_node,
     # that should bring us back to regularly scheduled programming..
-    
     lasgns = default_node[1..-1]
     lasgns.each do |asgn|
       args.assoc(asgn[1]) &lt;&lt; eval(RubyToRuby.new.process(asgn[2]))
     end
-    args
+    [args, (default_node[1..-1].map { |asgn| asgn[1] })]
   end
 
 end
@@ -75,10 +84,10 @@ module GetArgs
   end
 end
 
-class UnboundMethod #:nodoc:
+class UnboundMethod
   include GetArgs
 end
 
-class Method  #:nodoc:
+class Method
   include GetArgs
 end
\ No newline at end of file</diff>
      <filename>merb-action-args/lib/merb-action-args/get_args.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,4 +26,12 @@ describe Merb::AbstractController do
     dispatch_to(ActionArgs, :dynamic_define_method).body.should == &quot;mos def&quot;
   end
   
+  it &quot;should be able to inherit actions for use with Action Arguments&quot; do
+    dispatch_to(ActionArgs, :funky_inherited_method, :foo =&gt; &quot;bar&quot;, :bar =&gt; &quot;baz&quot;).body.should == &quot;bar baz&quot;
+  end
+  
+  it &quot;should be able to handle nil defaults&quot; do
+    dispatch_to(ActionArgs, :with_default_nil, :foo =&gt; &quot;bar&quot;).body.should == &quot;bar &quot;
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-action-args/spec/action_args_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,16 @@
+module ExtraActions
+  def self.included(base)
+    base.show_action(:funky_inherited_method)
+  end
+  
+  def funky_inherited_method(foo, bar)
+    &quot;#{foo} #{bar}&quot;
+  end
+end
+
+
 class ActionArgs &lt; Merb::Controller
+  include ExtraActions
   
   def index(foo)
     foo
@@ -20,4 +32,8 @@ class ActionArgs &lt; Merb::Controller
     &quot;mos def&quot;
   end
   
+  def with_default_nil(foo, bar = nil)
+    &quot;#{foo} #{bar}&quot;
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-action-args/spec/controllers/action-args.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,250 @@
 merb-assets
 ===========
 
-A plugin for the Merb framework that provides ...
\ No newline at end of file
+Provides extra functionality related to assets:
+
+	# Assets bundling.
+	# Assets hosts.
+	# Helpers to add asset links to views.
+	# Deployment-time assets processing (for instance, with YUI Compressor).
+
+Quick overview of the API
+==============================
+
+  # asset_path generates path for asset taking type and name.
+	# UniqueAssetPath class handles generation of paths using subdomains.
+	# AbstractAssetBundler is the base asset bundlers class.
+
+	# auto_link generates conventional asset tags based on controller/action.
+	# link_to creates anchor tag (a tag).
+	# image_tag creates img tag.
+	
+	# escape_js escapes JavaScript.
+	# js method translates object into JSON.
+	
+	# require_js is smart(-er) way to do includes just once per page no matter
+	  how many times partial use it.
+	# require_css is like require_js but for JavaScript.
+		 
+	# js_include_tag is used when you need to include script tag with bundling.
+	# css_include_tag works like js_include_tag but for stylesheets.
+	# include_required_js generates script tags for previously included files.
+	# include_required_css generates link tags for previously included files.
+
+	# uniq_js_path generates a script tag for path with asset subdomain.
+	# uniq_css_path generates a link tag for path with asset subdomain.	
+
+
+Examples
+===========
+
+auto_link to include asset tags using convention:
+
+  We want all possible matches in the FileSys up to the action name
+     Given:  controller_name = &quot;namespace/controller&quot;
+             action_name     = &quot;action&quot;
+  If all files are present should generate link/script tags for:
+     namespace.(css|js)
+     namespace/controller.(css|js)
+     namespace/controller/action.(css|js)
+
+link_to and image_tag to make anchor and image tags:
+
+  image_tag('foo.gif') 
+  # =&gt; &lt;img src='/images/foo.gif' /&gt;
+  
+  image_tag('foo.gif', :class =&gt; 'bar') 
+  # =&gt; &lt;img src='/images/foo.gif' class='bar' /&gt;
+
+  image_tag('foo.gif', :path =&gt; '/files/') 
+  # =&gt; &lt;img src='/files/foo.gif' /&gt;
+
+  image_tag('http://test.com/foo.gif')
+  # =&gt; &lt;img src=&quot;http://test.com/foo.gif&quot;&gt;
+
+  image_tag('charts', :path =&gt; '/dynamic/')
+  or 
+  image_tag('/dynamic/charts')
+  # =&gt; &lt;img src=&quot;/dynamic/charts&quot;&gt;
+
+  link_to(&quot;The Merb home page&quot;, &quot;http://www.merbivore.com/&quot;)
+    # =&gt; &lt;a href=&quot;http://www.merbivore.com/&quot;&gt;The Merb home page&lt;/a&gt;
+
+  link_to(&quot;The Ruby home page&quot;, &quot;http://www.ruby-lang.org&quot;, {'class' =&gt; 'special', 'target' =&gt; 'blank'})
+    # =&gt; &lt;a href=&quot;http://www.ruby-lang.org&quot; class=&quot;special&quot; target=&quot;blank&quot;&gt;The Ruby home page&lt;/a&gt;
+
+  link_to p.title, &quot;/blog/show/#{p.id}&quot;
+    # =&gt; &lt;a href=&quot;/blog/show/13&quot;&gt;The Entry Title&lt;/a&gt;
+
+uniq_css_tag and uniq_js_tag for paths with asset subdomains:
+
+  uniq_css_tag(&quot;my&quot;)
+  #=&gt; &lt;link href=&quot;http://assets2.my-awesome-domain.com/stylesheets/my.css&quot; type=&quot;text/css&quot; /&gt;
+
+  uniq_js_tag(&quot;my&quot;)
+  #=&gt; &lt;script type=&quot;text/javascript&quot; src=&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;&gt;&lt;/script&gt;
+
+  uniq_js_path(&quot;my&quot;)
+  #=&gt; &quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;
+
+  uniq_js_path([&quot;admin/secrets&quot;,&quot;home/signup&quot;])
+  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/admin/secrets.js&quot;, 
+         &quot;http://assets1.my-awesome-domain.com/javascripts/home/signup.js&quot;]
+
+re_js and require_css, include_required_js and include_requried_css
+quire assets in parts/partials just once:		
+
+ 
+ In your application layout:
+ 
+   js_include_tag :prototype, :lowpro, :bundle =&gt; :base
+ 
+ In your controller layout:
+ 
+   require_js :bundle =&gt; :posts
+
+ The require_js method can be used to require any JavaScript file anywhere
+ in your templates. Regardless of how many times a single script is
+ included with require_js, Merb will only include it once in the header.
+
+   # File: app/views/layouts/application.html.erb
+
+   &lt;html&gt;
+     &lt;head&gt;
+       &lt;%= include_required_js %&gt;
+       &lt;%= include_required_css %&gt;
+     &lt;/head&gt;
+     &lt;body&gt;
+       &lt;%= catch_content :layout %&gt;
+     &lt;/body&gt;
+   &lt;/html&gt;
+ 
+   # File: app/views/whatever/_part1.herb
+
+   &lt;% require_js  'this' -%&gt;
+   &lt;% require_css 'that', 'another_one' -%&gt;
+ 
+   # File: app/views/whatever/_part2.herb
+
+   &lt;% require_js 'this', 'something_else' -%&gt;
+   &lt;% require_css 'that' -%&gt;
+
+   # File: app/views/whatever/index.herb
+
+   &lt;%= partial(:part1) %&gt;
+   &lt;%= partial(:part2) %&gt;
+
+   # Will generate the following in the final page...
+   &lt;html&gt;
+     &lt;head&gt;
+       &lt;script src=&quot;/javascripts/this.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+       &lt;script src=&quot;/javascripts/something_else.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+       &lt;link href=&quot;/stylesheets/that.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+       &lt;link href=&quot;/stylesheets/another_one.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+     &lt;/head&gt;
+     .
+     .
+     .
+   &lt;/html&gt;		
+
+   # my_action.herb has a call to require_css 'style'
+   # File: layout/application.html.erb
+   include_required_css
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+
+   # my_action.herb has a call to require_css 'style', 'ie-specific'
+   # File: layout/application.html.erb
+   include_required_css
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+   #    &lt;link href=&quot;/stylesheets/ie-specific.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+
+   # my_action.herb has a call to require_js 'jquery'
+   # File: layout/application.html.erb
+   include_required_js
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   # my_action.herb has a call to require_js 'jquery', 'effects', 'validation'
+   # File: layout/application.html.erb
+   include_required_js
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+   #    &lt;script src=&quot;/javascripts/effects.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+   #    &lt;script src=&quot;/javascripts/validation.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   &lt;% require_css('style') %&gt;
+   # A subsequent call to include_required_css will render...
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+
+   &lt;% require_css('style', 'ie-specific') %&gt;
+   # A subsequent call to include_required_css will render...
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+   #    &lt;link href=&quot;/stylesheets/ie-specific.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
+
+   &lt;% require_js 'jquery' %&gt;
+   # A subsequent call to include_required_js will render...
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   &lt;% require_js 'jquery', 'effects' %&gt;
+   # A subsequent call to include_required_js will render...
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+   #    &lt;script src=&quot;/javascripts/effects.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+css_include_tag and js_include_tag that do not use asset subdomains:
+		
+   css_include_tag 'style'
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+
+   css_include_tag 'style.css', 'layout'
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+   #    &lt;link href=&quot;/stylesheets/layout.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+
+   css_include_tag :menu
+   # =&gt; &lt;link href=&quot;/stylesheets/menu.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+
+   css_include_tag :style, :screen
+   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+   #    &lt;link href=&quot;/stylesheets/screen.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+ 
+  css_include_tag :style, :media =&gt; :print
+  # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;print&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
+
+  css_include_tag :style, :charset =&gt; 'iso-8859-1'
+  # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;print&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;iso-8859-1&quot; /&gt;
+
+   js_include_tag 'jquery'
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   js_include_tag 'moofx.js', 'upload'
+   # =&gt; &lt;script src=&quot;/javascripts/moofx.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+   #    &lt;script src=&quot;/javascripts/upload.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   js_include_tag :effects
+   # =&gt; &lt;script src=&quot;/javascripts/effects.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+   js_include_tag :jquery, :validation
+   # =&gt; &lt;script src=&quot;/javascripts/jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+   #    &lt;script src=&quot;/javascripts/validation.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+
+Utility methods examples
+==========================
+		
+  uniq_css_path(&quot;my&quot;)
+  #=&gt; &quot;http://assets2.my-awesome-domain.com/stylesheets/my.css&quot;
+
+  uniq_css_path([&quot;admin/secrets&quot;,&quot;home/signup&quot;])
+  #=&gt; [&quot;http://assets2.my-awesome-domain.com/stylesheets/admin/secrets.css&quot;, 
+         &quot;http://assets1.my-awesome-domain.com/stylesheets/home/signup.css&quot;]
+
+  uniq_path(&quot;/javascripts/my.js&quot;,&quot;/javascripts/my.css&quot;)
+  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets1.my-awesome-domain.com/javascripts/my.css&quot;]
+
+  uniq_path([&quot;/javascripts/my.js&quot;,&quot;/stylesheets/my.css&quot;])
+  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets1.my-awesome-domain.com/stylesheets/my.css&quot;]
+
+  uniq_path(%w(/javascripts/my.js /stylesheets/my.css))
+  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets1.my-awesome-domain.com/stylesheets/my.css&quot;]
+
+  uniq_path('/stylesheets/somearbitrary.css')
+  #=&gt; &quot;http://assets3.my-awesome-domain.com/stylesheets/somearbitrary.css&quot;
+
+  uniq_path('/images/hostsexypicture.jpg')
+  #=&gt;&quot;http://assets1.my-awesome-domain.com/images/hostsexypicture.jpg&quot;
\ No newline at end of file</diff>
      <filename>merb-assets/README</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,18 @@
 require 'rubygems'
 require 'rake/gempackagetask'
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-assets&quot;
 NAME = &quot;merb-assets&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Ezra Zygmuntowicz&quot;
 EMAIL = &quot;ez@engineyard.com&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-assets/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb plugin that provides the helpers for assets and asset bundling&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -20,10 +21,9 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
@@ -31,14 +31,19 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
+end
+
+desc &quot;Run specs&quot;
+task :spec do
+  sh %{spec -r spec/spec_helper.rb spec/*_spec.rb}
 end</diff>
      <filename>merb-assets/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,6 @@ module Merb
     
     # Helpers for handling asset files.
     module AssetHelpers
-      # :nodoc:
       ASSET_FILE_EXTENSIONS = {
         :javascript =&gt; &quot;.js&quot;,
         :stylesheet =&gt; &quot;.css&quot;
@@ -42,10 +41,12 @@ module Merb
       #   # =&gt; &quot;public/javascripts/dingo.js&quot;
       def asset_path(asset_type, filename, local_path = false)
         filename = filename.to_s
-        if filename !~ /#{'\\' + ASSET_FILE_EXTENSIONS[asset_type]}\Z/
-          filename &lt;&lt; ASSET_FILE_EXTENSIONS[asset_type]
+        if filename !~ /#{'\\' + ASSET_FILE_EXTENSIONS[asset_type]}\Z/ &amp;&amp; filename.index('?').nil?
+          filename = &quot;#{filename}#{ASSET_FILE_EXTENSIONS[asset_type]}&quot; # don't modify receiver
+        end
+        if filename !~ %r{^(/|https?://)}
+          filename = &quot;/#{asset_type}s/#{filename}&quot;
         end
-        filename = &quot;/#{asset_type}s/#{filename}&quot;
         if local_path
           return &quot;public#{filename}&quot;
         else
@@ -59,8 +60,6 @@ module Merb
     # for downloading static files (css, js, images...)
     class UniqueAssetPath
       class &lt;&lt; self
-        @@config = Merb::Plugins.config[:asset_helpers]
-        
         # Builds the path to the file based on the name
         # 
         # ==== Parameters
@@ -74,9 +73,10 @@ module Merb
         #   # =&gt; &quot;https://assets5.my-awesome-domain.com/javascripts/my_fancy_script.js&quot;
         #
         def build(filename)
-          #%{#{(USE_SSL ? 'https' : 'http')}://#{sprintf(@@config[:asset_domain],self.calculate_host_id(file))}.#{@@config[:domain]}/#{filename}}
-          path = @@config[:use_ssl] ? 'https://' : 'http://'
-          path &lt;&lt; sprintf(@@config[:asset_domain],self.calculate_host_id(filename)) &lt;&lt; &quot;.#{@@config[:domain]}&quot;
+          config = Merb::Plugins.config[:asset_helpers]
+          #%{#{(USE_SSL ? 'https' : 'http')}://#{sprintf(config[:asset_domain],self.calculate_host_id(file))}.#{config[:domain]}/#{filename}}
+          path = config[:use_ssl] ? 'https://' : 'http://'
+          path &lt;&lt; sprintf(config[:asset_domain],self.calculate_host_id(filename)) &lt;&lt; &quot;.#{config[:domain]}&quot;
           path &lt;&lt; &quot;/&quot; if filename.index('/') != 0
           path &lt;&lt; filename
         end
@@ -89,15 +89,48 @@ module Merb
           filename.each_byte {|byte|
             ascii_total += byte
           }
-          (ascii_total % @@config[:max_hosts] + 1)
+          (ascii_total % Merb::Plugins.config[:asset_helpers][:max_hosts] + 1)
         end
       end
     end
     
     # An abstract class for bundling text assets into single files.
     class AbstractAssetBundler
+      
+      class_inheritable_array :cached_bundles
+      self.cached_bundles ||= []
+      
       class &lt;&lt; self
         
+        # Mark a bundle as cached.
+        #
+        # ==== Parameters
+        # name&lt;~to_s&gt;:: Name of the bundle
+        #
+        def cache_bundle(name)
+          cached_bundles.push(name.to_s)
+        end
+        
+        # Purge a bundle from the cache.
+        #
+        # ==== Parameters
+        # name&lt;~to_s&gt;:: Name of the bundle
+        #
+        def purge_bundle(name)
+          cached_bundles.delete(name.to_s)
+        end
+        
+        # Test if a bundle has been cached.
+        #
+        # ==== Parameters
+        # name&lt;~to_s&gt;:: Name of the bundle
+        #
+        # ==== Returns
+        # Boolean:: Whether the bundle has been cached or not.
+        def cached_bundle?(name)
+          cached_bundles.include?(name.to_s)
+        end
+        
         # ==== Parameters
         # &amp;block:: A block to add as a post-bundle callback.
         #
@@ -145,10 +178,19 @@ module Merb
       # ==== Returns
       # Symbol:: Name of the bundle.
       def bundle!
-        # 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.
-        unless File.exist?(@bundle_filename)
+        # TODO: push it out to the helper level so we don't have to create the helper object.
+        unless self.class.cached_bundle?(@bundle_name)
+          # skip regeneration of new bundled files - preventing multiple merb apps stepping on eachother
+          # file needs to be older than 60 seconds to be regenerated
+          if File.exist?(@bundle_filename) &amp;&amp; File.mtime(@bundle_filename) &gt;= Time.now - 60
+            return @bundle_name # serve the old file for now - to be regenerated later
+          end
           bundle_files(@bundle_filename, *@files)
-          self.class.callbacks.each { |c| c.call(@bundle_filename) }
+          if File.exist?(@bundle_filename)
+            self.class.callbacks.each { |c| c.call(@bundle_filename) }
+            Merb.logger.info(&quot;Assets: bundled :#{@bundle_name} into #{File.basename(@bundle_filename)}&quot;)
+            self.class.cache_bundle(@bundle_name)
+          end
         end
         return @bundle_name
       end
@@ -164,7 +206,9 @@ module Merb
       # *files&lt;String&gt;:: Filenames to be bundled.
       def bundle_files(filename, *files)
         File.open(filename, &quot;w&quot;) do |f|
+          f.flock(File::LOCK_EX)
           files.each { |file| f.puts(File.read(file)) }
+          f.flock(File::LOCK_UN)
         end
       end
       </diff>
      <filename>merb-assets/lib/merb-assets/assets.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,11 +7,52 @@ module Merb
     # Merb provides views with convenience methods for links images and other
     # assets.
 
+
+    # ==== Parameters
+    # none
+    #
+    # ==== Returns
+    # html&lt;String&gt;
+    #
+    # ==== Examples
+    #  We want all possible matches in the FileSys up to the action name
+    #     Given:  controller_name = &quot;namespace/controller&quot;
+    #             action_name     = &quot;action&quot;
+    #  If all files are present should generate link/script tags for:
+    #     namespace.(css|js)
+    #     namespace/controller.(css|js)
+    #     namespace/controller/action.(css|js)
+    #
+    def auto_link
+      html    = &quot;&quot;
+      prefix  = &quot;&quot;
+      (controller_name / action_name).split(&quot;/&quot;).each do |path|
+        path = prefix + path
+
+        css_path  = path + &quot;.css&quot;
+        if File.exists? Merb.root / &quot;public&quot; / &quot;stylesheets&quot; / css_path
+          html &lt;&lt; %{&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/stylesheets/#{css_path}&quot; /&gt; }
+        end
+
+        js_path   = path + &quot;.js&quot;
+        if File.exists? Merb.root / &quot;public&quot; / &quot;javascripts&quot; / js_path
+          html &lt;&lt; %{&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; src=&quot;/javascripts/#{js_path}&quot;&gt;&lt;/script&gt;}
+        end
+
+        #Update the prefix for the next iteration
+        prefix += path / &quot;&quot;
+      end
+
+      #Return the generated HTML
+      html
+    end
+
+
     # ==== Parameters
     # name&lt;~to_s&gt;:: The text of the link.
     # url&lt;~to_s&gt;:: The URL to link to. Defaults to an empty string.
     # opts&lt;Hash&gt;:: Additional HTML options for the link.
-    #    
+    #
     # ==== Examples
     #   link_to(&quot;The Merb home page&quot;, &quot;http://www.merbivore.com/&quot;)
     #     # =&gt; &lt;a href=&quot;http://www.merbivore.com/&quot;&gt;The Merb home page&lt;/a&gt;
@@ -20,13 +61,13 @@ module Merb
     #     # =&gt; &lt;a href=&quot;http://www.ruby-lang.org&quot; class=&quot;special&quot; target=&quot;blank&quot;&gt;The Ruby home page&lt;/a&gt;
     #
     #   link_to p.title, &quot;/blog/show/#{p.id}&quot;
-    #     # =&gt; &lt;a href=&quot;blog/show/13&quot;&gt;The Entry Title&lt;/a&gt;
+    #     # =&gt; &lt;a href=&quot;/blog/show/13&quot;&gt;The Entry Title&lt;/a&gt;
     #
     def link_to(name, url='', opts={})
       opts[:href] ||= url
       %{&lt;a #{ opts.to_xml_attributes }&gt;#{name}&lt;/a&gt;}
     end
-  
+
     # ==== Parameters
     # img&lt;~to_s&gt;:: The image path.
     # opts&lt;Hash&gt;:: Additional options for the image tag (see below).
@@ -36,31 +77,31 @@ module Merb
     #   Sets the path prefix for the image. Defaults to &quot;/images/&quot; or whatever
     #   is specified in Merb::Config. This is ignored if img is an absolute
     #   path or full URL.
-    # 
+    #
     # All other options set HTML attributes on the tag.
     #
     # ==== Examples
-    #   image_tag('foo.gif') 
+    #   image_tag('foo.gif')
     #   # =&gt; &lt;img src='/images/foo.gif' /&gt;
-    #   
-    #   image_tag('foo.gif', :class =&gt; 'bar') 
+    #
+    #   image_tag('foo.gif', :class =&gt; 'bar')
     #   # =&gt; &lt;img src='/images/foo.gif' class='bar' /&gt;
     #
-    #   image_tag('foo.gif', :path =&gt; '/files/') 
+    #   image_tag('foo.gif', :path =&gt; '/files/')
     #   # =&gt; &lt;img src='/files/foo.gif' /&gt;
     #
     #   image_tag('http://test.com/foo.gif')
     #   # =&gt; &lt;img src=&quot;http://test.com/foo.gif&quot;&gt;
     #
     #   image_tag('charts', :path =&gt; '/dynamic/')
-    #   or 
+    #   or
     #   image_tag('/dynamic/charts')
     #   # =&gt; &lt;img src=&quot;/dynamic/charts&quot;&gt;
     def image_tag(img, opts={})
       if img[0].chr == '/'
         opts[:src] = img
       else
-        opts[:path] ||= 
+        opts[:path] ||=
           if img =~ %r{^https?://}
             ''
           else
@@ -72,12 +113,12 @@ module Merb
           end
         opts[:src] ||= opts.delete(:path) + img
       end
-      %{&lt;img #{ opts.to_xml_attributes } /&gt;}    
+      %{&lt;img #{ opts.to_xml_attributes } /&gt;}
     end
 
     # :section: JavaScript related functions
     #
-    
+
     # ==== Parameters
     # javascript&lt;String&gt;:: Text to escape for use in JavaScript.
     #
@@ -90,21 +131,7 @@ module Merb
     def escape_js(javascript)
       (javascript || '').gsub('\\','\0\0').gsub(/\r\n|\n|\r/, &quot;\\n&quot;).gsub(/[&quot;']/) { |m| &quot;\\#{m}&quot; }
     end
-    
-    # ==== Parameters
-    # name&lt;~to_s&gt;:: The text in the link.
-    # function&lt;~to_s&gt;:: The onClick event in JavaScript.
-    #
-    # ==== Examples
-    #   link_to_function('Click me', &quot;alert('hi!')&quot;)
-    #     # =&gt; &lt;a href=&quot;#&quot; onclick=&quot;alert('hi!'); return false;&quot;&gt;Click me&lt;/a&gt;
-    #
-    #   link_to_function('Add to cart', &quot;item_total += 1; alert('Item added!');&quot;)
-    #     # =&gt; &lt;a href=&quot;#&quot; onclick=&quot;item_total += 1; alert('Item added!'); return false;&quot;&gt;Add to cart&lt;/a&gt;
-    def link_to_function(name, function)
-      %{&lt;a href=&quot;#&quot; onclick=&quot;#{function}; return false;&quot;&gt;#{name}&lt;/a&gt;}
-    end
-    
+
     # ==== Parameters
     # data&lt;Object&gt;::
     #   Object to translate into JSON. If the object does not respond to
@@ -123,7 +150,7 @@ module Merb
         data.inspect.to_json
       end
     end
-      
+
     # :section: External JavaScript and Stylesheets
     #
     # You can use require_js(:prototype) or require_css(:shinystyles)
@@ -144,12 +171,12 @@ module Merb
     #       &lt;%= catch_content :layout %&gt;
     #     &lt;/body&gt;
     #   &lt;/html&gt;
-    # 
+    #
     #   # File: app/views/whatever/_part1.herb
     #
     #   &lt;% require_js  'this' -%&gt;
     #   &lt;% require_css 'that', 'another_one' -%&gt;
-    # 
+    #
     #   # File: app/views/whatever/_part2.herb
     #
     #   &lt;% require_js 'this', 'something_else' -%&gt;
@@ -174,78 +201,78 @@ module Merb
     #   &lt;/html&gt;
     #
     # See each method's documentation for more information.
-    
+
     # :section: Bundling Asset Files
-    # 
+    #
     # The key to making a fast web application is to reduce both the amount of
     # data transfered and the number of client-server interactions. While having
     # many small, module Javascript or stylesheet files aids in the development
     # process, your web application will benefit from bundling those assets in
     # the production environment.
-    # 
+    #
     # An asset bundle is a set of asset files which are combined into a single
     # file. This reduces the number of requests required to render a page, and
     # can reduce the amount of data transfer required if you're using gzip
     # encoding.
-    # 
+    #
     # Asset bundling is always enabled in production mode, and can be optionally
     # enabled in all environments by setting the &lt;tt&gt;:bundle_assets&lt;/tt&gt; value
     # in &lt;tt&gt;config/merb.yml&lt;/tt&gt; to +true+.
-    # 
+    #
     # ==== Examples
-    # 
+    #
     # In the development environment, this:
-    # 
+    #
     #   js_include_tag :prototype, :lowpro, :bundle =&gt; true
-    # 
+    #
     # will produce two &lt;script&gt; elements. In the production mode, however, the
     # two files will be concatenated in the order given into a single file,
     # &lt;tt&gt;all.js&lt;/tt&gt;, in the &lt;tt&gt;public/javascripts&lt;/tt&gt; directory.
-    # 
+    #
     # To specify a different bundle name:
-    # 
+    #
     #   css_include_tag :typography, :whitespace, :bundle =&gt; :base
     #   css_include_tag :header, :footer, :bundle =&gt; &quot;content&quot;
     #   css_include_tag :lightbox, :images, :bundle =&gt; &quot;lb.css&quot;
-    # 
+    #
     # (&lt;tt&gt;base.css&lt;/tt&gt;, &lt;tt&gt;content.css&lt;/tt&gt;, and &lt;tt&gt;lb.css&lt;/tt&gt; will all be
     # created in the &lt;tt&gt;public/stylesheets&lt;/tt&gt; directory.)
-    # 
+    #
     # == Callbacks
-    # 
+    #
     # To use a Javascript or CSS compressor, like JSMin or YUI Compressor:
-    # 
+    #
     #   Merb::Assets::JavascriptAssetBundler.add_callback do |filename|
     #     system(&quot;/usr/local/bin/yui-compress #{filename}&quot;)
     #   end
-    #   
+    #
     #   Merb::Assets::StylesheetAssetBundler.add_callback do |filename|
     #     system(&quot;/usr/local/bin/css-min #{filename}&quot;)
     #   end
-    # 
+    #
     # These blocks will be run after a bundle is created.
-    # 
+    #
     # == Bundling Required Assets
-    # 
+    #
     # Combining the +require_css+ and +require_js+ helpers with bundling can be
     # problematic. You may want to separate out the common assets for your
     # application -- Javascript frameworks, common CSS, etc. -- and bundle those
     # in a &quot;base&quot; bundle. Then, for each section of your site, bundle the
     # required assets into a section-specific bundle.
-    # 
+    #
     # &lt;b&gt;N.B.: If you bundle an inconsistent set of assets with the same name,
     # you will have inconsistent results. Be thorough and test often.&lt;/b&gt;
-    # 
+    #
     # ==== Example
-    # 
+    #
     # In your application layout:
-    # 
+    #
     #   js_include_tag :prototype, :lowpro, :bundle =&gt; :base
-    # 
+    #
     # In your controller layout:
-    # 
+    #
     #   require_js :bundle =&gt; :posts
-    
+
     # The require_js method can be used to require any JavaScript file anywhere
     # in your templates. Regardless of how many times a single script is
     # included with require_js, Merb will only include it once in the header.
@@ -265,9 +292,17 @@ module Merb
     #
     def require_js(*js)
       @required_js ||= []
-      @required_js |= js
+      @required_js &lt;&lt; js
     end
     
+    # All javascript files to include, without duplicates.
+    #
+    # ==== Parameters
+    # options&lt;Hash&gt;:: Default options to pass to js_include_tag.
+    def required_js(options = {})
+      extract_required_files(@required_js, options)
+    end
+
     # The require_css method can be used to require any CSS file anywhere in
     # your templates. Regardless of how many times a single stylesheet is
     # included with require_css, Merb will only include it once in the header.
@@ -287,16 +322,28 @@ module Merb
     #
     def require_css(*css)
       @required_css ||= []
-      @required_css |= css
+      @required_css &lt;&lt; css
     end
     
+    # All css files to include, without duplicates.
+    #
+    # ==== Parameters
+    # options&lt;Hash&gt;:: Default options to pass to css_include_tag.
+    def required_css(options = {})
+      extract_required_files(@required_css, options)
+    end
+
     # A method used in the layout of an application to create +&lt;script&gt;+ tags
     # to include JavaScripts required in in templates and subtemplates using
     # require_js.
-    # 
+    #
     # ==== Parameters
     # options&lt;Hash&gt;:: Options to pass to js_include_tag.
-    # 
+    #
+    # ==== Options
+    # :bundle&lt;~to_s&gt;::
+    #   The name of the bundle the scripts should be combined into.
+    #
     # ==== Returns
     # String:: The JavaScript tag.
     #
@@ -314,37 +361,41 @@ module Merb
     #   #    &lt;script src=&quot;/javascripts/validation.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
     #
     def include_required_js(options = {})
-      return '' if @required_js.nil?
-      js_include_tag(*(@required_js + [options]))
+      required_js(options).map { |req_js| js_include_tag(*req_js) }.join
     end
-    
+
     # A method used in the layout of an application to create +&lt;link&gt;+ tags for
     # CSS stylesheets required in in templates and subtemplates using
     # require_css.
-    # 
+    #
     # ==== Parameters
     # options&lt;Hash&gt;:: Options to pass to css_include_tag.
-    # 
+    #
     # ==== Returns
     # String:: The CSS tag.
-    # 
+    #
+    # ==== Options
+    # :bundle&lt;~to_s&gt;::
+    #   The name of the bundle the stylesheets should be combined into.
+    # :media&lt;~to_s&gt;::
+    #   The media attribute for the generated link element. Defaults to :all.
+    #
     # ==== Examples
     #   # my_action.herb has a call to require_css 'style'
     #   # File: layout/application.html.erb
     #   include_required_css
     #   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
     #
-    #   # my_action.herb has a call to require_js 'style', 'ie-specific'
+    #   # my_action.herb has a call to require_css 'style', 'ie-specific'
     #   # File: layout/application.html.erb
     #   include_required_css
     #   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
     #   #    &lt;link href=&quot;/stylesheets/ie-specific.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot;/&gt;
     #
     def include_required_css(options = {})
-      return '' if @required_css.nil?
-      css_include_tag(*(@required_css + [options]))
+      required_css(options).map { |req_js| css_include_tag(*req_js) }.join
     end
-    
+
     # ==== Parameters
     # *scripts::
     #   The scripts to include. If the last element is a Hash, it will be used
@@ -376,7 +427,7 @@ module Merb
     def js_include_tag(*scripts)
       options = scripts.last.is_a?(Hash) ? scripts.pop : {}
       return nil if scripts.empty?
-      
+
       if (bundle_name = options[:bundle]) &amp;&amp; Merb::Assets.bundle? &amp;&amp; scripts.size &gt; 1
         bundler = Merb::Assets::JavascriptAssetBundler.new(bundle_name, *scripts)
         bundled_asset = bundler.bundle!
@@ -395,7 +446,7 @@ module Merb
 
       return tags
     end
-    
+
     # ==== Parameters
     # *stylesheets::
     #   The stylesheets to include. If the last element is a Hash, it will be
@@ -425,7 +476,7 @@ module Merb
     #   css_include_tag :style, :screen
     #   # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
     #   #    &lt;link href=&quot;/stylesheets/screen.css&quot; media=&quot;all&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
-    # 
+    #
     #  css_include_tag :style, :media =&gt; :print
     #  # =&gt; &lt;link href=&quot;/stylesheets/style.css&quot; media=&quot;print&quot; rel=&quot;Stylesheet&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;
     #
@@ -434,7 +485,7 @@ module Merb
     def css_include_tag(*stylesheets)
       options = stylesheets.last.is_a?(Hash) ? stylesheets.pop : {}
       return nil if stylesheets.empty?
-      
+
       if (bundle_name = options[:bundle]) &amp;&amp; Merb::Assets.bundle? &amp;&amp; stylesheets.size &gt; 1
         bundler = Merb::Assets::StylesheetAssetBundler.new(bundle_name, *stylesheets)
         bundled_asset = bundler.bundle!
@@ -456,7 +507,7 @@ module Merb
 
       return tags
     end
-    
+
     # ==== Parameters
     # *assets::
     #   The assets to include. These should be the full paths to any static served file
@@ -466,7 +517,7 @@ module Merb
     # String:: if only a single path is requested
     # ==== Examples
     #  uniq_path(&quot;/javascripts/my.js&quot;,&quot;/javascripts/my.css&quot;)
-    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets2.my-awesome-domain.com/javascripts/my.css&quot;]
+    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets1.my-awesome-domain.com/javascripts/my.css&quot;]
     #
     #  uniq_path([&quot;/javascripts/my.js&quot;,&quot;/stylesheets/my.css&quot;])
     #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;, &quot;http://assets1.my-awesome-domain.com/stylesheets/my.css&quot;]
@@ -479,14 +530,14 @@ module Merb
     #
     #  uniq_path('/images/hostsexypicture.jpg')
     #  #=&gt;&quot;http://assets1.my-awesome-domain.com/images/hostsexypicture.jpg&quot;
-    def uniq_path(*assets)      
+    def uniq_path(*assets)
       paths = []
       assets.collect.flatten.each do |filename|
-        paths.push(UniqueAssetPath.build(filename))
+        paths.push(Merb::Assets::UniqueAssetPath.build(filename))
       end
       paths.length &gt; 1 ? paths : paths.first
     end
-    
+
     # ==== Parameters
     # *assets::
     #   Creates unique paths for javascript files (prepends &quot;/javascripts&quot; and appends &quot;.js&quot;)
@@ -499,16 +550,16 @@ module Merb
     #  #=&gt; &quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;
     #
     #  uniq_js_path([&quot;admin/secrets&quot;,&quot;home/signup&quot;])
-    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/admin/secrets.js&quot;, 
+    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/javascripts/admin/secrets.js&quot;,
     #         &quot;http://assets1.my-awesome-domain.com/javascripts/home/signup.js&quot;]
     def uniq_js_path(*assets)
       paths = []
       assets.collect.flatten.each do |filename|
-        paths.push(UniqueAssetPath.build(asset_path(:javascript,filename,true)))
+        paths.push(Merb::Assets::UniqueAssetPath.build(asset_path(:javascript,filename)))
       end
       paths.length &gt; 1 ? paths : paths.first
     end
-    
+
     # ==== Parameters
     # *assets::
     #   Creates unique paths for stylesheet files (prepends &quot;/stylesheets&quot; and appends &quot;.css&quot;)
@@ -521,16 +572,16 @@ module Merb
     #  #=&gt; &quot;http://assets2.my-awesome-domain.com/stylesheets/my.css&quot;
     #
     #  uniq_css_path([&quot;admin/secrets&quot;,&quot;home/signup&quot;])
-    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/stylesheets/admin/secrets.css&quot;, 
+    #  #=&gt; [&quot;http://assets2.my-awesome-domain.com/stylesheets/admin/secrets.css&quot;,
     #         &quot;http://assets1.my-awesome-domain.com/stylesheets/home/signup.css&quot;]
     def uniq_css_path(*assets)
       paths = []
       assets.collect.flatten.each do |filename|
-        paths.push(UniqueAssetPath.build(asset_path(:stylesheet,filename,true)))
+        paths.push(Merb::Assets::UniqueAssetPath.build(asset_path(:stylesheet,filename)))
       end
       paths.length &gt; 1 ? paths : paths.first
     end
-    
+
     # ==== Parameters
     # *assets::
     #   As js_include_tag but has unique path
@@ -542,9 +593,9 @@ module Merb
     #  uniq_js_tag(&quot;my&quot;)
     #  #=&gt; &lt;script type=&quot;text/javascript&quot; src=&quot;http://assets2.my-awesome-domain.com/javascripts/my.js&quot;&gt;&lt;/script&gt;
     def uniq_js_tag(*assets)
-      js_include_tag(uniq_js_path(assets))
+      js_include_tag(*uniq_js_path(assets))
     end
-    
+
     # ==== Parameters
     # *assets::
     #   As uniq_css_tag but has unique path
@@ -556,7 +607,29 @@ module Merb
     #  uniq_css_tag(&quot;my&quot;)
     #  #=&gt; &lt;link href=&quot;http://assets2.my-awesome-domain.com/stylesheets/my.css&quot; type=&quot;text/css&quot; /&gt;
     def uniq_css_tag(*assets)
-      css_include_tag(uniq_css_path(assets))
+      css_include_tag(*uniq_css_path(assets))
     end
+    
+    private 
+    
+    # Helper method to filter out duplicate files.
+    #
+    # ==== Parameters
+    # options&lt;Hash&gt;:: Options to pass to include tag methods.
+    def extract_required_files(files, options = {})
+      return [] if files.nil? || files.empty?
+      seen = []
+      files.inject([]) do |extracted, req_js|
+        include_files, include_options = if req_js.last.is_a?(Hash)
+          [req_js[0..-2], options.merge(req_js.last)]
+        else
+          [req_js, options]
+        end
+        seen += (includes = include_files - seen)
+        extracted &lt;&lt; (includes + [include_options]) unless includes.empty?
+        extracted
+      end
+    end
+    
   end
 end</diff>
      <filename>merb-assets/lib/merb-assets/assets_mixin.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,13 @@
 $TESTING=true
-$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
\ No newline at end of file
+$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
+require &quot;rubygems&quot;
+require &quot;merb-core&quot;
+require &quot;merb-assets&quot;
+# require File.dirname(__FILE__) / &quot;controllers&quot; / &quot;action-args&quot;
+require &quot;spec&quot;
+
+Merb.start :environment =&gt; 'test'
+
+Spec::Runner.configure do |config|
+  config.include Merb::Test::RequestHelper  
+end
\ No newline at end of file</diff>
      <filename>merb-assets/spec/spec_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,18 @@
 require 'rubygems'
 require 'rake/gempackagetask'
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-builder&quot;
 NAME = &quot;merb-builder&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Jonathan Younger&quot;
 EMAIL = &quot;jonathan@daikini.com&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-builder/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb plugin that provides Builder support&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -20,10 +21,10 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
+  s.add_dependency('builder', '&gt;= 2.0.0')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
@@ -31,14 +32,14 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end</diff>
      <filename>merb-builder/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -9,8 +9,8 @@ module Merb::Template
     # name&lt;~to_s&gt;:: The name of the template method.
     # mod&lt;Class, Module&gt;::
     #   The class or module wherein this method should be defined.
-    def self.compile_template(path, name, mod)
-      path = File.expand_path(path)
+    def self.compile_template(io, name, mod)
+      path = File.expand_path(io.path)
       method = mod.is_a?(Module) ? :module_eval : :instance_eval
       mod.send(method, %{
         def #{name}
@@ -20,7 +20,7 @@ module Merb::Template
             c
           end
           xml = ::Builder::XmlMarkup.new(config)
-          self.instance_eval %{#{File.read(path)}}
+          self.instance_eval %{#{io.read}}
           xml.target!
         end
       })
@@ -28,7 +28,36 @@ module Merb::Template
       name    
     end
   
-    module Mixin; end
+    module Mixin
+      def _builder_buffer(the_binding)
+        @_buffer = eval(&quot;xml&quot;, the_binding, __FILE__, __LINE__)
+      end
+      # ==== Parameters
+      # *args:: Arguments to pass to the block.
+      # &amp;block:: The template block to call.
+      #
+      # ==== Returns
+      # String:: The output of the block.
+      #
+      # ==== Examples
+      # Capture being used in a .html.erb page:
+      # 
+      #   @foo = capture do
+      #     xml.instruct!
+      #     xml.foo do
+      #       xml.bar &quot;baz&quot;
+      #     end
+      #     xml.target!
+      #   end
+      def capture_builder(*args, &amp;block)
+        block.call(*args)
+      end
+
+      def concat_builder(string, binding)
+        _builder_buffer(binding) &lt;&lt; string
+      end
+      
+    end
     Merb::Template.register_extensions(self, %w[builder]) 
   end
 end</diff>
      <filename>merb-builder/lib/merb-builder/template.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,4 +33,24 @@ describe &quot;Builder&quot; do
     end
     c.body.should == xml.target!
   end
+  
+  it &quot;should capture_builder properly&quot; do
+    c = dispatch_to(CaptureBuilder, :index, :format =&gt; &quot;xml&quot;)
+    xml = ::Builder::XmlMarkup.new :indent =&gt; 4
+    xml.instruct!
+    xml.comment! &quot;I would not say such things if I were you&quot;
+    xml.node 'Capture'
+    
+    c.body.should == xml.target!
+  end
+  
+  it &quot;should concat_builder properly&quot; do
+    c = dispatch_to(ConcatBuilder, :index, :format =&gt; &quot;xml&quot;)
+    xml = ::Builder::XmlMarkup.new :indent =&gt; 4
+    xml.instruct!
+    xml.node 'Concat'
+    
+    c.body.should == xml.target!.chomp
+  end
+  
 end</diff>
      <filename>merb-builder/spec/builder_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,4 +20,13 @@ class PartialIvars &lt; BuilderController
 end
 
 class CaptureBuilder &lt; BuilderController
+end
+
+module Merb::ConcatBuilderHelper
+  def concatter(&amp;blk)
+    concat(&quot;&lt;node&gt;Concat&lt;/node&gt;&quot;, blk.binding)
+  end
+end
+
+class ConcatBuilder &lt; BuilderController
 end
\ No newline at end of file</diff>
      <filename>merb-builder/spec/controllers/builder.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,18 +2,19 @@ require 'rubygems'
 require &quot;rake/rdoctask&quot;
 require 'rake/gempackagetask'
 require &quot;spec/rake/spectask&quot;
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-cache&quot;
 NAME = &quot;merb-cache&quot;
-MERB_CACHE_VERSION = Merb::MORE_VERSION rescue &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Alex Boussinet&quot;
 EMAIL = &quot;alex.boussinet@gmail.com&quot;
 HOMEPAGE = &quot;http://www.merbivore.com&quot;
 SUMMARY = &quot;Merb plugin that provides caching (page, action, fragment, object)&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = MERB_CACHE_VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -22,10 +23,9 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 
   # rdoc
   s.has_rdoc         = true
@@ -64,14 +64,14 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{MERB_CACHE_VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end</diff>
      <filename>merb-cache/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 if defined?(Merb::Plugins)
   Merb::Plugins.add_rakefiles &quot;merb-cache/merbtasks&quot;
   unless 1.respond_to? :minutes
-    class Numeric #:nodoc:
+    class Numeric
       def minutes; self * 60; end
       def from_now(now = Time.now); now + self; end
     end</diff>
      <filename>merb-cache/lib/merb-cache.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,8 +16,8 @@ module Merb::Cache::ControllerClassMethods
   # ==== Examples
   #   cache_action :mostly_static
   #   cache_action :barely_dynamic, 10
-  def cache_action(action, from_now = nil)
-    cache_actions([action, from_now])
+  def cache_action(action, from_now = nil, opts = {})
+    cache_actions([action, from_now, opts])
   end
 
   # Register actions for action caching (before and after filters)
@@ -28,11 +28,14 @@ module Merb::Cache::ControllerClassMethods
   # ==== Example
   #   cache_actions :mostly_static, [:barely_dynamic, 10]
   def cache_actions(*actions)
-    if actions.any? &amp;&amp; Merb::Cache.cached_actions.empty?
-      before(:cache_action_before)
-      after(:cache_action_after)
-    end
-    actions.each do |action, from_now| 
+    actions.each do |action, from_now, opts|
+      from_now, opts = nil, from_now if Hash === from_now
+      
+      before(&quot;cache_#{action}_before&quot;, opts.merge(:only =&gt; action))
+      after(&quot;cache_#{action}_after&quot;, opts.merge(:only =&gt; action))
+      alias_method &quot;cache_#{action}_before&quot;, :cache_action_before
+      alias_method &quot;cache_#{action}_after&quot;, :cache_action_after
+      
       _actions = Merb::Cache.cached_actions[controller_name] ||= {}
       _actions[action] = from_now
     end</diff>
      <filename>merb-cache/lib/merb-cache/cache-action.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,11 +29,11 @@ module Merb::Cache::ControllerClassMethods
   # ==== Example
   #   cache_pages :mostly_static, [:barely_dynamic, 10]
   def cache_pages(*pages)
-    if pages.any? &amp;&amp; Merb::Cache.cached_pages.empty?
+    if pages.any? &amp;&amp; !Merb::Cache.cached_pages.key?(controller_name)
       before(:cache_page_before)
       after(:cache_page_after)
     end
-    pages.each do |action, from_now| 
+    pages.each do |action, from_now|
       _pages = Merb::Cache.cached_pages[controller_name] ||= {}
       _pages[action] = [from_now, 0]
     end
@@ -44,6 +44,8 @@ end
 module Merb::Cache::ControllerInstanceMethods
   # Mixed in Merb::Controller. Provides methods related to page caching
 
+  DEFAULT_PAGE_EXTENSION = 'html'
+
   # Checks whether a cache entry exists
   #
   # ==== Parameter
@@ -54,9 +56,11 @@ module Merb::Cache::ControllerInstanceMethods
   #
   # ==== Example
   #   cached_page?(:action =&gt; 'show', :params =&gt; [params[:page]])
+  #   cached_page?(:action =&gt; 'show', :extension =&gt; 'js')
   def cached_page?(options)
     key = Merb::Controller._cache.key_for(options, controller_name, true)
-    File.file?(Merb::Controller._cache.config[:cache_html_directory] / &quot;#{key}.html&quot;)
+    extension = options[:extension] || DEFAULT_PAGE_EXTENSION
+    File.file?(Merb::Controller._cache.config[:cache_html_directory] / &quot;#{key}.#{extension}&quot;)
   end
 
   # Expires the page identified by the key computed after the parameters
@@ -64,16 +68,26 @@ module Merb::Cache::ControllerInstanceMethods
   # ==== Parameter
   # options&lt;String,Hash&gt;:: The options that will be passed to #expire_key_for
   #
-  # ==== Examples
+  # ==== Examples (See Merb::Cache#expire_key_for for more options)
+  #   # will expire path/to/page/cache/news/show/1.html
+  #   expire_page(:key =&gt; url(:news,News.find(1)))
+  #
+  #   # will expire path/to/page/cache/news/show.html
   #   expire_page(:action =&gt; 'show', :controller =&gt; 'news')
+  #
+  #   # will expire path/to/page/cache/news/show*
   #   expire_page(:action =&gt; 'show', :match =&gt; true)
+  #
+  #   # will expire path/to/page/cache/news/show.js
+  #   expire_page(:action =&gt; 'show', :extension =&gt; 'js')
   def expire_page(options)
     config_dir = Merb::Controller._cache.config[:cache_html_directory]
     Merb::Controller._cache.expire_key_for(options, controller_name, true) do |key, match|
       if match
         files = Dir.glob(config_dir / &quot;#{key}*&quot;)
       else
-        files = config_dir / &quot;#{key}.html&quot;
+        extension = options[:extension] || DEFAULT_PAGE_EXTENSION
+        files = config_dir / &quot;#{key}.#{extension}&quot;
       end
       FileUtils.rm_rf(files)
     end
@@ -106,14 +120,19 @@ module Merb::Cache::ControllerInstanceMethods
   #   If request.path is &quot;/&quot;, the name will be &quot;/index.html&quot;
   #   If request.path is &quot;/news/show/1&quot;, the name will be &quot;/news/show/1.html&quot;
   #   If request.path is &quot;/news/show/&quot;, the name will be &quot;/news/show.html&quot;
+  #   If request.path is &quot;/news/styles.css&quot;, the name will be &quot;/news/styles.css&quot;
   def _cache_page(data = nil)
+    return if Merb::Controller._cache.config[:disable_page_caching]
     controller = controller_name
     action = action_name.to_sym
     pages = Merb::Controller._cache.cached_pages[controller]
     return unless pages &amp;&amp; pages.key?(action)
     path = request.path.chomp(&quot;/&quot;)
     path = &quot;index&quot; if path.empty?
-    cache_file = Merb::Controller._cache.config[:cache_html_directory] / &quot;#{path}.html&quot;
+    no_format = params[:format].nil? || params[:format].empty?
+    ext = &quot;.&quot; + (no_format ? DEFAULT_PAGE_EXTENSION : params[:format])
+    ext = nil if File.extname(path) == ext
+    cache_file = Merb::Controller._cache.config[:cache_html_directory] / &quot;#{path}#{ext}&quot;
     if data
       cache_directory = File.dirname(cache_file)
       FileUtils.mkdir_p(cache_directory)
@@ -126,7 +145,7 @@ module Merb::Cache::ControllerInstanceMethods
       if File.file?(cache_file)
         _data = cache_read_page(cache_file)
         _expire_in, _expire_at = pages[action]
-        if _expire_in.nil? || Time.now &lt; _expire_at
+        if _expire_in.nil? || Time.now.to_i &lt; _expire_at.to_i
           Merb.logger.info(&quot;cache: hit (#{path})&quot;)
           throw(:halt, _data)
         end</diff>
      <filename>merb-cache/lib/merb-cache/cache-page.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ class Merb::Cache::DatabaseStore
     prepare
   end
 
-  class OrmNotFound &lt; Exception #:nodoc:
+  class OrmNotFound &lt; Exception #
     def initialize
       super(&quot;No valid ORM found (did you specify use_orm in init.rb?)&quot;)
     end</diff>
      <filename>merb-cache/lib/merb-cache/cache-store/database.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+require 'fileutils'
 class Merb::Cache::FileStore
   # Provides the file cache store for merb-cache
 
@@ -8,7 +9,7 @@ class Merb::Cache::FileStore
     prepare
   end
 
-  class NotAccessible &lt; Exception #:nodoc:
+  class NotAccessible &lt; Exception #
     def initialize(message)
       super(&quot;Cache directories are not readable/writeable (#{message})&quot;)
     end
@@ -17,6 +18,7 @@ class Merb::Cache::FileStore
   # This method is there to ensure minimal requirements are met
   # (directories are accessible, table exists, connected to server, ...)
   def prepare
+    FileUtils.mkdir_p @config[:cache_directory]
     unless File.readable?(@config[:cache_directory]) &amp;&amp;
       File.writable?(@config[:cache_directory])
       raise NotAccessible, @config[:cache_directory]</diff>
      <filename>merb-cache/lib/merb-cache/cache-store/file.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,13 +6,13 @@ class Merb::Cache::MemcacheStore
     prepare
   end
 
-  class NotReady &lt; Exception #:nodoc:
+  class NotReady &lt; Exception
     def initialize
       super(&quot;Memcache server is not ready&quot;)
     end
   end
 
-  class NotDefined &lt; Exception #:nodoc:
+  class NotDefined &lt; Exception
     def initialize
       super(&quot;Memcache is not defined (require it in init.rb)&quot;)
     end</diff>
      <filename>merb-cache/lib/merb-cache/cache-store/memcache.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require &quot;merb-cache/cache-fragment&quot;
 class Merb::Cache
   attr_reader  :config, :store
 
-  class StoreNotFound &lt; Exception #:nodoc:
+  class StoreNotFound &lt; Exception
     def initialize(cache_store)
       super(&quot;cache_store (#{cache_store}) not found (not implemented?)&quot;)
     end
@@ -40,6 +40,7 @@ class Merb::Cache
   def start
     @config = DEFAULT_CONFIG.merge(Merb::Plugins.config[:merb_cache] || {})
     if @config[:disable] == true || Merb.environment == @config[:disable]
+      config[:disable_page_caching] = true
       config[:store] = &quot;dummy&quot;
     end
     @config[:cache_html_directory] ||= Merb.dir_for(:public) / &quot;cache&quot;
@@ -145,13 +146,13 @@ class Merb::Cache
   end
 end
 
-module Merb #:nodoc:
-  class Controller #:nodoc:
+module Merb
+  class Controller
     cattr_reader :_cache
     @@_cache = Merb::Cache.new
     # extends Merb::Controller with new instance methods
     include Merb::Cache::ControllerInstanceMethods
-    class &lt;&lt; self #:nodoc:
+    class &lt;&lt; self
       # extends Merb::Controller with new class methods
       include Merb::Cache::ControllerClassMethods
     end</diff>
      <filename>merb-cache/lib/merb-cache/merb-cache.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,6 +8,12 @@ class CacheController &lt; Merb::Controller
   cache_page :action5
   cache_page :action6, 0.05
   # or cache_pages :action5, [:action6, 0.05]
+  cache_page :action7
+
+  cache_action :action8, 0.05, :if =&gt; proc {|controller| !controller.params[:id].empty?}
+  cache_action :action9, 0.05, :unless =&gt; proc {|controller| controller.params[:id].empty?}
+  cache_action :action10, :if =&gt; :non_empty_id?
+  cache_action :action11, :unless =&gt; :empty_id?
 
   def action1
     render
@@ -33,6 +39,48 @@ class CacheController &lt; Merb::Controller
     Time.now.to_s
   end
 
+  def action7
+    provides :js, :css, :html, :xml, :jpg
+    case params[:format]
+    when &quot;css&quot;
+      &quot;CSS&quot;
+    when &quot;js&quot;
+      &quot;JS&quot;
+    when &quot;html&quot;
+      &quot;HTML&quot;
+    when &quot;xml&quot;
+      &quot;XML&quot;
+    when &quot;jpg&quot;
+      &quot;JPG&quot;
+    else
+      raise &quot;BAD FORMAT: #{params[:format].inspect}&quot;
+    end
+  end
+
+  def action8
+    &quot;test action8&quot;
+  end
+
+  def action9
+    &quot;test action9&quot;
+  end
+
+  def action10
+    &quot;test action10&quot;
+  end
+
+  def action11
+    &quot;test action11&quot;
+  end
+
+  def empty_id?
+    params[:id].empty?
+  end
+
+  def non_empty_id?
+    !empty_id?
+  end
+
   def index
     &quot;test index&quot;
   end</diff>
      <filename>merb-cache/spec/controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -103,4 +103,35 @@ describe &quot;merb-cache-action&quot; do
     CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action4/id1/id2&quot;).should be_false
   end
 
+  it &quot;should allow :if conditions with procs&quot; do
+    c = get(&quot;/cache_controller/action8&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action8&quot;).should be_false
+
+    c = get(&quot;/cache_controller/action8/cache&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action8/cache&quot;).should be_true
+  end
+
+  it &quot;should allow :unless conditions with procs&quot; do
+    c = get(&quot;/cache_controller/action9&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action9&quot;).should be_false
+
+    c = get(&quot;/cache_controller/action9/cache&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action9/cache&quot;).should be_true
+  end
+
+  it &quot;should allow :if conditions with symbols&quot; do
+    c = get(&quot;/cache_controller/action10&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action10&quot;).should be_false
+
+    c = get(&quot;/cache_controller/action10/cache&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action10/cache&quot;).should be_true
+  end
+
+  it &quot;should allow :unless conditions with symbols&quot; do
+    c = get(&quot;/cache_controller/action11&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action11&quot;).should be_false
+
+    c = get(&quot;/cache_controller/action11/cache&quot;)
+    CACHE.cached_action?(:key =&gt; &quot;/cache_controller/action11/cache&quot;).should be_true
+  end
 end</diff>
      <filename>merb-cache/spec/merb-cache-action_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -109,6 +109,38 @@ describe &quot;merb-cache-page&quot; do
     CACHE.cached_page?(:key =&gt; &quot;/cache_controller/action6/id1/id2&quot;).should be_false
   end
 
+  it &quot;should respect original content-type&quot; do
+    c = get(&quot;/cache_controller/action7.css&quot;)
+    c.body.should == &quot;CSS&quot;
+    c = get(&quot;/cache_controller/action7.css&quot;)
+    c.params[:format].should == &quot;css&quot;
+    c.cached_page?(:action =&gt; &quot;action7&quot;, :extension =&gt; 'css').should be_true
+
+    c = get(&quot;/cache_controller/action7.js&quot;)
+    c.body.should == &quot;JS&quot;
+    c = get(&quot;/cache_controller/action7.js&quot;)
+    c.params[:format].should == &quot;js&quot;
+    c.cached_page?(:action =&gt; &quot;action7&quot;, :extension =&gt; 'js').should be_true
+
+    c = get(&quot;/cache_controller/action7.xml&quot;)
+    c.body.should == &quot;XML&quot;
+    c = get(&quot;/cache_controller/action7.xml&quot;)
+    c.params[:format].should == &quot;xml&quot;
+    c.cached_page?(:action =&gt; &quot;action7&quot;, :extension =&gt; 'xml').should be_true
+
+    c = get(&quot;/cache_controller/action7.jpg&quot;)
+    c.body.should == &quot;JPG&quot;
+    c = get(&quot;/cache_controller/action7.jpg&quot;)
+    c.params[:format].should == &quot;jpg&quot;
+    c.cached_page?(:action =&gt; &quot;action7&quot;, :extension =&gt; 'jpg').should be_true
+
+    c = get(&quot;/cache_controller/action7.html&quot;)
+    c.body.should == &quot;HTML&quot;
+    c = get(&quot;/cache_controller/action7.html&quot;)
+    c.params[:format].should == &quot;html&quot;
+    c.cached_page?(:action =&gt; &quot;action7&quot;).should be_true
+  end
+
   it &quot;should expire all pages&quot; do
     CACHE.expire_all_pages
     CACHE.cached_page?(&quot;action6&quot;).should be_false</diff>
      <filename>merb-cache/spec/merb-cache-page_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,21 @@
 ==== merb-gen
 
-merb-gen is a part of the Merb More package. It provides application and plugin generators for Merb.
+merb-gen is a part of the Merb More package. It provides application, plugin, and component
+generators for Merb.
 
 ==== Usage
 
-To generate a new merb app, run merb-gen &amp;lt;path&amp;gt;. For instance, &lt;tt&gt;merb-gen foo&lt;/tt&gt; would create
-a new merb app inside of the foo directory.
+To generate directory structure for a new merb app, run merb-gen app &amp;lt;app-name&amp;gt;.
+For instance, &lt;tt&gt;merb-gen app foo&lt;/tt&gt; would create a new foo merb app inside of the foo directory.
 
-To generate a new merb plugin, run merb-gen plugin &amp;lt;path&amp;gt;.
+Use &lt;tt&gt;--flat&lt;/tt&gt; to generate a flattened application (very simple directory structure)
+and &lt;tt&gt;--very-flat&lt;/tt&gt; to generate a single file application.
+
+To generate a new merb plugin, run merb-gen plugin &amp;lt;plugin_name&amp;gt;.
+
+To see what generators are available, run merb-gen generators.
+
+==== Custom generators
+
+If you want to create your custom generators to use with Merb, and don't want to create a gem,
+you should put them in ~/.rubigen/merb_generators/.
\ No newline at end of file</diff>
      <filename>merb-gen/README</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,16 @@
 require 'rubygems'
 require 'rake/gempackagetask'
 
-GEM = &quot;merb-gen&quot;
-VERSION = &quot;0.9.2&quot;
-AUTHOR = &quot;Yehuda Katz&quot;
-EMAIL = &quot;wycats@gmail.com&quot;
+NAME = &quot;merb-gen&quot;
+VERSION = &quot;0.9.4&quot;
+AUTHOR = &quot;Jonas Nicklas&quot;
+EMAIL = &quot;jonas.nicklas@gmail.com&quot;
 HOMEPAGE = &quot;http://www.merbivore.com&quot;
 SUMMARY = &quot;Merb More: Merb's Application and Plugin Generators&quot;
 
 spec = Gem::Specification.new do |s|
-  s.name = GEM
+  s.rubyforge_project = 'merb'
+  s.name = NAME
   s.version = VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
@@ -21,27 +22,28 @@ spec = Gem::Specification.new do |s|
   s.homepage = HOMEPAGE
   s.bindir = &quot;bin&quot;
   s.executables = %w( merb-gen )
-    
+
   # Uncomment this to add a dependency
-  s.add_dependency &quot;merb-core&quot;, &quot;&gt;= 0.9.2&quot;
-  s.add_dependency &quot;rubigen&quot;, &quot;&gt;= 1.2.4&quot;
-  
+  #s.add_dependency &quot;merb-core&quot;, &quot;&gt;= 0.9.4&quot;
+  #s.add_dependency &quot;templater&quot;, &quot;&gt;= 0.1&quot;
+
   s.require_path = 'lib'
-  s.autorequire = GEM
-  s.files = %w(LICENSE README Rakefile TODO) + 
-          Dir.glob(&quot;{lib,bin,spec,app_generators,merb_default_generators,merb_generators,rspec_generators,test_unit_generators}/**/*&quot;)
+  s.autorequire = NAME
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,bin,spec,templates}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
   pkg.gem_spec = spec
 end
 
+task :install =&gt; [:package] do
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
+end
+
 namespace :jruby do
   task :install do
-    sh %{sudo jruby -S gem install pkg/#{GEM}-#{VERSION} --no-update-sources}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
 end
 
-task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{GEM}-#{VERSION} --no-update-sources}
-end
+</diff>
      <filename>merb-gen/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,13 @@
-TODO:
-Fix LICENSE with your name
-Fix Rakefile with your name and contact info
-Add your code to lib/&lt;%= name %&gt;.rb
\ No newline at end of file
+Merb-gen is now ported to templater, instead of rubigen. Some things are left to do, including:
+
+* Integrate with Merb::Config[:framework], so that stuff gets placed in the correct directories
+* Allow some system for plugins to add their own generators.
+* Move ORM specific templates/code into respective plugin (this requires a change in templater so that absolute paths can be specified for templates)
+* Move test_unit stuff into merb-test-unit
+* Move part controller generator into merb-parts
+* Automatically infer ORM and testing framework (this should be easy, really)
+* Add migration generators
+* Add generators for session migrations
+* Change ActiveRecord migrations to use new datestamp format
+
+* Fix remaining stuff in templater (see separate TODO)
\ No newline at end of file</diff>
      <filename>merb-gen/TODO</filename>
    </modified>
    <modified>
      <diff>@@ -1,103 +1,12 @@
 #!/usr/bin/env ruby
 
-at_exit { exit }
+require 'rubygems'
+require 'merb-core'
+require 'merb-gen'
 
-command = ARGV.shift if %w(generate destroy update).include?(ARGV[0])
-
-%w(rubygems merb-core).each do |file|
-  require file
-end
+application = false # TODO: figure out a way to infer this
 
 # start merb
 Merb.start :environment =&gt; 'development', :log_level =&gt; 'error'
 
-# remove dependency
-module Kernel
-  undef dependency if defined?(Kernel.dependency)
-end
-
-%w(rubigen rubigen/scripts/generate rubigen/scripts/destroy 
-    rubigen/scripts/update fileutils find merb-gen).each do |file|
-  require file
-end
-
-app_help = &lt;&lt;-EOF
-  Application Generators:
-  To generate an application use one of the following
-  merb-gen app app_name             (for a standard application)
-  merb-gen app app_name --flat      (for a flattened application)
-  merb-gen app app_name --very-flat (for a single file application)
-  merb-gen frozen-merb          (script to run from frozen gems/framework)
-  merb-gen plugin plugin_name   (creates a plugin gem skeleton)
-
-  Other Generators:
-  merb-gen generators
-  with no args will display all availble generators for the current configuration.
-EOF
-
-# merb-gen || merb-gen help || merb-gen help app || merb-gen app
-if ARGV.empty? || (ARGV[0] == &quot;help&quot; &amp;&amp; ARGV.length == 1) || 
-  (ARGV[0] == &quot;help&quot; &amp;&amp; ARGV[1] == &quot;app&quot;) || (ARGV[0] == &quot;app&quot; &amp;&amp; ARGV.length == 1)
-  puts app_help
-  
-# merb-gen generators
-elsif ARGV[0] == &quot;generators&quot;
-  # List all the Available Generators
-  RubiGen::Base.use_component_sources! Merb.generator_scope
-  RubiGen::Scripts::Generate.new.run([])
- 
-# merb-gen help foo
-elsif ARGV[0] &amp;&amp; ARGV[0] == &quot;help&quot;
-  begin
-    RubiGen::Base.use_component_sources! Merb.generator_scope
-    RubiGen::Base.lookup(ARGV[1])
-    Merb::ComponentGenerator.run ARGV[1], ARGV[2..-1], ARGV[1], command || &quot;generate&quot;
-  rescue RubiGen::GeneratorError
-    # List all the Available Generators
-    RubiGen::Base.use_component_sources! Merb.generator_scope
-    RubiGen::Scripts::Generate.new.run([]) 
-  rescue =&gt; e
-    puts e.message
-  end
-
-# merb-gen app myapp
-elsif ARGV[0] &amp;&amp; ARGV[0] == &quot;app&quot; &amp;&amp; ARGV[1] &amp;&amp; ARGV[1] !~ /^-/
-  app_type = case ARGV[2]
-  when &quot;--flat&quot;
-    &quot;merb_flat&quot;
-  when &quot;--very-flat&quot;
-    &quot;merb_very_flat&quot;
-  else
-    &quot;merb&quot;
-  end
-  Merb::ApplicationGenerator.run ARGV[1], ARGV[3..-1], app_type, command || &quot;generate&quot;
-      
-# merb-gen plugin foo
-elsif ARGV[0] &amp;&amp; ARGV[0] == &quot;plugin&quot;
-  Merb::ApplicationGenerator.run ARGV[1], ARGV[2..-1], &quot;merb_plugin&quot;, command || &quot;generate&quot;
-
-# merb-gen frozen-merb
-elsif ARGV[0] &amp;&amp; ARGV[0] == &quot;frozen-merb&quot;
-  Merb::ComponentGenerator.run &quot;frozen-merb&quot;, [&quot;frozen-merb&quot;], &quot;freezer&quot;, command || &quot;generate&quot;
-
-# merb-gen controller foo
-# merb-gen resource foo --test
-elsif ARGV[1] &amp;&amp; ARGV[1] !~ /^-/
-  Merb::ComponentGenerator.run ARGV[1], ARGV[1..-1], ARGV.first, command || &quot;generate&quot;
-
-# catch all merb-gen -??? and display help instead of creating application in -???
-elsif ARGV[0] &amp;&amp; ARGV[0] =~ /^-/
-  puts app_help
-
-else
-  begin
-    # May be a generator that takes no arguments.
-    RubiGen::Base.use_component_sources! Merb.generator_scope
-    RubiGen::Base.lookup(ARGV[0])
-    Merb::ComponentGenerator.run ARGV[0], ARGV[1..-1], ARGV.first, command || &quot;generate&quot;
-  rescue RubiGen::GeneratorError
-    puts app_help
-  rescue =&gt; e
-    puts e.message
-  end  
-end
+Merb::Generators.run_cli(Dir.pwd, 'merb-gen', Merb::VERSION, ARGV)
\ No newline at end of file</diff>
      <filename>merb-gen/bin/merb-gen</filename>
    </modified>
    <modified>
      <diff>@@ -1,38 +1,16 @@
-require 'rubigen'
-module Merb
-  require File.join(File.dirname(__FILE__), &quot;merb-gen&quot;, &quot;base&quot;)
-  
-  class ApplicationGenerator
-    def self.run(path, argv, generator, command)
-      if command == &quot;destroy&quot;
-        puts &quot;destroying app&quot;
-        FileUtils.rm_rf(File.expand_path(path))
-        puts &quot;done&quot;
-        exit
-      end
-      
-      source = RubiGen::PathSource.new(:application, 
-        File.join(File.dirname(__FILE__), &quot;..&quot;, &quot;app_generators&quot;))
-      RubiGen::Base.reset_sources
-      RubiGen::Base.append_sources source
-      puts RubiGen::Scripts.const_get(command.capitalize).inspect
-      RubiGen::Scripts.const_get(command.capitalize).new.run([File.expand_path(path), *argv], :generator =&gt; generator, :backtrace =&gt; true)
-    end
-  end
-  
-  class ComponentGenerator
-    def self.run(name, argv, generator, command)
-      app_root = Dir.pwd
-      
-      # Merb.start :environment =&gt; 'development'
-      
-      Gem.clear_paths
-      Gem.path.unshift(app_root / &quot;gems&quot;)
-      
-      require &quot;rubigen/scripts/#{command}&quot;
-      
-      RubiGen::Base.use_component_sources! Merb.generator_scope
-      RubiGen::Scripts.const_get(command.capitalize).new.run(argv, :generator =&gt; generator, :destination =&gt; app_root)
-    end
-  end
-end
\ No newline at end of file
+require 'rubygems'
+require 'templater'
+require 'sha1'
+
+path = File.join(File.dirname(__FILE__), &quot;merb-gen&quot;)
+
+require path / &quot;generator&quot;
+require path / &quot;merb&quot;
+require path / &quot;merb_flat&quot;
+require path / &quot;merb_very_flat&quot;
+require path / &quot;controller&quot;
+require path / &quot;part_controller&quot;
+require path / &quot;migration&quot;
+require path / &quot;model&quot;
+require path / &quot;resource_controller&quot;
+require path / &quot;resource&quot;
\ No newline at end of file</diff>
      <filename>merb-gen/lib/merb-gen.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,18 @@
 require 'rubygems'
 require 'rake/gempackagetask'
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-haml&quot;
 NAME = &quot;merb-haml&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Yehuda Katz&quot;
 EMAIL = &quot;ykatz@engineyard.com&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-haml/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb plugin that provides HAML support&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -20,10 +21,10 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
+  s.add_dependency('haml', '&gt;= 1.8.2')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
@@ -31,14 +32,14 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end</diff>
      <filename>merb-haml/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -9,13 +9,13 @@ module Merb::Template
     # name&lt;~to_s&gt;:: The name of the template method.
     # mod&lt;Class, Module&gt;::
     #   The class or module wherein this method should be defined.
-    def self.compile_template(path, name, mod)
-      path = File.expand_path(path)
-      config = (Merb::Config[:haml] || {}).inject({}) do |c, (k, v)|
+    def self.compile_template(io, name, mod)
+      path = File.expand_path(io.path)
+      config = (Merb::Plugins.config[:haml] || {}).inject({}) do |c, (k, v)|
         c[k.to_sym] = v
         c
       end.merge :filename =&gt; path
-      template = ::Haml::Engine.new(File.read(path), config)
+      template = ::Haml::Engine.new(io.read, config)
       template.def_method(mod, name)
       name
     end</diff>
      <filename>merb-haml/lib/merb-haml/template.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@ describe &quot;HAML&quot; do
     c.body.should == ::Haml::Engine.new(&quot;#foo\n  %p Partial&quot;).render
   end
 
-  it &quot;should use the haml configuration in Merb::Config&quot; do
+  it &quot;should use the haml configuration in Merb::Plugins.config&quot; do
     c = dispatch_to(HamlConfig, :index)
     c.body.should == ::Haml::Engine.new(&quot;#foo\n  %foo&quot;, :autoclose =&gt; [&quot;foo&quot;]).render
   end</diff>
      <filename>merb-haml/spec/haml_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,18 +1,19 @@
 require 'rubygems'
 require 'rake/gempackagetask'
 require &quot;spec/rake/spectask&quot;
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-mailer&quot;
 NAME = &quot;merb-mailer&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Yehuda Katz&quot;
 EMAIL = &quot;wycats@gmail.com&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-mailer/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb plugin that provides mailer functionality to Merb&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -21,11 +22,10 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
   s.add_dependency(&quot;mailfactory&quot;, &quot;&gt;= 1.2.3&quot;)
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
@@ -33,16 +33,16 @@ Rake::GemPackageTask.new(spec) do |pkg|
 end
 
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end
 
 desc &quot;Run all specs&quot;</diff>
      <filename>merb-mailer/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,5 @@
 require &quot;merb-mailer/mailer&quot;
 require &quot;merb-mailer/mail_controller&quot;
-require &quot;merb-mailer/merb_controller&quot;
+require &quot;merb-mailer/mailer_mixin&quot;
+
+Merb::Controller.send(:include, Merb::MailerMixin)</diff>
      <filename>merb-mailer/lib/merb-mailer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -71,6 +71,13 @@ module Merb
     attr_accessor :params, :mailer, :mail
     attr_reader   :session, :base_controller
 
+    cattr_accessor :_subclasses
+    self._subclasses = Set.new
+
+    # ==== Returns
+    # Array[Class]:: Classes that inherit from Merb::MailController.
+    def self.subclasses_list() _subclasses end
+
     # ==== Parameters
     # action&lt;~to_s&gt;:: The name of the action that will be rendered.
     # type&lt;~to_s&gt;::
@@ -84,6 +91,23 @@ module Merb
     def _template_location(action, type = nil, controller = controller_name)
       &quot;#{controller}/#{action}.#{type}&quot;
     end
+    
+    # The location to look for a template and mime-type. This is overridden 
+    # from AbstractController, which defines a version of this that does not 
+    # involve mime-types.
+    #
+    # ==== Parameters
+    # template&lt;String&gt;:: 
+    #    The absolute path to a template - without mime and template extension.
+    #    The mime-type extension is optional - it will be appended from the 
+    #    current content type if it hasn't been added already.
+    # type&lt;~to_s&gt;::
+    #    The mime-type of the template that will be rendered. Defaults to nil.
+    #
+    # @public
+    def _absolute_template_location(template, type)
+      template.match(/\.#{type.to_s.escape_regexp}$/) ? template : &quot;#{template}.#{type}&quot;
+    end
 
     # ==== Parameters
     # params&lt;Hash&gt;:: Configuration parameters for the MailController.
@@ -102,7 +126,7 @@ module Merb
     #   The Merb::MailController inheriting from the base class.  
     def self.inherited(klass)
       super
-      klass.class_eval %{self._template_root = Merb.dir_for(:mailer) / &quot;views&quot;}
+      klass._template_root = Merb.dir_for(:mailer) / &quot;views&quot; unless self._template_root
     end
 
     # Override filters halted to return nothing.
@@ -222,6 +246,13 @@ module Merb
       @mail
     end
 
+    # Mimic the behavior of absolute_url in AbstractController
+    # but use @base_controller.request
+    def absolute_url(name, rparams={})
+      req = @base_controller.request
+      uri =  req.protocol + req.host + url(name, rparams)
+    end
+
     # Attaches a file or multiple files to an email. You call this from a
     # method in your MailController (including a before filter).
     # 
@@ -325,4 +356,4 @@ module Merb
 
 
   end
-end
\ No newline at end of file
+end</diff>
      <filename>merb-mailer/lib/merb-mailer/mail_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -34,7 +34,7 @@ describe &quot;a merb mailer&quot; do
     delivery = TestMailer.deliveries.last
     delivery.to.should include(&quot;test@test.com&quot;)
     delivery.from.should include(&quot;foo@bar.com&quot;)
-    delivery.subject.should include(&quot;Test Subject&quot;)
+    delivery.subject.should include(&quot;=?utf-8?Q?Test_Subject=?=&quot;)
     delivery.body.should include(&quot;Test&quot;)
   end
   </diff>
      <filename>merb-mailer/spec/mailer_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,18 +1,19 @@
 require 'rubygems'
 require 'rake/gempackagetask'
 require &quot;spec/rake/spectask&quot;
+require 'merb-core/tasks/merb_rake_helper'
 
-PLUGIN = &quot;merb-parts&quot;
 NAME = &quot;merb-parts&quot;
-VERSION = &quot;0.9.2&quot;
+GEM_VERSION = Merb::MORE_VERSION rescue &quot;0.9.4&quot;
 AUTHOR = &quot;Hassox&quot;
 EMAIL = &quot;&quot;
-HOMEPAGE = &quot;http://merb-plugins.rubyforge.org/merb-parts/&quot;
+HOMEPAGE = &quot;http://merbivore.com/&quot;
 SUMMARY = &quot;Merb More: Merb plugin that provides Part Controllers.&quot;
 
 spec = Gem::Specification.new do |s|
+  s.rubyforge_project = 'merb'
   s.name = NAME
-  s.version = VERSION
+  s.version = GEM_VERSION
   s.platform = Gem::Platform::RUBY
   s.has_rdoc = true
   s.extra_rdoc_files = [&quot;README&quot;, &quot;LICENSE&quot;, 'TODO']
@@ -21,27 +22,27 @@ spec = Gem::Specification.new do |s|
   s.author = AUTHOR
   s.email = EMAIL
   s.homepage = HOMEPAGE
-  s.add_dependency('merb-core', '&gt;= 0.9.2')
+  s.add_dependency('merb-core', '&gt;= 0.9.4')
   s.require_path = 'lib'
-  s.autorequire = PLUGIN
-  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,specs}/**/*&quot;)
+  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob(&quot;{lib,spec}/**/*&quot;)
 end
 
 Rake::GemPackageTask.new(spec) do |pkg|
   pkg.gem_spec = spec
 end
 
+
 task :install =&gt; [:package] do
-  sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
+  sh %{#{sudo} gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION} --no-update-sources}
 end
 
 namespace :jruby do
 
   desc &quot;Run :package and install the resulting .gem with jruby&quot;
   task :install =&gt; :package do
-    sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
+    sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
   end
-  
+
 end
 
 desc &quot;Run all specs&quot;</diff>
      <filename>merb-parts/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,44 +1,4 @@
-require File.join(File.dirname(__FILE__), 'merb-parts','part_controller')
+require File.join(File.dirname(__FILE__), &quot;merb-parts&quot;, &quot;part_controller&quot;)
+require File.join(File.dirname(__FILE__), &quot;merb-parts&quot;, &quot;mixins&quot;, &quot;parts_mixin&quot;)
 
-module Merb
-  class Controller
-    # Dispatches a PartController.
-    # ==== Parameters
-    # opts&lt;Hash&gt;:: A Hash of Options. (see below)
-    #
-    # ==== Options
-    # An option hash has two parts.
-    # 1. keys that are Merb::PartControllers with values that are action names (as symbols)
-    # 2. key value pairs that will become available in the PartController as params merged
-    #    with the web controllers params
-    #
-    # ==== Example
-    #  Calling a part controller
-    #  {{{
-    #    part TodoPart =&gt; :list
-    #   }}}
-    #
-    #  Calling a part with additional options
-    #  {{{
-    #    part TodoPart =&gt; :list, :limit =&gt; 20, :user =&gt; current_user 
-    #  }}}
-    #
-    # ==== Returns
-    #   Returns the result of the PartControllers action, which is a string.
-    def part(opts = {})
-      # Extract any params out that may have been specified
-      klasses, opts = opts.partition do |k,v| 
-        k.respond_to?(:ancestors) &amp;&amp; k.ancestors.include?(Merb::PartController)
-      end       
-        
-      opts = Hash[*(opts.flatten)]
-      
-      res = klasses.inject([]) do |memo,(klass,action)|
-        memo &lt;&lt; klass.new(self, opts)._dispatch(action)
-      end
-      res.size == 1 ? res[0] : res
-    end
-    
-    
-  end
-end
\ No newline at end of file
+Merb::Controller.send(:include, Merb::PartsMixin)
\ No newline at end of file</diff>
      <filename>merb-parts/lib/merb-parts.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 # Includes files into the class to allow it to minimally delegates to a web controller
-module Merb #:nodoc:
+module Merb
   module Mixins
     module WebController
       </diff>
      <filename>merb-parts/lib/merb-parts/mixins/web_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,21 +1,21 @@
 require File.join(File.dirname(__FILE__), &quot;mixins&quot;, &quot;web_controller&quot;)
 module Merb
-  
+
   # A Merb::PartController is a light weight way to share logic and templates
-  # amongst controllers.  
-  # Merb::PartControllers work just like Merb::controller.  
+  # amongst controllers.
+  # Merb::PartControllers work just like Merb::controller.
   # There is a filter stack, layouts (if needed) all the render functions,
-  # and url generation.  
+  # and url generation.
   #
-  # Cookies, params, and even the request object are shared with the web controller  
+  # Cookies, params, and even the request object are shared with the web controller
   class PartController &lt; AbstractController
     include Merb::Mixins::WebController
-    
+
     attr_reader :params
 
     cattr_accessor :_subclasses
     self._subclasses = Set.new
-    
+
     # ==== Returns
     # Array[Class]:: Classes that inherit from Merb::PartController.
     def self.subclasses_list() _subclasses end
@@ -23,26 +23,43 @@ module Merb
     # ==== Parameters
     # action&lt;~to_s&gt;:: The name of the action that will be rendered.
     # type&lt;~to_s&gt;::
-    #    The mime-type of the template that will be rendered. Defaults to nil.
+    #    The mime-type of the template that will be rendered. Defaults to html.
     # controller&lt;~to_s&gt;::
     #   The name of the controller that will be rendered. Defaults to
     #   controller_name.
     #
     # ==== Returns
     # String:: The template location, i.e. &quot;:controller/:action.:type&quot;.
-    def _template_location(action, type = nil, controller = controller_name)
+    def _template_location(action, type = :html, controller = controller_name)
       &quot;#{controller}/#{action}.#{type}&quot;
     end
+    
+    # The location to look for a template and mime-type. This is overridden 
+    # from AbstractController, which defines a version of this that does not 
+    # involve mime-types.
+    #
+    # ==== Parameters
+    # template&lt;String&gt;:: 
+    #    The absolute path to a template - without mime and template extension.
+    #    The mime-type extension is optional - it will be appended from the 
+    #    current content type if it hasn't been added already.
+    # type&lt;~to_s&gt;::
+    #    The mime-type of the template that will be rendered. Defaults to nil.
+    #
+    # @public
+    def _absolute_template_location(template, type)
+      template.match(/\.#{type.to_s.escape_regexp}$/) ? template : &quot;#{template}.#{type}&quot;
+    end
 
     # Sets the template root to the default parts view directory.
     #
     # ==== Parameters
     # klass&lt;Class&gt;::
-    #   The Merb::PartController inheriting from the base class.  
+    #   The Merb::PartController inheriting from the base class.
     def self.inherited(klass)
       _subclasses &lt;&lt; klass.to_s
       super
-      klass.class_eval %{self._template_root = Merb.dir_for(:part) / &quot;views&quot;}
+      klass._template_root = Merb.dir_for(:part) / &quot;views&quot; unless self._template_root
     end
 
     # ==== Parameters
@@ -50,7 +67,7 @@ module Merb
     # opts&lt;Hash&gt;:: Additional options for this part.
     def initialize(web_controller, opts = {})
       @web_controller = web_controller
-      @params = @web_controller.params
+      @params = @web_controller.params.dup
       @params.merge!(opts) unless opts.empty?
       super
       @content_type = @web_controller.content_type
@@ -65,11 +82,13 @@ module Merb
       self.action_name = action
       super(action)
       @body
-    end    
-    
+    end
+
     # Send any methods that are missing back up to the web controller
+    # Patched to set partial locals on the web controller
     def method_missing(sym, *args, &amp;blk)
+      @web_controller.instance_variable_set(:@_merb_partial_locals, @_merb_partial_locals)
       @web_controller.send(sym, *args, &amp;blk)
-    end    
+    end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>merb-parts/lib/merb-parts/part_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,4 +26,8 @@ class Main &lt; Merb::Controller
     render
   end
   
+  def parth_with_absolute_template
+    part(TodoPart =&gt; :parth_with_absolute_template)
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-parts/spec/fixtures/controllers/main.rb</filename>
    </modified>
    <modified>
      <diff>@@ -23,4 +23,8 @@ class TodoPart &lt; Merb::PartController
     render
   end
   
+  def parth_with_absolute_template
+    render :template =&gt; File.expand_path(self._template_root) / 'todo_part' / 'formatted_output'
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-parts/spec/fixtures/parts/todo_part.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,7 @@ describe &quot;A Merb PartController&quot; do
   
   it &quot;should render the html format by default to the controller that set it&quot; do
     controller = dispatch_to(Main, :index4)
-    controller.body.should match(/part_html_format/m) 
+    controller.body.should match(/part_html_format/m)
   end
   
   it &quot;should render the xml format according to the controller&quot; do
@@ -52,6 +52,10 @@ describe &quot;A Merb PartController&quot; do
     controller.body.should match( /Do this/)
   end
   
+  it &quot;should render a template from an absolute path&quot; do
+    controller = dispatch_to(Main, :parth_with_absolute_template)
+    controller.body.should match(/part_html_format/m)
+  end
   
 end  
 
@@ -68,4 +72,13 @@ describe &quot;A Merb Part Controller with urls&quot; do
     the_url.should == &quot;/main/bar&quot;
   end
 
+end
+
+describe &quot;A Merb Part Controller inheriting from another Part Controller&quot; do
+  
+  it &quot;should inherit the _template_root&quot; do
+    TodoPart._template_root.should == File.expand_path(File.dirname(__FILE__) / 'fixtures' / 'parts' / 'views')
+    TodoPart._template_root.should == DonePart._template_root
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-parts/spec/merb-parts_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>merb-gen/app_generators/merb/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/merb_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/Rakefile</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/controllers/application.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/controllers/exceptions.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/helpers/global_helpers.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/views/exceptions/not_found.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/app/views/layout/application.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/autotest/discover.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/autotest/merb.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/autotest/merb_rspec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/environments/development.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/environments/production.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/environments/rake.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/environments/test.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/init.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/rack.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/config/router.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/.DS_Store</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/.htaccess</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/images/.DS_Store</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/images/merb.jpg</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/merb.fcgi</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/public/stylesheets/master.css</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/spec/spec.opts</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/spec/spec_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb/templates/test/test_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/merb_flat_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/templates/README.txt</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/templates/application.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/templates/config/framework.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/templates/config/init.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_flat/templates/views/foo.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/merb_plugin_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/LICENSE</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/README</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/Rakefile</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/TODO</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/lib/%base_name%.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/lib/%base_name%/merbtasks.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/spec/%base_name%_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/spec/spec_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/test/%base_name%_test.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_plugin/templates/test/test_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_very_flat/merb_very_flat_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_very_flat/templates/%app_file_name%.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/app_generators/merb_very_flat/templates/README.txt</filename>
    </removed>
    <removed>
      <filename>merb-gen/lib/merb-gen/base.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/lib/merb-gen/helpers.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/model/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/model/model_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/model/templates/app/models/%model_file_name%.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/resource_controller_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/controllers/%controller_file_name%.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/helpers/%controller_file_name%_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/views/%controller_file_name%/delete.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/views/%controller_file_name%/edit.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/views/%controller_file_name%/index.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/views/%controller_file_name%/new.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_default_generators/resource_controller/templates/app/views/%controller_file_name%/show.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/controller/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/controller/controller_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/controller/templates/app/controllers/%controller_file_name%.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/controller/templates/app/helpers/%controller_file_name%_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/controller/templates/app/views/%controller_file_name%/index.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/freezer/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/freezer/freezer_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/freezer/templates/script/frozen-merb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/part_controller/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/part_controller/part_controller_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/part_controller/templates/app/helpers/%controller_file_name%_part_helper.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/part_controller/templates/app/parts/%controller_file_name%_part.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/part_controller/templates/app/parts/views/%controller_file_name%_part/index.html.erb</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/resource/USAGE</filename>
    </removed>
    <removed>
      <filename>merb-gen/merb_generators/resource/resource_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_controller_test/merb_controller_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_controller_test/templates/spec/controllers/%controller_full_file_path%_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_controller_test/templates/spec/helpers/%controller_full_file_path%_helper_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_model_test/merb_model_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_model_test/templates/spec/models/%model_file_name%_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/merb_resource_controller_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/controllers/%controller_full_file_path%_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/helpers/%controller_full_file_path%_helpers.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/views/%controller_full_file_path%/delete.html.erb_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/views/%controller_full_file_path%/edit.html.erb_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/views/%controller_full_file_path%/index.html.erb_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/views/%controller_full_file_path%/new.html.erb_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/rspec_generators/merb_resource_controller_test/templates/spec/views/%controller_full_file_path%/show.html.erb_spec.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/test_unit_generators/merb_controller_test/templates/test/functional/%controller_full_file_path%_test.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/test_unit_generators/merb_model_test/merb_model_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/test_unit_generators/merb_model_test/templates/test/unit/%model_file_name%_test.rb</filename>
    </removed>
    <removed>
      <filename>merb-gen/test_unit_generators/merb_resource_controller_test/merb_resource_controller_test_generator.rb</filename>
    </removed>
    <removed>
      <filename>merb-mailer/lib/merb-mailer/merb_controller.rb</filename>
    </removed>
    <removed>
      <filename>merb-mailer/log/merb.4000.pid</filename>
    </removed>
    <removed>
      <filename>merb-mailer/log/merb_test.log</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/.svn/all-wcprops</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/.svn/entries</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/.svn/format</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/.svn/all-wcprops</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/.svn/entries</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/.svn/format</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/layout/.svn/all-wcprops</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/layout/.svn/entries</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/layout/.svn/format</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/layout/.svn/text-base/application.html.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/layout/.svn/text-base/application.text.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/all-wcprops</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/entries</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/format</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/eighth.html.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/eighth.text.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/first.html.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/first.text.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/ninth.html.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/ninth.text.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/second.text.erb.svn-base</filename>
    </removed>
    <removed>
      <filename>merb-mailer/spec/mailers/views/test_mail_controller/.svn/text-base/third.html.erb.svn-base</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>6c4f1a0f2c67f80405065d2a01b66db5ccd58a6a</id>
    </parent>
    <parent>
      <id>ce8ba76ed02eb5382cd6d3bf386c6344d3fd7afd</id>
    </parent>
  </parents>
  <author>
    <name>Jonas Nicklas</name>
    <email>jonas.nicklas@gmail.com</email>
  </author>
  <url>http://github.com/wycats/merb/commit/c2a80cee938de2a879bf5ad81dabd3727f3ff7d2</url>
  <id>c2a80cee938de2a879bf5ad81dabd3727f3ff7d2</id>
  <committed-date>2008-06-27T04:32:32-07:00</committed-date>
  <authored-date>2008-06-27T04:32:32-07:00</authored-date>
  <message>Merge branch 'new_merb_gen' into testing

Conflicts:

	.gitignore
	merb-cache/lib/merb-cache/cache-action.rb
	merb-freezer/README
	merb-freezer/Rakefile
	merb-freezer/bin/frozen-merb
	merb-freezer/lib/merb-freezer.rb
	merb-freezer/lib/merb-freezer/merbtasks.rb
	merb-freezer/spec/merb-freezer_spec.rb
	merb-freezer/spec/spec_helper.rb</message>
  <tree>7cdd7d32af4f16d97369c1365d5eb9ad59fe3cb0</tree>
  <committer>
    <name>Jonas Nicklas</name>
    <email>jonas.nicklas@gmail.com</email>
  </committer>
</commit>
