[DRE-commits] [ruby-actionpack-action-caching] 01/08: New upstream version 1.2.0

Marc Dequènes duck at moszumanska.debian.org
Mon Sep 11 17:09:47 UTC 2017


This is an automated email from the git hooks/post-receive script.

duck pushed a commit to branch master
in repository ruby-actionpack-action-caching.

commit 994077fc3e0ada85bad66c5029b0618a500ba61c
Author: Marc Dequènes (Duck) <Duck at DuckCorp.org>
Date:   Tue Sep 12 01:10:05 2017 +0900

    New upstream version 1.2.0
---
 .codeclimate.yml                                |   7 +
 .gitignore                                      |  18 +-
 .rubocop.yml                                    | 116 +++++
 .travis.yml                                     |  41 +-
 CHANGELOG.md                                    |  36 +-
 Gemfile                                         |   4 +-
 README.md                                       |  72 +--
 Rakefile                                        |  10 +-
 actionpack-action_caching.gemspec               |  29 +-
 gemfiles/Gemfile-4-0-stable                     |   7 +-
 gemfiles/Gemfile-4-1-stable                     |   6 +
 gemfiles/Gemfile-4-2-stable                     |  10 +
 gemfiles/Gemfile-5-0-stable                     |   5 +
 gemfiles/Gemfile-edge                           |   7 +-
 lib/action_controller/action_caching.rb         |   2 +-
 lib/action_controller/caching/actions.rb        |  77 ++-
 lib/actionpack/action_caching.rb                |   2 +-
 lib/actionpack/action_caching/railtie.rb        |   6 +-
 metadata.yml                                    | 117 -----
 test/abstract_unit.rb                           |  45 +-
 test/caching_test.rb                            | 609 +++++++++++++++++++-----
 test/fixtures/layouts/talk_from_action.erb      |   2 -
 test/fixtures/layouts/talk_from_action.html.erb |   2 +
 23 files changed, 844 insertions(+), 386 deletions(-)

diff --git a/.codeclimate.yml b/.codeclimate.yml
new file mode 100644
index 0000000..18f3dbb
--- /dev/null
+++ b/.codeclimate.yml
@@ -0,0 +1,7 @@
+engines:
+  rubocop:
+    enabled: true
+
+ratings:
+  paths:
+  - "**.rb"
diff --git a/.gitignore b/.gitignore
index d87d4be..f4e3708 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,5 @@
-*.gem
-*.rbc
-.bundle
-.config
-.yardoc
+.ruby-version
 Gemfile.lock
