<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>actionpack/lib/action_controller/caching/actions.rb</filename>
    </added>
    <added>
      <filename>actionpack/lib/action_controller/caching/fragments.rb</filename>
    </added>
    <added>
      <filename>actionpack/lib/action_controller/caching/pages.rb</filename>
    </added>
    <added>
      <filename>actionpack/lib/action_controller/caching/sql_cache.rb</filename>
    </added>
    <added>
      <filename>actionpack/lib/action_controller/caching/sweeping.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache/compressed_mem_cache_store.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache/drb_store.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache/file_store.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache/mem_cache_store.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/cache/memory_store.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/gzip.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb</filename>
    </added>
    <added>
      <filename>activesupport/test/caching_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,11 @@
 *SVN*
 
+* All fragment cache keys are now by default prefixed with the &quot;views/&quot; namespace [DHH]
+
+* Moved the caching stores from ActionController::Caching::Fragments::* to ActiveSupport::Cache::*. If you're explicitly referring to a store, like ActionController::Caching::Fragments::MemoryStore, you need to update that reference with ActiveSupport::Cache::MemoryStore [DHH]
+
+* Deprecated ActionController::Base.fragment_cache_store for ActionController::Base.cache_store [DHH]
+
 * Made fragment caching in views work for rjs and builder as well #6642 [zsombor]
 
 * Fixed rendering of partials with layout when done from site layout #9209 [antramm]</diff>
      <filename>actionpack/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -97,7 +97,7 @@ A short rundown of the major features:
 
     class WeblogController &lt; ActionController::Base
       before_filter :authenticate, :cache, :audit
-      after_filter { |c| c.response.body = GZip::compress(c.response.body) }
+      after_filter { |c| c.response.body = Gzip::compress(c.response.body) }
       after_filter LocalizeFilter
       
       def index</diff>
      <filename>actionpack/README</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,13 @@ require 'fileutils'
 require 'uri'
 require 'set'
 
+require 'action_controller/caching/pages'
+require 'action_controller/caching/actions'
+require 'action_controller/caching/sql_cache'
+require 'action_controller/caching/sweeping'
+require 'action_controller/caching/fragments'
+
+
 module ActionController #:nodoc:
   # Caching is a cheap way of speeding up slow applications by keeping the result of calculations, renderings, and database calls
   # around for subsequent requests. Action Controller affords you three approaches in varying levels of granularity: Page, Action, Fragment.
@@ -9,701 +16,56 @@ module ActionController #:nodoc:
   # You can read more about each approach and the sweeping assistance by clicking the modules below.
   #
   # Note: To turn off all caching and sweeping, set Base.perform_caching = false.
+  #
+  #
+  # == Caching stores
+  #
+  # All the caching stores from ActiveSupport::Cache is available to be used as backends for Action Controller caching.
+  #
+  # Configuration examples (MemoryStore is the default):
+  #
+  #   ActionController::Base.cache_store = :memory_store
+  #   ActionController::Base.cache_store = :file_store, &quot;/path/to/cache/directory&quot;
+  #   ActionController::Base.cache_store = :drb_store, &quot;druby://localhost:9192&quot;
+  #   ActionController::Base.cache_store = :mem_cache_store, &quot;localhost&quot;
+  #   ActionController::Base.cache_store = MyOwnStore.new(&quot;parameter&quot;)
   module Caching
     def self.included(base) #:nodoc:
       base.class_eval do
-        include Pages, Actions, Fragments
+        @@cache_store = nil
+        cattr_reader :cache_store
 
-        if defined? ActiveRecord
-          include Sweeping, SqlCache
+        # Defines the storage option for cached fragments
+        def self.cache_store=(store_option)
+          @@cache_store = ActiveSupport::Cache.lookup_store(store_option)
         end
 
+        include Pages, Actions, Fragments
+        include Sweeping, SqlCache if defined?(ActiveRecord)
+
         @@perform_caching = true
         cattr_accessor :perform_caching
-      end
-    end
-
-    # Page caching is an approach to caching where the entire action output of is stored as a HTML file that the web server
-    # can serve without going through the Action Pack. This can be as much as 100 times faster than going through the process of dynamically
-    # generating the content. Unfortunately, this incredible speed-up is only available to stateless pages where all visitors
-    # are treated the same. Content management systems -- including weblogs and wikis -- have many pages that are a great fit
-    # for this approach, but account-based systems where people log in and manipulate their own data are often less likely candidates.
-    #
-    # Specifying which actions to cache is done through the &lt;tt&gt;caches&lt;/tt&gt; class method:
-    #
-    #   class WeblogController &lt; ActionController::Base
-    #     caches_page :show, :new
-    #   end
-    #
-    # This will generate cache files such as weblog/show/5 and weblog/new, which match the URLs used to trigger the dynamic
-    # generation. This is how the web server is able pick up a cache file when it exists and otherwise let the request pass on to
-    # the Action Pack to generate it.
-    #
-    # Expiration of the cache is handled by deleting the cached file, which results in a lazy regeneration approach where the cache
-    # is not restored before another hit is made against it. The API for doing so mimics the options from url_for and friends:
-    #
-    #   class WeblogController &lt; ActionController::Base
-    #     def update
-    #       List.update(params[:list][:id], params[:list])
-    #       expire_page :action =&gt; &quot;show&quot;, :id =&gt; params[:list][:id]
-    #       redirect_to :action =&gt; &quot;show&quot;, :id =&gt; params[:list][:id]
-    #     end
-    #   end
-    #
-    # Additionally, you can expire caches using Sweepers that act on changes in the model to determine when a cache is supposed to be
-    # expired.
-    #
-    # == Setting the cache directory
-    #
-    # The cache directory should be the document root for the web server and is set using Base.page_cache_directory = &quot;/document/root&quot;.
-    # For Rails, this directory has already been set to RAILS_ROOT + &quot;/public&quot;.
-    #
-    # == Setting the cache extension
-    #
-    # By default, the cache extension is .html, which makes it easy for the cached files to be picked up by the web server. If you want
-    # something else, like .php or .shtml, just set Base.page_cache_extension.
-    module Pages
-      def self.included(base) #:nodoc:
-        base.extend(ClassMethods)
-        base.class_eval do
-          @@page_cache_directory = defined?(RAILS_ROOT) ? &quot;#{RAILS_ROOT}/public&quot; : &quot;&quot;
-          cattr_accessor :page_cache_directory
-
-          @@page_cache_extension = '.html'
-          cattr_accessor :page_cache_extension
-        end
-      end
-
-      module ClassMethods
-        # Expires the page that was cached with the +path+ as a key. Example:
-        #   expire_page &quot;/lists/show&quot;
-        def expire_page(path)
-          return unless perform_caching
-
-          benchmark &quot;Expired page: #{page_cache_file(path)}&quot; do
-            File.delete(page_cache_path(path)) if File.exist?(page_cache_path(path))
-          end
-        end
-
-        # Manually cache the +content+ in the key determined by +path+. Example:
-        #   cache_page &quot;I'm the cached content&quot;, &quot;/lists/show&quot;
-        def cache_page(content, path)
-          return unless perform_caching
-
-          benchmark &quot;Cached page: #{page_cache_file(path)}&quot; do
-            FileUtils.makedirs(File.dirname(page_cache_path(path)))
-            File.open(page_cache_path(path), &quot;wb+&quot;) { |f| f.write(content) }
-          end
-        end
 