-InstalledFiles
-_yardoc
-coverage
-doc/
-lib/bundler/man
-pkg
-rdoc
-spec/reports
+gemfiles/*.lock
+pkg/*
 test/tmp
-test/version_tmp
-tmp
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..34ec2a5
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,116 @@
+AllCops:
+  TargetRubyVersion: 2.2
+  # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
+  # to ignore them, so only the ones explicitly set in this file are enabled.
+  DisabledByDefault: true
+
+# Prefer &&/|| over and/or.
+Style/AndOr:
+  Enabled: true
+
+# Do not use braces for hash literals when they are the last argument of a
+# method call.
+Style/BracesAroundHashParameters:
+  Enabled: true
+
+# Align `when` with `case`.
+Style/CaseIndentation:
+  Enabled: true
+
+# Align comments with method definitions.
+Style/CommentIndentation:
+  Enabled: true
+
+# No extra empty lines.
+Style/EmptyLines:
+  Enabled: true
+
+# In a regular class definition, no empty lines around the body.
+Style/EmptyLinesAroundClassBody:
+  Enabled: true
+
+# In a regular module definition, no empty lines around the body.
+Style/EmptyLinesAroundModuleBody:
+  Enabled: true
+
+# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
+Style/HashSyntax:
+  Enabled: true
+
+# Method definitions after `private` or `protected` isolated calls need one
+# extra level of indentation.
+Style/IndentationConsistency:
+  Enabled: true
+  EnforcedStyle: rails
+
+# Two spaces, no tabs (for indentation).
+Style/IndentationWidth:
+  Enabled: true
+
+Style/SpaceAfterColon:
+  Enabled: true
+
+Style/SpaceAfterComma:
+  Enabled: true
+
+Style/SpaceAroundEqualsInParameterDefault:
+  Enabled: true
+
+Style/SpaceAroundKeyword:
+  Enabled: true
+
+Style/SpaceAroundOperators:
+  Enabled: true
+
+Style/SpaceBeforeFirstArg:
+    Enabled: true
+
+# Defining a method with parameters needs parentheses.
+Style/MethodDefParentheses:
+  Enabled: true
+
+# Use `foo {}` not `foo{}`.
+Style/SpaceBeforeBlockBraces:
+  Enabled: true
+
+# Use `foo { bar }` not `foo {bar}`.
+Style/SpaceInsideBlockBraces:
+  Enabled: true
+
+# Use `{ a: 1 }` not `{a:1}`.
+Style/SpaceInsideHashLiteralBraces:
+  Enabled: true
+
+Style/SpaceInsideParens:
+  Enabled: true
+
+# Check quotes usage according to lint rule below.
+Style/StringLiterals:
+  Enabled: true
+  EnforcedStyle: double_quotes
+
+# Detect hard tabs, no hard tabs.
+Style/Tab:
+  Enabled: true
+
+# Blank lines should not have any spaces.
+Style/TrailingBlankLines:
+  Enabled: true
+
+# No trailing whitespace.
+Style/TrailingWhitespace:
+  Enabled: true
+
+# Use quotes for string literals when they are enough.
+Style/UnneededPercentQ:
+  Enabled: true
+
+# Align `end` with the matching keyword or starting expression except for
+# assignments, where it should be aligned with the LHS.
+Lint/EndAlignment:
+  Enabled: true
+  AlignWith: variable
+
+# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
+Lint/RequireParentheses:
+  Enabled: true
diff --git a/.travis.yml b/.travis.yml
index 5e74365..d1a4516 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,55 @@
 language: ruby
+sudo: false
+
+cache:
+  bundler: true
+
 before_install:
   - gem install bundler
+
 rvm:
   - 1.9.3
   - 2.0.0
+  - 2.1.9
+  - 2.2.6
+  - 2.3.3
+  - 2.4.0
+
 gemfile:
   - Gemfile
-  - gemfiles/Gemfile-edge
   - gemfiles/Gemfile-4-0-stable
+  - gemfiles/Gemfile-4-1-stable
+  - gemfiles/Gemfile-4-2-stable
+  - gemfiles/Gemfile-5-0-stable
+  - gemfiles/Gemfile-edge
+
 matrix:
   allow_failures:
     - gemfile: gemfiles/Gemfile-edge
+  exclude:
+    - rvm: 1.9.3
+      gemfile: Gemfile
+    - rvm: 2.0.0
+      gemfile: Gemfile
+    - rvm: 2.1.9
+      gemfile: Gemfile
+    - rvm: 1.9.3
+      gemfile: gemfiles/Gemfile-5-0-stable
+    - rvm: 2.0.0
+      gemfile: gemfiles/Gemfile-5-0-stable
+    - rvm: 2.1.9
+      gemfile: gemfiles/Gemfile-5-0-stable
+    - rvm: 1.9.3
+      gemfile: gemfiles/Gemfile-edge
+    - rvm: 2.0.0
+      gemfile: gemfiles/Gemfile-edge
+    - rvm: 2.1.9
+      gemfile: gemfiles/Gemfile-edge
+    - rvm: 2.4.0
+      gemfile: gemfiles/Gemfile-4-0-stable
+    - rvm: 2.4.0
+      gemfile: gemfiles/Gemfile-4-1-stable
+
 notifications:
   email: false
   irc:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10960cf..e6f234f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,41 @@
-## 1.1.1
+## 1.2.0 (January 23, 2014)
+
+*   Support proc options with zero arguments
+
+    Fixes #40.
+
+    *Andrew White*
+
+*   The options `:layout` and `:cache_path` now behave the same when
+    passed a `Symbol`, `Proc` or object that responds to call.
+
+    *Andrew White*
+
+*   Respect `Accept` header when caching actions
+
+    Fixes #18.
+
+    *Andrew White*
+
+*   Support Rails 4.0, 4.1, 4.2, 5.0 and edge
+
+    *Eileen Uchitelle*, *Andrew White*
+
+*   Call `to_s` on the extension as it may be a symbol
+
+    Fixes #10.
+
+    *Andrew White*
+
+
+## 1.1.1 (January 2, 2014)
 
 *   Fix load order problem with other gems
 
     *Andrew White*
 
-## 1.1.0
+
+## 1.1.0 (November 1, 2013)
 
 *   Allow to use non-proc object in `cache_path` option. You can pass an object that
     responds to a `call` method.
@@ -24,6 +55,7 @@
 
     *Piotr Niełacny*
 
+
 ## 1.0.0 (February 28, 2013)
 
 *   Extract Action Pack - Action Caching from Rails core.
diff --git a/Gemfile b/Gemfile
index ef52326..b473cf7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
 
 gemspec
 
-gem 'rails'
+gem "rails"
diff --git a/README.md b/README.md
index 757cf29..abb1497 100644
--- a/README.md
+++ b/README.md
@@ -3,14 +3,12 @@ actionpack-action_caching
 
 Action caching for Action Pack (removed from core in Rails 4.0).
 
-**NOTE:** It will continue to be officially maintained until Rails 4.1.
-
 Installation
 ------------
 
 Add this line to your application's Gemfile:
 
-    gem 'actionpack-action_caching'
+    gem "actionpack-action_caching"
 
 And then execute:
 
@@ -31,7 +29,7 @@ authentication and other restrictions on whether someone is allowed
 to execute such action.
 
     class ListsController < ApplicationController
-      before_filter :authenticate, except: :public
+      before_action :authenticate, except: :public
 
       caches_page   :public
       caches_action :index, :show
@@ -56,17 +54,18 @@ Different representations of the same resource, e.g.
 `http://david.example.com/lists.xml`
 are treated like separate requests and so are cached separately.
 Keep in mind when expiring an action cache that
-`action: 'lists'` is not the same as
-`action: 'list', format: :xml`.
+`action: "lists"` is not the same as
+`action: "list", format: :xml`.
 
 You can modify the default action cache path by passing a
 `:cache_path` option. This will be passed directly to
 `ActionCachePath.new`. 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.
+proc (or an object that responds to `to_proc`) is given, it is
+called with the current controller instance.
 
-And you can also use `:if` (or `:unless`) to pass a
-proc that specifies when the action should be cached.
+And you can also use `:if` (or `:unless`) to control when the action
+should be cached, similar to how you use them with `before_action`.
 
 As of Rails 3.0, you can also pass `:expires_in` with a time
 interval (in seconds) to schedule expiration of the cached item.
@@ -74,38 +73,45 @@ interval (in seconds) to schedule expiration of the cached item.
 The following example depicts some of the points made above:
 
     class ListsController < ApplicationController
-      before_filter :authenticate, except: :public
+      before_action :authenticate, except: :public
+
+      # simple fragment cache
+      caches_action :current
+
+      # expire cache after an hour
+      caches_action :archived, expires_in: 1.hour
 
-      caches_page :public
+      # cache unless it's a JSON request
+      caches_action :index, unless: -> { request.format.json? }
 
-      caches_action :index, if: Proc.new do
-        !request.format.json?  # cache if is not a JSON request
-      end
+      # custom cache path
+      caches_action :show, cache_path: { project: 1 }
 
-      caches_action :show, cache_path: { project: 1 },
-        expires_in: 1.hour
+      # custom cache path with a proc
+      caches_action :history, cache_path: -> { request.domain }
 
-      caches_action :feed, cache_path: Proc.new do
-        if params[:user_id]
-          user_list_url(params[:user_id], params[:id])
-        else
-          list_url(params[:id])
+      # custom cache path with a symbol
+      caches_action :feed, cache_path: :user_cache_path
+
+      protected
+        def user_cache_path
+          if params[:user_id]
+            user_list_url(params[:user_id], params[:id])
+          else
+            list_url(params[:id])
+          end
         end
-      end
     end
 
 If you pass `layout: false`, it will only cache your action
 content. That's useful when your layout has dynamic information.
 
-Warning: If the format of the request is determined by the Accept HTTP
-header the Content-Type of the cached response could be wrong because
-no information about the MIME type is stored in the cache key. So, if
-you first ask for MIME type M in the Accept header, a cache entry is
-created, and then perform a second request to the same resource asking
-for a different MIME type, you'd get the content cached for M.
-
-The `:format` parameter is taken into account though. The safest
-way to cache by MIME type is to pass the format in the route.
+Note: Both the `:format` param and the `Accept` header are taken
+into account when caching the fragment with the `:format` having
+precedence. For backwards compatibility when the `Accept` header
+indicates a HTML request the fragment is stored without the
+extension but if an explicit `"html"` is passed in `:format` then
+that _is_ used for storing the fragment.
 
 Contributing
 ------------
@@ -119,5 +125,5 @@ Contributing
 Code Status
 -----------
 
-* [![Build Status](https://travis-ci.org/rails/actionpack-action_caching.png?branch=master)](https://travis-ci.org/rails/actionpack-action_caching)
-* [![Dependency Status](https://gemnasium.com/rails/actionpack-action_caching.png)](https://gemnasium.com/rails/actionpack-action_caching)
+* [![Build Status](https://travis-ci.org/rails/actionpack-action_caching.svg?branch=master)](https://travis-ci.org/rails/actionpack-action_caching)
+* [![Dependency Status](https://gemnasium.com/rails/actionpack-action_caching.svg)](https://gemnasium.com/rails/actionpack-action_caching)
diff --git a/Rakefile b/Rakefile
index 95e7910..6efeb91 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,11 +1,11 @@
 #!/usr/bin/env rake
-require 'bundler/gem_tasks'
-require 'rake/testtask'
+require "bundler/gem_tasks"
+require "rake/testtask"
 
 Rake::TestTask.new do |t|
-  t.libs = ['test']
-  t.pattern = 'test/**/*_test.rb'
-  t.ruby_opts = ['-w']
+  t.libs = ["test"]
+  t.pattern = "test/**/*_test.rb"
+  t.ruby_opts = ["-w"]
 end
 
 task default: :test
diff --git a/actionpack-action_caching.gemspec b/actionpack-action_caching.gemspec
index ff7e0d7..2bc1eec 100644
--- a/actionpack-action_caching.gemspec
+++ b/actionpack-action_caching.gemspec
@@ -1,22 +1,21 @@
-# -*- encoding: utf-8 -*-
-
 Gem::Specification.new do |gem|
-  gem.name          = 'actionpack-action_caching'
-  gem.version       = '1.1.1'
-  gem.author        = 'David Heinemeier Hansson'
-  gem.email         = 'david at loudthinking.com'
-  gem.description   = 'Action caching for Action Pack (removed from core in Rails 4.0)'
-  gem.summary       = 'Action caching for Action Pack (removed from core in Rails 4.0)'
-  gem.homepage      = 'https://github.com/rails/actionpack-action_caching'
+  gem.name          = "actionpack-action_caching"
+  gem.version       = "1.2.0"
+  gem.author        = "David Heinemeier Hansson"
+  gem.email         = "david at loudthinking.com"
+  gem.description   = "Action caching for Action Pack (removed from core in Rails 4.0)"
+  gem.summary       = "Action caching for Action Pack (removed from core in Rails 4.0)"
+  gem.homepage      = "https://github.com/rails/actionpack-action_caching"
 
+  gem.required_ruby_version = ">= 1.9.3"
   gem.files         = `git ls-files`.split($/)
-  gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
+  gem.executables   = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
   gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
-  gem.require_paths = ['lib']
-  gem.license       = 'MIT'
+  gem.require_paths = ["lib"]
+  gem.license       = "MIT"
 
-  gem.add_dependency 'actionpack', '>= 4.0.0', '< 5.0'
+  gem.add_dependency "actionpack", ">= 4.0.0", "< 6"
 
-  gem.add_development_dependency 'mocha'
-  gem.add_development_dependency 'activerecord', '>= 4.0.0.beta', '< 5'
+  gem.add_development_dependency "mocha"
+  gem.add_development_dependency "activerecord", ">= 4.0.0", "< 6"
 end
diff --git a/gemfiles/Gemfile-4-0-stable b/gemfiles/Gemfile-4-0-stable
index c0cb216..f1e23a7 100644
--- a/gemfiles/Gemfile-4-0-stable
+++ b/gemfiles/Gemfile-4-0-stable
@@ -1,5 +1,6 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
 
-gemspec path: '..'
+gemspec path: ".."
 
-gem 'rails', github: 'rails/rails', branch: '4-0-stable'
+gem "rails", github: "rails/rails", branch: "4-0-stable"
+gem "mime-types", "< 3"
diff --git a/gemfiles/Gemfile-4-1-stable b/gemfiles/Gemfile-4-1-stable
new file mode 100644
index 0000000..0c05078
--- /dev/null
+++ b/gemfiles/Gemfile-4-1-stable
@@ -0,0 +1,6 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "4-1-stable"
+gem "mime-types", "< 3"
diff --git a/gemfiles/Gemfile-4-2-stable b/gemfiles/Gemfile-4-2-stable
new file mode 100644
index 0000000..4089561
--- /dev/null
+++ b/gemfiles/Gemfile-4-2-stable
@@ -0,0 +1,10 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "4-2-stable"
+gem "mime-types", "< 3"
+
+if RUBY_VERSION < "2.1"
+  gem "nokogiri", "< 1.7"
+end
diff --git a/gemfiles/Gemfile-5-0-stable b/gemfiles/Gemfile-5-0-stable
new file mode 100644
index 0000000..9e3aa5c
--- /dev/null
+++ b/gemfiles/Gemfile-5-0-stable
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gemspec path: ".."
+
+gem "rails", github: "rails/rails", branch: "5-0-stable"
diff --git a/gemfiles/Gemfile-edge b/gemfiles/Gemfile-edge
index 4b72e7d..689c9a5 100644
--- a/gemfiles/Gemfile-edge
+++ b/gemfiles/Gemfile-edge
@@ -1,5 +1,6 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
 
-gemspec path: '..'
+gemspec path: ".."
 
-gem 'rails', github: 'rails/rails', branch: 'master'
+gem "rails", github: "rails/rails", branch: "master"
+gem "arel", github: "rails/arel", branch: "master"
diff --git a/lib/action_controller/action_caching.rb b/lib/action_controller/action_caching.rb
index b5e630a..8e04000 100644
--- a/lib/action_controller/action_caching.rb
+++ b/lib/action_controller/action_caching.rb
@@ -1,4 +1,4 @@
-require 'action_controller/caching/actions'
+require "action_controller/caching/actions"
 
 module ActionController
   module Caching
diff --git a/lib/action_controller/caching/actions.rb b/lib/action_controller/caching/actions.rb
index 280f80c..0127d61 100644
--- a/lib/action_controller/caching/actions.rb
+++ b/lib/action_controller/caching/actions.rb
@@ -1,4 +1,4 @@
-require 'set'
+require "set"
 
 module ActionController
   module Caching
@@ -10,7 +10,7 @@ module ActionController
     # to execute such action.
     #
     #   class ListsController < ApplicationController
-    #     before_filter :authenticate, except: :public
+    #     before_action :authenticate, except: :public
     #
     #     caches_page   :public
     #     caches_action :index, :show
@@ -35,8 +35,8 @@ module ActionController
     # <tt>http://david.example.com/lists.xml</tt>
     # are treated like separate requests and so are cached separately.
     # Keep in mind when expiring an action cache that
-    # <tt>action: 'lists'</tt> is not the same as
-    # <tt>action: 'lists', format: :xml</tt>.
+    # <tt>action: "lists"</tt> is not the same as
+    # <tt>action: "lists", format: :xml</tt>.
     #
     # You can modify the default action cache path by passing a
     # <tt>:cache_path</tt> option. This will be passed directly to
@@ -66,7 +66,7 @@ module ActionController
     #
     #
     #   class ListsController < ApplicationController
-    #     before_filter :authenticate, except: :public
+    #     before_action :authenticate, except: :public
     #
     #     caches_page :public
     #
@@ -85,7 +85,7 @@ module ActionController
     #       end
     #     end
     #
-    #     caches_action :posts, cache_path: CachePathCreator.new('posts')
+    #     caches_action :posts, cache_path: CachePathCreator.new("posts")
     #   end
     #
     # If you pass <tt>layout: false</tt>, it will only cache your action
@@ -113,12 +113,12 @@ module ActionController
           filter_options = options.extract!(:if, :unless).merge(only: actions)
           cache_options  = options.extract!(:layout, :cache_path).merge(store_options: options)
 
-          around_filter ActionCacheFilter.new(cache_options), filter_options
+          around_action ActionCacheFilter.new(cache_options), filter_options
         end
       end
 
       def _save_fragment(name, options)
-        content = ''
+        content = ""
         response_body.each do |parts|
           content << parts
         end
@@ -152,16 +152,8 @@ module ActionController
         end
 
         def around(controller)
-          cache_layout = @cache_layout.respond_to?(:call) ? @cache_layout.call(controller) : @cache_layout
-
-          path_options = if @cache_path.is_a?(Proc)
-            controller.instance_exec(controller, &@cache_path)
-          elsif @cache_path.respond_to?(:call)
-            @cache_path.call(controller)
-          else
-            @cache_path
-          end
-
+          cache_layout = expand_option(controller, @cache_layout)
+          path_options = expand_option(controller, @cache_path)
           cache_path = ActionCachePath.new(controller, path_options || {})
 
           body = controller.read_fragment(cache_path.path, @store_options)
@@ -173,11 +165,41 @@ module ActionController
             body = controller._save_fragment(cache_path.path, @store_options)
           end
 