-        # Caches the +actions+ using the page-caching approach that'll store the cache in a path within the page_cache_directory that
-        # matches the triggering url.
-        def caches_page(*actions)
-          return unless perform_caching
-          actions = actions.map(&amp;:to_s)
-          after_filter { |c| c.cache_page if actions.include?(c.action_name) }
+        def self.cache_configured?
+          perform_caching &amp;&amp; cache_store
         end
-
-        private
-          def page_cache_file(path)
-            name = (path.empty? || path == &quot;/&quot;) ? &quot;/index&quot; : URI.unescape(path.chomp('/'))
-            name &lt;&lt; page_cache_extension unless (name.split('/').last || name).include? '.'
-            return name
-          end
-
-          def page_cache_path(path)
-            page_cache_directory + page_cache_file(path)
-          end
       end
-
-      # Expires the page that was cached with the +options+ as a key. Example:
-      #   expire_page :controller =&gt; &quot;lists&quot;, :action =&gt; &quot;show&quot;
-      def expire_page(options = {})
-        return unless perform_caching
-
-        if options.is_a?(Hash)
-          if options[:action].is_a?(Array)
-            options[:action].dup.each do |action|
-              self.class.expire_page(url_for(options.merge(:only_path =&gt; true, :skip_relative_url_root =&gt; true, :action =&gt; action)))
-            end
-          else
-            self.class.expire_page(url_for(options.merge(:only_path =&gt; true, :skip_relative_url_root =&gt; true)))
-          end
-        else
-          self.class.expire_page(options)
-        end
-      end
-
-      # Manually cache the +content+ in the key determined by +options+. If no content is provided, the contents of response.body is used
-      # If no options are provided, the requested url is used. Example:
-      #   cache_page &quot;I'm the cached content&quot;, :controller =&gt; &quot;lists&quot;, :action =&gt; &quot;show&quot;
-      def cache_page(content = nil, options = nil)
-        return unless perform_caching &amp;&amp; caching_allowed
-
-        path = case options
-          when Hash
-            url_for(options.merge(:only_path =&gt; true, :skip_relative_url_root =&gt; true, :format =&gt; params[:format]))
-          when String
-            options
-          else
-            request.path
-        end
-
-        self.class.cache_page(content || response.body, path)
-      end
-
-      private
-        def caching_allowed
-          request.get? &amp;&amp; response.headers['Status'].to_i == 200
-        end
     end
 
-    # Action caching is similar to page caching by the fact that the entire output of the response is cached, but unlike page caching,
-    # every request still goes through the Action Pack. The key benefit of this is that filters are run before the cache is served, which
-    # allows for authentication and other restrictions on whether someone is allowed to see the cache. Example:
-    #
-    #   class ListsController &lt; ApplicationController
-    #     before_filter :authenticate, :except =&gt; :public
-    #     caches_page   :public
-    #     caches_action :show, :feed
-    #   end
-    #
-    # In this example, the public action doesn't require authentication, so it's possible to use the faster page caching method. But both the
-    # show and feed action are to be shielded behind the authenticate filter, so we need to implement those as action caches.
-    #
-    # Action caching internally uses the fragment caching and an around filter to do the job. The fragment cache is named according to both
-    # the current host and the path. So a page that is accessed at http://david.somewhere.com/lists/show/1 will result in a fragment named
-    # &quot;david.somewhere.com/lists/show/1&quot;. This allows the cacher to differentiate between &quot;david.somewhere.com/lists/&quot; and
-    # &quot;jamis.somewhere.com/lists/&quot; -- which is a helpful way of assisting the subdomain-as-account-key pattern.
-    #
-    # Different representations of the same resource, e.g. &lt;tt&gt;http://david.somewhere.com/lists&lt;/tt&gt; and &lt;tt&gt;http://david.somewhere.com/lists.xml&lt;/tt&gt;
-    # are treated like separate requests and so are cached separately. Keep in mind when expiring an action cache that &lt;tt&gt;:action =&gt; 'lists'&lt;/tt&gt; is not the same
-    # as &lt;tt&gt;:action =&gt; 'list', :format =&gt; :xml&lt;/tt&gt;.
-    #
-    # You can set modify the default action cache path by passing a :cache_path option.  This will be passed directly to ActionCachePath.path_for.  This is handy
-    # for actions with multiple possible routes that should be cached differently.  If a block is given, it is called with the current controller instance.
-    #
-    #   class ListsController &lt; ApplicationController
-    #     before_filter :authenticate, :except =&gt; :public
-    #     caches_page   :public
-    #     caches_action :show, :cache_path =&gt; { :project =&gt; 1 }
-    #     caches_action :show, :cache_path =&gt; Proc.new { |controller| 
-    #       controller.params[:user_id] ? 
-    #         controller.send(:user_list_url, c.params[:user_id], c.params[:id]) :
-    #         controller.send(:list_url, c.params[:id]) }
-    #   end
-    module Actions
-      def self.included(base) #:nodoc:
-        base.extend(ClassMethods)
-          base.class_eval do
-            attr_accessor :rendered_action_cache, :action_cache_path
-            alias_method_chain :protected_instance_variables, :action_caching
-          end
-      end
-
-      module ClassMethods
-        # Declares that +actions+ should be cached.
-        # See ActionController::Caching::Actions for details.
-        def caches_action(*actions)
-          return unless perform_caching
-          around_filter(ActionCacheFilter.new(*actions))
-        end
-      end
-
-      def protected_instance_variables_with_action_caching
-        protected_instance_variables_without_action_caching + %w(@action_cache_path)
-      end
-
-      def expire_action(options = {})
-        return unless perform_caching
-        if options[:action].is_a?(Array)
-          options[:action].dup.each do |action|
-            expire_fragment(ActionCachePath.path_for(self, options.merge({ :action =&gt; action })))
-          end
+    protected
+      # Convenience accessor
+      def cache(key, options = nil, &amp;block)
+        if cache_configured?
+          cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &amp;block)
         else