-          body = controller.render_to_string(text: body, layout: true) unless cache_layout
+          body = render_to_string(controller, body) unless cache_layout
 
           controller.response_body = body
           controller.content_type = Mime[cache_path.extension || :html]
         end
+
+        if ActionPack::VERSION::STRING < "4.1"
+          def render_to_string(controller, body)
+            controller.render_to_string(text: body, layout: true)
+          end
+        else
+          def render_to_string(controller, body)
+            controller.render_to_string(html: body, layout: true)
+          end
+        end
+
+        private
+          def expand_option(controller, option)
+            option = option.to_proc if option.respond_to?(:to_proc)
+
+            if option.is_a?(Proc)
+              case option.arity
+              when -2, -1, 1
+                controller.instance_exec(controller, &option)
+              when 0
+                controller.instance_exec(&option)
+              else
+                raise ArgumentError, "Invalid proc arity of #{option.arity} - proc options should have an arity of 0 or 1"
+              end
+            elsif option.respond_to?(:call)
+              option.call(controller)
+            else
+              option
+            end
+          end
       end
 
       class ActionCachePath
@@ -189,19 +211,26 @@ module ActionController
         # request format.
         def initialize(controller, options = {}, infer_extension = true)
           if infer_extension
-            @extension = controller.params[:format]
+            if controller.params.key?(:format)
+              @extension = controller.params[:format]
+            elsif !controller.request.format.html?
+              @extension = controller.request.format.to_sym
+            else
+              @extension = nil
+            end
+
             options.reverse_merge!(format: @extension) if options.is_a?(Hash)
           end
 
-          path = controller.url_for(options).split('://', 2).last
+          path = controller.url_for(options).split("://", 2).last
           @path = normalize!(path)
         end
 
       private
         def normalize!(path)
-          ext = URI.parser.escape(extension) if extension
-          path << 'index' if path[-1] == ?/
-          path << ".#{ext}" if extension and !path.split('?', 2).first.ends_with?(".#{ext}")
+          ext = URI.parser.escape(extension.to_s) if extension
+          path << "index" if path[-1] == ?/
+          path << ".#{ext}" if extension && !path.split("?", 2).first.ends_with?(".#{ext}")
           URI.parser.unescape(path)
         end
       end
diff --git a/lib/actionpack/action_caching.rb b/lib/actionpack/action_caching.rb
index 4f29f19..39c2792 100644
--- a/lib/actionpack/action_caching.rb
+++ b/lib/actionpack/action_caching.rb
@@ -1 +1 @@
-require 'action_controller/action_caching'
+require "actionpack/action_caching/railtie"
diff --git a/lib/actionpack/action_caching/railtie.rb b/lib/actionpack/action_caching/railtie.rb
index 8b09ad5..4708597 100644
--- a/lib/actionpack/action_caching/railtie.rb
+++ b/lib/actionpack/action_caching/railtie.rb
@@ -1,11 +1,11 @@
-require 'rails/railtie'
+require "rails/railtie"
 
 module ActionPack
   module ActionCaching
     class Railtie < Rails::Railtie
-      initializer 'action_pack.action_caching' do
+      initializer "action_pack.action_caching" do
         ActiveSupport.on_load(:action_controller) do
-          require 'action_controller/action_caching'
+          require "action_controller/action_caching"
         end
       end
     end
diff --git a/metadata.yml b/metadata.yml
deleted file mode 100644
index 70604a1..0000000
--- a/metadata.yml
+++ /dev/null
@@ -1,117 +0,0 @@
---- !ruby/object:Gem::Specification
-name: actionpack-action_caching
-version: !ruby/object:Gem::Version
-  version: 1.1.1
-platform: ruby
-authors:
-- David Heinemeier Hansson
-autorequire: 
-bindir: bin
-cert_chain: []
-date: 2014-01-02 00:00:00.000000000 Z
-dependencies:
-- !ruby/object:Gem::Dependency
-  name: actionpack
-  requirement: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 4.0.0
-    - - "<"
-      - !ruby/object:Gem::Version
-        version: '5.0'
-  type: :runtime
-  prerelease: false
-  version_requirements: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 4.0.0
-    - - "<"
-      - !ruby/object:Gem::Version
-        version: '5.0'
-- !ruby/object:Gem::Dependency
-  name: mocha
-  requirement: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: '0'
-  type: :development
-  prerelease: false
-  version_requirements: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: '0'
-- !ruby/object:Gem::Dependency
-  name: activerecord
-  requirement: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 4.0.0.beta
-    - - "<"
-      - !ruby/object:Gem::Version
-        version: '5'
-  type: :development
-  prerelease: false
-  version_requirements: !ruby/object:Gem::Requirement
-    requirements:
-    - - ">="
-      - !ruby/object:Gem::Version
-        version: 4.0.0.beta
-    - - "<"
-      - !ruby/object:Gem::Version
-        version: '5'
-description: Action caching for Action Pack (removed from core in Rails 4.0)
-email: david at loudthinking.com
-executables: []
-extensions: []
-extra_rdoc_files: []
-files:
-- ".gitignore"
-- ".travis.yml"
-- CHANGELOG.md
-- Gemfile
-- LICENSE.txt
-- README.md
-- Rakefile
-- actionpack-action_caching.gemspec
-- gemfiles/Gemfile-4-0-stable
-- gemfiles/Gemfile-edge
-- lib/action_controller/action_caching.rb
-- lib/action_controller/caching/actions.rb
-- lib/actionpack/action_caching.rb
-- lib/actionpack/action_caching/railtie.rb
-- test/abstract_unit.rb
-- test/caching_test.rb
-- test/fixtures/layouts/talk_from_action.erb
-homepage: https://github.com/rails/actionpack-action_caching
-licenses:
-- MIT
-metadata: {}
-post_install_message: 
-rdoc_options: []
-require_paths:
-- lib
-required_ruby_version: !ruby/object:Gem::Requirement
-  requirements:
-  - - ">="
-    - !ruby/object:Gem::Version
-      version: '0'
-required_rubygems_version: !ruby/object:Gem::Requirement
-  requirements:
-  - - ">="
-    - !ruby/object:Gem::Version
-      version: '0'
-requirements: []
-rubyforge_project: 
-rubygems_version: 2.2.0
-signing_key: 
-specification_version: 4
-summary: Action caching for Action Pack (removed from core in Rails 4.0)
-test_files:
-- test/abstract_unit.rb
-- test/caching_test.rb
-- test/fixtures/layouts/talk_from_action.erb
diff --git a/test/abstract_unit.rb b/test/abstract_unit.rb
index 9407a31..dbd6a1b 100644
--- a/test/abstract_unit.rb
+++ b/test/abstract_unit.rb
@@ -1,40 +1,11 @@
-require 'bundler/setup'
-require 'minitest/autorun'
-require 'action_controller'
-require 'active_record'
-require 'action_controller/action_caching'
+require "bundler/setup"
+require "minitest/autorun"
+require "action_controller"
+require "active_record"
+require "action_controller/action_caching"
 
-FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
+FIXTURE_LOAD_PATH = File.expand_path("../fixtures", __FILE__)
 
-SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
-
-module ActionController
-  class Base
-    include SharedTestRoutes.url_helpers
-
-    self.view_paths = FIXTURE_LOAD_PATH
-  end
-
-  class TestCase
-    def setup
-      @routes = SharedTestRoutes
-
-      @routes.draw do
-        get ':controller(/:action)'
-      end
-    end
-  end
-end
-
-module RackTestUtils
-  def body_to_string(body)
-    if body.respond_to?(:each)
-      str = ''
-      body.each {|s| str << s }
-      str
-    else
-      body
-    end
-  end
-  extend self
+if ActiveSupport.respond_to?(:test_order)
+  ActiveSupport.test_order = :random
 end
diff --git a/test/caching_test.rb b/test/caching_test.rb
index 1e3d739..49b3d3b 100644
--- a/test/caching_test.rb
+++ b/test/caching_test.rb
@@ -1,8 +1,10 @@
-require 'abstract_unit'
+require "abstract_unit"
+require "mocha/setup"
 
-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)
+CACHE_DIR = "test_cache"
+# Don't change "../tmp" cavalierly or you might hose something you don't want hosed
+TEST_TMP_DIR = File.expand_path("../tmp", __FILE__)
+FILE_STORE_PATH = File.join(TEST_TMP_DIR, CACHE_DIR)
 
 class CachingController < ActionController::Base
   abstract!
@@ -12,7 +14,7 @@ end
 
 class CachePath
   def call(controller)
-    ['controller', controller.params[:id]].compact.join('-')
+    ["controller", controller.params[:id]].compact.join("-")
   end
 end
 
@@ -23,99 +25,159 @@ class ActionCachingTestController < CachingController
     rescue_from(ActiveRecord::RecordNotFound) { head :not_found }
   end
 
-  # Eliminate uninitialized ivar warning
-  before_filter { @title = nil }
+  self.view_paths = FIXTURE_LOAD_PATH
 
-  caches_action :index, :redirected, :forbidden, if: Proc.new { |c| c.request.format && !c.request.format.json? }, expires_in: 1.hour
-  caches_action :show, cache_path: 'http://test.host/custom/show'
-  caches_action :edit, cache_path: Proc.new { |c| c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : 'http://test.host/edit' }
+  before_action only: :with_symbol_format do
+    request.params[:format] = :json
+  end
+
+  caches_action :index, :redirected, :forbidden, if: ->(c) { c.request.format && !c.request.format.json? }, expires_in: 1.hour
+  caches_action :show, cache_path: "http://test.host/custom/show"
+  caches_action :edit, cache_path: ->(c) { c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : "http://test.host/edit" }
   caches_action :custom_cache_path, cache_path: CachePath.new
+  caches_action :symbol_cache_path, cache_path: :cache_path_protected_method
   caches_action :with_layout
-  caches_action :with_format_and_http_param, cache_path: Proc.new { |c| { key: 'value' } }
+  caches_action :with_format_and_http_param, cache_path: ->(c) { { key: "value" } }
+  caches_action :with_symbol_format, cache_path: "http://test.host/action_caching_test/with_symbol_format"
+  caches_action :not_url_cache_path, cache_path: ->(c) { "#{c.params[:action]}_key" }
+  caches_action :not_url_cache_path_no_args, cache_path: -> { "#{params[:action]}_key" }
   caches_action :layout_false, layout: false
-  caches_action :with_layout_proc_param, layout: Proc.new { |c| c.params[:layout] }
+  caches_action :with_layout_proc_param, layout: ->(c) { c.params[:layout] != "false" }
+  caches_action :with_layout_proc_param_no_args, layout: -> { params[:layout] != "false" }
   caches_action :record_not_found, :four_oh_four, :simple_runtime_error
   caches_action :streaming
   caches_action :invalid
+  caches_action :accept
 
-  layout 'talk_from_action'
+  layout "talk_from_action"
 
   def index
     @cache_this = MockTime.now.to_f.to_s
-    render text: @cache_this
+    render plain: @cache_this
   end
 
   def redirected
-    redirect_to action: 'index'
+    redirect_to action: "index"
   end
 
   def forbidden
-    render text: 'Forbidden'
-    response.status = '403 Forbidden'
+    render plain: "Forbidden"
+    response.status = "403 Forbidden"
   end
 
   def with_layout
     @cache_this = MockTime.now.to_f.to_s
-    @title = nil
-    render text: @cache_this, layout: true
+    render html: @cache_this, layout: true
   end
 
   def with_format_and_http_param
     @cache_this = MockTime.now.to_f.to_s
-    render text: @cache_this
+    render plain: @cache_this
+  end
+
+  def with_symbol_format
+    @cache_this = MockTime.now.to_f.to_s
+    render json: { timestamp: @cache_this }
+  end
+
+  def not_url_cache_path
+    render plain: "cache_this"
   end
+  alias_method :not_url_cache_path_no_args, :not_url_cache_path
 
   def record_not_found
-    raise ActiveRecord::RecordNotFound, 'oops!'
+    raise ActiveRecord::RecordNotFound, "oops!"
   end
 
   def four_oh_four
-    render text: "404'd!", status: 404
+    render plain: "404'd!", status: 404
   end
 
   def simple_runtime_error
-    raise 'oops!'
+    raise "oops!"
   end
 
   alias_method :show, :index
   alias_method :edit, :index
   alias_method :destroy, :index
   alias_method :custom_cache_path, :index
+  alias_method :symbol_cache_path, :index
   alias_method :layout_false, :with_layout
   alias_method :with_layout_proc_param, :with_layout
+  alias_method :with_layout_proc_param_no_args, :with_layout
 
   def expire
-    expire_action controller: 'action_caching_test', action: 'index'
-    render nothing: true
+    expire_action controller: "action_caching_test", action: "index"
+    head :ok
   end
 
   def expire_xml
-    expire_action controller: 'action_caching_test', action: 'index', format: 'xml'
-    render nothing: true
+    expire_action controller: "action_caching_test", action: "index", format: "xml"
+    head :ok
   end
 
   def expire_with_url_string
-    expire_action url_for(controller: 'action_caching_test', action: 'index')
-    render nothing: true
+    expire_action url_for(controller: "action_caching_test", action: "index")
+    head :ok
   end
 
   def streaming
-    render text: 'streaming', stream: true
+    render plain: "streaming", stream: true
   end
 
   def invalid
     @cache_this = MockTime.now.to_f.to_s
 
     respond_to do |format|
-      format.json{ render json: @cache_this }
+      format.json { render json: @cache_this }
     end
   end
+
+  def accept
+    @cache_this = MockTime.now.to_f.to_s
+
+    respond_to do |format|
+      format.html { render html: @cache_this }
+      format.json { render json: @cache_this }
+    end
+  end
+
+  def expire_accept
+    if params.key?(:format)
+      expire_action action: "accept", format: params[:format]
+    elsif !request.format.html?
+      expire_action action: "accept", format: request.format.to_sym
+    else
+      expire_action action: "accept"
+    end
+
+    head :ok
+  end
+
+  protected
+    def cache_path_protected_method
+      ["controller", params[:id]].compact.join("-")
+    end
+
+    if ActionPack::VERSION::STRING < "4.1"
+      def render(options)
+        if options.key?(:plain)
+          super({ text: options.delete(:plain) }.merge(options))
+          response.content_type = "text/plain"
+        elsif options.key?(:html)
+          super({ text: options.delete(:html) }.merge(options))
+          response.content_type = "text/html"
+        else
+          super
+        end
+      end
+    end
 end
 
 class MockTime < Time
   # Let Time spicy to assure that Time.now != Time.now
   def to_f