-          expire_fragment(ActionCachePath.path_for(self, options))
+          yield
         end
       end
 
-      class ActionCacheFilter #:nodoc:
-        def initialize(*actions, &amp;block)
-          @options = actions.extract_options!
-          @actions = Set.new actions
-        end
-
-        def before(controller)
-          return unless @actions.include?(controller.action_name.intern)
-          cache_path = ActionCachePath.new(controller, path_options_for(controller, @options))
-          if cache = controller.read_fragment(cache_path.path)
-            controller.rendered_action_cache = true
-            set_content_type!(controller, cache_path.extension)
-            controller.send!(:render_for_text, cache)
-            false
-          else
-            controller.action_cache_path = cache_path
-          end
-        end
-
-        def after(controller)
-          return if !@actions.include?(controller.action_name.intern) || controller.rendered_action_cache || !caching_allowed(controller)
-          controller.write_fragment(controller.action_cache_path.path, controller.response.body)
-        end
 
-        private
-          def set_content_type!(controller, extension)
-            controller.response.content_type = Mime::Type.lookup_by_extension(extension).to_s if extension
-          end
-
-          def path_options_for(controller, options)
-            ((path_options = options[:cache_path]).respond_to?(:call) ? path_options.call(controller) : path_options) || {}
-          end
-
-          def caching_allowed(controller)
-            controller.request.get? &amp;&amp; controller.response.headers['Status'].to_i == 200
-          end
-      end
-      
-      class ActionCachePath
-        attr_reader :path, :extension
-        
-        class &lt;&lt; self
-          def path_for(controller, options)
-            new(controller, options).path
-          end
-        end
-        
-        def initialize(controller, options = {})
-          @extension = extract_extension(controller.request.path)
-          path = controller.url_for(options).split('://').last
-          normalize!(path)
-          add_extension!(path, @extension)
-          @path = URI.unescape(path)
-        end
-        
-        private
-          def normalize!(path)
-            path &lt;&lt; 'index' if path[-1] == ?/
-          end
-        
-          def add_extension!(path, extension)
-            path &lt;&lt; &quot;.#{extension}&quot; if extension
-          end
-          
-          def extract_extension(file_path)
-            # Don't want just what comes after the last '.' to accommodate multi part extensions
-            # such as tar.gz.
-            file_path[/^[^.]+\.(.+)$/, 1]
-          end
+    private    
+      def cache_configured?
+        self.class.cache_configured?
       end