-    super+rand
+    super + rand
   end
 end
 
@@ -136,9 +198,9 @@ class ActionCachingMockController
   end
 
   def request
-    Object.new.instance_eval(<<-EVAL)
-      def path; '#{@mock_path}' end
-      def format; 'all' end
+    Object.new.instance_eval <<-EVAL
+      def path; "#{@mock_path}" end
+      def format; "all" end
       def parameters; { format: nil }; end
       self
     EVAL
@@ -150,7 +212,10 @@ class ActionCacheTest < ActionController::TestCase
 
   def setup
     super
-    @request.host = 'hostname.com'
+
+    @routes = ActionDispatch::Routing::RouteSet.new
+
+    @request.host = "hostname.com"
     FileUtils.mkdir_p(FILE_STORE_PATH)
     @path_class = ActionController::Caching::Actions::ActionCachePath
     @mock_controller = ActionCachingMockController.new
@@ -162,11 +227,15 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_simple_action_cache_with_http_head
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+    end
+
     head :index
     assert_response :success
     cached_time = content_to_cache
     assert_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test')
+    assert fragment_exist?("hostname.com/action_caching_test")
 
     head :index
     assert_response :success
@@ -174,11 +243,15 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_simple_action_cache
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+    end
+
     get :index
     assert_response :success
     cached_time = content_to_cache
     assert_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test')
+    assert fragment_exist?("hostname.com/action_caching_test")
 
     get :index
     assert_response :success
@@ -186,103 +259,155 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_simple_action_not_cached
+    draw do
+      get "/action_caching_test/destroy", to: "action_caching_test#destroy"
+    end
+
     get :destroy
     assert_response :success
     cached_time = content_to_cache
     assert_equal cached_time, @response.body
-    assert !fragment_exist?('hostname.com/action_caching_test/destroy')
+    assert !fragment_exist?("hostname.com/action_caching_test/destroy")
 
     get :destroy
     assert_response :success
     assert_not_equal cached_time, @response.body
   end
 
-  include RackTestUtils
-
   def test_action_cache_with_layout
+    draw do
+      get "/action_caching_test/with_layout", to: "action_caching_test#with_layout"
+    end
+
     get :with_layout
     assert_response :success
     cached_time = content_to_cache
     assert_not_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test/with_layout')
+    assert fragment_exist?("hostname.com/action_caching_test/with_layout")
 
     get :with_layout
     assert_response :success
     assert_not_equal cached_time, @response.body
-    body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout'))
-    assert_equal @response.body, body
+    assert_equal @response.body, read_fragment("hostname.com/action_caching_test/with_layout")
   end
 
   def test_action_cache_with_layout_and_layout_cache_false
-    get :layout_false
+    draw do
+      get "/action_caching_test/layout_false", to: "action_caching_test#layout_false"
+    end
+
+    get :layout_false, params: { title: "Request 1" }
     assert_response :success
     cached_time = content_to_cache
-    assert_not_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test/layout_false')
+    assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
 
-    get :layout_false
+    get :layout_false, params: { title: "Request 2" }
     assert_response :success
-    assert_not_equal cached_time, @response.body
-    body = body_to_string(read_fragment('hostname.com/action_caching_test/layout_false'))
-    assert_equal cached_time, body
+    assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
   end
 
   def test_action_cache_with_layout_and_layout_cache_false_via_proc
-    get :with_layout_proc_param, layout: false
+    draw do
+      get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
+    end
+
+    get :with_layout_proc_param, params: { title: "Request 1", layout: "false" }
     assert_response :success
     cached_time = content_to_cache
-    assert_not_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
+    assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
 
-    get :with_layout_proc_param, layout: false
+    get :with_layout_proc_param, params: { title: "Request 2", layout: "false" }
     assert_response :success
-    assert_not_equal cached_time, @response.body
-    body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
-    assert_equal cached_time, body
+    assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
   end
 
   def test_action_cache_with_layout_and_layout_cache_true_via_proc
-    get :with_layout_proc_param, layout: true
+    draw do
+      get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
+    end
+
+    get :with_layout_proc_param, params: { title: "Request 1", layout: "true" }
     assert_response :success
     cached_time = content_to_cache
-    assert_not_equal cached_time, @response.body
-    assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
+    assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+    assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
 
-    get :with_layout_proc_param, layout: true
+    get :with_layout_proc_param, params: { title: "Request 2", layout: "true" }
     assert_response :success
-    assert_not_equal cached_time, @response.body
-    body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
-    assert_equal @response.body, body
+    assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+    assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
   end
 
   def test_action_cache_conditional_options
-    @request.env['HTTP_ACCEPT'] = 'application/json'
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+    end
+
+    @request.accept = "application/json"
     get :index
     assert_response :success
-    assert !fragment_exist?('hostname.com/action_caching_test')
+    assert !fragment_exist?("hostname.com/action_caching_test")
   end
 
   def test_action_cache_with_format_and_http_param
-    get :with_format_and_http_param, format: 'json'
+    draw do
+      get "/action_caching_test/with_format_and_http_param", to: "action_caching_test#with_format_and_http_param"
+    end
+
+    get :with_format_and_http_param, format: "json"
+    assert_response :success
+    assert !fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json")
+    assert fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value")
+  end
+
+  def test_action_cache_with_symbol_format
+    draw do
+      get "/action_caching_test/with_symbol_format", to: "action_caching_test#with_symbol_format"
+    end
+
+    get :with_symbol_format
+    assert_response :success
+    assert !fragment_exist?("test.host/action_caching_test/with_symbol_format")
+    assert fragment_exist?("test.host/action_caching_test/with_symbol_format.json")
+  end
+
+  def test_action_cache_not_url_cache_path
+    draw do
+      get "/action_caching_test/not_url_cache_path", to: "action_caching_test#not_url_cache_path"
+    end
+
+    get :not_url_cache_path
     assert_response :success
-    assert !fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json')
-    assert fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value')
+    assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path")
+    assert fragment_exist?("not_url_cache_path_key")
   end
 
   def test_action_cache_with_store_options
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+    end
+
     MockTime.expects(:now).returns(12345).once
-    @controller.expects(:read_fragment).with('hostname.com/action_caching_test', expires_in: 1.hour).once
-    @controller.expects(:write_fragment).with('hostname.com/action_caching_test', '12345.0', expires_in: 1.hour).once
+    @controller.expects(:read_fragment).with("hostname.com/action_caching_test", expires_in: 1.hour).once
+    @controller.expects(:write_fragment).with("hostname.com/action_caching_test", "12345.0", expires_in: 1.hour).once
     get :index
     assert_response :success
   end
 
   def test_action_cache_with_custom_cache_path
+    draw do
+      get "/action_caching_test/show", to: "action_caching_test#show"
+    end
+
     get :show
     assert_response :success
     cached_time = content_to_cache
     assert_equal cached_time, @response.body
-    assert fragment_exist?('test.host/custom/show')
+    assert fragment_exist?("test.host/custom/show")
 
     get :show
     assert_response :success
@@ -290,26 +415,53 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_action_cache_with_custom_cache_path_in_block
+    draw do
+      get "/action_caching_test/edit(/:id)", to: "action_caching_test#edit"
+    end
+
     get :edit
     assert_response :success