-    end
-
-    # Fragment caching is used for caching various blocks within templates without caching the entire action as a whole. This is useful when
-    # certain elements of an action change frequently or depend on complicated state while other parts rarely change or can be shared amongst multiple
-    # parties. The caching is doing using the cache helper available in the Action View. A template with caching might look something like:
-    #
-    #   &lt;b&gt;Hello &lt;%= @name %&gt;&lt;/b&gt;
-    #   &lt;% cache do %&gt;
-    #     All the topics in the system:
-    #     &lt;%= render :partial =&gt; &quot;topic&quot;, :collection =&gt; Topic.find(:all) %&gt;
-    #   &lt;% end %&gt;
-    #
-    # This cache will bind to the name of the action that called it, so if this code was part of the view for the topics/list action, you would 
-    # be able to invalidate it using &lt;tt&gt;expire_fragment(:controller =&gt; &quot;topics&quot;, :action =&gt; &quot;list&quot;)&lt;/tt&gt;. 
-    # 
-    # This default behavior is of limited use if you need to cache multiple fragments per action or if the action itself is cached using 
-    # &lt;tt&gt;caches_action&lt;/tt&gt;, so we also have the option to qualify the name of the cached fragment with something like:
-    #
-    #   &lt;% cache(:action =&gt; &quot;list&quot;, :action_suffix =&gt; &quot;all_topics&quot;) do %&gt;
-    #
-    # That would result in a name such as &quot;/topics/list/all_topics&quot;, avoiding conflicts with the action cache and with any fragments that use a 
-    # different suffix. Note that the URL doesn't have to really exist or be callable - the url_for system is just used to generate unique 
-    # cache names that we can refer to when we need to expire the cache. 
-    # 
-    # The expiration call for this example is:
-    # 
-    #   expire_fragment(:controller =&gt; &quot;topics&quot;, :action =&gt; &quot;list&quot;, :action_suffix =&gt; &quot;all_topics&quot;)
-    #
-    # == Fragment stores
-    #
-    # By default, cached fragments are stored in memory. The available store options are:
-    #
-    # * FileStore: Keeps the fragments on disk in the +cache_path+, which works well for all types of environments and allows all 
-    #   processes running from the same application directory to access the cached content.
-    # * MemoryStore: Keeps the fragments in memory, which is fine for WEBrick and for FCGI (if you don't care that each FCGI process holds its
-    #   own fragment store). It's not suitable for CGI as the process is thrown away at the end of each request. It can potentially also take
-    #   up a lot of memory since each process keeps all the caches in memory.
-    # * DRbStore: Keeps the fragments in the memory of a separate, shared DRb process. This works for all environments and only keeps one cache
-    #   around for all processes, but requires that you run and manage a separate DRb process.
-    # * MemCacheStore: Works like DRbStore, but uses Danga's MemCache instead.
-    #   Requires the ruby-memcache library:  gem install ruby-memcache.
-    #
-    # Configuration examples (MemoryStore is the default):
-    #
-    #   ActionController::Base.fragment_cache_store = :memory_store
-    #   ActionController::Base.fragment_cache_store = :file_store, &quot;/path/to/cache/directory&quot;
-    #   ActionController::Base.fragment_cache_store = :drb_store, &quot;druby://localhost:9192&quot;
-    #   ActionController::Base.fragment_cache_store = :mem_cache_store, &quot;localhost&quot;
-    #   ActionController::Base.fragment_cache_store = MyOwnStore.new(&quot;parameter&quot;)
-    module Fragments
-      def self.included(base) #:nodoc:
-        base.class_eval do
-          @@fragment_cache_store = MemoryStore.new
-          cattr_reader :fragment_cache_store
-
-          # Defines the storage option for cached fragments
-          def self.fragment_cache_store=(store_option)
-            store, *parameters = *([ store_option ].flatten)
-            @@fragment_cache_store = if store.is_a?(Symbol)
-              store_class_name = (store == :drb_store ? &quot;DRbStore&quot; : store.to_s.camelize)
-              store_class = ActionController::Caching::Fragments.const_get(store_class_name)
-              store_class.new(*parameters)
-            else
-              store
-            end
-          end
-        end
-      end
-
-      # Given a name (as described in &lt;tt&gt;expire_fragment&lt;/tt&gt;), returns a key suitable for use in reading, 
-      # writing, or expiring a cached fragment. If the name is a hash, the generated name is the return
-      # value of url_for on that hash (without the protocol).
-      def fragment_cache_key(name)
-        name.is_a?(Hash) ? url_for(name).split(&quot;://&quot;).last : name
-      end
-
-      def fragment_for(block, name = {}, options = nil) #:nodoc:
-        unless perform_caching then block.call; return end
-
-        buffer = yield
-
-        if cache = read_fragment(name, options)
-          buffer.concat(cache)
-        else
-          pos = buffer.length
-          block.call
-          write_fragment(name, buffer[pos..-1], options)
-        end
-      end
-
-      # Called by CacheHelper#cache
-      def cache_rxml_fragment(block, name = {}, options = nil) #:nodoc:
-        fragment_for(block, name, options) do
-          eval('xml.target!', block.binding)
-        end
-      end
-      
-      # Called by CacheHelper#cache
-      def cache_rjs_fragment(block, name = {}, options = nil) #:nodoc:
-        fragment_for(block, name, options) do
-          begin
-            debug_mode, ActionView::Base.debug_rjs = ActionView::Base.debug_rjs, false
-            eval('page.to_s', block.binding)
-          ensure
-            ActionView::Base.debug_rjs = debug_mode
-          end
-        end
-      end
-      
-      # Called by CacheHelper#cache
-      def cache_erb_fragment(block, name = {}, options = nil) #:nodoc:
-        fragment_for(block, name, options) do
-          eval(ActionView::Base.erb_variable, block.binding)
-        end
-      end
-
-
-      # Writes &lt;tt&gt;content&lt;/tt&gt; to the location signified by &lt;tt&gt;name&lt;/tt&gt; (see &lt;tt&gt;expire_fragment&lt;/tt&gt; for acceptable formats)
-      def write_fragment(name, content, options = nil)
-        return unless perform_caching
-
-        key = fragment_cache_key(name)
-        self.class.benchmark &quot;Cached fragment: #{key}&quot; do
-          fragment_cache_store.write(key, content, options)
-        end
-        content
-      end
-
-      # Reads a cached fragment from the location signified by &lt;tt&gt;name&lt;/tt&gt; (see &lt;tt&gt;expire_fragment&lt;/tt&gt; for acceptable formats)
-      def read_fragment(name, options = nil)
-        return unless perform_caching
-
-        key = fragment_cache_key(name)
-        self.class.benchmark &quot;Fragment read: #{key}&quot; do
-          fragment_cache_store.read(key, options)
-        end
-      end
-
-      # Name can take one of three forms:
-      # * String: This would normally take the form of a path like &quot;pages/45/notes&quot;
-      # * Hash: Is treated as an implicit call to url_for, like { :controller =&gt; &quot;pages&quot;, :action =&gt; &quot;notes&quot;, :id =&gt; 45 }
-      # * Regexp: Will destroy all the matched fragments, example:
-      #     %r{pages/\d*/notes}
-      #   Ensure you do not specify start and finish in the regex (^$) because
-      #   the actual filename matched looks like ./cache/filename/path.cache
-      #   Regexp expiration is only supported on caches that can iterate over
-      #   all keys (unlike memcached).
-      def expire_fragment(name, options = nil)
-        return unless perform_caching
-
-        key = fragment_cache_key(name)
-
-        if key.is_a?(Regexp)
-          self.class.benchmark &quot;Expired fragments matching: #{key.source}&quot; do
-            fragment_cache_store.delete_matched(key, options)
-          end
-        else
-          self.class.benchmark &quot;Expired fragment: #{key}&quot; do
-            fragment_cache_store.delete(key, options)
-          end
-        end
-      end
-
-
-      class UnthreadedMemoryStore #:nodoc:
-        def initialize #:nodoc:
-          @data = {}
-        end
-
-        def read(name, options=nil) #:nodoc:
-          @data[name]
-        end
-
-        def write(name, value, options=nil) #:nodoc:
-          @data[name] = value
-        end
-
-        def delete(name, options=nil) #:nodoc:
-          @data.delete(name)
-        end
-
-        def delete_matched(matcher, options=nil) #:nodoc:
-          @data.delete_if { |k,v| k =~ matcher }
-        end
-      end
-
-      module ThreadSafety #:nodoc:
-        def read(name, options=nil) #:nodoc:
-          @mutex.synchronize { super }
-        end
-
-        def write(name, value, options=nil) #:nodoc:
-          @mutex.synchronize { super }
-        end
-
-        def delete(name, options=nil) #:nodoc:
-          @mutex.synchronize { super }
-        end
-
-        def delete_matched(matcher, options=nil) #:nodoc:
-          @mutex.synchronize { super }
-        end
-      end
-
-      class MemoryStore &lt; UnthreadedMemoryStore #:nodoc:
-        def initialize #:nodoc:
-          super
-          if ActionController::Base.allow_concurrency
-            @mutex = Mutex.new
-            MemoryStore.module_eval { include ThreadSafety }
-          end
-        end
-      end
-
-      class DRbStore &lt; MemoryStore #:nodoc:
-        attr_reader :address
-
-        def initialize(address = 'druby://localhost:9192')
-          super()
-          @address = address
-          @data = DRbObject.new(nil, address)
-        end
-      end
-
-    begin
-      require_library_or_gem 'memcache'
-      class MemCacheStore &lt; MemoryStore #:nodoc:
-        attr_reader :addresses
-
-        def initialize(*addresses)
-          super()
-          addresses = addresses.flatten
-          addresses = [&quot;localhost&quot;] if addresses.empty?
-          @addresses = addresses
-          @data = MemCache.new(*addresses)
-        end
-      end
-    rescue LoadError
-      # MemCache wasn't available so neither can the store be
-    end
-
-      class UnthreadedFileStore #:nodoc:
-        attr_reader :cache_path
-
-        def initialize(cache_path)
-          @cache_path = cache_path
-        end
-
-        def write(name, value, options = nil) #:nodoc:
-          ensure_cache_path(File.dirname(real_file_path(name)))
-          File.open(real_file_path(name), &quot;wb+&quot;) { |f| f.write(value) }
-        rescue =&gt; e
-          Base.logger.error &quot;Couldn't create cache directory: #{name} (#{e.message})&quot; if Base.logger
-        end
-
-        def read(name, options = nil) #:nodoc:
-          File.open(real_file_path(name), 'rb') { |f| f.read } rescue nil
-        end
-
-        def delete(name, options) #:nodoc:
-          File.delete(real_file_path(name))
-        rescue SystemCallError =&gt; e
-          # If there's no cache, then there's nothing to complain about
-        end
-
-        def delete_matched(matcher, options) #:nodoc:
-          search_dir(@cache_path) do |f|
-            if f =~ matcher
-              begin
-                File.delete(f)
-              rescue SystemCallError =&gt; e
-                # If there's no cache, then there's nothing to complain about
-              end
-            end
-          end
-        end
-
-        private
-          def real_file_path(name)
-            '%s/%s.cache' % [@cache_path, name.gsub('?', '.').gsub(':', '.')]
-          end
-
-          def ensure_cache_path(path)
-            FileUtils.makedirs(path) unless File.exist?(path)
-          end
-
-          def search_dir(dir, &amp;callback)
-            Dir.foreach(dir) do |d|
-              next if d == &quot;.&quot; || d == &quot;..&quot;
-              name = File.join(dir, d)
-              if File.directory?(name)
-                search_dir(name, &amp;callback)
-              else
-                callback.call name
-              end
-            end
-          end
-        end
-
-        class FileStore &lt; UnthreadedFileStore #:nodoc:
-          def initialize(cache_path)
-            super(cache_path)
-            if ActionController::Base.allow_concurrency
-              @mutex = Mutex.new
-              FileStore.module_eval { include ThreadSafety }
-            end
-          end
-        end
-    end
-
-    # Sweepers are the terminators of the caching world and responsible for expiring caches when model objects change.
-    # They do this by being half-observers, half-filters and implementing callbacks for both roles. A Sweeper example:
-    #
-    #   class ListSweeper &lt; ActionController::Caching::Sweeper
-    #     observe List, Item
-    #
-    #     def after_save(record)
-    #       list = record.is_a?(List) ? record : record.list
-    #       expire_page(:controller =&gt; &quot;lists&quot;, :action =&gt; %w( show public feed ), :id =&gt; list.id)
-    #       expire_action(:controller =&gt; &quot;lists&quot;, :action =&gt; &quot;all&quot;)
-    #       list.shares.each { |share| expire_page(:controller =&gt; &quot;lists&quot;, :action =&gt; &quot;show&quot;, :id =&gt; share.url_key) }
-    #     end
-    #   end
-    #
-    # The sweeper is assigned in the controllers that wish to have its job performed using the &lt;tt&gt;cache_sweeper&lt;/tt&gt; class method:
-    #
-    #   class ListsController &lt; ApplicationController
-    #     caches_action :index, :show, :public, :feed
-    #     cache_sweeper :list_sweeper, :only =&gt; [ :edit, :destroy, :share ]
-    #   end
-    #
-    # In the example above, four actions are cached and three actions are responsible for expiring those caches.
-    module Sweeping
-      def self.included(base) #:nodoc:
-        base.extend(ClassMethods)
-      end
-
-      module ClassMethods #:nodoc:
-        def cache_sweeper(*sweepers)
-          return unless perform_caching
-          configuration = sweepers.extract_options!
-          sweepers.each do |sweeper|
-            ActiveRecord::Base.observers &lt;&lt; sweeper if defined?(ActiveRecord) and defined?(ActiveRecord::Base)
-            sweeper_instance = Object.const_get(Inflector.classify(sweeper)).instance
-
-            if sweeper_instance.is_a?(Sweeper)
-              around_filter(sweeper_instance, :only =&gt; configuration[:only])
-            else
-              after_filter(sweeper_instance, :only =&gt; configuration[:only])
-            end
-          end
-        end
-      end
-    end
-
-    if defined?(ActiveRecord) and defined?(ActiveRecord::Observer)
-      class Sweeper &lt; ActiveRecord::Observer #:nodoc:
-        attr_accessor :controller
-
-        def before(controller)
-          self.controller = controller
-          callback(:before)
-        end
-
-        def after(controller)
-          callback(:after)
-          # Clean up, so that the controller can be collected after this request
-          self.controller = nil
-        end
-
-        protected
-          # gets the action cache path for the given options.
-          def action_path_for(options)
-            ActionController::Caching::Actions::ActionCachePath.path_for(controller, options)
-          end
-
-          # Retrieve instance variables set in the controller.
-          def assigns(key)
-            controller.instance_variable_get(&quot;@#{key}&quot;)
-          end
-
-        private
-          def callback(timing)
-            controller_callback_method_name = &quot;#{timing}_#{controller.controller_name.underscore}&quot;
-            action_callback_method_name     = &quot;#{controller_callback_method_name}_#{controller.action_name}&quot;
-
-            send!(controller_callback_method_name) if respond_to?(controller_callback_method_name, true)
-            send!(action_callback_method_name)     if respond_to?(action_callback_method_name, true)
-          end
-
-          def method_missing(method, *arguments)
-            return if @controller.nil?
-            @controller.send!(method, *arguments)
-          end
-      end
-    end
-
-    module SqlCache
-      def self.included(base) #:nodoc:
-        if defined?(ActiveRecord) &amp;&amp; ActiveRecord::Base.respond_to?(:cache)
-          base.alias_method_chain :perform_action, :caching
-        end
-      end
-
-      def perform_action_with_caching
-        ActiveRecord::Base.cache do
-          perform_action_without_caching
-        end
-      end
-    end
   end
-end
+end
\ No newline at end of file</diff>
      <filename>actionpack/lib/action_controller/caching.rb</filename>
    </modified>
    <modified>
      <diff>@@ -31,21 +31,25 @@ module ActionView
       #      &lt;%= render :partial =&gt; &quot;topics&quot;, :collection =&gt; @topic_list %&gt;
       #      &lt;i&gt;Topics listed alphabetically&lt;/i&gt;
       #    &lt;% end %&gt;
-      def cache(name = {}, &amp;block)
+      def cache(name = {}, options = nil, &amp;block)
         template_extension = first_render[/\.(\w+)$/, 1].to_sym
+
         case template_extension
         when :erb, :rhtml
-          @controller.cache_erb_fragment(block, name)
+          @controller.cache_erb_fragment(block, name, options)
         when :rjs
-          @controller.cache_rjs_fragment(block, name)
+          @controller.cache_rjs_fragment(block, name, options)
         when :builder, :rxml
-          @controller.cache_rxml_fragment(block, name)
+          @controller.cache_rxml_fragment(block, name, options)
         else
           # do a last ditch effort for those brave souls using
           # different template engines. This should give plugin
           # writters a simple hook.
-          raise &quot;fragment caching not supported for #{template_extension} files.&quot; unless @controller.respond_to?(&quot;cache_#{template_extension}_fragment&quot;)
-          @controller.send &quot;cache_#{template_extension}_fragment&quot;, block, name
+          unless @controller.respond_to?(&quot;cache_#{template_extension}_fragment&quot;)
+            raise &quot;fragment caching not supported for #{template_extension} files.&quot;
+          end
+
+          @controller.send!(&quot;cache_#{template_extension}_fragment&quot;, block, name, options)
         end
       end
     end</diff>
      <filename>actionpack/lib/action_view/helpers/cache_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ CACHE_DIR = 'test_cache'
 # Don't change '/../temp/' cavalierly or you might hose something you don't want hosed
 FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
 ActionController::Base.page_cache_directory = FILE_STORE_PATH
-ActionController::Base.fragment_cache_store = :file_store, FILE_STORE_PATH
+ActionController::Base.cache_store = :file_store, FILE_STORE_PATH
 
 class PageCachingTestController &lt; ActionController::Base
   caches_page :ok, :no_content, :found, :not_found
@@ -343,7 +343,7 @@ class ActionCacheTest &lt; Test::Unit::TestCase
     end
 
     def assert_cache_exists(path)
-      full_path = File.join(FILE_STORE_PATH, path + '.cache')
+      full_path = File.join(FILE_STORE_PATH, &quot;views&quot;, path + '.cache')
       assert File.exist?(full_path), &quot;#{full_path.inspect} does not exist.&quot;
     end
 end
@@ -355,8 +355,8 @@ end
 class FragmentCachingTest &lt; Test::Unit::TestCase
   def setup
     ActionController::Base.perform_caching = true
-    @store = ActionController::Caching::Fragments::UnthreadedMemoryStore.new
-    ActionController::Base.fragment_cache_store = @store
+    @store = ActiveSupport::Cache::MemoryStore.new
+    ActionController::Base.cache_store = @store
     @controller = FragmentCachingTestController.new
     @params = {:controller =&gt; 'posts', :action =&gt; 'index'}
     @request = ActionController::TestRequest.new
@@ -368,57 +368,57 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
   end
 
   def test_fragement_cache_key
-    assert_equal 'what a key', @controller.fragment_cache_key('what a key')
-    assert_equal( &quot;test.host/fragment_caching_test/some_action&quot;,
+    assert_equal 'views/what a key', @controller.fragment_cache_key('what a key')
+    assert_equal( &quot;views/test.host/fragment_caching_test/some_action&quot;,
                   @controller.fragment_cache_key(:controller =&gt; 'fragment_caching_test',:action =&gt; 'some_action'))
   end
 
   def test_read_fragment__with_caching_enabled
-    @store.write('name', 'value')
+    @store.write('views/name', 'value')
     assert_equal 'value', @controller.read_fragment('name')
   end
 
   def test_read_fragment__with_caching_disabled
     ActionController::Base.perform_caching = false
-    @store.write('name', 'value')
+    @store.write('views/name', 'value')
     assert_nil @controller.read_fragment('name')
   end
 
   def test_write_fragment__with_caching_enabled
-    assert_nil @store.read('name')
+    assert_nil @store.read('views/name')
     assert_equal 'value', @controller.write_fragment('name', 'value')
-    assert_equal 'value', @store.read('name')
+    assert_equal 'value', @store.read('views/name')
   end
 
   def test_write_fragment__with_caching_disabled
-    assert_nil @store.read('name')
+    assert_nil @store.read('views/name')
     ActionController::Base.perform_caching = false
     assert_equal nil, @controller.write_fragment('name', 'value')
-    assert_nil @store.read('name')
+    assert_nil @store.read('views/name')
   end
 
   def test_expire_fragment__with_simple_key
-    @store.write('name', 'value')
+    @store.write('views/name', 'value')
     @controller.expire_fragment 'name'
-    assert_nil @store.read('name')
+    assert_nil @store.read('views/name')
   end
 
   def test_expire_fragment__with__regexp
-    @store.write('name', 'value')
-    @store.write('another_name', 'another_value')
-    @store.write('primalgrasp', 'will not expire ;-)')
+    @store.write('views/name', 'value')
+    @store.write('views/another_name', 'another_value')
+    @store.write('views/primalgrasp', 'will not expire ;-)')
 
     @controller.expire_fragment /name/
 
-    assert_nil @store.read('name')
-    assert_nil @store.read('another_name')
-    assert_equal 'will not expire ;-)', @store.read('primalgrasp')
+    assert_nil @store.read('views/name')
+    assert_nil @store.read('views/another_name')
+    assert_equal 'will not expire ;-)', @store.read('views/primalgrasp')
   end
 
   def test_fragment_for__with_disabled_caching
     ActionController::Base.perform_caching = false
 
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     fragment_computed = false
 
     buffer = 'generated till now -&gt; '
@@ -430,7 +430,7 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
 
 
   def test_fragment_for
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     fragment_computed = false
 
     buffer = 'generated till now -&gt; '
@@ -441,7 +441,7 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
   end
 
   def test_cache_erb_fragment
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     _erbout = 'generated till now -&gt; '
 
     assert_equal( 'generated till now -&gt; fragment content',
@@ -449,7 +449,7 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
   end
 
   def test_cache_rxml_fragment
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     xml = 'generated till now -&gt; '
     class &lt;&lt; xml; def target!; to_s; end; end
 
@@ -458,7 +458,7 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
   end
 
   def test_cache_rjs_fragment
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     page = 'generated till now -&gt; '
 
     assert_equal( 'generated till now -&gt; fragment content',
@@ -466,7 +466,7 @@ class FragmentCachingTest &lt; Test::Unit::TestCase
   end
 
   def test_cache_rjs_fragment_debug_mode_does_not_interfere
-    @store.write('expensive', 'fragment content')
+    @store.write('views/expensive', 'fragment content')
     page = 'generated till now -&gt; '
 
     begin</diff>
      <filename>actionpack/test/controller/caching_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,47 +0,0 @@
-require File.dirname(__FILE__) + '/../abstract_unit'
-
-MemCache = Struct.new(:MemCache, :address) unless Object.const_defined?(:MemCache)
-
-class FragmentCacheStoreSettingTest &lt; Test::Unit::TestCase
-  def teardown
-    ActionController::Base.fragment_cache_store = ActionController::Caching::Fragments::MemoryStore.new
-  end
-  
-  def test_file_fragment_cache_store
-    ActionController::Base.fragment_cache_store = :file_store, &quot;/path/to/cache/directory&quot;
-    assert_kind_of(
-      ActionController::Caching::Fragments::FileStore,
-      ActionController::Base.fragment_cache_store
-    )
-    assert_equal &quot;/path/to/cache/directory&quot;, ActionController::Base.fragment_cache_store.cache_path
-  end
-  
-  def test_drb_fragment_cache_store
-    ActionController::Base.fragment_cache_store = :drb_store, &quot;druby://localhost:9192&quot;
-    assert_kind_of(
-      ActionController::Caching::Fragments::DRbStore,
-      ActionController::Base.fragment_cache_store
-    )
-    assert_equal &quot;druby://localhost:9192&quot;, ActionController::Base.fragment_cache_store.address
-  end
-
-  if defined? CGI::Session::MemCacheStore
-    def test_mem_cache_fragment_cache_store
-      ActionController::Base.fragment_cache_store = :mem_cache_store, &quot;localhost&quot;
-      assert_kind_of(
-        ActionController::Caching::Fragments::MemCacheStore,
-        ActionController::Base.fragment_cache_store
-      )
-      assert_equal %w(localhost), ActionController::Base.fragment_cache_store.addresses
-    end
-  end
-
-  def test_object_assigned_fragment_cache_store
-    ActionController::Base.fragment_cache_store = ActionController::Caching::Fragments::FileStore.new(&quot;/path/to/cache/directory&quot;)
-    assert_kind_of(
-      ActionController::Caching::Fragments::FileStore,
-      ActionController::Base.fragment_cache_store
-    )
-    assert_equal &quot;/path/to/cache/directory&quot;, ActionController::Base.fragment_cache_store.cache_path
-  end
-end</diff>
      <filename>actionpack/test/controller/fragment_store_setting_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,7 @@
 *SVN*
 
+* Added ActiveRecord::Base.cache_key to make it easier to cache Active Records in combination with the new ActiveSupport::Cache::* libraries [DHH]
+
 * Make sure CSV fixtures are compatible with ruby 1.9's new csv implementation. [JEG2]
 
 * Added by parameter to increment, decrement, and their bang varieties so you can do player1.increment!(:points, 5) #10542 [Sam]</diff>
      <filename>activerecord/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -1959,6 +1959,22 @@ module ActiveRecord #:nodoc:
         # We can't use alias_method here, because method 'id' optimizes itself on the fly.
         (id = self.id) ? id.to_s : nil # Be sure to stringify the id for routes
       end
+      
+      # Returns a cache key that can be used to identify this record. Examples:
+      #
+      #   Product.new.cache_key     # =&gt; &quot;products/new&quot;
+      #   Product.find(5).cache_key # =&gt; &quot;products/5&quot; (updated_at not available)
+      #   Person.find(5).cache_key  # =&gt; &quot;people/5-20071224150000&quot; (updated_at available)
+      def cache_key
+        case 
+        when new_record?
+          &quot;#{self.class.name.tableize}/new&quot;
+        when self[:updated_at]
+          &quot;#{self.class.name.tableize}/#{id}-#{updated_at.to_s(:number)}&quot;
+        else
+          &quot;#{self.class.name.tableize}/#{id}&quot;
+        end
+      end
 
       def id_before_type_cast #:nodoc:
         read_attribute_before_type_cast(self.class.primary_key)</diff>
      <filename>activerecord/lib/active_record/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,11 @@
 *SVN*
 
+* Added ActiveSupport::Gzip.decompress/compress(source) as an easy wrapper for Zlib [Tobias Luetke]
+
+* Included MemCache-Client to make the improved ActiveSupport::Cache::MemCacheStore work out of the box [Bob Cottrell, Eric Hodel]
+
+* Added ActiveSupport::Cache::* framework as an extraction from ActionController::Caching::Fragments::* [DHH]
+
 * Fixed String#titleize to work for strings with 's too #10571 [trek]
 
 * Changed the implementation of Enumerable#group_by to use a double array approach instead of a hash such that the insert order is honored [DHH/Marcel]</diff>
      <filename>activesupport/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,9 @@ require 'active_support/core_ext'
 require 'active_support/clean_logger'
 require 'active_support/buffered_logger'
 
+require 'active_support/gzip'
+require 'active_support/cache'
+
 require 'active_support/dependencies'
 require 'active_support/deprecation'
 </diff>
      <filename>activesupport/lib/active_support.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@ module ActiveSupport #:nodoc:
           :short        =&gt; &quot;%e %b&quot;,
           :long         =&gt; &quot;%B %e, %Y&quot;,
           :db           =&gt; &quot;%Y-%m-%d&quot;,
+          :number       =&gt; &quot;%Y%m%d&quot;,
           :long_ordinal =&gt; lambda { |date| date.strftime(&quot;%B #{date.day.ordinalize}, %Y&quot;) }, # =&gt; &quot;April 25th, 2007&quot;
           :rfc822       =&gt; &quot;%e %b %Y&quot;
         }</diff>
      <filename>activesupport/lib/active_support/core_ext/date/conversions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -94,6 +94,8 @@ module ActiveSupport #:nodoc:
             value.to_query(namespace ? &quot;#{namespace}[#{key}]&quot; : key)
           end.sort * '&amp;'
         end
+        
+        alias_method :to_param, :to_query
 
         def to_xml(options = {})
           options[:indent] ||= 2</diff>
      <filename>activesupport/lib/active_support/core_ext/hash/conversions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,6 +5,7 @@ module ActiveSupport #:nodoc:
       module Conversions
         DATE_FORMATS = {
           :db           =&gt; &quot;%Y-%m-%d %H:%M:%S&quot;,
+          :number       =&gt; &quot;%Y%m%d%H%M%S&quot;,
           :time         =&gt; &quot;%H:%M&quot;,
           :short        =&gt; &quot;%d %b %H:%M&quot;,
           :long         =&gt; &quot;%B %d, %Y %H:%M&quot;,</diff>
      <filename>activesupport/lib/active_support/core_ext/time/conversions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -12,3 +12,9 @@ begin
 rescue Gem::LoadError
   $:.unshift &quot;#{File.dirname(__FILE__)}/vendor/xml-simple-1.0.11&quot;
 end
+
+begin
+  gem 'memcache-client', '~&gt; 1.5.0'
+rescue Gem::LoadError
+  $:.unshift &quot;#{File.dirname(__FILE__)}/vendor/memcache-client-1.5.0&quot;
+end
\ No newline at end of file</diff>
      <filename>activesupport/lib/active_support/vendor.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,7 @@
 *SVN*
 
+* Added config.cache_store to environment options to control the default cache store (default is FileStore if tmp/cache is present, otherwise MemoryStore is used) [DHH]
+
 * Added that rails:update is run when you do rails:freeze:edge to ensure you also get the latest JS and config files #10565 [jeff]
 
 * SQLite: db:drop:all doesn't fail silently if the database is already open.  #10577 [Cheah Chu Yeow, mrichman]</diff>
      <filename>railties/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -58,29 +58,7 @@ module Rails
     end
 
     # Sequentially step through all of the available initialization routines,
-    # in order:
-    #
-    # * #check_ruby_version
-    # * #set_load_path
-    # * #require_frameworks
-    # * #set_autoload_paths
-    # * add_plugin_load_paths
-    # * #load_environment
-    # * #initialize_encoding
-    # * #initialize_database
-    # * #initialize_logger
-    # * #initialize_framework_logging
-    # * #initialize_framework_views
-    # * #initialize_dependency_mechanism
-    # * #initialize_whiny_nils
-    # * #initialize_temporary_directories
-    # * #initialize_framework_settings
-    # * #add_support_load_paths
-    # * #load_plugins
-    # * #load_observers
-    # * #initialize_routing
-    # * #after_initialize
-    # * #load_application_initializers
+    # in order (view execution order in source).
     def process
       check_ruby_version
       set_load_path
@@ -92,12 +70,17 @@ module Rails
 
       initialize_encoding
       initialize_database
+
+      initialize_cache
+      initialize_framework_caches
+
       initialize_logger
       initialize_framework_logging
+
       initialize_framework_views
       initialize_dependency_mechanism
       initialize_whiny_nils
-      initialize_temporary_directories
+      initialize_temporary_session_directory
       initialize_framework_settings
 
       add_support_load_paths
@@ -239,6 +222,18 @@ module Rails
       end
     end
 
+    def initialize_cache
+      unless defined?(RAILS_CACHE)
+        silence_warnings { Object.const_set &quot;RAILS_CACHE&quot;, ActiveSupport::Cache.lookup_store(configuration.cache_store) }
+      end
+    end
+
+    def initialize_framework_caches
+      if configuration.frameworks.include?(:action_controller)
+        ActionController::Base.cache_store ||= RAILS_CACHE
+      end
+    end
+
     # If the +RAILS_DEFAULT_LOGGER+ constant is already set, this initialization
     # routine does nothing. If the constant is not set, and Configuration#logger
     # is not +nil+, this also does nothing. Otherwise, a new logger instance
@@ -277,6 +272,8 @@ module Rails
       for framework in ([ :active_record, :action_controller, :action_mailer ] &amp; configuration.frameworks)
         framework.to_s.camelize.constantize.const_get(&quot;Base&quot;).logger ||= RAILS_DEFAULT_LOGGER
       end
+      
+      RAILS_CACHE.logger ||= RAILS_DEFAULT_LOGGER
     end
 
     # Sets +ActionController::Base#view_paths+ and +ActionMailer::Base#template_root+
@@ -309,15 +306,10 @@ module Rails
       require('active_support/whiny_nil') if configuration.whiny_nils
     end
 
-    def initialize_temporary_directories
+    def initialize_temporary_session_directory
       if configuration.frameworks.include?(:action_controller)
         session_path = &quot;#{configuration.root_path}/tmp/sessions/&quot;
         ActionController::Base.session_options[:tmpdir] = File.exist?(session_path) ? session_path : Dir::tmpdir
-
-        cache_path = &quot;#{configuration.root_path}/tmp/cache/&quot;
-        if File.exist?(cache_path)
-          ActionController::Base.fragment_cache_store = :file_store, cache_path
-        end
       end
     end
 
@@ -418,6 +410,9 @@ module Rails
     # used directly.
     attr_accessor :logger
 
+    # The specific cache store to use. By default, the ActiveSupport::Cache::Store will be used.
+    attr_accessor :cache_store
+
     # The root of the application's views. (Defaults to &lt;tt&gt;app/views&lt;/tt&gt;.)
     attr_accessor :view_path
 
@@ -647,6 +642,14 @@ module Rails
       def default_plugin_loader
         Plugin::Loader
       end
+      
+      def default_cache_store
+        if File.exist?(&quot;#{root_path}/tmp/cache/&quot;)
+          [ :file_store, &quot;#{root_path}/tmp/cache/&quot; ]
+        else
+          :memory_store
+        end
+      end
   end
 end
 </diff>
      <filename>railties/lib/initializer.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>288553540b5b2f37497cb19357b25ac12e0498fd</id>
    </parent>
  </parents>
  <author>
    <name>David Heinemeier Hansson</name>
    <login>dhh</login>
    <email>david@loudthinking.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/2a9ad9ccbc706e546bf02ec95f864944e7d7983b</url>
  <id>2a9ad9ccbc706e546bf02ec95f864944e7d7983b</id>
  <committed-date>2008-01-03T13:05:12-08:00</committed-date>
  <authored-date>2008-01-03T13:05:12-08:00</authored-date>
  <message>Moved the caching stores from ActionController::Caching::Fragments::* to ActiveSupport::Cache::*. If you're explicitly referring to a store, like ActionController::Caching::Fragments::MemoryStore, you need to update that reference with ActiveSupport::Cache::MemoryStore [DHH] Deprecated ActionController::Base.fragment_cache_store for ActionController::Base.cache_store [DHH] All fragment cache keys are now by default prefixed with the 'views/' namespace [DHH] Added ActiveRecord::Base.cache_key to make it easier to cache Active Records in combination with the new ActiveSupport::Cache::* libraries [DHH] Added ActiveSupport::Gzip.decompress/compress(source) as an easy wrapper for Zlib [Tobias Luetke] Included MemCache-Client to make the improved ActiveSupport::Cache::MemCacheStore work out of the box [Bob Cottrell, Eric Hodel] Added config.cache_store to environment options to control the default cache store (default is FileStore if tmp/cache is present, otherwise MemoryStore is used) [DHH]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8546 5ecf4fe2-1ee6-0310-87b1-e25e094e27de</message>
  <tree>868624e91f037840bfbf0aca30bb2ea1c9d78701</tree>
  <committer>
    <name>David Heinemeier Hansson</name>
    <login>dhh</login>
    <email>david@loudthinking.com</email>
  </committer>
</commit>