-    assert fragment_exist?('test.host/edit')
+    assert fragment_exist?("test.host/edit")
 
-    get :edit, id: 1
+    get :edit, params: { id: 1 }
     assert_response :success
-    assert fragment_exist?('test.host/1;edit')
+    assert fragment_exist?("test.host/1;edit")
   end
 
   def test_action_cache_with_custom_cache_path_with_custom_object
+    draw do
+      get "/action_caching_test/custom_cache_path(/:id)", to: "action_caching_test#custom_cache_path"
+    end
+
     get :custom_cache_path
     assert_response :success
-    assert fragment_exist?('controller')
+    assert fragment_exist?("controller")
 
-    get :custom_cache_path, id: 1
+    get :custom_cache_path, params: { id: 1 }
     assert_response :success
-    assert fragment_exist?('controller-1')
+    assert fragment_exist?("controller-1")
+  end
+
+  def test_action_cache_with_symbol_cache_path
+    draw do
+      get "/action_caching_test/symbol_cache_path(/:id)", to: "action_caching_test#symbol_cache_path"
+    end
+
+    get :symbol_cache_path
+    assert_response :success
+    assert fragment_exist?("controller")
+
+    get :symbol_cache_path, params: { id: 1 }
+    assert_response :success
+    assert fragment_exist?("controller-1")
   end
 
   def test_cache_expiration
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+      get "/action_caching_test/expire", to: "action_caching_test#expire"
+    end
+
     get :index
     assert_response :success
     cached_time = content_to_cache
@@ -332,6 +484,11 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_cache_expiration_isnt_affected_by_request_format
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+      get "/action_caching_test/expire", to: "action_caching_test#expire"
+    end
+
     get :index
     cached_time = content_to_cache
 
@@ -345,6 +502,11 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_cache_expiration_with_url_string
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+      get "/action_caching_test/expire_with_url_string", to: "action_caching_test#expire_with_url_string"
+    end
+
     get :index
     cached_time = content_to_cache
 
@@ -358,29 +520,38 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_cache_is_scoped_by_subdomain
-    @request.host = 'jamis.hostname.com'
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+    end
+
+    @request.host = "jamis.hostname.com"
     get :index
     assert_response :success
     jamis_cache = content_to_cache
 
-    @request.host = 'david.hostname.com'
+    @request.host = "david.hostname.com"
     get :index
     assert_response :success
     david_cache = content_to_cache
     assert_not_equal jamis_cache, @response.body
 
-    @request.host = 'jamis.hostname.com'
+    @request.host = "jamis.hostname.com"
     get :index
     assert_response :success
     assert_equal jamis_cache, @response.body
 
-    @request.host = 'david.hostname.com'
+    @request.host = "david.hostname.com"
     get :index
     assert_response :success
     assert_equal david_cache, @response.body
   end
 
   def test_redirect_is_not_cached
+    draw do
+      get "/action_caching_test", to: "action_caching_test#index"
+      get "/action_caching_test/redirected", to: "action_caching_test#redirected"
+    end
+
     get :redirected
     assert_response :redirect
     get :redirected
@@ -388,6 +559,10 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_forbidden_is_not_cached
+    draw do
+      get "/action_caching_test/forbidden", to: "action_caching_test#forbidden"
+    end
+
     get :forbidden
     assert_response :forbidden
     get :forbidden
@@ -395,71 +570,90 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_xml_version_of_resource_is_treated_as_different_cache
-    with_routing do |set|
-      set.draw do
-        get ':controller(/:action(.:format))'
-      end
+    draw do
+      get "/action_caching_test/index", to: "action_caching_test#index"
+      get "/action_caching_test/expire_xml", to: "action_caching_test#expire_xml"
+    end
 
-      get :index, format: 'xml'
-      assert_response :success
-      cached_time = content_to_cache
-      assert_equal cached_time, @response.body
-      assert fragment_exist?('hostname.com/action_caching_test/index.xml')
+    get :index, format: "xml"
+    assert_response :success
+    cached_time = content_to_cache
+    assert_equal cached_time, @response.body
+    assert fragment_exist?("hostname.com/action_caching_test/index.xml")
 
-      get :index, format: 'xml'
-      assert_response :success
-      assert_equal cached_time, @response.body
-      assert_equal 'application/xml', @response.content_type
+    get :index, format: "xml"
+    assert_response :success
+    assert_equal cached_time, @response.body
+    assert_equal "application/xml", @response.content_type
 
-      get :expire_xml
-      assert_response :success
+    get :expire_xml
+    assert_response :success
 
-      get :index, format: 'xml'
-      assert_response :success
-      assert_not_equal cached_time, @response.body
-    end
+    get :index, format: "xml"
+    assert_response :success
+    assert_not_equal cached_time, @response.body
   end
 
   def test_correct_content_type_is_returned_for_cache_hit
+    draw do
+      get "/action_caching_test/index/:id", to: "action_caching_test#index"
+    end
+
     # run it twice to cache it the first time
-    get :index, id: 'content-type', format: 'xml'
-    get :index, id: 'content-type', format: 'xml'
+    get :index, params: { id: "content-type" }, format: "xml"
+    get :index, params: { id: "content-type" }, format: "xml"
     assert_response :success
-    assert_equal 'application/xml', @response.content_type
+    assert_equal "application/xml", @response.content_type
   end
 
   def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key
+    draw do
+      get "/action_caching_test/show", to: "action_caching_test#show"
+    end
+
     # run it twice to cache it the first time
-    get :show, format: 'xml'
-    get :show, format: 'xml'
+    get :show, format: "xml"
+    get :show, format: "xml"
     assert_response :success
-    assert_equal 'application/xml', @response.content_type
+    assert_equal "application/xml", @response.content_type
   end
 
   def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key_from_proc
+    draw do
+      get "/action_caching_test/edit/:id", to: "action_caching_test#edit"
+    end
+
     # run it twice to cache it the first time
-    get :edit, id: 1, format: 'xml'
-    get :edit, id: 1, format: 'xml'
+    get :edit, params: { id: 1 }, format: "xml"
+    get :edit, params: { id: 1 }, format: "xml"
     assert_response :success
-    assert_equal 'application/xml', @response.content_type
+    assert_equal "application/xml", @response.content_type
   end
 
   def test_empty_path_is_normalized
-    @mock_controller.mock_url_for = 'http://example.org/'
-    @mock_controller.mock_path    = '/'
+    @mock_controller.mock_url_for = "http://example.org/"
+    @mock_controller.mock_path    = "/"
 
-    assert_equal 'example.org/index', @path_class.new(@mock_controller, {}).path
+    assert_equal "example.org/index", @path_class.new(@mock_controller, {}).path
   end
 
   def test_file_extensions
-    get :index, id: 'kitten.jpg'
-    get :index, id: 'kitten.jpg'
+    draw do
+      get "/action_caching_test/index/*id", to: "action_caching_test#index", format: false
+    end
+
+    get :index, params: { id: "kitten.jpg" }
+    get :index, params: { id: "kitten.jpg" }
 
     assert_response :success
   end
 
   if defined? ActiveRecord
     def test_record_not_found_returns_404_for_multiple_requests
+      draw do
+        get "/action_caching_test/record_not_found", to: "action_caching_test#record_not_found"
+      end
+
       get :record_not_found
       assert_response 404
       get :record_not_found
@@ -468,6 +662,10 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_four_oh_four_returns_404_for_multiple_requests
+    draw do
+      get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
+    end
+
     get :four_oh_four
     assert_response 404
     get :four_oh_four
@@ -475,11 +673,19 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_four_oh_four_renders_content
+    draw do
+      get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
+    end
+
     get :four_oh_four
     assert_equal "404'd!", @response.body
   end
 
   def test_simple_runtime_error_returns_500_for_multiple_requests
+    draw do
+      get "/action_caching_test/simple_runtime_error", to: "action_caching_test#simple_runtime_error"
+    end
+
     get :simple_runtime_error
     assert_response 500
     get :simple_runtime_error
@@ -487,35 +693,177 @@ class ActionCacheTest < ActionController::TestCase
   end
 
   def test_action_caching_plus_streaming
+    draw do
+      get "/action_caching_test/streaming", to: "action_caching_test#streaming"
+    end
+
     get :streaming
     assert_response :success
     assert_match(/streaming/, @response.body)
-    assert fragment_exist?('hostname.com/action_caching_test/streaming')
+    assert fragment_exist?("hostname.com/action_caching_test/streaming")
   end
 
   def test_invalid_format_returns_not_acceptable
-    get :invalid, format: 'json'
+    draw do
+      get "/action_caching_test/invalid", to: "action_caching_test#invalid"
+    end
+
+    get :invalid, format: "json"
     assert_response :success
     cached_time = content_to_cache
     assert_equal cached_time, @response.body
 
     assert fragment_exist?("hostname.com/action_caching_test/invalid.json")
 
-    get :invalid, format: 'json'
+    get :invalid, format: "json"
     assert_response :success
     assert_equal cached_time, @response.body
 
-    get :invalid, format: 'xml'
+    get :invalid, format: "xml"
     assert_response :not_acceptable
 
-    get :invalid, format: '\xC3\x83'
+    get :invalid, format: "\xC3\x83"
     assert_response :not_acceptable
   end
 
+  def test_format_from_accept_header
+    draw do
+      get "/action_caching_test/accept", to: "action_caching_test#accept"
+      get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
+    end
+
+    # Cache the JSON format
+    get_json :accept
+    json_cached_time = content_to_cache
+    assert_cached json_cached_time, "application/json"
+
+    # Check that the JSON format is cached
+    get_json :accept
+    assert_cached json_cached_time, "application/json"
+
+    # Cache the HTML format
+    get_html :accept
+    html_cached_time = content_to_cache
+    assert_cached html_cached_time
+
+    # Check that it's not the JSON format
+    assert_not_equal json_cached_time, @response.body
+
+    # Check that the HTML format is cached
+    get_html :accept
+    assert_cached html_cached_time
+
+    # Check that the JSON format is still cached
+    get_json :accept
+    assert_cached json_cached_time, "application/json"
+
+    # Expire the JSON format
+    get_json :expire_accept
+    assert_response :success
+
+    # Check that the HTML format is still cached
+    get_html :accept
+    assert_cached html_cached_time
+
+    # Check the JSON format was expired
+    get_json :accept
+    new_json_cached_time = content_to_cache
+    assert_cached new_json_cached_time, "application/json"
+    assert_not_equal json_cached_time, @response.body
+
+    # Expire the HTML format
+    get_html :expire_accept
+    assert_response :success
+
+    # Check that the JSON format is still cached
+    get_json :accept
+    assert_cached new_json_cached_time, "application/json"
+
+    # Check the HTML format was expired
+    get_html :accept
+    new_html_cached_time = content_to_cache
+    assert_cached new_html_cached_time
+    assert_not_equal html_cached_time, @response.body
+  end
+
+  def test_explicit_html_format_is_used_for_fragment_path
+    draw do
+      get "/action_caching_test/accept", to: "action_caching_test#accept"
+      get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
+    end
+
+    get :accept, format: "html"
+    cached_time = content_to_cache
+    assert_cached cached_time
+
+    assert fragment_exist?("hostname.com/action_caching_test/accept.html")
+
+    get :accept, format: "html"
+    cached_time = content_to_cache
+    assert_cached cached_time
+
+    get :expire_accept, format: "html"
+    assert_response :success
+
+    assert !fragment_exist?("hostname.com/action_caching_test/accept.html")
+
+    get :accept, format: "html"
+    assert_not_cached cached_time
+  end
+
+  def test_lambda_arity_with_cache_path
+    draw do
+      get "/action_caching_test/not_url_cache_path_no_args", to: "action_caching_test#not_url_cache_path_no_args"
+    end
+
+    get :not_url_cache_path_no_args
+    assert_response :success
+    assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path_no_args")
+    assert fragment_exist?("not_url_cache_path_no_args_key")
+  end
+
+  def test_lambda_arity_with_layout
+    draw do
+      get "/action_caching_test/with_layout_proc_param_no_args", to: "action_caching_test#with_layout_proc_param_no_args"
+    end
+
+    get :with_layout_proc_param_no_args, params: { title: "Request 1", layout: "false" }
+    assert_response :success
+    cached_time = content_to_cache
+    assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
+
+    get :with_layout_proc_param_no_args, params: { title: "Request 2", layout: "false" }
+    assert_response :success
+    assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
+    assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
+  end
+
   private
+    def get_html(*args)
+      @request.accept = "text/html"
+      get(*args)
+    end
+
+    def get_json(*args)
+      @request.accept = "application/json"
+      get(*args)
+    end
+
+    def assert_cached(cache_time, content_type = "text/html")
+      assert_response :success
+      assert_equal cache_time, @response.body
+      assert_equal content_type, @response.content_type
+    end
+
+    def assert_not_cached(cache_time, content_type = "text/html")
+      assert_response :success
+      assert_not_equal cache_time, @response.body
+      assert_equal content_type, @response.content_type
+    end
 
     def content_to_cache
-      assigns(:cache_this)
+      @controller.instance_variable_get(:@cache_this)
     end
 
     def fragment_exist?(path)
@@ -525,4 +873,21 @@ class ActionCacheTest < ActionController::TestCase
     def read_fragment(path)
       @controller.read_fragment(path)
     end
+
+    def draw(&block)
+      @routes = ActionDispatch::Routing::RouteSet.new
+      @routes.draw(&block)
+      @controller.extend(@routes.url_helpers)
+    end
+
+    if ActionPack::VERSION::STRING < "5.0"
+      def get(action, options = {})
+        format = options.slice(:format)
+        params = options[:params] || {}
+        session = options[:session] || {}
+        flash = options[:flash] || {}
+
+        super(action, params.merge(format), session, flash)
+      end
+    end
 end
diff --git a/test/fixtures/layouts/talk_from_action.erb b/test/fixtures/layouts/talk_from_action.erb
deleted file mode 100644
index 935a3f0..0000000
--- a/test/fixtures/layouts/talk_from_action.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-<title><%= @title || yield(:title) %></title>
-<%= yield -%>
diff --git a/test/fixtures/layouts/talk_from_action.html.erb b/test/fixtures/layouts/talk_from_action.html.erb
new file mode 100644
index 0000000..15009ed
--- /dev/null
+++ b/test/fixtures/layouts/talk_from_action.html.erb
@@ -0,0 +1,2 @@
+<title><%= params[:title] %></title>
+<%= yield -%>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-actionpack-action-caching.git



More information about the Pkg-ruby-extras-commits mailing list